Attean
view release on metacpan or search on metacpan
lib/AtteanX/Functions/CompositeLists.pm view on Meta::CPAN
my $rewritten = AtteanX::Functions::CompositeLists::rewrite_lexical($literal, $bnode_map, $parse_id);
my ($t) = $rewritten->sparql_tokens->elements;
my $i = Attean::ListIterator->new( values => [$t], item_type => 'AtteanX::SPARQL::Token' );
my $str = decode_utf8($s->serialize_iter_to_bytes($i));
chomp($str);
push(@rewritten, $str);
$j++;
next;
}
push(@rewritten, blessed($t) ? $t->token_as_string() : "null");
$j++;
}
my $rewritten = join('', @rewritten);
Attean::Literal->new(value => $rewritten, datatype => $term->datatype);
};
warn $@ if ($@);
return $r || $term;
}
=item C<< register() >>
=cut
sub register {
Attean->register_datatype_role(
"${CDT_BASE}List" => 'AtteanX::Functions::CompositeLists::ListLiteral'
);
Attean->register_global_functional_form(
"${CDT_BASE}List" => \&listCreate,
"${CDT_BASE}listCreate" => \&listCreate,
);
Attean->register_global_function(
"${CDT_BASE}get" => \&ctGet,
"${CDT_BASE}listGet" => \&listGet,
"${CDT_BASE}subseq" => \&listSubseq,
"${CDT_BASE}size" => \&ctSize,
"${CDT_BASE}listSize" => \&listSize,
"${CDT_BASE}reverse" => \&listReverse,
"${CDT_BASE}head" => \&listHead,
"${CDT_BASE}tail" => \&listTail,
"${CDT_BASE}contains" => \&listContains,
"${CDT_BASE}concat" => \&listConcat,
"${CDT_BASE}containsTerm" => \&listContainsTerm,
"${CDT_BASE}sequence" => \&sequence,
"${CDT_BASE}zip" => \&zip,
"${CDT_BASE}split" => \&stringSplit,
"${CDT_BASE}list_from_head" => \&list_from_head,
);
Attean->register_global_aggregate(
"${CDT_BASE}listAgg" => {
start => \&listCreate_agg_start,
process => \&listCreate_agg_process,
finalize => \&listCreate_agg_finalize,
},
);
}
}
package AtteanX::Functions::CompositeLists::ListLiteral {
use Scalar::Util qw(blessed looks_like_number);
use Moo::Role;
use List::Util qw(min);
sub equals {
my $lhs = shift;
my $rhs = shift;
# warn "LIST EQUALS?";
# warn "- " . $lhs->as_string . "\n";
# warn "- " . $rhs->as_string . "\n";
return 0 unless ($rhs->does('Attean::API::Literal') and $rhs->datatype->value eq $AtteanX::Functions::CompositeLists::LIST_TYPE_IRI);
my $lhs_size = eval { AtteanX::Functions::CompositeLists::listSize(undef, undef, $lhs)->value };
return 0 if ($@);
my $rhs_size = eval { AtteanX::Functions::CompositeLists::listSize(undef, undef, $rhs)->value };
return 0 if ($@);
return 0 unless ($lhs_size == $rhs_size);
my $seen_error = 0;
foreach my $i (0 .. $lhs_size-1) {
my $li = AtteanX::Functions::CompositeLists::listGet(undef, undef, $lhs, Attean::Literal->integer($i+1));
my $ri = AtteanX::Functions::CompositeLists::listGet(undef, undef, $rhs, Attean::Literal->integer($i+1));
if (not blessed($li) and not blessed($ri)) {
# both null
next;
} elsif (not blessed($li) or not blessed($ri)) {
return 0;
}
if ($li->does('Attean::API::Blank') and $ri->does('Attean::API::Blank')) {
if ($li->value eq $ri->value) {
next;
} else {
$seen_error++;
next;
}
}
return 0 unless ($li->equals($ri));
}
if ($seen_error) {
die 'TypeError: Cannot compare cdt:List values with blank nodes';
}
return 1;
}
sub order {
my $self = shift;
return _compare('order', $self, @_);
}
sub compare {
my $self = shift;
return _compare('compare', $self, @_);
}
sub _compare {
my $cmp_method = shift;
my $lhs = shift;
my $rhs = shift;
# warn "LIST-LESS-THAN?";
# warn "- " . $lhs->as_string . "\n";
( run in 2.296 seconds using v1.01-cache-2.11-cpan-8f98c5d2c55 )