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 2016/05/21 18:54:24 UTC

[04/23] jena git commit: Handle VarExprList and inner EXISTS

Handle VarExprList and inner EXISTS

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/11f06ca6
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/11f06ca6
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/11f06ca6

Branch: refs/heads/master
Commit: 11f06ca6dd77f18fd75f3d59b470b73555441b2b
Parents: f32636b
Author: Andy Seaborne <an...@apache.org>
Authored: Sat Apr 23 22:05:13 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../apache/jena/sparql/algebra/AlgebraQuad.java |   8 +-
 .../apache/jena/sparql/algebra/OpAsQuery.java   |   4 +-
 .../jena/sparql/algebra/TransformBase.java      |   3 +
 .../jena/sparql/algebra/TransformQuadGraph.java |   2 +-
 .../apache/jena/sparql/algebra/Transformer.java |  15 ++-
 .../optimize/ExprTransformApplyTransform.java   |   1 +
 .../optimize/TransformDistinctToReduced.java    |   1 -
 .../algebra/walker/ApplyTransformVisitor.java   | 102 ++++++++++---------
 .../algebra/walker/ElementWalker_New.java       |   2 +-
 .../jena/sparql/algebra/walker/ExprNone.java    |  10 ++
 .../algebra/walker/OpVisitorByTypeAndExpr.java  |   6 +-
 .../jena/sparql/algebra/walker/Walker.java      |   5 +-
 .../sparql/algebra/walker/WalkerVisitor.java    |  11 +-
 13 files changed, 99 insertions(+), 71 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/11f06ca6/jena-arq/src/main/java/org/apache/jena/sparql/algebra/AlgebraQuad.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/AlgebraQuad.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/AlgebraQuad.java
index 06c1536..04238cc 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/AlgebraQuad.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/AlgebraQuad.java
@@ -65,7 +65,9 @@ public class AlgebraQuad
      *  an assign is done after the execution of the graph pattern block. 
      */
     static class QuadSlot
-    {   // Oh scala, where art thou!
+    {
+        // No longer needed (rewriting done elsewhere).
+        // Remove and use a stack of Nodes.
         final Node actualGraphName ;
         final Node rewriteGraphName ;
         QuadSlot(Node actualGraphName, Node rewriteGraphName)
@@ -95,6 +97,7 @@ public class AlgebraQuad
                 if ( vars.contains(gn) )
                     gnQuad = varAlloc.allocVar() ;
             }
+            //System.out.println("Pusher: "+gn) ;
             stack.push(new QuadSlot(gn, gnQuad)) ;
         }
     }
@@ -109,7 +112,8 @@ public class AlgebraQuad
             // The final work is done in the main vistor, 
             // which is called after the subnode has been 
             // rewritten.
