/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.sparql.path;
import java.io.StringReader ;
import java.util.Arrays ;
import java.util.Iterator ;
import java.util.List ;
import org.apache.jena.atlas.iterator.Iter ;
import org.apache.jena.atlas.junit.BaseTest ;
import org.apache.jena.graph.Factory ;
import org.apache.jena.graph.Graph ;
import org.apache.jena.graph.Node ;
import org.apache.jena.graph.NodeFactory ;
import org.apache.jena.query.ARQ ;
import org.apache.jena.rdf.model.Bag ;
import org.apache.jena.rdf.model.Model ;
import org.apache.jena.rdf.model.ModelFactory ;
import org.apache.jena.rdf.model.Seq ;
import org.apache.jena.riot.Lang ;
import org.apache.jena.riot.RDFDataMgr ;
import org.apache.jena.sparql.graph.GraphFactory ;
import org.apache.jena.sparql.graph.NodeConst ;
import org.apache.jena.sparql.path.Path ;
import org.apache.jena.sparql.path.eval.PathEval ;
import org.apache.jena.sparql.sse.SSE ;
import org.junit.AfterClass ;
import org.junit.BeforeClass ;
import org.junit.Test ;
/** Tests of property functions in paths.
* A property function can get invoked in the regular way
* (propfunc) by simple property path flattening in the optimizer
* or by use in complex path expressions.
*/
public class TestPathPF extends BaseTest
{
static Graph graph1 = GraphFactory.createDefaultGraph() ;
static Node elt1 = SSE.parseNode("'elt1'") ;
static Node elt2 = SSE.parseNode("'elt2'") ;
static String base = "http://example/" ;
static Node node0 = NodeFactory.createURI(base+"node0") ;
static Node node1 = NodeFactory.createURI(base+"node1") ;
static Node node2 = NodeFactory.createURI(base+"node2") ;
static Node s1 = NodeFactory.createURI("http://example/s1") ;
static Node s2 = NodeFactory.createURI("http://example/s2") ;
static Node s3 = NodeFactory.createURI("http://example/s3") ;
private static String data =
"prefix : <http://example/>\n" +
":s1 :p (1 2 3) .\n"+
":s2 :p () .\n" +
":s1 :p (4 5) .\n" +
":s3 :p (8 9) .\n" ;
private static Graph graph2 = Factory.createDefaultGraph() ;
static { RDFDataMgr.read(graph2, new StringReader(data), null, Lang.TTL); }
@BeforeClass public static void beforeClass() {
Model m = ModelFactory.createModelForGraph(graph1) ;
Bag bag0 = m.createBag(base+"node0") ;
Bag bag1 = m.createBag(base+"node1") ;
Seq seq2 = m.createSeq(base+"node2") ;
bag1.add("elt1") ;
seq2.add("elt1") ;
seq2.add("elt2") ;
}
@AfterClass public static void afterClass() {
graph1 = null ;
}
@Test public void path_pf_00() {
Path path = SSE.parsePath("(link rdfs:member)") ;
eval(graph1, node0, path, new Node[] {}) ;
}
@Test public void path_pf_01() {
Path path = SSE.parsePath("(path+ rdfs:member)") ;
eval(graph1, Node.ANY, path, elt1,elt2) ;
}
@Test public void path_pf_02() {
Path path = SSE.parsePath("(link rdfs:member)") ;
evalReverse(graph1, elt1, path, node1, node2) ;
}
@Test public void path_pf_03() {
Path path = SSE.parsePath("(link rdfs:member)") ;
evalReverse(graph1, Node.ANY, path, node2, node2, node1) ;
}
@Test public void path_pf_10() {
Path path = SSE.parsePath("(prefix ((list: <http://jena.apache.org/ARQ/list#>)) (seq :p (link list:member)))") ;
eval(graph2, s1, path, "1", "2", "3", "4", "5") ;
}
@Test public void path_pf_11() {
Path path = SSE.parsePath("(prefix ((list: <http://jena.apache.org/ARQ/list#>)) (seq :p (link list:member)))") ;
eval(graph2, s2, path, new Node[] {}) ;
}
@Test public void path_pf_12() {
Path path = SSE.parsePath("(prefix ((list: <http://jena.apache.org/ARQ/list#>)) (seq :p (link list:member)))") ;
eval(graph2, s3, path, "8", "9") ;
}
@Test public void path_pf_13() {
Path path = SSE.parsePath("(prefix ((list: <http://jena.apache.org/ARQ/list#>)) (seq :p (link list:member)))") ;
evalReverse(graph2, NodeConst.nodeOne, path, s1) ;
}
@Test public void path_pf_14() {
Path path = SSE.parsePath("(prefix ((list: <http://jena.apache.org/ARQ/list#>)) (seq :p (link list:member)))") ;
evalReverse(graph2, NodeConst.nodeNil, path) ;
}
private static void eval(Graph graph, Node start, Path path, String... expected) {
Node[] r = new Node[expected.length] ;
for ( int i = 0 ; i < expected.length ; i++ ) {
r[i] = SSE.parseNode(expected[i]) ;
}
eval(graph, start, path, r) ;
}
private static void evalReverse(Graph graph, Node start, Path path, Node... expected) {
Iterator<Node> iter = PathEval.evalReverse(graph, start, path, null) ;
check(iter, expected) ;
}
private static void eval(Graph graph, Node start, Path path, Node... expected) {
Iterator<Node> iter = PathEval.eval(graph, start, path, ARQ.getContext()) ;
check(iter, expected) ;
}
private static void check(Iterator<Node> iter, Node... expected) {
check(iter, Arrays.asList(expected)) ;
}
private static void check(Iterator<Node> iter, List<Node> expected) {
List<Node> x = Iter.toList(iter) ;
assertEqualsUnordered(expected,x) ;
}
}