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 2013/02/07 16:02:49 UTC

svn commit: r1443530 - in /jena/trunk/jena-arq/src: main/java/com/hp/hpl/jena/sparql/algebra/ main/java/com/hp/hpl/jena/sparql/algebra/optimize/ test/java/com/hp/hpl/jena/sparql/algebra/

Author: andy
Date: Thu Feb  7 15:02:49 2013
New Revision: 1443530

URL: http://svn.apache.org/viewvc?rev=1443530&view=rev
Log:
JENA-340
Transformation of the NOT EXISTS expression needs the quad stack before/after visitors.

Removed:
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformApplyInsideExprFunctionOp.java
Modified:
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/Transformer.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/ExprTransformApplyTransform.java
    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/Transformer.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/Transformer.java?rev=1443530&r1=1443529&r2=1443530&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/Transformer.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/Transformer.java Thu Feb  7 15:02:49 2013
@@ -28,10 +28,7 @@ import com.hp.hpl.jena.sparql.algebra.op
 import com.hp.hpl.jena.sparql.algebra.optimize.ExprTransformApplyTransform ;
 import com.hp.hpl.jena.sparql.core.Var ;
 import com.hp.hpl.jena.sparql.core.VarExprList ;
-import com.hp.hpl.jena.sparql.expr.Expr ;
-import com.hp.hpl.jena.sparql.expr.ExprAggregator ;
-import com.hp.hpl.jena.sparql.expr.ExprList ;
-import com.hp.hpl.jena.sparql.expr.ExprTransformer ;
+import com.hp.hpl.jena.sparql.expr.* ;
 import com.hp.hpl.jena.sparql.expr.aggregate.Aggregator ;
 
 /** A botton-top application of a transformation of SPARQL algebra */  
@@ -69,12 +66,14 @@ public class Transformer
         {
             // Simplest way but still walks the OpService subtree (and throws away the transformation).
             Transform walker = new TransformSkipService(transform) ;
+            ExprTransform exprTransform = new ExprTransformApplyTransform(transform, beforeVisitor, afterVisitor) ;
             return Transformer.transform(walker, op, beforeVisitor, afterVisitor) ;
         }
         else
         {
             // Don't transform OpService and don't walk the sub-op 
-            ApplyTransformVisitorServiceAsLeaf v = new ApplyTransformVisitorServiceAsLeaf(transform) ;
+            ExprTransform exprTransform = new ExprTransformApplyTransform(transform, beforeVisitor, afterVisitor) ;
+            ApplyTransformVisitorServiceAsLeaf v = new ApplyTransformVisitorServiceAsLeaf(transform, exprTransform) ;
             WalkerVisitorSkipService walker = new WalkerVisitorSkipService(v, beforeVisitor, afterVisitor) ;
             OpWalker.walk(walker, op) ;
             return v.result() ;
@@ -93,7 +92,8 @@ public class Transformer
     // and theses protected methods.
     protected Op transformation(Transform transform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor)
     {
-        ApplyTransformVisitor v = new ApplyTransformVisitor(transform) ;
+        ExprTransform exprTransform = new ExprTransformApplyTransform(transform, beforeVisitor, afterVisitor) ;
+        ApplyTransformVisitor v = new ApplyTransformVisitor(transform, exprTransform) ;
         return transformation(v, op, beforeVisitor, afterVisitor) ;
     }
     
@@ -124,7 +124,7 @@ public class Transformer
     class ApplyTransformVisitor extends OpVisitorByType
     {
         protected final Transform transform ;
-        private final ExprTransformApplyTransform exprTransform ;
+        private final ExprTransform exprTransform ;
 
         private final Deque<Op> stack = new ArrayDeque<Op>() ;
         protected final Op pop() 
@@ -136,11 +136,10 @@ public class Transformer
             stack.push(op) ;
         }
         
-        public ApplyTransformVisitor(Transform transform)
+        public ApplyTransformVisitor(Transform transform, ExprTransform exprTransform)
         { 
             this.transform = transform ;
-            this.exprTransform = new ExprTransformApplyTransform(transform) ;
-
+            this.exprTransform = exprTransform ;
         }
         
         final Op result()
@@ -149,7 +148,21 @@ public class Transformer
                 Log.warn(this, "Stack is not aligned") ;
             return pop() ; 
         }
-    
+
+        private ExprList transform(ExprList exprList, ExprTransform exprTransform)
+        {
+            if ( exprTransform == null )
+                return exprList ;
+            return ExprTransformer.transform(exprTransform, exprList) ;
+        }
+
+        private Expr transform(Expr expr, ExprTransform exprTransform)
+        {
+            if ( exprTransform == null )
+                return expr ;
+            return ExprTransformer.transform(exprTransform, expr) ;
+        }
+        
         // ----
         // Algebra operations that involve an Expr, and so might include NOT EXISTS 
 