-            stack.pop() ;
+            QuadSlot qs = stack.pop() ;
+            //System.out.println("Popper: "+qs.rewriteGraphName) ;
         }
     }    
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/11f06ca6/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpAsQuery.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpAsQuery.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpAsQuery.java
index a7ce267..71e12ef 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpAsQuery.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpAsQuery.java
@@ -332,13 +332,13 @@ public class OpAsQuery {
 
         private static void processExtends(List<OpExtend> ext, BiConsumer<Var, Expr> action) {
             ext.forEach(extend->{
-                extend.getVarExprList().forEach(action) ;
+                extend.getVarExprList().forEachExpr(action) ;
             });
         }
         
         private static void processAssigns(List<OpAssign> assigns, BiConsumer<Var, Expr> action) {
             assigns.forEach(assign->{
-                assign.getVarExprList().forEach(action) ;
+                assign.getVarExprList().forEachExpr(action) ;
             });
         }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/11f06ca6/jena-arq/src/main/java/org/apache/jena/sparql/algebra/TransformBase.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/TransformBase.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/TransformBase.java
index 2deca12..761eb77 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/TransformBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/TransformBase.java
@@ -22,6 +22,9 @@ import java.util.List ;
 
 import org.apache.jena.sparql.algebra.op.* ;
 
+/** When writing {@link Transform}s to be applied to a tree,
+ * extend {@link TransformCopy}, not this class. 
+ */
 public class TransformBase implements Transform
 {
     @Override

http://git-wip-us.apache.org/repos/asf/jena/blob/11f06ca6/jena-arq/src/main/java/org/apache/jena/sparql/algebra/TransformQuadGraph.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/TransformQuadGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/TransformQuadGraph.java
index 27d44e5..daaf8b1 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/TransformQuadGraph.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/TransformQuadGraph.java
@@ -116,7 +116,7 @@ public class TransformQuadGraph extends TransformCopy
     
     @Override
     public Op transform(OpBGP opBGP) { 
-        //System.err.println("transform(OpBGP) : "+getNode()+"\n"+opBGP) ;
+        //System.out.print("transform(OpBGP) : "+getNode()+"\n"+opBGP) ;
         return new OpQuadPattern(getNode(), opBGP.getPattern()) ;
     }
     

http://git-wip-us.apache.org/repos/asf/jena/blob/11f06ca6/jena-arq/src/main/java/org/apache/jena/sparql/algebra/Transformer.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/Transformer.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/Transformer.java
index 9f155d4..550fd5b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/Transformer.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/Transformer.java
@@ -24,7 +24,6 @@ import org.apache.jena.atlas.logging.Log ;
 import org.apache.jena.query.SortCondition ;
 import org.apache.jena.sparql.algebra.OpWalker.WalkerVisitor ;
 import org.apache.jena.sparql.algebra.op.* ;
-import org.apache.jena.sparql.algebra.optimize.ExprTransformApplyTransform ;
 import org.apache.jena.sparql.algebra.walker.Walker ;
 import org.apache.jena.sparql.core.Var ;
 import org.apache.jena.sparql.core.VarExprList ;
@@ -79,6 +78,8 @@ public class Transformer
     /** Transform an algebra expression except skip (leave alone) any OpService nodes */
     public static Op transformSkipService(Transform transform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor)
     {
+        // XXX XXX REPLACED? ApplyTransformVisitor has a flag.
+        
         // Skip SERVICE
         if ( true )
         {
@@ -88,9 +89,7 @@ public class Transformer
         }
         else
         {
-            // Don't transform OpService and don't walk the sub-op 
-            ExprTransform exprTransform = new ExprTransformApplyTransform(transform, beforeVisitor, afterVisitor) ;
-            ApplyTransformVisitorServiceAsLeaf v = new ApplyTransformVisitorServiceAsLeaf(transform, exprTransform) ;
+            ApplyTransformVisitorServiceAsLeaf v = new ApplyTransformVisitorServiceAsLeaf(transform, null) ;
             WalkerVisitorSkipService walker = new WalkerVisitorSkipService(v, beforeVisitor, afterVisitor) ;
             OpWalker.walk(walker, op) ;
             return v.result() ;
@@ -120,13 +119,13 @@ public class Transformer
     // and theses protected methods.
     protected Op transformation(Transform transform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor)
     {
-        // XXX
-        ExprTransform exprTransform = new ExprTransformApplyTransform(transform, beforeVisitor, afterVisitor) ;
-        return transformation(transform, exprTransform, op, beforeVisitor, afterVisitor) ;
+        // XXX XXX
+        //ExprTransform exprTransform = new ExprTransformApplyTransform(transform, beforeVisitor, afterVisitor) ;
+        return transformation(transform, null, op, beforeVisitor, afterVisitor) ;
     }   
     
     protected Op transformation(Transform transform, ExprTransform exprTransform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
-        // XXX Switch on before/after via the Walker.
+        // XXX XXX Switch on before/after via the Walker.
         if ( true )
             return Walker.transform(op, transform, exprTransform, beforeVisitor, afterVisitor) ;
         

http://git-wip-us.apache.org/repos/asf/jena/blob/11f06ca6/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/ExprTransformApplyTransform.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/ExprTransformApplyTransform.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/ExprTransformApplyTransform.java
index e38b3ee..42b25c4 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/ExprTransformApplyTransform.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/ExprTransformApplyTransform.java
@@ -44,6 +44,7 @@ public class ExprTransformApplyTransform extends ExprTransformCopy
         this.afterVisitor = afterVisitor ;
     }
     
+    // Needed?
     @Override
     public Expr transform(ExprFunctionOp funcOp, ExprList args, Op opArg)
     {

http://git-wip-us.apache.org/repos/asf/jena/blob/11f06ca6/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformDistinctToReduced.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformDistinctToReduced.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformDistinctToReduced.java
index f185b41..8d40a9d 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformDistinctToReduced.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformDistinctToReduced.java
@@ -130,7 +130,6 @@ public class TransformDistinctToReduced extends TransformCopy {
                 ok = false;
                 break;
             }
-            // XXX
             // As soon as we've seen all variables we know this is safe and any
             // further sort conditions are irrelevant
             if (seenVars.size() == projectVars.size())

http://git-wip-us.apache.org/repos/asf/jena/blob/11f06ca6/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ApplyTransformVisitor.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ApplyTransformVisitor.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ApplyTransformVisitor.java
index 2d545dd..8de2dc0 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ApplyTransformVisitor.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ApplyTransformVisitor.java
@@ -31,6 +31,9 @@ import org.apache.jena.sparql.core.VarExprList ;
 import org.apache.jena.sparql.expr.* ;
 import org.apache.jena.sparql.expr.aggregate.Aggregator ;
 
+/** Apply the {@link Transform}, {@link ExprTransform}
+ *  Works in conjunction with {@link WalkerVisitor}. 
+ */
 public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisitor {
     private final Transform     opTransform ;
     private final ExprTransform exprTransform ;
@@ -131,7 +134,7 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
     @Override
     public void visit(OpAssign opAssign) {
         VarExprList varExpr = opAssign.getVarExprList() ;
-        VarExprList varExpr2 = process(varExpr) ;
+        VarExprList varExpr2 = collect(varExpr) ;
         OpAssign opAssign2 = opAssign ;
         if ( varExpr != varExpr2 )
             opAssign2 = OpAssign.create(opAssign.getSubOp(), varExpr2) ;
@@ -141,47 +144,64 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
     @Override
     public void visit(OpExtend opExtend) {
         VarExprList varExpr = opExtend.getVarExprList() ;
-        VarExprList varExpr2 = process(varExpr) ;
+        VarExprList varExpr2 = collect(varExpr) ;
         OpExtend opExtend2 = opExtend ;
         if ( varExpr != varExpr2 )
             opExtend2 = OpExtend.create(opExtend.getSubOp(), varExpr2) ;
         visit1(opExtend2) ;
     }
 
-    // VarExprLists are not visited by OpVisitorByTypeAndExpr 
-    // XXX Maybe they should.
-    private VarExprList process(VarExprList varExprList) {
+    // Special test cases for collectors.
+    
+    // XXX XXX Check order 
+    private VarExprList collect(VarExprList varExprList) {
         if ( varExprList == null )
             return varExprList ;
-        List<Var> vars = varExprList.getVars() ;
-        VarExprList varExpr2 = new VarExprList() ;
-        boolean changed = false ;
-        for ( Var v : vars ) {
-            Expr e = varExprList.getExpr(v) ;
-            Expr e2 = e ;
-            if ( e != null )
-                e2 = transform(e) ;
-            if ( e2 == null )
-                varExpr2.add(v) ;
-            else
-                varExpr2.add(v, e2) ;
-            if ( e != e2 )
-                changed = true ;
-        }
-        if ( !changed )
-            return varExprList ;
-        return varExpr2 ;
-    }
-
+      List<Var> vars = varExprList.getVars() ;
+      VarExprList varExpr2 = new VarExprList() ;
+      
+      List<Expr> x = collect(vars.size()) ;
+      
+      boolean changed = false ;     // XXX XXX
+
+      for ( int i = 0 ; i < vars.size() ; i++ ) {
+          Var v = vars.get(i) ;
+          Expr e2 = x.get(i) ;
+          if ( e2 == null || e2 ==  ExprNone.NONE )
+              varExpr2.add(v) ;
+          else
+              varExpr2.add(v, e2) ;
+      }
+      return varExpr2 ;
+    }  
+        
+    // XXX XXX Check order 
     private ExprList collect(ExprList exprList) {
         if ( exprList == null )
             return null ;
-        ExprList ex2 = new ExprList() ;
-        exprList.forEach((e)->ex2.add(pop(exprStack)));
-        return ex2 ; 
+        return new ExprList(collect(exprList.size())) ;
+    }
+    
+    // XXX XXX Check order 
+    private ExprList collect(List<Expr> exprList) {
+        if ( exprList == null )
+            return null ;
+        return new ExprList(collect(exprList.size())) ;
     }
-     
-//    private ExprList process(ExprList exprList) {
+    
+    // collect and return in the original order (stacks reverse order). 
+    private List<Expr> collect(int N) {
+        List<Expr> x = new ArrayList<>(N) ;
+        for ( int i = N-1 ; i >= 0 ; i-- ) {
+            Expr e2 = pop(exprStack) ;
+            x.add(0, e2) ;
+        }
+        return x ;
+    }
+    
+    // XXX collectExpr(N)
+
+    //    private ExprList process(ExprList exprList) {
 //        if ( exprList == null )
 //            return null ;
 //        ExprList exprList2 = new ExprList() ;
@@ -211,7 +231,7 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
         boolean changed = false ;
 
         VarExprList varExpr = opGroup.getGroupVars() ;
-        VarExprList varExpr2 = process(varExpr) ;
+        VarExprList varExpr2 = collect(varExpr) ;
         if ( varExpr != varExpr2 )
             changed = true ;
 
@@ -353,7 +373,8 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
     
     @Override
     public void visitExpr(ExprList exprs) { 
-        // XXX
+        // XXX XXX
+        // Not called?
         System.err.println("visitExpr(ExprList)") ;
         if ( exprs != null && exprTransform != null ) {
             
@@ -362,6 +383,8 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
     
     @Override
     public void visitVarExpr(VarExprList exprVarExprList)  {
+        // XXX XXX
+        // Not called?
         System.err.println("visitExpr(ExprList)") ;
         if ( exprVarExprList != null && exprTransform != null ) {
             
@@ -405,19 +428,6 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
         push(exprStack, e) ;
     }
 
-    private ExprList collect(List<Expr> exprList) {
-        if ( exprList == null )
-            return null ;
-        int N = exprList.size() ;
-        List<Expr> x = new ArrayList<>(N) ;
-        for ( Expr anExprList : exprList ) {
-            Expr e2 = pop(exprStack) ;
-            // Add in reverse.
-            x.add(0, e2) ;
-        }
-        return new ExprList(x) ;
-    }
-
     @Override
     public void visit(ExprFunctionOp funcOp) {
         ExprList x = null ;
@@ -457,7 +467,7 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
                 Log.warn(ApplyTransformVisitor.class, "Pop null from "+stackLabel(stack)+" stack") ;
             return v ;
         }
-        catch (EmptyStackException ex) {
+        catch (NoSuchElementException ex) {
             Log.warn(ApplyTransformVisitor.class, "Empty "+stackLabel(stack)+" stack") ;
             return null ;
         }

http://git-wip-us.apache.org/repos/asf/jena/blob/11f06ca6/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ElementWalker_New.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ElementWalker_New.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ElementWalker_New.java
index 7ca53b9..aab404a 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ElementWalker_New.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ElementWalker_New.java
@@ -189,7 +189,7 @@ public class ElementWalker_New {
         @Override
         public void visit(ExprAggregator eAgg)  {
             //eAgg.getAggVar().visit(visitorExpr);
-            // XXX Hack for varsMentioned
+            // XXX XXX Hack for varsMentioned
             eAgg.visit(exprVisitor) ; 
         }
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/11f06ca6/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ExprNone.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ExprNone.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ExprNone.java
new file mode 100644
index 0000000..f7acae9
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ExprNone.java
@@ -0,0 +1,10 @@
+package org.apache.jena.sparql.algebra.walker;
+
+import org.apache.jena.sparql.expr.ExprVar ;
+
+/** Marker, used in place of a null.
+ *  This may be tested for using {@code ==} */ 
+public class ExprNone extends ExprVar {
+    public static ExprNone NONE = new ExprNone() ;
+    private ExprNone() { super("") ; }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/11f06ca6/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/OpVisitorByTypeAndExpr.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/OpVisitorByTypeAndExpr.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/OpVisitorByTypeAndExpr.java
index 8c1ee3e..61595d3 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/OpVisitorByTypeAndExpr.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/OpVisitorByTypeAndExpr.java
@@ -170,7 +170,7 @@ public interface OpVisitorByTypeAndExpr extends OpVisitor
 
     @Override
     public default void visit(OpOrder opOrder) {
-        // XXX
+        // XXX XXX
         //opOrder.getConditions() ;
         visitModifer(opOrder);
     }
@@ -178,14 +178,14 @@ public interface OpVisitorByTypeAndExpr extends OpVisitor
     @Override
     public default void visit(OpGroup opGroup) {
         visitVarExpr(opGroup.getGroupVars()) ;
-        // XXX
+        // XXX XXX
         //opGroup.getAggregators() ;
         visit1(opGroup);
     }
 
     @Override
     public default void visit(OpTopN opTop) {
-        // XXX
+        // XXX XXX
         // opTop.getConditions() ;
         visit1(opTop);
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/11f06ca6/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/Walker.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/Walker.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/Walker.java
index 6135416..a0b484c 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/Walker.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/Walker.java
@@ -102,7 +102,7 @@ public class Walker {
      public static void walk(VarExprList varExprList, OpVisitor opVisitor, ExprVisitor exprVisitor) {
          if ( varExprList == null )
              return ;
-         varExprList.forEach((v,e)->walk(e,opVisitor, exprVisitor)) ;
+         varExprList.forEachExpr((v,e)->walk(e,opVisitor, exprVisitor)) ;
      }
  
     private static OpVisitor   nullOpVisitor   = new OpVisitorBase() ;
@@ -180,10 +180,11 @@ public class Walker {
     }
  
     public static ApplyTransformVisitor createTransformer(Transform opTransform, ExprTransform exprTransform, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        // XXX XXX Copy forms?
         if ( opTransform == null )
             opTransform = nullOpTransform ;
         if ( exprTransform == null )
-            exprTransform = nullExprTransform ;
+            exprTransform = new ExprTransformCopy() ;
         return new ApplyTransformVisitor(opTransform, exprTransform, null, null) ;
     }
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/11f06ca6/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor.java
index a54572a..0d9e24a 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor.java
@@ -102,11 +102,10 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
     public void walk(VarExprList varExprList) {
         if ( varExprList == null )
             return ;
-        varExprList.forEach((v,e) -> walk(e));
+        varExprList.forEachVarExpr((v,e) -> walk( e!=null ? e : ExprNone.NONE ));
     }
 
     // ---- Mode swapping between op and expr. visit=>?walk
-    // XXX
     @Override
     public void visitExpr(ExprList exprList) {
         if ( exprVisitor != null )
@@ -130,8 +129,10 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
 
     @Override
     public void visit0(Op0 op) {
+        before(op) ;
         if ( opVisitor != null )
             op.visit(opVisitor) ;
+        after(op) ;
     }
 
     @Override
@@ -141,6 +142,7 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
         after(op) ;
     }
     
+    // Can be called via different routes. 
     private void visit1$(Op1 op) {
         if ( op.getSubOp() != null )
             op.getSubOp().visit(this) ;
@@ -192,7 +194,7 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
     
     @Override
     public void visit(OpOrder opOrder) {
-        // XXX
+        // XXX XXX
 //        List<SortCondition> conditions = opOrder.getConditions() ;
 //        List<SortCondition> conditions2 = new ArrayList<>() ;
 //        boolean changed = false ;
@@ -304,8 +306,7 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
 
         // visitAssignVar(eAgg.getAggVar().asVar()) ;
 
-        // XXX Hack for varsMentioned
-
+        // XXX XXX Hack for varsMentioned
         if ( exprVisitor != null )
             eAgg.visit(exprVisitor) ;
     }