Attean

 view release on metacpan or  search on metacpan

t/serializer-sparql.t  view on Meta::CPAN

		my $pp1	= Attean::Algebra::PredicatePath->new( predicate => $p1 );
		my $pp2	= Attean::Algebra::PredicatePath->new( predicate => $p2 );
		my $seq	= Attean::Algebra::AlternativePath->new( children => [$pp1, $pp2] );
		my $inv	= Attean::Algebra::InversePath->new( children => [$seq] );
		my $a	= Attean::Algebra::OneOrMorePath->new( children => [$inv] );
		my $i	= $a->sparql_tokens;
		# (^(<p1>/<p2>))+
		expect_token_stream($i, [LPAREN, HAT, LPAREN, IRI, OR, IRI, RPAREN, RPAREN, PLUS]);

		subtest '+ path' => sub {
			my $p	= Attean::Algebra::Path->new( path => $a, subject => iri('s'), object => iri('o') );
			ws_is($p->as_sparql, '<s> (^(<p1>|<p2>))+ <o>');
		}
	};
	
	subtest 'expected tokens: zero or one 2-IRI inverse path' => sub {
		my $p1	= iri('p1');
		my $p2	= iri('p2');
		my $pp1	= Attean::Algebra::PredicatePath->new( predicate => $p1 );
		my $pp2	= Attean::Algebra::PredicatePath->new( predicate => $p2 );
		my $seq	= Attean::Algebra::AlternativePath->new( children => [$pp1, $pp2] );
		my $inv	= Attean::Algebra::InversePath->new( children => [$seq] );
		my $a	= Attean::Algebra::ZeroOrOnePath->new( children => [$inv] );
		my $i	= $a->sparql_tokens;
		# (^(<p1>/<p2>))+
		expect_token_stream($i, [LPAREN, HAT, LPAREN, IRI, OR, IRI, RPAREN, RPAREN, QUESTION]);

		subtest '? path' => sub {
			my $p	= Attean::Algebra::Path->new( path => $a, subject => iri('s'), object => iri('o') );
			ws_is($p->as_sparql, '<s> (^(<p1>|<p2>))? <o>');
		}
	};

	subtest 'expected tokens: 2-IRI sequence path triple' => sub {
		my $p1	= iri('p1');
		my $p2	= iri('p2');
		my $pp1	= Attean::Algebra::PredicatePath->new( predicate => $p1 );
		my $pp2	= Attean::Algebra::PredicatePath->new( predicate => $p2 );
		my $seq	= Attean::Algebra::SequencePath->new( children => [$pp1, $pp2] );
		my $a	= Attean::Algebra::Path->new( path => $seq, subject => iri('s'), object => iri('o') );
		my $i	= $a->sparql_tokens;
		expect_token_stream($i, [IRI, IRI, SLASH, IRI, IRI]);
		ws_is($a->as_sparql, '<s> <p1>/<p2> <o>');
	};
};

subtest 'expected tokens: named graph tokens' => sub {
	my $bgp	= Attean::Algebra::BGP->new(triples => [triple(iri('s'), iri('p'), literal('1'))]);
	my $g	= iri('graphname');
	my $a	= Attean::Algebra::Graph->new( children => [$bgp], graph => $g );
	my $i	= $a->sparql_tokens;
	does_ok($i, 'Attean::API::Iterator');
	# GRAPH <graphname> { <s> <p> "1" . }
	expect_token_stream($i, [KEYWORD, IRI, LBRACE, IRI, IRI, STRING1D, DOT, RBRACE]);
	ws_is($a->as_sparql, 'GRAPH <graphname> { <s> <p> "1" . }');
};

subtest 'expected tokens: service tokens' => sub {
	my $bgp	= Attean::Algebra::BGP->new(triples => [triple(iri('s'), iri('p'), literal('1'))]);
	my $g	= iri('http://example.org/sparql');
	my $a	= Attean::Algebra::Service->new( children => [$bgp], endpoint => $g );
	my $i	= $a->sparql_tokens;
	does_ok($i, 'Attean::API::Iterator');
	# SERVICE <http://example.org/sparql> { <s> <p> "1" . }
	expect_token_stream($i, [KEYWORD, IRI, LBRACE, IRI, IRI, STRING1D, DOT, RBRACE]);
	ws_is($a->as_sparql, 'SERVICE <http://example.org/sparql> { <s> <p> "1" . }');
};