@@ -163,7 +176,7 @@ public class Transformer
             for ( SortCondition sc : conditions )
             {
                 Expr e = sc.getExpression() ;
-                Expr e2 = ExprTransformer.transform(exprTransform, e) ;
+                Expr e2 = transform(e, exprTransform) ;
                 conditions2.add(new SortCondition(e2, sc.getDirection())) ;
                 if ( e != e2 )
                     changed = true ;
@@ -188,7 +201,6 @@ public class Transformer
         @Override
         public void visit(OpExtend opExtend)
         { 
-            
             VarExprList varExpr = opExtend.getVarExprList() ;
             VarExprList varExpr2 = process(varExpr) ;
             OpExtend opExtend2 = opExtend ;
@@ -207,7 +219,7 @@ public class Transformer
                 Expr e = varExpr.getExpr(v) ;
                 Expr e2 =  e ;
                 if ( e != null )
-                    e2 = ExprTransformer.transform(exprTransform, e) ;
+                    e2 = transform(e, exprTransform) ;
                 if ( e2 == null )
                     varExpr2.add(v) ;
                 else
@@ -242,7 +254,7 @@ public class Transformer
                 
                 // Variable associated with the aggregate
                 Expr eVar = agg.getAggVar() ;   // Not .getExprVar()
-                Expr eVar2 = ExprTransformer.transform(exprTransform, eVar) ;
+                Expr eVar2 = transform(eVar, exprTransform) ;
                 if ( eVar != eVar2 )
                     changed = true ;
 
@@ -250,7 +262,7 @@ public class Transformer
                 Expr e = aggregator.getExpr() ;
                 Expr e2 = e ;
                 if ( e != null )    // Null means "no relevant expression" e.g. COUNT(*)
-                    ExprTransformer.transform(exprTransform, e) ;
+                    e2 = transform(e, exprTransform) ;
                 if ( e != e2 )
                     changed = true ;
                 Aggregator a2 = aggregator.copy(e2) ;
@@ -319,7 +331,7 @@ public class Transformer
             boolean changed = false ;
             for ( Expr e : opFilter.getExprs() )
             {
-                Expr e2 = ExprTransformer.transform(exprTransform, e) ;
+                Expr e2 = transform(e, exprTransform) ;
                 ex.add(e2) ;
                 if ( e != e2 )
                     changed = true ;
@@ -349,9 +361,9 @@ public class Transformer
     /** Treat OpService as a leaf of the tree */
     static class ApplyTransformVisitorServiceAsLeaf extends ApplyTransformVisitor
     {
-        public ApplyTransformVisitorServiceAsLeaf(Transform transform)
+        public ApplyTransformVisitorServiceAsLeaf(Transform transform, ExprTransform exprTransform)
         {
-            super(transform) ;
+            super(transform, exprTransform) ;
         }
         
         @Override
@@ -440,6 +452,6 @@ public class Transformer
         
         @Override
         protected void visitExt(OpExt op)
-        { op.apply(transform) ; }
+        { result = op.apply(transform) ; }
     }
 }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/ExprTransformApplyTransform.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/ExprTransformApplyTransform.java?rev=1443530&r1=1443529&r2=1443530&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/ExprTransformApplyTransform.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/ExprTransformApplyTransform.java Thu Feb  7 15:02:49 2013
@@ -20,6 +20,7 @@ package com.hp.hpl.jena.sparql.algebra.o
 
 import com.hp.hpl.jena.sparql.ARQInternalErrorException ;
 import com.hp.hpl.jena.sparql.algebra.Op ;
+import com.hp.hpl.jena.sparql.algebra.OpVisitor ;
 import com.hp.hpl.jena.sparql.algebra.Transform ;
 import com.hp.hpl.jena.sparql.algebra.Transformer ;
 import com.hp.hpl.jena.sparql.expr.E_Exists ;
@@ -29,20 +30,29 @@ import com.hp.hpl.jena.sparql.expr.ExprF
 import com.hp.hpl.jena.sparql.expr.ExprList ;
 import com.hp.hpl.jena.sparql.expr.ExprTransformCopy ;
 
-/** A copying transform that applies a Transform to the algebra operator of E_Exist and E_NoExists */
+/** A copying transform that applies an Op Transform to the algebra operator of E_Exist and E_NoExists */
 public class ExprTransformApplyTransform extends ExprTransformCopy
 {
-    // See also ExprTransformer.transform(ExprFunctionOp func, ..) and ExprTransformOp
     private final Transform transform ;
+    private OpVisitor beforeVisitor ;
+    private OpVisitor afterVisitor ;
+    
     public ExprTransformApplyTransform(Transform transform)
     {
+        this(transform, null, null) ;
+    }
+    
+    public ExprTransformApplyTransform(Transform transform, OpVisitor beforeVisitor, OpVisitor afterVisitor)
+    {
         this.transform = transform ;
+        this.beforeVisitor = beforeVisitor ;
+        this.afterVisitor = afterVisitor ;
     }
     
     @Override
     public Expr transform(ExprFunctionOp funcOp, ExprList args, Op opArg)
     {
-        Op opArg2 = Transformer.transform(transform, opArg) ;
+        Op opArg2 = Transformer.transform(transform, opArg, beforeVisitor, afterVisitor) ;
         if ( opArg2 == opArg )
             return super.transform(funcOp, args, opArg) ;
         if ( funcOp instanceof E_Exists )
@@ -52,3 +62,4 @@ public class ExprTransformApplyTransform
         throw new ARQInternalErrorException("Unrecognized ExprFunctionOp: \n"+funcOp) ;
     }
 }
+

Modified: 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/TestTransformQuads.java?rev=1443530&r1=1443529&r2=1443530&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/TestTransformQuads.java Thu Feb  7 15:02:49 2013
@@ -99,6 +99,20 @@ public class TestTransformQuads extends 
                                          "       (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)))"
+                                         ) ; }
+    
     private static void test(String patternString, String... strExpected)
     {
         Query q = QueryFactory.create("SELECT * WHERE "+patternString) ;