You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2014/08/25 20:01:09 UTC
svn commit: r1620393 - in /jena/trunk/jena-arq/src:
main/java/com/hp/hpl/jena/sparql/algebra/
main/java/com/hp/hpl/jena/sparql/algebra/op/
test/java/com/hp/hpl/jena/sparql/algebra/
Author: andy
Date: Mon Aug 25 18:01:09 2014
New Revision: 1620393
URL: http://svn.apache.org/r1620393
Log:
JENA-763 : Add OpExt.apply(trasnaform,before,after) and call from quad transformation.
Added:
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformOpExt.java
- copied, changed from r1619216, jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformQuads.java
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformQuadsExt.java (with props)
Removed:
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformQuads.java
Modified:
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/AlgebraQuad.java
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/TransformQuadGraph.java
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpExt.java
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TS_Algebra.java
Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/AlgebraQuad.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/AlgebraQuad.java?rev=1620393&r1=1620392&r2=1620393&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/AlgebraQuad.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/AlgebraQuad.java Mon Aug 25 18:01:09 2014
@@ -53,7 +53,7 @@ public class AlgebraQuad
OpVisitor before = new Pusher(stack) ;
OpVisitor after = new Popper(stack) ;
- TransformQuadGraph qg = new TransformQuadGraph(stack) ;
+ TransformQuadGraph qg = new TransformQuadGraph(stack, before, after) ;
return Transformer.transformSkipService(qg, op, before, after) ;
}
Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/TransformQuadGraph.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/TransformQuadGraph.java?rev=1620393&r1=1620392&r2=1620393&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/TransformQuadGraph.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/TransformQuadGraph.java Mon Aug 25 18:01:09 2014
@@ -18,20 +18,13 @@
package com.hp.hpl.jena.sparql.algebra;
-import java.util.Deque;
+import java.util.Deque ;
-import com.hp.hpl.jena.graph.Node;
-import com.hp.hpl.jena.sparql.algebra.AlgebraQuad.QuadSlot;
-import com.hp.hpl.jena.sparql.algebra.op.OpAssign;
-import com.hp.hpl.jena.sparql.algebra.op.OpBGP;
-import com.hp.hpl.jena.sparql.algebra.op.OpDatasetNames;
-import com.hp.hpl.jena.sparql.algebra.op.OpGraph;
-import com.hp.hpl.jena.sparql.algebra.op.OpPath;
-import com.hp.hpl.jena.sparql.algebra.op.OpPropFunc;
-import com.hp.hpl.jena.sparql.algebra.op.OpQuadPattern;
-import com.hp.hpl.jena.sparql.algebra.op.OpTable;
-import com.hp.hpl.jena.sparql.core.Var;
-import com.hp.hpl.jena.sparql.expr.ExprVar;
+import com.hp.hpl.jena.graph.Node ;
+import com.hp.hpl.jena.sparql.algebra.AlgebraQuad.QuadSlot ;
+import com.hp.hpl.jena.sparql.algebra.op.* ;
+import com.hp.hpl.jena.sparql.core.Var ;
+import com.hp.hpl.jena.sparql.expr.ExprVar ;
/**
* Transform that rewrites an algebra into quad form
@@ -40,14 +33,19 @@ import com.hp.hpl.jena.sparql.expr.ExprV
public class TransformQuadGraph extends TransformCopy
{
private Deque<QuadSlot> tracker ;
+ private OpVisitor beforeVisitor ;
+ private OpVisitor afterVisitor ;
- public TransformQuadGraph(Deque<QuadSlot> tracker) { this.tracker = tracker ; }
+ public TransformQuadGraph(Deque<QuadSlot> tracker, OpVisitor before, OpVisitor after) {
+ this.tracker = tracker ;
+ this.beforeVisitor = before ;
+ this.afterVisitor = after ;
+ }
private Node getNode() { return tracker.peek().rewriteGraphName ; }
@Override
- public Op transform(OpGraph opGraph, Op op)
- {
+ public Op transform(OpGraph opGraph, Op op) {
// ?? Could just leave the (graph) in place always - just rewrite BGPs.
boolean noPattern = false ;
@@ -97,8 +95,7 @@ public class TransformQuadGraph extends
}
@Override
- public Op transform(OpPropFunc opPropFunc, Op subOp)
- {
+ public Op transform(OpPropFunc opPropFunc, Op subOp) {
if ( opPropFunc.getSubOp() != subOp )
opPropFunc = new OpPropFunc(opPropFunc.getProperty(), opPropFunc.getSubjectArgs(), opPropFunc.getObjectArgs(), subOp) ;
// Put the (graph) back round it so the property function works on the named graph.
@@ -106,8 +103,7 @@ public class TransformQuadGraph extends
}
@Override
- public Op transform(OpPath opPath)
- {
+ public Op transform(OpPath opPath) {
// Put the (graph) back round it
// ?? inc default graph node.
return new OpGraph(getNode() , opPath) ;
@@ -116,8 +112,13 @@ public class TransformQuadGraph extends
}
@Override
- public Op transform(OpBGP opBGP)
- {
+ public Op transform(OpBGP opBGP) {
return new OpQuadPattern(getNode(), opBGP.getPattern()) ;
}
+
+ @Override
+ public Op transform(OpExt opExt) {
+ return opExt.apply(this, beforeVisitor, afterVisitor) ;
+ }
+
}
\ No newline at end of file
Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpExt.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpExt.java?rev=1620393&r1=1620392&r2=1620393&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpExt.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpExt.java Mon Aug 25 18:01:09 2014
@@ -83,7 +83,12 @@ public abstract class OpExt extends OpBa
out.ensureStartOfLine() ;
}
- public Op apply(Transform transform) { throw new ARQNotImplemented("OpExt.appy(Transform)") ; }
+ public Op apply(Transform transform, OpVisitor before, OpVisitor after) {
+ // Default behaviour is just to pass to apply(transform)
+ return apply(transform) ;
+ }
+
+ public Op apply(Transform transform) { throw new ARQNotImplemented("OpExt.apply(Transform)") ; }
// /** Return the sub tag - must match the builder */
// public abstract String getSubTag() ;
Modified: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TS_Algebra.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TS_Algebra.java?rev=1620393&r1=1620392&r2=1620393&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TS_Algebra.java (original)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TS_Algebra.java Mon Aug 25 18:01:09 2014
@@ -31,7 +31,7 @@ import org.junit.runners.Suite ;
, TestOpAsQuery.class
, TestOpVars.class
, TestPattern2Join.class
- , TestTransformQuads.class
+ , TestTransformOpExt.class
, TestVarFinder.class
})
Copied: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformOpExt.java (from r1619216, jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformQuads.java)
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformOpExt.java?p2=jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformOpExt.java&p1=jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformQuads.java&r1=1619216&r2=1620393&rev=1620393&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformQuads.java (original)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformOpExt.java Mon Aug 25 18:01:09 2014
@@ -18,155 +18,88 @@
package com.hp.hpl.jena.sparql.algebra;
+import org.apache.jena.atlas.io.IndentedWriter ;
import org.apache.jena.atlas.junit.BaseTest ;
import org.apache.jena.atlas.lib.StrUtils ;
import org.junit.Test ;
-import com.hp.hpl.jena.query.Query ;
-import com.hp.hpl.jena.query.QueryFactory ;
+import com.hp.hpl.jena.sparql.algebra.op.OpExt ;
+import com.hp.hpl.jena.sparql.algebra.op.OpGraph ;
+import com.hp.hpl.jena.sparql.engine.ExecutionContext ;
+import com.hp.hpl.jena.sparql.engine.QueryIterator ;
+import com.hp.hpl.jena.sparql.serializer.SerializationContext ;
import com.hp.hpl.jena.sparql.sse.SSE ;
+import com.hp.hpl.jena.sparql.sse.writers.WriterOp ;
+import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
-//Tests for conversion of algebra forms to quad form.
-public class TestTransformQuads extends BaseTest
+/** Tests for OpExt */
+public class TestTransformOpExt extends BaseTest
{
- // Simple
- @Test public void quads01() { test ("{ GRAPH ?g { ?s ?p ?o } }",
- "(quadpattern (quad ?g ?s ?p ?o))"
- ) ; }
- // Not nested
- @Test public void quads02() { test ("{ GRAPH ?g { ?s ?p ?o } GRAPH ?g1 { ?s1 ?p1 ?o1 } }",
- "(sequence" +
- " (quadpattern (quad ?g ?s ?p ?o))",
- " (quadpattern (quad ?g1 ?s1 ?p1 ?o1)))"
- ) ; }
-
- @Test public void quads03() { test ("{ GRAPH ?g { ?s ?p ?o } GRAPH ?g { ?s1 ?p1 ?o1 } }",
- "(sequence" +
- " (quadpattern (quad ?g ?s ?p ?o))" +
- " (quadpattern (quad ?g ?s1 ?p1 ?o1)))"
- ) ; }
- // Nested
- @Test public void quads04() { test ("{ GRAPH ?g { ?s ?p ?o GRAPH ?g1 { ?s1 ?p1 ?o1 } } }",
- "(sequence" +
- " (quadpattern (quad ?g ?s ?p ?o))" +
- " (quadpattern (quad ?g1 ?s1 ?p1 ?o1)))"
- ) ; }
-
- @Test public void quads05() { test ("{ GRAPH ?g { ?s ?p ?o GRAPH ?g { ?s1 ?p1 ?o1 } } }",
- "(assign ((?g ?*g0))" +
- " (sequence" +
- " (quadpattern (quad ?*g0 ?s ?p ?o))" +
- " (quadpattern (quad ?g ?s1 ?p1 ?o1))))"
- ) ; }
- // Filters
- @Test public void quads10() { test ("{ GRAPH ?g { ?s ?p ?o FILTER (str(?g) = 'graphURI') } }",
- "(assign ((?g ?*g0))" +
- " (filter (= (str ?g) 'graphURI')" +
- " (quadpattern (quad ?*g0 ?s ?p ?o))))"
- ) ; }
-
- @Test public void quads11() { test ("{ GRAPH ?g { ?s ?p ?o } FILTER (str(?g) = 'graphURI') }",
- "(filter (= (str ?g) 'graphURI')" +
- " (quadpattern (quad ?g ?s ?p ?o)))"
- ) ; }
-
- // Nested and filter
- @Test public void quads20() { test ("{ GRAPH ?g { ?s ?p ?o GRAPH ?g1 { ?s1 ?p1 ?o1 FILTER (str(?g) = 'graphURI') } } }",
- "(assign ((?g ?*g0))" +
- " (sequence" +
- " (quadpattern (quad ?*g0 ?s ?p ?o))" +
- " (filter (= (str ?g) 'graphURI')" +
- " (quadpattern (quad ?g1 ?s1 ?p1 ?o1)))))"
- ) ; }
-
- @Test public void quads21() { test ("{ GRAPH ?g { ?s ?p ?o GRAPH ?g1 { ?s1 ?p1 ?o1 FILTER (str(?g1) = 'graphURI') } } }",
- "(sequence" +
- " (quadpattern (quad ?g ?s ?p ?o))" +
- " (assign ((?g1 ?*g0))" +
- " (filter (= (str ?g1) 'graphURI')" +
- " (quadpattern (quad ?*g0 ?s1 ?p1 ?o1)))))"
- ) ; }
-
- // Tricky pattern ... twice.
- @Test public void quads30() { test ( "{ GRAPH ?g { ?s ?p ?o FILTER (str(?g) = 'graphURI') } " +
- " GRAPH ?g { ?s ?p ?o FILTER (str(?g) = 'graphURI') } }",
- "(sequence" +
- " (assign ((?g ?*g0))" +
- " (filter (= (str ?g) 'graphURI')" +
- " (quadpattern (quad ?*g0 ?s ?p ?o))))" +
- " (assign ((?g ?*g1))" +
- " (filter (= (str ?g) 'graphURI')" +
- " (quadpattern (quad ?*g1 ?s ?p ?o)))))"
- ) ; }
-
- // NOT EXISTS
- @Test public void quads31() { test ( "{ GRAPH ?g { ?s ?p ?o FILTER NOT EXISTS { GRAPH ?g1 { ?s1 ?p ?o1 } } } }",
- "(filter (notexists",
- " (quadpattern (quad ?g1 ?s1 ?p ?o1)))",
- " (quadpattern (quad ?g ?s ?p ?o)))"
- ) ; }
-
- // NOT EXISTS
- @Test public void quads32() { test ( "{ ?s ?p ?o FILTER NOT EXISTS { GRAPH ?g1 { ?s1 ?p ?o1 } } }",
- "(filter (notexists",
- " (quadpattern (quad ?g1 ?s1 ?p ?o1)))",
- " (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?s ?p ?o)))"
- ) ; }
-
- // Regression in toQuadForm() - currently disable as the test fails with an ARQInternalErrorException
- @Test public void quads33() { test ( "{ GRAPH ?g { { SELECT ?x WHERE { ?x ?p ?g } } } }",
- "(project (?x)",
- " (quadpattern (quad ?g ?x ?/p ?/g)))") ; }
-
- // JENA-535
- @Test public void quads34() { test ( "{ ?s ?p ?o OPTIONAL { FILTER NOT EXISTS { ?x ?y ?z } } }",
- "(conditional",
- " (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?s ?p ?o))",
- " (filter (notexists",
- " (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?x ?y ?z)))",
- " (table unit)))") ; }
+ // An OpExt
+ static class OpExtTest extends OpExt {
+ private Op op ;
+
+ OpExtTest(Op op) {
+ super("test") ;
+ this.op = op ;
+ }
+
+ @Override
+ public Op apply(Transform transform, OpVisitor before, OpVisitor after) {
+ Op opx = Transformer.transformSkipService(transform, op, before, after) ;
+ return new OpExtTest(opx) ;
+ }
+
+ @Override public Op effectiveOp() { return op ; }
+
+ @Override public QueryIterator eval(QueryIterator input, ExecutionContext execCxt)
+ { return null ; }
+
+ @Override
+ public void outputArgs(IndentedWriter out, SerializationContext sCxt) {
+ out.println();
+ WriterOp.output(out, op, sCxt) ;
+ }
+
+ @Override
+ public int hashCode() { return 0 ; }
+
+ @Override
+ public boolean equalTo(Op other, NodeIsomorphismMap labelMap) {
+ return other instanceof OpExtTest ;
+ }
+ }
- // NOT EXISTS in left join expression.
- @Test public void quads35() { test ( "{ ?s ?p ?o OPTIONAL { FILTER NOT EXISTS { ?x ?y ?z } } }",
- false,
- "(leftjoin",
- " (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?s ?p ?o))",
- " (table unit)",
- " (notexists",
- " (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?x ?y ?z))))") ; }
+ @Test public void textOpExtQuads() {
+ String x = StrUtils.strjoinNL
+ ("(graph <g>"
+ ," (join"
+ , " (bgp (?s ?p ?o))"
+ ," (graph <g2> (bgp (?s ?p ?o)))"
+ ,"))"
+ ) ;
- // NOT EXISTS in left join expression.
- @Test public void quads36() { test ( "{ ?s ?p ?o OPTIONAL { FILTER NOT EXISTS { GRAPH ?g { ?x ?y ?z } } } }",
- false,
- "(leftjoin",
- " (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?s ?p ?o))",
- " (table unit)",
- " (notexists",
- " (quadpattern (?g ?x ?y ?z))))") ; }
-
- // NOT EXISTS in BIND
- @Test public void quads37() { test ( "{ BIND ( true && NOT EXISTS { GRAPH ?g { ?x ?y ?z } } AS ?X ) }",
- "(extend ((?X (&& true (notexists",
- " (quadpattern (quad ?g ?x ?y ?z))))))",
- " (table unit))") ; }
-
+ String y = StrUtils.strjoinNL
+ ("(join"
+ ," (quadpattern (quad <g> ?s ?p ?o))"
+ ," (quadpattern (quad <g2> ?s ?p ?o)))"
+ ) ;
+
+ // Build
+ Op op = SSE.parseOp(x) ;
+ OpGraph opg = (OpGraph)op ;
-
- private static void test(String patternString, String... strExpected) {
- test(patternString, true, strExpected) ;
- }
-
-
- private static void test(String patternString, boolean optimize, String... strExpected)
- {
- Query q = QueryFactory.create("SELECT * WHERE "+patternString) ;
- Op op = Algebra.compile(q) ;
- if ( optimize )
- op = Algebra.optimize(op) ;
- op = Algebra.toQuadForm(op) ;
+ // Insert OpExtTest
+ Op op1 = opg.getSubOp() ;
+ op1 = new OpExtTest(op1) ;
+
+ op = new OpGraph(opg.getNode(), op1) ;
+ Op op2 = AlgebraQuad.quadize(op) ;
- Op op2 = SSE.parseOp(StrUtils.strjoinNL(strExpected)) ;
- assertEquals(op2, op) ;
+ assertTrue(op2 instanceof OpExt) ;
+ Op opSub = ((OpExt)op2).effectiveOp() ;
+ Op expectedSub = SSE.parseOp(y) ;
+ assertEquals(expectedSub, opSub) ;
}
}
Added: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformQuadsExt.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformQuadsExt.java?rev=1620393&view=auto
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformQuadsExt.java (added)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformQuadsExt.java Mon Aug 25 18:01:09 2014
@@ -0,0 +1,172 @@
+/*
+ * 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 com.hp.hpl.jena.sparql.algebra;
+
+import org.apache.jena.atlas.junit.BaseTest ;
+import org.apache.jena.atlas.lib.StrUtils ;
+import org.junit.Test ;
+
+import com.hp.hpl.jena.query.Query ;
+import com.hp.hpl.jena.query.QueryFactory ;
+import com.hp.hpl.jena.sparql.sse.SSE ;
+
+//Tests for conversion of algebra forms to quad form.
+public class TestTransformQuadsExt extends BaseTest
+{
+ // Simple
+ @Test public void quads01() { test ("{ GRAPH ?g { ?s ?p ?o } }",
+ "(quadpattern (quad ?g ?s ?p ?o))"
+ ) ; }
+ // Not nested
+ @Test public void quads02() { test ("{ GRAPH ?g { ?s ?p ?o } GRAPH ?g1 { ?s1 ?p1 ?o1 } }",
+ "(sequence" +
+ " (quadpattern (quad ?g ?s ?p ?o))",
+ " (quadpattern (quad ?g1 ?s1 ?p1 ?o1)))"
+ ) ; }
+
+ @Test public void quads03() { test ("{ GRAPH ?g { ?s ?p ?o } GRAPH ?g { ?s1 ?p1 ?o1 } }",
+ "(sequence" +
+ " (quadpattern (quad ?g ?s ?p ?o))" +
+ " (quadpattern (quad ?g ?s1 ?p1 ?o1)))"
+ ) ; }
+ // Nested
+ @Test public void quads04() { test ("{ GRAPH ?g { ?s ?p ?o GRAPH ?g1 { ?s1 ?p1 ?o1 } } }",
+ "(sequence" +
+ " (quadpattern (quad ?g ?s ?p ?o))" +
+ " (quadpattern (quad ?g1 ?s1 ?p1 ?o1)))"
+ ) ; }
+
+ @Test public void quads05() { test ("{ GRAPH ?g { ?s ?p ?o GRAPH ?g { ?s1 ?p1 ?o1 } } }",
+ "(assign ((?g ?*g0))" +
+ " (sequence" +
+ " (quadpattern (quad ?*g0 ?s ?p ?o))" +
+ " (quadpattern (quad ?g ?s1 ?p1 ?o1))))"
+ ) ; }
+ // Filters
+ @Test public void quads10() { test ("{ GRAPH ?g { ?s ?p ?o FILTER (str(?g) = 'graphURI') } }",
+ "(assign ((?g ?*g0))" +
+ " (filter (= (str ?g) 'graphURI')" +
+ " (quadpattern (quad ?*g0 ?s ?p ?o))))"
+ ) ; }
+
+ @Test public void quads11() { test ("{ GRAPH ?g { ?s ?p ?o } FILTER (str(?g) = 'graphURI') }",
+ "(filter (= (str ?g) 'graphURI')" +
+ " (quadpattern (quad ?g ?s ?p ?o)))"
+ ) ; }
+
+ // Nested and filter
+ @Test public void quads20() { test ("{ GRAPH ?g { ?s ?p ?o GRAPH ?g1 { ?s1 ?p1 ?o1 FILTER (str(?g) = 'graphURI') } } }",
+ "(assign ((?g ?*g0))" +
+ " (sequence" +
+ " (quadpattern (quad ?*g0 ?s ?p ?o))" +
+ " (filter (= (str ?g) 'graphURI')" +
+ " (quadpattern (quad ?g1 ?s1 ?p1 ?o1)))))"
+ ) ; }
+
+ @Test public void quads21() { test ("{ GRAPH ?g { ?s ?p ?o GRAPH ?g1 { ?s1 ?p1 ?o1 FILTER (str(?g1) = 'graphURI') } } }",
+ "(sequence" +
+ " (quadpattern (quad ?g ?s ?p ?o))" +
+ " (assign ((?g1 ?*g0))" +
+ " (filter (= (str ?g1) 'graphURI')" +
+ " (quadpattern (quad ?*g0 ?s1 ?p1 ?o1)))))"
+ ) ; }
+
+ // Tricky pattern ... twice.
+ @Test public void quads30() { test ( "{ GRAPH ?g { ?s ?p ?o FILTER (str(?g) = 'graphURI') } " +
+ " GRAPH ?g { ?s ?p ?o FILTER (str(?g) = 'graphURI') } }",
+ "(sequence" +
+ " (assign ((?g ?*g0))" +
+ " (filter (= (str ?g) 'graphURI')" +
+ " (quadpattern (quad ?*g0 ?s ?p ?o))))" +
+ " (assign ((?g ?*g1))" +
+ " (filter (= (str ?g) 'graphURI')" +
+ " (quadpattern (quad ?*g1 ?s ?p ?o)))))"
+ ) ; }
+
+ // NOT EXISTS
+ @Test public void quads31() { test ( "{ GRAPH ?g { ?s ?p ?o FILTER NOT EXISTS { GRAPH ?g1 { ?s1 ?p ?o1 } } } }",
+ "(filter (notexists",
+ " (quadpattern (quad ?g1 ?s1 ?p ?o1)))",
+ " (quadpattern (quad ?g ?s ?p ?o)))"
+ ) ; }
+
+ // NOT EXISTS
+ @Test public void quads32() { test ( "{ ?s ?p ?o FILTER NOT EXISTS { GRAPH ?g1 { ?s1 ?p ?o1 } } }",
+ "(filter (notexists",
+ " (quadpattern (quad ?g1 ?s1 ?p ?o1)))",
+ " (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?s ?p ?o)))"
+ ) ; }
+
+ // Regression in toQuadForm() - currently disable as the test fails with an ARQInternalErrorException
+ @Test public void quads33() { test ( "{ GRAPH ?g { { SELECT ?x WHERE { ?x ?p ?g } } } }",
+ "(project (?x)",
+ " (quadpattern (quad ?g ?x ?/p ?/g)))") ; }
+
+ // JENA-535
+ @Test public void quads34() { test ( "{ ?s ?p ?o OPTIONAL { FILTER NOT EXISTS { ?x ?y ?z } } }",
+ "(conditional",
+ " (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?s ?p ?o))",
+ " (filter (notexists",
+ " (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?x ?y ?z)))",
+ " (table unit)))") ; }
+
+ // NOT EXISTS in left join expression.
+ @Test public void quads35() { test ( "{ ?s ?p ?o OPTIONAL { FILTER NOT EXISTS { ?x ?y ?z } } }",
+ false,
+ "(leftjoin",
+ " (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?s ?p ?o))",
+ " (table unit)",
+ " (notexists",
+ " (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?x ?y ?z))))") ; }
+
+ // NOT EXISTS in left join expression.
+ @Test public void quads36() { test ( "{ ?s ?p ?o OPTIONAL { FILTER NOT EXISTS { GRAPH ?g { ?x ?y ?z } } } }",
+ false,
+ "(leftjoin",
+ " (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?s ?p ?o))",
+ " (table unit)",
+ " (notexists",
+ " (quadpattern (?g ?x ?y ?z))))") ; }
+
+ // NOT EXISTS in BIND
+ @Test public void quads37() { test ( "{ BIND ( true && NOT EXISTS { GRAPH ?g { ?x ?y ?z } } AS ?X ) }",
+ "(extend ((?X (&& true (notexists",
+ " (quadpattern (quad ?g ?x ?y ?z))))))",
+ " (table unit))") ; }
+
+
+
+ private static void test(String patternString, String... strExpected) {
+ test(patternString, true, strExpected) ;
+ }
+
+
+ private static void test(String patternString, boolean optimize, String... strExpected)
+ {
+ Query q = QueryFactory.create("SELECT * WHERE "+patternString) ;
+ Op op = Algebra.compile(q) ;
+ if ( optimize )
+ op = Algebra.optimize(op) ;
+ op = Algebra.toQuadForm(op) ;
+
+ Op op2 = SSE.parseOp(StrUtils.strjoinNL(strExpected)) ;
+ assertEquals(op2, op) ;
+ }
+}
+
Propchange: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformQuadsExt.java
------------------------------------------------------------------------------
svn:mime-type = text/plain