subtest 'expected tokens: union tokens' => sub {
	my $lhs	= Attean::Algebra::BGP->new(triples => [triple(iri('s'), iri('p'), literal('1'))]);
	my $rhs	= Attean::Algebra::BGP->new(triples => [triple(iri('s'), iri('p'), literal('2'))]);
	my $a	= Attean::Algebra::Union->new( children => [$lhs, $rhs] );
	my $i	= $a->sparql_tokens;
	does_ok($i, 'Attean::API::Iterator');
	expect_token_stream($i, [LBRACE, IRI, IRI, STRING1D, DOT, RBRACE, KEYWORD, LBRACE, IRI, IRI, STRING1D, DOT, RBRACE]);
	ws_is($a->as_sparql, '{ <s> <p> "1" . } UNION { <s> <p> "2" . }');
};

subtest 'expected tokens: minus tokens' => sub {
	my $lhs	= Attean::Algebra::BGP->new(triples => [triplepattern(variable('s'), iri('p'), literal('1'))]);
	my $rhs	= Attean::Algebra::BGP->new(triples => [triplepattern(variable('s'), iri('p'), literal('2'))]);
	my $a	= Attean::Algebra::Minus->new( children => [$lhs, $rhs] );
	my $i	= $a->sparql_tokens;
	does_ok($i, 'Attean::API::Iterator');
	# { ?s <p> "1" . } MINUS { ?s <p> "2" . }
	expect_token_stream($i, [LBRACE, VAR, IRI, STRING1D, DOT, RBRACE, KEYWORD, LBRACE, VAR, IRI, STRING1D, DOT, RBRACE]);
	ws_is($a->as_sparql, '{ ?s <p> "1" . } MINUS { ?s <p> "2" . }');
};

subtest 'expected tokens: optional tokens' => sub {
	my $lhs	= Attean::Algebra::BGP->new(triples => [triplepattern(variable('s'), iri('p'), literal('1'))]);
	my $rhs	= Attean::Algebra::BGP->new(triples => [triplepattern(variable('s'), iri('p'), literal('2'))]);
	my $a	= Attean::Algebra::LeftJoin->new( children => [$lhs, $rhs] );
	my $i	= $a->sparql_tokens;
	does_ok($i, 'Attean::API::Iterator');
	# { ?s <p> "1" . } OPTIONAL { ?s <p> "1" . }
	expect_token_stream($i, [LBRACE, VAR, IRI, STRING1D, DOT, RBRACE, KEYWORD, LBRACE, VAR, IRI, STRING1D, DOT, RBRACE]);
	ws_is($a->as_sparql, '{ ?s <p> "1" . } OPTIONAL { ?s <p> "2" . }');
};

subtest 'expected tokens: table tokens' => sub {
	my @rows;
	push(@rows, Attean::Result->new( bindings => { 's' => iri('http://example.org/') }));
	push(@rows, Attean::Result->new( bindings => { 's' => literal('sparql') }));
	my $a	= Attean::Algebra::Table->new(variables => [variable('s')], rows => \@rows);
	my $i	= $a->sparql_tokens;
	does_ok($i, 'Attean::API::Iterator');
	
	# VALUES (?s) { (<http://example.org>) ("sparql") }
	expect_token_stream($i, [KEYWORD, LPAREN, VAR, RPAREN, LBRACE, LPAREN, IRI, RPAREN, LPAREN, STRING1D, RPAREN, RBRACE]);
	ws_is($a->as_sparql, 'VALUES (?s) { (<http://example.org/>) ("sparql") }');
};

subtest 'expected tokens: optional+filter tokens' => sub {
	my $lhs	= Attean::Algebra::BGP->new(triples => [triplepattern(variable('s'), iri('p'), literal('1'))]);
	my $rhs	= Attean::Algebra::BGP->new(triples => [triplepattern(variable('s'), iri('p'), literal('2'))]);
	my $e		= Attean::ValueExpression->new( value => variable('s') );
	my $expr	= Attean::FunctionExpression->new( operator => 'ISIRI', children => [$e] );
	my $a	= Attean::Algebra::LeftJoin->new( children => [$lhs, $rhs], expression => $expr );
	my $i	= $a->sparql_tokens;
	does_ok($i, 'Attean::API::Iterator');



( run in 1.269 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )