| RDF-Query documentation | Contained in the RDF-Query distribution. |
RDF::Query::Algebra::Aggregate - Algebra class for aggregate patterns
This document describes RDF::Query::Algebra::Aggregate version 2.907.
Beyond the methods documented below, this class inherits methods from the RDF::Query::Algebra class.
new ( $pattern, \@groupby, $alias = [$op => $col] )>new ( $pattern, \@groupby, expressions = [ $alias => [$op, \%options, @cols] ] )>Returns a new Aggregate structure. Groups by the named bindings in @groupby,
and returns new bindings for the named $alias for the operation $op
on column $col.
$op may be one of: COUNT, MIN, MAX, SUM.
construct_argsReturns a list of arguments that, passed to this class' constructor, will produce a clone of this algebra pattern.
patternReturns the aggregates pattern.
groupbyReturns the aggregate's GROUP BY binding names.
opsReturns a list of tuples as ARRAY refs containing $alias, $op, @cols.
sseReturns the SSE string for this algebra expression.
as_sparqlReturns the SPARQL string for this algebra expression.
as_hashReturns the query as a nested set of plain data structures (no objects).
typeReturns the type of this algebra expression.
referenced_variablesReturns a list of the variable names used in this algebra expression.
potentially_boundReturns a list of the variable names used in this algebra expression that will bind values during execution.
definite_variablesReturns a list of the variable names that will be bound after evaluating this algebra expression.
Gregory Todd Williams <gwilliams@cpan.org>
| RDF-Query documentation | Contained in the RDF-Query distribution. |
# RDF::Query::Algebra::Aggregate # -----------------------------------------------------------------------------
package RDF::Query::Algebra::Aggregate; use strict; use warnings; no warnings 'redefine'; use base qw(RDF::Query::Algebra); use Scalar::Util qw(blessed reftype); use Data::Dumper; use Carp qw(carp croak confess); use RDF::Trine::Iterator qw(smap); ###################################################################### our ($VERSION); BEGIN { $VERSION = '2.907'; } ######################################################################
sub new { my $class = shift; my $pattern = shift; my $groupby = shift; my @ops; if (scalar(@_) and ref($_[0]) and reftype($_[0]) eq 'HASH') { my $hash = shift; @ops = @{ $hash->{ 'expressions' } || [] }; } else { while (@_) { my ($alias, $data) = splice(@_,0,2,()); my $op = shift(@$data); my @data = ($op, {}, @$data); push(@ops, $alias, \@data); } @ops = @_; } return bless( [ $pattern, $groupby, \@ops ] ); }
sub construct_args { my $self = shift; my @ops = @{ $self->[2] }; return ($self->pattern, [ $self->groupby ], { expressions => \@ops }); }
sub pattern { my $self = shift; return $self->[0]; }
sub groupby { my $self = shift; return @{ $self->[1] }; }
sub ops { my $self = shift; my @ops = @{ $self->[2] }; my @tuples; while (@ops) { my $alias = shift(@ops); my $data = shift(@ops); my ($op, $opts, @col) = @$data; push(@tuples, [$alias, $op, $opts, @col]); } return @tuples; }
sub sse { my $self = shift; my $context = shift; my $prefix = shift || ''; my $indent = ($context->{indent} ||= ' '); my @ops_sse; my @ops = $self->ops; foreach my $data (@ops) { my ($alias, $op, $opts, @cols) = @$data; my @col_strings = map { (not(blessed($_)) and $_ eq '*') ? '*' : $_->sse( $context, "${prefix}${indent}" ) } @cols; my $col_string = join(' ', @col_strings); if (@col_strings > 1) { $col_string = '(' . $col_string . ')'; } my %op_opts = %{ $opts || {} }; my @opts_keys = keys %op_opts; if (@opts_keys) { my $opt_string = '(' . join(' ', map { $_, qq["$op_opts{$_}"] } @opts_keys) . ')'; push(@ops_sse, sprintf('(alias "%s" (%s %s %s))', $alias, $op, $col_string, $opt_string)); } else { push(@ops_sse, sprintf('(alias "%s" (%s %s))', $alias, $op, $col_string)); } } my @group = $self->groupby; my $group = (@group) ? '(' . join(', ', map {$_->sse($context, $prefix)} @group) . ')' : ''; return sprintf( "(aggregate\n${prefix}${indent}%s\n${prefix}${indent}(%s)\n${prefix}${indent}%s)", $self->pattern->sse( $context, "${prefix}${indent}" ), join(', ', @ops_sse), $group, ); }
sub as_sparql { my $self = shift; my $context = shift; my $indent = shift; return $self->pattern->as_sparql($context, $indent); }
sub as_hash { my $self = shift; my $context = shift; return { type => lc($self->type), pattern => $self->pattern->as_hash, groupby => [ map { $_->as_hash } $self->groupby ], expressions => [ map { $_->as_hash } $self->ops ], }; }
sub type { return 'AGGREGATE'; }
sub referenced_variables { my $self = shift; my @aliases = map { $_->[0] } $self->ops; return RDF::Query::_uniq( @aliases, $self->pattern->referenced_variables ); }
sub potentially_bound { my $self = shift; my @vars; # push(@vars, map { $_->[0] } $self->ops); foreach my $g ($self->groupby) { if (blessed($g)) { if ($g->isa('RDF::Query::Node::Variable')) { push(@vars, $g->name); } elsif ($g->isa('RDF::Query::Expression::Alias')) { push(@vars, $g->name); } } } return RDF::Query::_uniq(@vars); # return RDF::Query::_uniq( @aliases, $self->pattern->referenced_variables ); }
sub definite_variables { my $self = shift; my @aliases = map { $_->[0] } $self->ops; return @aliases; } 1; __END__