#!/usr/bin/perl use strict; use warnings; no warnings 'redefine'; use Test::More; use lib qw(. t); require "models.pl"; my @files = map { "data/$_" } qw(about.xrdf foaf.xrdf); my @models = test_models( @files ); my $tests = 1 + (scalar(@models) * 26); plan tests => $tests; use_ok( 'RDF::Query' ); foreach my $model (@models) { print "\n#################################\n"; print "### Using model: $model\n\n"; { my %seen; { print "# foaf:Person ORDER BY name with LIMIT\n"; my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: SELECT DISTINCT ?p ?name WHERE { ?p a foaf:Person; foaf:name ?name . FILTER(lang(?name) = "") } ORDER BY ?name LIMIT 2 END my $stream = $query->execute( $model ); isa_ok( $stream, 'RDF::Trine::Iterator' ); my ($count, $last); while (my $row = $stream->next) { my ($p, $node) = @{ $row }{qw(p name)}; my $name = $node->literal_value; $seen{ $name }++; if (defined($last)) { cmp_ok( $name, 'ge', $last, "In order: $name (" . $p->as_string . ")" ); } else { ok( $name, "First: $name (" . $p->as_string . ")" ); } $last = $name; } continue { ++$count }; is( $count, 2, 'good LIMIT' ); } { print "# foaf:Person ORDER BY name with LIMIT and OFFSET\n"; my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: SELECT DISTINCT ?p ?name WHERE { ?p a foaf:Person; foaf:name ?name . FILTER(lang(?name) = "") } ORDER BY ?name LIMIT 2 OFFSET 2 END my $stream = $query->execute( $model ); isa_ok( $stream, 'RDF::Trine::Iterator' ); my ($count, $last); while (my $row = $stream->next) { my ($p, $node) = @{ $row }{qw(p name)}; my $name = $node->literal_value; is( exists($seen{ $name }), '', "not seen before with offset: $name" ); if (defined($last)) { cmp_ok( $name, 'ge', $last, "In order: $name (" . $p->as_string . ")" ); } else { ok( $name, "First: $name (" . $p->as_string . ")" ); } $last = $name; } continue { ++$count }; is( $count, 1, 'good LIMIT' ); } } { print "# foaf:Person with LIMIT\n"; my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: SELECT ?p ?name WHERE { ?p a foaf:Person; foaf:name ?name } LIMIT 2 END my $stream = $query->execute( $model ); isa_ok( $stream, 'RDF::Trine::Iterator' ); my ($count); while (my $row = $stream->next) { my ($p, $node) = @{ $row }{qw(p name)}; my $name = $node->literal_value; ok( $name, "First: $name (" . $p->as_string . ")" ); } continue { ++$count }; is( $count, 2, 'good LIMIT' ); } { print "# foaf:Person with ORDER BY and OFFSET\n"; my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: SELECT DISTINCT ?p ?name WHERE { ?p a foaf:Person; foaf:nick ?nick; foaf:name ?name } ORDER BY ?name OFFSET 1 END my $stream = $query->execute( $model ); isa_ok( $stream, 'RDF::Trine::Iterator' ); my ($count); while (my $row = $stream->next) { my ($p, $node) = @{ $row }{qw(p name)}; my $name = $node->literal_value; ok( $name, "Got person with nick: $name (" . $p->as_string . ")" ); } continue { ++$count }; is( $count, 1, "Good DISTINCT with OFFSET" ); } { print "# foaf:Image with OFFSET [2]\n"; my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: PREFIX exif: PREFIX dc: SELECT DISTINCT ?name ?camera WHERE { ?img a foaf:Image . ?img dc:creator ?name . ?img exif:model ?camera } OFFSET 1 END my $stream = $query->execute( $model ); isa_ok( $stream, 'RDF::Trine::Iterator' ); my ($count); while (my $row = $stream->next) { my ($n, $c) = @{ $row }{qw(name camera)}; my $name = $n->literal_value; ok( $name, "Got image creator: $name" ); } continue { ++$count }; is( $count, 1, "Good DISTINCT with LIMIT" ); } { print "# foaf:Image with ORDER BY ASC(expression) [1]\n"; my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: PREFIX dcterms: PREFIX geo: PREFIX exif: PREFIX dc: PREFIX xsd: SELECT DISTINCT ?img ?long WHERE { ?img a foaf:Image . ?img dcterms:spatial ?point . ?point geo:long ?long . } ORDER BY ASC(xsd:float(xsd:decimal(?long) * -1)) END my $stream = $query->execute( $model ); isa_ok( $stream, 'RDF::Trine::Iterator' ); my $count = 0; my $min; while (my $row = $stream->next) { my ($i, $l) = @{ $row }{qw(img long)}; my $image = $i->uri_value; my $long = $l->literal_value; if (defined($min)) { cmp_ok( $long, '<=', $min, "decreasing longitude $long on $image" ); if ($long <= $min) { $min = $long; } } else { is( $image, 'http://kasei.us/pictures/2004/20040909-Ireland/images/DSC_5705.jpg' ); $min = $long; } } continue { last if ++$count == 2 }; is( $count, 2, "Good ORDER BY ASC(expression) [1]" ); } { print "# foaf:Image with ORDER BY DESC(expression) [2]\n"; my $query = new RDF::Query ( <<"END", undef, undef, 'sparql' ); PREFIX foaf: PREFIX dcterms: PREFIX geo: PREFIX exif: PREFIX dc: PREFIX xsd: SELECT DISTINCT ?img ?long WHERE { ?img a foaf:Image . ?img dcterms:spatial ?point . ?point geo:long ?long . } ORDER BY DESC(xsd:float(xsd:decimal(?long) * -1)) END my $stream = $query->execute( $model ); isa_ok( $stream, 'RDF::Trine::Iterator' ); my $count = 0; my $max; while (my $row = $stream->next) { my ($i, $l) = @{ $row }{qw(img long)}; my $image = $i->uri_value; my $long = $l->literal_value; if (defined($max)) { cmp_ok( $long, '>=', $max, "increasing longitude $long on $image" ); if ($long >= $max) { $max = $long; } } else { cmp_ok( $long, '==', -71.3924 ); $max = $long; } } continue { last if ++$count == 2 }; is( $count, 2, "Good ORDER BY DESC(expression) [2]" ); } }