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