AtteanX-RDFQueryTranslator
view release on metacpan or search on metacpan
lib/AtteanX/RDFQueryTranslator.pm view on Meta::CPAN
variables => [ @vars ],
);
} elsif ($a->isa('RDF::Query::Algebra::GroupGraphPattern')) {
my @p = map { $self->translate($_) } $a->patterns;
if (scalar(@p) == 0) {
return Attean::Algebra::BGP->new();
} else {
while (scalar(@p) > 1) {
my ($l, $r) = splice(@p, 0, 2);
unshift(@p, Attean::Algebra::Join->new( children => [$l, $r] ));
}
return shift(@p);
}
} elsif ($a->isa('RDF::Query::Algebra::BasicGraphPattern')) {
my @p = map { $self->translate($_) } $a->triples;
return Attean::Algebra::BGP->new( triples => \@p );
} elsif ($a->isa('RDF::Query::Algebra::Triple')) {
my @nodes = map { $self->translate($_) } $a->nodes;
return Attean::TriplePattern->new(@nodes);
} elsif ($a->isa('RDF::Query::Node::Variable')) {
my $value = variable($a->isa("RDF::Query::Node::Variable::ExpressionProxy") ? ("." . $a->name) : $a->name);
$value = Attean::ValueExpression->new(value => $value) if ($self->_in_expr);
return $value;
} elsif ($a->isa('RDF::Query::Node::Resource')) {
my $value = iri($a->uri_value);
$value = Attean::ValueExpression->new(value => $value) if ($self->_in_expr);
return $value;
} elsif ($a->isa('RDF::Query::Node::Blank')) {
my $value = blank($a->blank_identifier);
$value = Attean::ValueExpression->new(value => $value) if ($self->_in_expr);
return $value;
} elsif ($a->isa('RDF::Query::Node::Literal')) {
my $value;
if ($a->has_language) {
$value = langliteral($a->literal_value, $a->literal_value_language);
} elsif ($a->has_datatype) {
$value = dtliteral($a->literal_value, $a->literal_datatype);
} else {
$value = literal($a->literal_value);
}
$value = Attean::ValueExpression->new(value => $value) if ($self->_in_expr);
return $value;
} elsif ($a->isa('RDF::Query::Algebra::Limit')) {
my $child = $a->pattern;
if ($child->isa('RDF::Query::Algebra::Offset')) {
my $p = $self->translate($child->pattern);
return Attean::Algebra::Slice->new( children => [$p], limit => $a->limit, offset => $child->offset );
} else {
my $p = $self->translate($child);
return Attean::Algebra::Slice->new( children => [$p], limit => $a->limit );
}
} elsif ($a->isa('RDF::Query::Algebra::Offset')) {
my $p = $self->translate($a->pattern);
return Attean::Algebra::Slice->new( children => [$p], offset => $a->offset );
} elsif ($a->isa('RDF::Query::Algebra::Path')) {
my $s = $self->translate($a->start);
my $o = $self->translate($a->end);
my $path = $self->translate_path($a->path);
return Attean::Algebra::Path->new( subject => $s, path => $path, object => $o );
} elsif ($a->isa('RDF::Query::Algebra::Service')) {
my $endpoint = $self->translate($a->endpoint);
my $p = $self->translate($a->pattern);
return Attean::Algebra::Service->new( children => [$p], endpoint => $endpoint );
} elsif ($a->isa('RDF::Query::Algebra::NamedGraph')) {
my $graph = $self->translate($a->graph);
my $p = $self->translate($a->pattern);
return Attean::Algebra::Graph->new( children => [$p], graph => $graph );
} elsif ($a->isa('RDF::Query::Algebra::Filter')) {
my $p = $self->translate($a->pattern);
my $expr = $self->translate_expr($a->expr);
return Attean::Algebra::Filter->new( children => [$p], expression => $expr );
} elsif ($a->isa('RDF::Query::Expression::Binary')) {
my $op = $a->op;
$op = '=' if ($op eq '==');
my @ops = $a->operands;
my @operands = map { $self->translate($_) } @ops;
my $expr = Attean::BinaryExpression->new( operator => $op, children => \@operands );
return $expr;
} elsif ($a->isa('RDF::Query::Expression::Unary')) {
my $op = $a->op;
$op = '=' if ($op eq '==');
my ($child) = $a->operands;
my $expr = Attean::UnaryExpression->new( operator => $op, children => [$self->translate($child)] );
return $expr;
} elsif ($a->isa('RDF::Query::Algebra::Extend')) {
my $p = $self->translate($a->pattern);
my $vars = $a->vars;
foreach my $v (@$vars) {
if ($v->isa('RDF::Query::Expression::Alias')) {
my $var = variable($v->name);
my $expr = $v->expression;
$p = Attean::Algebra::Extend->new( children => [$p], variable => $var, expression => $self->translate_expr( $expr ) );
} else {
die "Unexpected extend expression: " . Dumper($v);
}
}
return $p;
} elsif ($a->isa('RDF::Query::VariableBindings')) {
my %bindings;
foreach my $v ($a->variables) {
if (my $term = $a->{ $v }) {
$bindings{ $v } = $self->translate( $term );
}
}
return Attean::Result->new( bindings => \%bindings );
} elsif ($a->isa('RDF::Query::Algebra::Table')) {
my @vars = map { variable($_) } $a->variables;
my @rows = map { $self->translate($_) } $a->rows;
return Attean::Algebra::Table->new( variables => \@vars, rows => \@rows );
} elsif ($a->isa('RDF::Query::Algebra::Aggregate')) {
my $p = $self->translate($a->pattern);
my @group;
foreach my $g ($a->groupby) {
if ($g->isa('RDF::Query::Expression::Alias')) {
my $var = $self->translate($g->alias);
my $varexpr = $self->translate_expr($g->alias);
push(@group, $varexpr);
my $expr = $self->translate_expr( $g->expression );
$p = Attean::Algebra::Extend->new( children => [$p], variable => $var, expression => $expr );
} else {
push(@group, $self->translate_expr($g));
}
}
( run in 2.251 seconds using v1.01-cache-2.11-cpan-63c85eba8c4 )