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:21 UTC

[01/23] jena git commit: Clear up "todo" items

Repository: jena
Updated Branches:
  refs/heads/master e028645c9 -> e8867ad1b


Clear up "todo" items


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

Branch: refs/heads/master
Commit: af9e747e812cb414292f732010ab9ea8955f6419
Parents: e4ef5bc
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Apr 25 22:01:27 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../apache/jena/sparql/algebra/Transformer.java |   1 -
 .../algebra/walker/OpVisitorByTypeAndExpr.java  |   3 +-
 .../sparql/algebra/walker/WalkerVisitor.java    |  27 +-
 .../sparql/algebra/walker/WalkerVisitor0.java   | 306 -------------------
 .../jena/sparql/expr/ExprTransformer.java       |  24 +-
 5 files changed, 19 insertions(+), 342 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/af9e747e/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 c4d828e..1477296 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
@@ -91,7 +91,6 @@ public class Transformer
 //        // transformation).
 //        Transform transform = new TransformSkipService(opTransform) ;
 //        return Transformer.transform(transform, exprTransform, op, beforeVisitor, afterVisitor) ;
-//        // XXX XXX Better to modify the walk and force the transform to be a no-op.
     }
 
     // To allow subclassing this class, we use a singleton pattern

http://git-wip-us.apache.org/repos/asf/jena/blob/af9e747e/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 17ccca4..c78e724 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
@@ -23,6 +23,7 @@ import java.util.List ;
 import org.apache.jena.query.SortCondition ;
 import org.apache.jena.sparql.algebra.OpVisitor ;
 import org.apache.jena.sparql.algebra.op.* ;
+import org.apache.jena.sparql.core.Var ;
 import org.apache.jena.sparql.core.VarExprList ;
 import org.apache.jena.sparql.expr.ExprAggregator ;
 import org.apache.jena.sparql.expr.ExprList ;
@@ -46,7 +47,7 @@ public interface OpVisitorByTypeAndExpr extends OpVisitor
 
     public void visitExpr(ExprList exprs) ;
     public void visitVarExpr(VarExprList exprs) ;
-    //public void visitAssignVar(Var var) ;
+    public default void visitAssignVar(Var var) {}
     
     // Currently, we assume these are handled by the visitor/transformer.
     public default void visitSortConditions(List<SortCondition> list)       {}

http://git-wip-us.apache.org/repos/asf/jena/blob/af9e747e/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 f4c9e43..251490c 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
@@ -187,21 +187,13 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
 
     @Override
     public void visit(OpOrder opOrder) {
-        // XXX XXX
-//        List<SortCondition> conditions = opOrder.getConditions() ;
-//        List<SortCondition> conditions2 = new ArrayList<>() ;
-//        boolean changed = false ;
-//
-//        for ( SortCondition sc : conditions ) {
-//            Expr e = sc.getExpression() ;
-//            Expr e2 = transform(e) ;
-//            conditions2.add(new SortCondition(e2, sc.getDirection())) ;
-//            if ( e != e2 )
-//                changed = true ;
-//        }
-//        OpOrder x = opOrder ;
-//        if ( changed )
-//            x = new OpOrder(opOrder.getSubOp(), conditions2) ;
+        // XXX Why not this?
+        // ApplyTransformVisitor handles the parts of OpOrder.  
+//        before(opOrder) ;
+//        visitSortConditions(opOrder.getConditions()) ;
+//        visitModifer(opOrder);
+//        visit1$(opOrder);
+//        after(opOrder) ;
         visit1(opOrder) ;
     }
 
@@ -302,10 +294,7 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
     public void visit(ExprAggregator eAgg) {
         // This is the assignment variable of the aggregation
         // not a normal variable of an expression.
-
-        // visitAssignVar(eAgg.getAggVar().asVar()) ;
-
-        // XXX XXX Hack for varsMentioned
+        visitAssignVar(eAgg.getAggVar().asVar()) ;
         if ( exprVisitor != null )
             eAgg.visit(exprVisitor) ;
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/af9e747e/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java
deleted file mode 100644
index 2acd7b6..0000000
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * 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.algebra.walker;
-
-import java.util.Iterator ;
-
-import org.apache.jena.sparql.algebra.Op ;
-import org.apache.jena.sparql.algebra.OpVisitor ;
-import org.apache.jena.sparql.algebra.OpVisitorBase ;
-import org.apache.jena.sparql.algebra.op.* ;
-import org.apache.jena.sparql.core.VarExprList ;
-import org.apache.jena.sparql.expr.* ;
-
-/** Walk algebra and expressions */
-public class WalkerVisitor0 implements OpVisitorByTypeAndExpr, ExprVisitorFunction {
-    protected final ExprVisitor exprVisitor ;
-    protected final OpVisitor   opVisitor ;
-    protected int               opDepthLimit      = Integer.MAX_VALUE ;
-    protected int               exprDepthLimit    = Integer.MAX_VALUE ;
-
-    protected int               opDepth      = 0 ;
-    protected int               exprDepth    = 0 ;
-    
-    private final OpVisitor     beforeVisitor ;
-    private final OpVisitor     afterVisitor ;
-
-    /**
-     * A walker. If a visitor is null, then don't walk in. For
-     * "no action but keep walking inwards", use {@link OpVisitorBase} and
-     * {@link ExprVisitorBase}.
-     * 
-     * @see OpVisitorBase
-     * @see ExprVisitorBase
-     */
-    public WalkerVisitor0(OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor before, OpVisitor after) {
-        this.opVisitor = opVisitor ;
-        this.exprVisitor = exprVisitor ;
-        if ( opDepthLimit < 0 )
-            opDepthLimit = Integer.MAX_VALUE ;
-        if ( exprDepth < 0 )
-            exprDepthLimit = Integer.MAX_VALUE ;
-        opDepth = 0 ;
-        exprDepth = 0 ;
-        beforeVisitor = before ;
-        afterVisitor = after ;
-    }
-
-    protected final void before(Op op) {
-        if ( beforeVisitor != null )
-            op.visit(beforeVisitor) ;
-    }
-
-    protected final void after(Op op) {
-        if ( afterVisitor != null )
-            op.visit(afterVisitor) ;
-    }
-    
-    public void walk(Op op) {
-        if ( op == null )
-            return ;
-        if ( opDepth == opDepthLimit )
-            // No deeper.
-            return ;
-        opDepth++ ; 
-        try { op.visit(this); }
-        finally { opDepth-- ; }
-    }
-    
-    public void walk(Expr expr) {
-        if ( expr == null )
-            return ;
-        if ( exprDepth == exprDepthLimit )
-            return ;
-        exprDepth++ ;
-        try { expr.visit(this) ; }
-        finally { exprDepth-- ; }
-    }
-    
-    public void walk(ExprList exprList) {
-        if ( exprList == null )
-            return ;
-        exprList.forEach(e->walk(e));
-    }
-
-    public void walk(VarExprList varExprList) {
-        if ( varExprList == null )
-            return ;
-        // retains order.
-        varExprList.forEachVarExpr((v,e) -> {
-            Expr expr = (e!=null) ? e : Expr.NONE ; 
-            walk(expr) ;
-        });
-    }
-
-    // ---- Mode swapping between op and expr. visit=>?walk
-    @Override
-    public void visitExpr(ExprList exprList) {
-        if ( exprVisitor != null )
-            walk(exprList) ;
-    }
-
-    @Override
-    public void visitVarExpr(VarExprList varExprList) {
-        if ( exprVisitor != null )
-            walk(varExprList);
-    }
-    
-    // ----
-    
-    public void visitOp(Op op) {
-        before(op) ;
-        if ( opVisitor != null )
-            op.visit(this);
-        after(op) ;
-    }
-
-    @Override
-    public void visit0(Op0 op) {
-        before(op) ;
-        if ( opVisitor != null )
-            op.visit(opVisitor) ;
-        after(op) ;
-    }
-
-    @Override
-    public void visit1(Op1 op) {
-        before(op) ;
-        visit1$(op) ;
-        after(op) ;
-    }
-    
-    // Can be called via different routes. 
-    private void visit1$(Op1 op) {
-        if ( op.getSubOp() != null )
-            op.getSubOp().visit(this) ;
-        if ( opVisitor != null )
-            op.visit(opVisitor) ;
-    }
-
-    @Override
-    public void visit2(Op2 op) {
-        before(op) ;
-        if ( op.getLeft() != null )
-            op.getLeft().visit(this) ;
-        if ( op.getRight() != null )
-            op.getRight().visit(this) ;
-        if ( opVisitor != null )
-            op.visit(opVisitor) ;
-        after(op) ;
-    }
-
-    @Override
-    public void visitN(OpN op) {
-        before(op) ;
-        for (Iterator<Op> iter = op.iterator(); iter.hasNext();) {
-            Op sub = iter.next() ;
-            sub.visit(this) ;
-        }
-        if ( opVisitor != null )
-            op.visit(opVisitor) ;
-        after(op) ;
-    }
-    
-    @Override
-    public void visitExt(OpExt op) {
-        before(op) ;
-        if ( opVisitor != null )
-            op.visit(opVisitor) ;
-        after(op) ;
-    }
-
-    @Override
-    public void visit(OpOrder opOrder) {
-        // XXX XXX
-//        List<SortCondition> conditions = opOrder.getConditions() ;
-//        List<SortCondition> conditions2 = new ArrayList<>() ;
-//        boolean changed = false ;
-//
-//        for ( SortCondition sc : conditions ) {
-//            Expr e = sc.getExpression() ;
-//            Expr e2 = transform(e) ;
-//            conditions2.add(new SortCondition(e2, sc.getDirection())) ;
-//            if ( e != e2 )
-//                changed = true ;
-//        }
-//        OpOrder x = opOrder ;
-//        if ( changed )
-//            x = new OpOrder(opOrder.getSubOp(), conditions2) ;
-        visit1(opOrder) ;
-    }
-
-    @Override
-    public void visit(OpAssign opAssign) {
-        before(opAssign) ;
-        VarExprList varExpr = opAssign.getVarExprList() ;
-        visitVarExpr(varExpr); 
-        visit1$(opAssign) ;
-        after(opAssign) ;
-    }
-
-    @Override
-    public void visit(OpExtend opExtend) {
-        before(opExtend) ;
-        VarExprList varExpr = opExtend.getVarExprList() ;
-        visitVarExpr(varExpr); 
-        visit1$(opExtend) ;
-        after(opExtend) ;
-    }
-
-    
-    // Transforming to quads needs the graph node handled before doing the sub-algebra ops
-    // so it has to be done as before/after by the Walker. By the time visit(OpGraph) is called,
-    // the sub-tree has already been visited. 
-    
-    
-//    @Override
-//    public void visit(OpGraph op) {
-//        pushGraph(op.getNode()) ;
-//        OpVisitorByTypeAndExpr.super.visit(op) ;
-//        popGraph() ;
-//    }
-//    
-//    private Deque<Node> stack = new ArrayDeque<>() ;
-//    
-//    public Node getCurrentGraph() { return stack.peek() ; }
-//    
-//    private void pushGraph(Node node) {
-//        stack.push(node) ;   
-//    }
-//
-//    private void popGraph() {
-//        stack.pop() ;
-//    }
-
-    @Override
-    public void visit(ExprFunction0 func) { visitExprFunction(func) ; }
-    @Override
-    public void visit(ExprFunction1 func) { visitExprFunction(func) ; }
-    @Override
-    public void visit(ExprFunction2 func) { visitExprFunction(func) ; }
-    @Override
-    public void visit(ExprFunction3 func) { visitExprFunction(func) ; }
-    @Override
-    public void visit(ExprFunctionN func) { visitExprFunction(func) ; }
-    
-    @Override
-    public void visitExprFunction(ExprFunction func) {
-        for ( int i = 1 ; i <= func.numArgs() ; i++ ) {
-            Expr expr = func.getArg(i) ;
-            if ( expr == null )
-                // Put a dummy in, e.g. to keep the transform stack aligned.
-                Expr.NONE.visit(this) ;
-            else
-                expr.visit(this) ;
-        }
-        if ( exprVisitor != null )
-            func.visit(exprVisitor) ;
-    }
-    
-    @Override
-    public void visit(ExprFunctionOp funcOp) {
-        walk(funcOp.getGraphPattern());
-        if ( exprVisitor != null )
-            funcOp.visit(exprVisitor) ;
-    }
-    
-    @Override
-    public void visit(NodeValue nv) {
-        if ( exprVisitor != null )
-            nv.visit(exprVisitor) ;
-    }
-
-    @Override
-    public void visit(ExprVar v) {
-        if ( exprVisitor != null )
-            v.visit(exprVisitor) ;
-    }
-
-    @Override
-    public void visit(ExprAggregator eAgg) {
-        // This is the assignment variable of the aggregation
-        // not a normal variable of an expression.
-
-        // visitAssignVar(eAgg.getAggVar().asVar()) ;
-
-        // XXX XXX Hack for varsMentioned
-        if ( exprVisitor != null )
-            eAgg.visit(exprVisitor) ;
-    }
-}

http://git-wip-us.apache.org/repos/asf/jena/blob/af9e747e/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java
index 494c945..e35e3fa 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java
@@ -29,22 +29,16 @@ public class ExprTransformer
     /** Transform an expression list */
     public static ExprList transform(ExprTransform transform, ExprList exprList) {
         ExprList exprList2 = new ExprList() ;
-        exprList.forEach((e) -> {
-            // XXX XXX No change checking? 
+        boolean changed = false ;
+        for ( Expr e : exprList ) {
             Expr e2 = transform(transform, e) ;
             exprList2.add(e2) ;
-        }) ;
-        return exprList2 ;
-//        boolean changed = false ;
-//        for ( Expr e : exprList ) {
-//            Expr e2 = transform(transform, e) ;
-//            exprList2.add(e2) ;
-//            if ( e != e2 )
-//                changed = true ;
-//        } ;
-//        if ( changed )
-//            return exprList2 ;
-//        else
-//            return exprList ;
+            if ( e != e2 )
+                changed = true ;
+        } ;
+        if ( changed )
+            return exprList2 ;
+        else
+            return exprList ;
     }
 }


[18/23] jena git commit: Different cases of VarExprList.forEachX for Var, VarExpr and Expr

Posted by an...@apache.org.
Different cases of VarExprList.forEachX for Var, VarExpr and Expr

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

Branch: refs/heads/master
Commit: f32636b51b3ac56e3e7e408d2cb3eee41fc2e6ae
Parents: 4a9ead5
Author: Andy Seaborne <an...@apache.org>
Authored: Sat Apr 23 22:04:41 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../apache/jena/sparql/core/VarExprList.java    | 29 ++++++++++++++++++--
 .../jena/sparql/engine/main/VarFinder.java      | 19 ++++++-------
 .../apache/jena/sparql/lang/SyntaxVarScope.java |  2 +-
 3 files changed, 37 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/f32636b5/jena-arq/src/main/java/org/apache/jena/sparql/core/VarExprList.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/VarExprList.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/VarExprList.java
index 6bce51e..d3ec82d 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/VarExprList.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/VarExprList.java
@@ -20,6 +20,7 @@ package org.apache.jena.sparql.core;
 
 import java.util.* ;
 import java.util.function.BiConsumer ;
+import java.util.function.Consumer ;
 
 import org.apache.jena.graph.Node ;
 import org.apache.jena.sparql.ARQInternalErrorException ;
@@ -61,8 +62,32 @@ public class VarExprList
     public List<Var> getVars()          { return vars ; }
     public Map<Var, Expr> getExprs()    { return exprs ; }
     
-    public void forEach(BiConsumer<Var, Expr> action) {
-        exprs.forEach(action); 
+    /** Call the action for each (variable, expression) defined.
+     *  Not called when there is no expression, just a variable.
+     *  Not order preserving.
+     */
+    public void forEachExpr(BiConsumer<Var, Expr> action) {
+        exprs.forEach(action);
+    }
+    
+    /** Call the action for each variable, in order.
+     *  The expression may be null.
+     *  Not called when there is no expression, just a variable.
+     */
+    public void forEachVarExpr(BiConsumer<Var, Expr> action) {
+        //*  See {@link #forEach}    
+        getVars().forEach((v) -> {
+            // Maybe null.
+            Expr e = exprs.get(v) ;
+            action.accept(v, e);
+        }) ;
+    }
+
+    /** Call the action for each variable, in order. */
+    public void forEachVar(Consumer<Var> action) {
+        getVars().forEach((v) -> {
+            action.accept(v);
+        }) ;
     }
 
     public boolean contains(Var var) { return vars.contains(var) ; }

http://git-wip-us.apache.org/repos/asf/jena/blob/f32636b5/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/VarFinder.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/VarFinder.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/VarFinder.java
index c9968ed..731532b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/VarFinder.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/VarFinder.java
@@ -237,19 +237,20 @@ public class VarFinder
         @Override
         public void visit(OpAssign opAssign) {
             opAssign.getSubOp().visit(this);
-            processVarExprList(opAssign.getVarExprList());
+            processAssignVarExprList(opAssign.getVarExprList());
         }
 
         @Override
         public void visit(OpExtend opExtend) {
             opExtend.getSubOp().visit(this);
-            processVarExprList(opExtend.getVarExprList());
+            processAssignVarExprList(opExtend.getVarExprList());
         }
         
-        private void processVarExprList(VarExprList varExprList) {
-            varExprList.forEach((v,e)-> {
+        private void processAssignVarExprList(VarExprList varExprList) {
+            varExprList.forEachVarExpr((v,e)-> {
                 defines.add(v) ;
-                e.varsMentioned(assignMentions);
+                if ( e != null )
+                    e.varsMentioned(assignMentions);
             }) ;
         }
 
@@ -316,12 +317,10 @@ public class VarFinder
 
         @Override
         public void visit(OpGroup opGroup) {
-            // Not subOp.
+            // Only the group variables are visible.
+            // So not the subOp, and not expressions.
             VarExprList varExprs = opGroup.getGroupVars() ;
-            varExprs.forEach((v,expr)->{
-                addVar(defines, v) ;
-                // Not the expressions.
-            }) ;
+            varExprs.forEachVar((v)->addVar(defines, v)) ;
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/jena/blob/f32636b5/jena-arq/src/main/java/org/apache/jena/sparql/lang/SyntaxVarScope.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/lang/SyntaxVarScope.java b/jena-arq/src/main/java/org/apache/jena/sparql/lang/SyntaxVarScope.java
index 684b440..bfd1cf3 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/lang/SyntaxVarScope.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/lang/SyntaxVarScope.java
@@ -132,7 +132,7 @@ public class SyntaxVarScope
     private static void checkExprListAssignment(Collection<Var> vars, VarExprList exprList)
     {
         Set<Var> vars2 = new LinkedHashSet<>(vars) ;
-        exprList.forEach((v,e) -> {
+        exprList.forEachExpr((v,e) -> {
             Set<Var> varInExpr = e.getVarsMentioned() ;
             // Include mentioned variables
             // These may be unused in the query (in vars) but stil contribute.


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

Posted by an...@apache.org.
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) ;
     }


[12/23] jena git commit: Tidying up.

Posted by an...@apache.org.
Tidying up.

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

Branch: refs/heads/master
Commit: b679b06fb2111bd0acad5738f077553db8410770
Parents: 11f06ca
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Apr 24 21:15:54 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../apache/jena/sparql/algebra/AlgebraQuad.java |   2 +-
 .../jena/sparql/algebra/BeforeAfterVisitor.java |  82 ----
 .../apache/jena/sparql/algebra/OpWalker.java    |   2 +-
 .../apache/jena/sparql/algebra/Transformer.java | 458 ++-----------------
 .../algebra/walker/ApplyTransformVisitor.java   |  40 +-
 .../sparql/algebra/walker/OpVisitorByType.java  | 217 +++++++++
 .../algebra/walker/OpVisitorByTypeAndExpr.java  |  11 +-
 .../jena/sparql/algebra/walker/Walker.java      |  22 +-
 .../sparql/algebra/walker/WalkerVisitor.java    |  23 +-
 .../walker/WalkerVisitorSkipService.java        |  38 ++
 .../algebra/walker/WalkerVisitorVisible.java    |  67 +++
 .../jena/sparql/algebra/TestTransformOpExt.java |   2 +-
 12 files changed, 396 insertions(+), 568 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/b679b06f/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 04238cc..c00d887 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
@@ -54,7 +54,7 @@ public class AlgebraQuad
         OpVisitor after = new Popper(stack) ;
         
         TransformQuadGraph qg = new TransformQuadGraph(stack, before, after) ;
-        return Transformer.transformSkipService(qg, op, before, after) ;
+        return Transformer.transformSkipService(qg, null, op, before, after) ;
     }
     
     /** This is the record of the transformation.

http://git-wip-us.apache.org/repos/asf/jena/blob/b679b06f/jena-arq/src/main/java/org/apache/jena/sparql/algebra/BeforeAfterVisitor.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/BeforeAfterVisitor.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/BeforeAfterVisitor.java
deleted file mode 100644
index 18d71e7..0000000
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/BeforeAfterVisitor.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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.algebra;
-
-import org.apache.jena.sparql.algebra.op.* ;
-
-public class BeforeAfterVisitor extends OpVisitorByType//implements OpVisitor
-{
-    OpVisitor beforeVisitor = null ;
-    OpVisitor afterVisitor = null ;
-    OpVisitor mainVisitor = null ;
-    
-    public BeforeAfterVisitor(OpVisitor mainVisitor ,
-                              OpVisitor beforeVisitor, 
-                              OpVisitor afterVisitor) 
-    {
-        this.mainVisitor = mainVisitor ;
-        this.beforeVisitor = beforeVisitor ;
-        this.afterVisitor = afterVisitor ;
-    }
-    
-    private void before(Op op) { 
-        if ( beforeVisitor != null )
-            op.visit(beforeVisitor) ;
-    }
-
-    private void after(Op op) {
-        if ( afterVisitor != null )
-            op.visit(afterVisitor) ;
-    }
-
-    @Override
-    protected void visit0(Op0 op) { 
-        before(op) ; op.visit(mainVisitor) ; after(op) ;
-    }
-
-    @Override
-    protected void visit1(Op1 op) { 
-        before(op) ; op.visit(mainVisitor) ; after(op) ;
-    }
-
-    @Override
-    protected void visit2(Op2 op) { 
-        before(op) ; op.visit(mainVisitor) ; after(op) ;
-    }
-
-    @Override
-    protected void visitN(OpN op) { 
-        before(op) ; op.visit(mainVisitor) ; after(op) ;
-    }
-
-    @Override
-    protected void visitFilter(OpFilter op) { 
-        before(op) ; op.visit(mainVisitor) ; after(op) ;
-    }
-
-    @Override
-    protected void visitLeftJoin(OpLeftJoin op) { 
-        before(op) ; op.visit(mainVisitor) ; after(op) ;
-    }
-
-    @Override
-    protected void visitExt(OpExt op) { 
-        before(op) ; op.visit(mainVisitor) ; after(op) ;
-    }
-}

http://git-wip-us.apache.org/repos/asf/jena/blob/b679b06f/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpWalker.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpWalker.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpWalker.java
index dfe3b86..fc6bce4 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpWalker.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpWalker.java
@@ -43,7 +43,7 @@ public class OpWalker
         op.visit(walkerVisitor) ;
     }
     
-    public static class WalkerVisitor extends OpVisitorByType {
+    protected static class WalkerVisitor extends OpVisitorByType {
         private final OpVisitor   beforeVisitor ;
         private final OpVisitor   afterVisitor ;
         protected final OpVisitor visitor ;

http://git-wip-us.apache.org/repos/asf/jena/blob/b679b06f/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 550fd5b..754e0ef 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
@@ -18,24 +18,17 @@
 
 package org.apache.jena.sparql.algebra;
 
-import java.util.* ;
-
-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.op.OpService ;
 import org.apache.jena.sparql.algebra.walker.Walker ;
-import org.apache.jena.sparql.core.Var ;
-import org.apache.jena.sparql.core.VarExprList ;
-import org.apache.jena.sparql.expr.* ;
-import org.apache.jena.sparql.expr.aggregate.Aggregator ;
+import org.apache.jena.sparql.expr.ExprTransform ;
 
 /** A bottom-top application of a transformation of SPARQL algebra */  
 public class Transformer
 {
+    // XXX XXX Clean me!
+    
     private static Transformer singleton = new Transformer();
     
-    // TopQuadrant extend Transformer for use in their SPARQL debugger.
     /** Get the current transformer */
     public static Transformer get() { return singleton; }
     
@@ -50,447 +43,56 @@ public class Transformer
     public static Op transform(Transform transform, ExprTransform exprTransform, Op op)
     { return get().transformation(transform, exprTransform, op, null, null) ; }
 
-    /** Transformation with specific Transform and default ExprTransform (apply transform inside pattern expressions like NOT EXISTS) */ 
-    public static Op transform(Transform transform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor)
-    {
+    /**
+     * Transformation with specific Transform and default ExprTransform (apply transform
+     * inside pattern expressions like NOT EXISTS)
+     */
+    public static Op transform(Transform transform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
         return get().transformation(transform, op, beforeVisitor, afterVisitor) ;
     }
-    
+
     /** Transformation with specific Transform and ExprTransform applied */
-    public static Op transform(Transform transform, ExprTransform exprTransform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor)
-    {
+    public static Op transform(Transform transform, ExprTransform exprTransform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
         return get().transformation(transform, exprTransform, op, beforeVisitor, afterVisitor) ;
     }
 
     /** Transform an algebra expression except skip (leave alone) any OpService nodes */
-    public static Op transformSkipService(Transform transform, Op op)
-    {
-        return transformSkipService(transform, op, null, null) ; 
+    public static Op transformSkipService(Transform transform, Op op) {
+        return transformSkipService(transform, null, op, null, null) ;
     }
 
     /** Transform an algebra expression except skip (leave alone) any OpService nodes */
-    public static Op transformSkipService(Transform transform, ExprTransform exprTransform, Op op)
-    {
-        return transformSkipService(transform, exprTransform, op, null, null) ; 
+    public static Op transformSkipService(Transform transform, ExprTransform exprTransform, Op op) {
+        return transformSkipService(transform, exprTransform, op, null, null) ;
     }
 
-
     /** 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 )
-        {
-            // Simplest way but still walks the OpService subtree (and throws away the transformation).
-            Transform walker = new TransformSkipService(transform) ;
-            return Transformer.transform(walker, op, beforeVisitor, afterVisitor) ;
-        }
-        else
-        {
-            ApplyTransformVisitorServiceAsLeaf v = new ApplyTransformVisitorServiceAsLeaf(transform, null) ;
-            WalkerVisitorSkipService walker = new WalkerVisitorSkipService(v, beforeVisitor, afterVisitor) ;
-            OpWalker.walk(walker, op) ;
-            return v.result() ;
-        }
+    public static Op transformSkipService(Transform transform, ExprTransform exprTransform, Op op, OpVisitor beforeVisitor,
+                                          OpVisitor afterVisitor) {
+        // Simplest way but still walks the OpService subtree (and throws away the
+        // transformation).
+        Transform walker = new TransformSkipService(transform) ;
+        return Transformer.transform(walker, exprTransform, op, beforeVisitor, afterVisitor) ;
+        // XXX XXX Better to modify the walk and force the transform to be a no-op.
     }
 
-    /** Transform an algebra expression except skip (leave alone) any OpService nodes */
-    public static Op transformSkipService(Transform transform, ExprTransform exprTransform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor)
-    {
-        // Skip SERVICE
-        if ( true )
-        {
-            // Simplest way but still walks the OpService subtree (and throws away the transformation).
-            Transform walker = new TransformSkipService(transform) ;
-            return Transformer.transform(walker, exprTransform, op, beforeVisitor, afterVisitor) ;
-        }
-        else
-        {
-            ApplyTransformVisitorServiceAsLeaf v = new ApplyTransformVisitorServiceAsLeaf(transform, exprTransform) ;
-            WalkerVisitorSkipService walker = new WalkerVisitorSkipService(v, beforeVisitor, afterVisitor) ;
-            OpWalker.walk(walker, op) ;
-            return v.result() ;
-        }
-    }
-
-    // To allow subclassing this class, we use a singleton pattern 
+    // To allow subclassing this class, we use a singleton pattern
     // and theses protected methods.
-    protected Op transformation(Transform transform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor)
-    {
+    protected Op transformation(Transform transform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
         // XXX XXX
-        //ExprTransform exprTransform = new ExprTransformApplyTransform(transform, beforeVisitor, afterVisitor) ;
+        // 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 XXX Switch on before/after via the Walker.
-        if ( true )
-            return Walker.transform(op, transform, exprTransform, beforeVisitor, afterVisitor) ;
-        
-        if ( beforeVisitor == null && afterVisitor == null )
-            return Walker.transform(op, transform, exprTransform) ;
-//        static Set<Class<?>> seen = new HashSet<>() ;
-//        if ( ! seen.contains(beforeVisitor.getClass()) ) {
-//            System.out.println("T:"+beforeVisitor.getClass().getName()) ;
-//            seen.add(beforeVisitor.getClass()) ;
-//        }
-        ApplyTransformVisitor v = new ApplyTransformVisitor(transform, exprTransform) ;
-        return transformation(v, op, beforeVisitor, afterVisitor) ;
-    }
-    
-    protected Op transformation(ApplyTransformVisitor transformApply, Op op, 
-                                OpVisitor beforeVisitor, OpVisitor afterVisitor) {
-        if ( op == null ) {
-            Log.warn(this, "Attempt to transform a null Op - ignored") ;
-            return op ;
-        }
-        return applyTransformation(transformApply, op, beforeVisitor, afterVisitor) ;
-    }
-
-    /** The primitive operation to apply a transformation to an Op */
-    private /*protected*/ Op applyTransformation(ApplyTransformVisitor transformApply, Op op,
-                                     OpVisitor beforeVisitor, OpVisitor afterVisitor) {
-        OpWalker.walk(op, transformApply, beforeVisitor, afterVisitor) ;
-        Op r = transformApply.result() ;
-        return r ;
     }
     
-    protected Transformer() { }
-    
-    public static
-    class ApplyTransformVisitor extends OpVisitorByType
-    {
-        protected final Transform transform ;
-        private final ExprTransform exprTransform ;
-
-        private final Deque<Op> stack = new ArrayDeque<>() ;
-        protected final Op pop() 
-        { return stack.pop(); }
-        
-        protected final void push(Op op)
-        { 
-            // Including nulls
-            stack.push(op) ;
-        }
-        
-        public ApplyTransformVisitor(Transform transform, ExprTransform exprTransform)
-        { 
-            this.transform = transform ;
-            this.exprTransform = exprTransform ;
-        }
-        
-        final Op result()
-        {
-            if ( stack.size() != 1 )
-                Log.warn(this, "Stack is not aligned") ;
-            return pop() ; 
-        }
-
-        private static ExprList transform(ExprList exprList, ExprTransform exprTransform)
-        {
-            if ( exprList == null || exprTransform == null )
-                return exprList ;
-            return ExprTransformer.transform(exprTransform, exprList) ;
-        }
-
-        private static Expr transform(Expr expr, ExprTransform exprTransform)
-        {
-            if ( expr == null || exprTransform == null )
-                return expr ;
-            return ExprTransformer.transform(exprTransform, expr) ;
-        }
-        
-        // ----
-        // Algebra operations that involve an Expr, and so might include NOT EXISTS 
-
-        @Override
-        public void visit(OpOrder opOrder)
-        {
-            List<SortCondition> conditions = opOrder.getConditions() ;
-            List<SortCondition> conditions2 = new ArrayList<>() ;
-            boolean changed = false ;
-
-            for ( SortCondition sc : conditions )
-            {
-                Expr e = sc.getExpression() ;
-                Expr e2 = transform(e, exprTransform) ;
-                conditions2.add(new SortCondition(e2, sc.getDirection())) ;
-                if ( e != e2 )
-                    changed = true ;
-            }
-            OpOrder x = opOrder ;
-            if ( changed )
-                x = new OpOrder(opOrder.getSubOp(), conditions2) ;
-            visit1(x) ;
-        }
-        
-        @Override
-        public void visit(OpAssign opAssign)
-        { 
-            VarExprList varExpr = opAssign.getVarExprList() ;
-            VarExprList varExpr2 = process(varExpr, exprTransform) ;
-            OpAssign opAssign2 = opAssign ;
-            if ( varExpr != varExpr2 )
-                opAssign2 = OpAssign.create(opAssign.getSubOp(), varExpr2) ;
-            visit1(opAssign2) ;
-        }
-        
-        @Override
-        public void visit(OpExtend opExtend)
-        { 
-            VarExprList varExpr = opExtend.getVarExprList() ;
-            VarExprList varExpr2 = process(varExpr, exprTransform) ;
-            OpExtend opExtend2 = opExtend ;
-            if ( varExpr != varExpr2 )
-                opExtend2 = OpExtend.create(opExtend.getSubOp(), varExpr2) ;
-            visit1(opExtend2) ;
-        }
-        
-        private static VarExprList process(VarExprList varExpr, ExprTransform exprTransform)
-        {
-            List<Var> vars = varExpr.getVars() ;
-            VarExprList varExpr2 = new VarExprList() ;
-            boolean changed = false ;
-            for ( Var v : vars )
-            {
-                Expr e = varExpr.getExpr(v) ;
-                Expr e2 =  e ;
-                if ( e != null )
-                    e2 = transform(e, exprTransform) ;
-                if ( e2 == null )
-                    varExpr2.add(v) ;
-                else
-                    varExpr2.add(v, e2) ; 
-                if ( e != e2 )
-                    changed = true ;
-            }
-            if ( ! changed ) 
-                return varExpr ;
-            return varExpr2 ;
-        }
-
-        private static ExprList process(ExprList exprList, ExprTransform exprTransform)
-        {
-            if ( exprList == null )
-                return null ;
-            ExprList exprList2 = new ExprList() ;
-            boolean changed = false ;
-            for ( Expr e : exprList )
-            {
-                Expr e2 = process(e, exprTransform) ;
-                exprList2.add(e2) ; 
-                if ( e != e2 )
-                    changed = true ;
-            }
-            if ( ! changed ) 
-                return exprList ;
-            return exprList2 ;
-        }
-        
-        private static Expr process(Expr expr, ExprTransform exprTransform)
-        {
-            Expr e = expr ;
-            Expr e2 =  e ;
-            if ( e != null )
-                e2 = transform(e, exprTransform) ;
-            if ( e == e2 ) 
-                return expr ;
-            return e2 ;
-        }
-
-        @Override
-        public void visit(OpGroup opGroup)
-        {
-            boolean changed = false ;
-
-            VarExprList varExpr = opGroup.getGroupVars() ;
-            VarExprList varExpr2 = process(varExpr, exprTransform) ;
-            if ( varExpr != varExpr2 )
-                changed = true ;
-            
-            List<ExprAggregator> aggs = opGroup.getAggregators() ;
-            List<ExprAggregator> aggs2 = aggs ;
-            
-            //And the aggregators...
-            aggs2 = new ArrayList<>() ;
-            for ( ExprAggregator agg : aggs )
-            {
-                Aggregator aggregator = agg.getAggregator() ;
-                Var v = agg.getVar() ;
-                
-                // Variable associated with the aggregate
-                Expr eVar = agg.getAggVar() ;   // Not .getExprVar()
-                Expr eVar2 = transform(eVar, exprTransform) ;
-                if ( eVar != eVar2 )
-                    changed = true ;
-
-                // The Aggregator expression
-                ExprList e = aggregator.getExprList() ;
-                ExprList e2 = e ;
-                if ( e != null )    // Null means "no relevant expression" e.g. COUNT(*)
-                    e2 = transform(e, exprTransform) ;
-                if ( e != e2 )
-                    changed = true ;
-                Aggregator a2 = aggregator.copy(e2) ;
-                aggs2.add(new ExprAggregator(eVar2.asVar(), a2)) ;
-            }
-
-            OpGroup opGroup2 = opGroup ;
-            if ( changed )
-                opGroup2 = new OpGroup(opGroup.getSubOp(), varExpr2, aggs2) ;
-            visit1(opGroup2) ;
-        }
-        
-        // ----
-
-        @Override
-        protected void visit0(Op0 op)
-        {
-            push(op.apply(transform)) ;
-        }
-        
-        @Override
-        protected void visit1(Op1 op)
-        {
-            Op subOp = null ;
-            if ( op.getSubOp() != null )
-                subOp = pop() ;
-            push(op.apply(transform, subOp)) ;
-        }
-
-        @Override
-        protected void visit2(Op2 op)
-        { 
-            Op left = null ;
-            Op right = null ;
-    
-            // Must do right-left because the pushes onto the stack were left-right. 
-            if ( op.getRight() != null )
-                right = pop() ;
-            if ( op.getLeft() != null )
-                left = pop() ;
-            Op opX = op.apply(transform, left, right) ; 
-            push(opX) ;
-        }
-        
-        @Override
-        protected void visitN(OpN op)
-        {
-            List<Op> x = new ArrayList<>(op.size()) ;
-            
-            for ( Iterator<Op> iter = op.iterator() ; iter.hasNext() ; )
-            {
-                Op sub = iter.next() ;
-                Op r = pop() ;
-                // Skip nulls.
-                if ( r != null )
-                    // Add in reverse.
-                    x.add(0, r) ;
-            }
-            Op opX = op.apply(transform, x) ;  
-            push(opX) ;
-        }
-        
-        @Override
-        protected void visitFilter(OpFilter opFilter)
-        {
-            Op subOp = null ;
-            if ( opFilter.getSubOp() != null )
-                subOp = pop() ;
-            boolean changed = ( opFilter.getSubOp() != subOp ) ;
-
-            ExprList ex = opFilter.getExprs() ;
-            ExprList ex2 = process(ex, exprTransform) ;
-            OpFilter f = opFilter ;
-            if ( ex != ex2 )
-                f = (OpFilter)OpFilter.filter(ex2, subOp) ;
-            push(f.apply(transform, subOp)) ;
-        }
-        
-        @Override
-        protected void visitLeftJoin(OpLeftJoin op) {
-            Op left = null ;
-            Op right = null ;
-        
-            // Must do right-left because the pushes onto the stack were left-right. 
-            if ( op.getRight() != null )
-                right = pop() ;
-            if ( op.getLeft() != null )
-                left = pop() ;
-            
-            ExprList exprs = op.getExprs() ;
-            ExprList exprs2 = process(exprs, exprTransform) ;
-            OpLeftJoin x = op ;
-            if ( exprs != exprs2 )
-                x = OpLeftJoin.createLeftJoin(left, right, exprs2) ;
-            Op opX = x.apply(transform, left, right) ; 
-            push(opX) ;
-        }
-
-        @Override
-        protected void visitExt(OpExt op)
-        {
-            push(transform.transform(op)) ;
-        }
-    }
-    
-    // --------------------------------
-    // Transformations that avoid touching SERVICE.
-    // Modified classes to avoid transforming SERVICE/OpService.
-    // Plan A: In the application of the transform, skip OpService. 
-    
-    /** Treat OpService as a leaf of the tree */
-    static class ApplyTransformVisitorServiceAsLeaf extends ApplyTransformVisitor
-    {
-        public ApplyTransformVisitorServiceAsLeaf(Transform transform, ExprTransform exprTransform)
-        {
-            super(transform, exprTransform) ;
-        }
-        
-        @Override
-        public void visit(OpService op)
-        {
-            // Treat as a leaf that does not change.
-            push(op) ;
-        }
-    }
-    
-    // Plan B: The walker skips walking into OpService nodes.
-    
-    /** Don't walk down an OpService sub-operation */
-    static class WalkerVisitorSkipService extends WalkerVisitor
-    {
-        public WalkerVisitorSkipService(OpVisitor visitor, OpVisitor beforeVisitor, OpVisitor afterVisitor)
-        {
-            super(visitor, beforeVisitor, afterVisitor) ;
-        }
-        
-        public WalkerVisitorSkipService(OpVisitor visitor)
-        {
-            super(visitor) ;
-        }
-        
-        @Override
-        public void visit(OpService op)
-        { 
-            before(op) ;
-            // visit1 code from WalkerVisitor
-//            if ( op.getSubOp() != null ) op.getSubOp().visit(this) ;
-            
-            // Just visit the OpService node itself.
-            // The transformer needs to push the code as a result (see ApplyTransformVisitorSkipService)
-            if ( visitor != null ) op.visit(visitor) ;
-            
-            after(op) ;
-        }
-        
+    protected Op transformation(Transform transform, ExprTransform exprTransform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        return Walker.transform(op, transform, exprTransform, beforeVisitor, afterVisitor) ;
     }
     
     // --------------------------------
     // Safe: ignore transformation of OpService and return the original.
-    // Still walks the sub-op of OpService 
+    // Still walks the sub-op of OpService unless combined with a walker that does not go
+    // down SERVICE
     static class TransformSkipService extends TransformWrapper
     {
         public TransformSkipService(Transform transform)

http://git-wip-us.apache.org/repos/asf/jena/blob/b679b06f/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 8de2dc0..dc5e341 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
@@ -153,7 +153,7 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
 
     // Special test cases for collectors.
     
-    // XXX XXX Check order 
+    // XXX XXX Check order : Check for "same"/unchanged
     private VarExprList collect(VarExprList varExprList) {
         if ( varExprList == null )
             return varExprList ;
@@ -167,7 +167,7 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
       for ( int i = 0 ; i < vars.size() ; i++ ) {
           Var v = vars.get(i) ;
           Expr e2 = x.get(i) ;
-          if ( e2 == null || e2 ==  ExprNone.NONE )
+          if ( e2 == null )
               varExpr2.add(v) ;
           else
               varExpr2.add(v, e2) ;
@@ -175,57 +175,33 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
       return varExpr2 ;
     }  
         
-    // XXX XXX Check order 
+    // XXX XXX Check order : Check for "same"/unchanged
     private ExprList collect(ExprList exprList) {
         if ( exprList == null )
             return null ;
         return new ExprList(collect(exprList.size())) ;
     }
     
-    // XXX XXX Check order 
+    // XXX XXX Check order : Check for "same"/unchanged
     private ExprList collect(List<Expr> exprList) {
         if ( exprList == null )
             return null ;
         return new ExprList(collect(exprList.size())) ;
     }
     
-    // collect and return in the original order (stacks reverse order). 
+    // collect and return in the original order (take account of stack reversal). 
     private List<Expr> collect(int N) {
+        // Check for "same"/unchanged
         List<Expr> x = new ArrayList<>(N) ;
         for ( int i = N-1 ; i >= 0 ; i-- ) {
             Expr e2 = pop(exprStack) ;
+            if ( e2 ==  ExprNone.NONE )
+                e2 = null ;
             x.add(0, e2) ;
         }
         return x ;
     }
     
-    // XXX collectExpr(N)
-
-    //    private ExprList process(ExprList exprList) {
-//        if ( exprList == null )
-//            return null ;
-//        ExprList exprList2 = new ExprList() ;
-//        boolean changed = false ;
-//        for ( Expr e : exprList ) {
-//            Expr e2 = process(e) ;
-//            exprList2.add(e2) ;
-//            if ( e != e2 )
-//                changed = true ;
-//        }
-//        if ( !changed )
-//            return exprList ;
-//        return exprList2 ;
-//
-//    private Expr process(Expr expr) {
-//        Expr e = expr ;
-//        Expr e2 = e ;
-//        if ( e != null )
-//            e2 = transform(e) ;
-//        if ( e == e2 )
-//            return expr ;
-//        return e2 ;
-//    }
-//
     @Override
     public void visit(OpGroup opGroup) {
         boolean changed = false ;

http://git-wip-us.apache.org/repos/asf/jena/blob/b679b06f/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/OpVisitorByType.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/OpVisitorByType.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/OpVisitorByType.java
new file mode 100644
index 0000000..8116f13
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/OpVisitorByType.java
@@ -0,0 +1,217 @@
+/*
+ * 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.algebra.walker;
+
+import org.apache.jena.sparql.algebra.OpVisitor ;
+import org.apache.jena.sparql.algebra.op.* ;
+
+/** A visitor helper that maps all visits to a few general ones.
+ *  Does not visit expressions at all. */ 
+public interface OpVisitorByType extends OpVisitor
+{
+    public void visitN(OpN op) ;
+
+    public void visit2(Op2 op) ;
+    
+    public void visit1(Op1 op) ;
+    
+    public void visit0(Op0 op) ;    
+    
+    public default void visitExt(OpExt op) {
+        op.effectiveOp().visit(this);
+    }
+
+    public default void visitModifer(OpModifier opMod) {
+        visit1(opMod);
+    }
+
+    @Override
+    public default void visit(OpBGP opBGP) {
+        visit0(opBGP);
+    }
+
+    @Override
+    public default void visit(OpQuadPattern quadPattern) {
+        visit0(quadPattern);
+    }
+
+    @Override
+    public default void visit(OpQuadBlock quadBlock) {
+        visit0(quadBlock);
+    }
+
+    @Override
+    public default void visit(OpTriple opTriple) {
+        visit0(opTriple);
+    }
+
+    @Override
+    public default void visit(OpQuad opQuad) {
+        visit0(opQuad);
+    }
+
+    @Override
+    public default void visit(OpPath opPath) {
+        visit0(opPath);
+    }
+
+    @Override
+    public default void visit(OpProcedure opProcedure) {
+        visit1(opProcedure);
+    }
+
+    @Override
+    public default void visit(OpPropFunc opPropFunc) {
+        visit1(opPropFunc);
+    }
+
+    @Override
+    public default void visit(OpJoin opJoin) {
+        visit2(opJoin);
+    }
+
+    @Override
+    public default void visit(OpSequence opSequence) {
+        visitN(opSequence);
+    }
+
+    @Override
+    public default void visit(OpDisjunction opDisjunction) {
+        visitN(opDisjunction);
+    }
+
+    @Override
+    public default void visit(OpLeftJoin opLeftJoin) {
+        visit2(opLeftJoin);
+    }
+
+    @Override
+    public default void visit(OpDiff opDiff) {
+        visit2(opDiff);
+    }
+
+    @Override
+    public default void visit(OpMinus opMinus) {
+        visit2(opMinus);
+    }
+
+    @Override
+    public default void visit(OpUnion opUnion) {
+        visit2(opUnion);
+    }
+
+    @Override
+    public default void visit(OpConditional opCond) {
+        visit2(opCond);
+    }
+
+    @Override
+    public default void visit(OpFilter opFilter) {
+        visit1(opFilter);
+    }
+
+    @Override
+    public default void visit(OpGraph opGraph) {
+        visit1(opGraph);
+    }
+
+    @Override
+    public default void visit(OpService opService) {
+        visit1(opService);
+    }
+
+    @Override
+    public default void visit(OpDatasetNames dsNames) {
+        visit0(dsNames);
+    }
+
+    @Override
+    public default void visit(OpTable opUnit) {
+        visit0(opUnit);
+    }
+
+    @Override
+    public default void visit(OpExt opExt) {
+        visitExt(opExt);
+    }
+
+    @Override
+    public default void visit(OpNull opNull) {
+        visit0(opNull);
+    }
+
+    @Override
+    public default void visit(OpLabel opLabel) {
+        visit1(opLabel);
+    }
+
+    @Override
+    public default void visit(OpOrder opOrder) {
+        // XXX XXX
+        //opOrder.getConditions() ;
+        visitModifer(opOrder);
+    }
+
+    @Override
+    public default void visit(OpGroup opGroup) {
+        visit1(opGroup);
+    }
+
+    @Override
+    public default void visit(OpTopN opTop) {
+        // XXX XXX
+        // opTop.getConditions() ;
+        visit1(opTop);
+    }
+    
+    @Override
+    public default void visit(OpAssign opAssign) {
+        visit1(opAssign);
+    }
+
+    @Override
+    public default void visit(OpExtend opExtend) {
+        visit1(opExtend);
+    }
+
+    @Override
+    public default void visit(OpList opList) {
+        visitModifer(opList);
+    }
+
+    @Override
+    public default void visit(OpProject opProject) {
+        visitModifer(opProject);
+    }
+
+    @Override
+    public default void visit(OpReduced opReduced) {
+        visitModifer(opReduced);
+    }
+
+    @Override
+    public default void visit(OpDistinct opDistinct) {
+        visitModifer(opDistinct);
+    }
+
+    @Override
+    public default void visit(OpSlice opSlice) {
+        visitModifer(opSlice);
+    }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/b679b06f/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 61595d3..b1a93f5 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
@@ -23,17 +23,18 @@ import org.apache.jena.sparql.algebra.op.* ;
 import org.apache.jena.sparql.core.VarExprList ;
 import org.apache.jena.sparql.expr.ExprList ;
 
-/** A visitor helper that maps all visits to a few general ones */ 
+/** A visitor helper that maps all visits to a few general ones.
+ *  Includes visitring expressions.  */ 
 public interface OpVisitorByTypeAndExpr extends OpVisitor
 {
-    public void visitN(OpN op) ;
-
-    public void visit2(Op2 op) ;
+    public void visit0(Op0 op) ;    
     
     public void visit1(Op1 op) ;
     
-    public void visit0(Op0 op) ;    
+    public void visit2(Op2 op) ;
     
+    public void visitN(OpN op) ;
+
     public default void visitExt(OpExt op) {
         op.effectiveOp().visit(this);
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/b679b06f/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 a0b484c..3952be5 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
@@ -48,7 +48,16 @@ public class Walker {
     public static void walk(Op op, OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
         if ( op == null )
             return ;
-        createWalker(opVisitor, exprVisitor, beforeVisitor, afterVisitor).walk(op);
+        walk$(op, opVisitor, exprVisitor, beforeVisitor, afterVisitor) ;
+    }
+    
+    private static void walk$(Op op, OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        WalkerVisitor wv = createWalker(opVisitor, exprVisitor, beforeVisitor, afterVisitor) ;
+        walk$(op, wv) ;
+    }
+    
+    private static void walk$(Op op, WalkerVisitor walker) {
+        walker.walk(op);
     }
 
     /** Walk visiting every {@link Expr} with an {@link ExprVisitor},
@@ -72,10 +81,17 @@ public class Walker {
     public static void walk(Expr expr, OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
         if ( expr == null )
             return ;
-        Objects.requireNonNull(expr) ;
-        createWalker(opVisitor, exprVisitor, beforeVisitor,afterVisitor).walk(expr);
+        walk$(expr, opVisitor, exprVisitor, beforeVisitor,afterVisitor) ;
     }
     
+    private static void walk$(Expr expr, OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        WalkerVisitor wv = createWalker(opVisitor, exprVisitor, beforeVisitor,afterVisitor) ;
+        walk$(expr, wv);
+    }
+    
+    private static void walk$(Expr expr, WalkerVisitor walker) {
+        walker.walk(expr);
+    }
 
     /** Walk visiting every {@link Expr} with an {@link ExprVisitor},
      * including inside any {@link Op} in expressions.

http://git-wip-us.apache.org/repos/asf/jena/blob/b679b06f/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 0d9e24a..4537cd7 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
@@ -31,7 +31,6 @@ import org.apache.jena.sparql.expr.* ;
 public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunction {
     protected final ExprVisitor exprVisitor ;
     protected final OpVisitor   opVisitor ;
-    protected boolean           visitService      = true ;
     protected int               opDepthLimit      = Integer.MAX_VALUE ;
     protected int               exprDepthLimit    = Integer.MAX_VALUE ;
 
@@ -62,12 +61,12 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
         afterVisitor = after ;
     }
 
-    private void before(Op op) {
+    protected final void before(Op op) {
         if ( beforeVisitor != null )
             op.visit(beforeVisitor) ;
     }
 
-    private void after(Op op) {
+    protected final void after(Op op) {
         if ( afterVisitor != null )
             op.visit(afterVisitor) ;
     }
@@ -102,7 +101,11 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
     public void walk(VarExprList varExprList) {
         if ( varExprList == null )
             return ;
-        varExprList.forEachVarExpr((v,e) -> walk( e!=null ? e : ExprNone.NONE ));
+        // retains order.
+        varExprList.forEachVarExpr((v,e) -> {
+            Expr expr = (e!=null) ? e : ExprNone.NONE ; 
+            walk(expr) ;
+        });
     }
 
     // ---- Mode swapping between op and expr. visit=>?walk
@@ -173,7 +176,7 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
             op.visit(opVisitor) ;
         after(op) ;
     }
-
+    
     @Override
     public void visitExt(OpExt op) {
         before(op) ;
@@ -182,16 +185,6 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
         after(op) ;
     }
 
-    // Special case Ops.
-    // These should call super.visit to do full processing.
-    
-    @Override
-    public void visit(OpService op) {
-        if ( ! visitService )
-            return ;
-        OpVisitorByTypeAndExpr.super.visit(op) ;
-    }
-    
     @Override
     public void visit(OpOrder opOrder) {
         // XXX XXX

http://git-wip-us.apache.org/repos/asf/jena/blob/b679b06f/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitorSkipService.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitorSkipService.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitorSkipService.java
new file mode 100644
index 0000000..9adc426
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitorSkipService.java
@@ -0,0 +1,38 @@
+/*
+ * 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.algebra.walker;
+
+import org.apache.jena.sparql.algebra.OpVisitor ;
+import org.apache.jena.sparql.algebra.op.OpService ;
+import org.apache.jena.sparql.expr.ExprVisitor ;
+
+/** Walk algebra and expressions, but don't walk into SERVICE */
+public class WalkerVisitorSkipService extends WalkerVisitor {
+
+    public WalkerVisitorSkipService(OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor before, OpVisitor after) {
+        super(opVisitor, exprVisitor, before, after) ;
+    }
+    
+    @Override
+    public void visit(OpService op) {
+        return ;
+    }
+}
+
+

http://git-wip-us.apache.org/repos/asf/jena/blob/b679b06f/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitorVisible.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitorVisible.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitorVisible.java
new file mode 100644
index 0000000..be1f9c3
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitorVisible.java
@@ -0,0 +1,67 @@
+/*
+ * 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.algebra.walker;
+
+import org.apache.jena.sparql.algebra.OpVisitor ;
+import org.apache.jena.sparql.algebra.op.OpMinus ;
+import org.apache.jena.sparql.algebra.op.OpProject ;
+import org.apache.jena.sparql.expr.ExprFunctionOp ;
+import org.apache.jena.sparql.expr.ExprVisitor ;
+
+/** Walk algebra 
+ * Do project, don't walk into it.
+ * Don' walk into RHS of MINUS nor ExprFunctionOp (NOT EXISTS etc)
+ */
+public class WalkerVisitorVisible extends WalkerVisitor {
+    
+    public WalkerVisitorVisible(OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor before, OpVisitor after) {
+        super(opVisitor, exprVisitor, before, after) ;
+    }
+
+    @Override
+    public void visit(OpProject op) {
+        //before(op) ;
+        // Skip inner.
+        //after(op) ;
+    }
+
+    @Override
+    public void visit(OpMinus op) {
+        before(op) ;
+        if (op.getLeft() != null)
+            op.getLeft().visit(this) ;
+        // Skip right.
+        // if ( op.getRight() != null ) op.getRight().visit(this) ;
+        if (opVisitor != null)
+            op.visit(opVisitor) ;
+        after(op) ;
+    }
+    
+    @Override
+    public void visit(ExprFunctionOp funcOp) {
+        // Skip the pattern
+        //walk(funcOp.getGraphPattern());
+        if ( exprVisitor != null )
+            funcOp.visit(exprVisitor) ;
+    }
+    
+
+}
+
+

http://git-wip-us.apache.org/repos/asf/jena/blob/b679b06f/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestTransformOpExt.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestTransformOpExt.java b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestTransformOpExt.java
index f46b21c..0e5bc1d 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestTransformOpExt.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestTransformOpExt.java
@@ -45,7 +45,7 @@ public class TestTransformOpExt extends BaseTest
 
         @Override
         public Op apply(Transform transform, OpVisitor before, OpVisitor after) {
-            Op opx = Transformer.transformSkipService(transform, op, before, after) ;
+            Op opx = Transformer.transformSkipService(transform, null, op, before, after) ;
             return new OpExtTest(opx) ;
         }
 


[15/23] jena git commit: The new walker uncovers the true scoping. Fix tests.

Posted by an...@apache.org.
The new walker uncovers the true scoping. Fix tests.

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

Branch: refs/heads/master
Commit: 3c08cdec8109a06cc59f8b949edf3f8b15220ae7
Parents: bcc4aa9
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Apr 25 13:30:46 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../TestTransformEliminateAssignments.java      | 46 +++++++++++++-------
 1 file changed, 31 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/3c08cdec/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestTransformEliminateAssignments.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestTransformEliminateAssignments.java b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestTransformEliminateAssignments.java
index dc0daff..2de716c 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestTransformEliminateAssignments.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestTransformEliminateAssignments.java
@@ -504,41 +504,57 @@ public class TestTransformEliminateAssignments {
 
     @Test
     public void exists_01() {
+        // (extend) used in the filter-exists
+        //@formatter:off
+        testNoChange("(project (?y)",
+                     "  (filter (exists",
+                     "            (filter  ?x (table unit)))",
+                     "    (extend (?x true)",
+                     "      (table unit))))") ; 
+        //@formatter:on
+    }
+
+    @Test
+    public void exists_02() {
         // We can't inline into an EXISTS since the assignment isn't projected
         // out anyway and its an n-ary operator so would change semantics
         // However this makes the assignment unused so can still remove it
         //@formatter:off
         test(StrUtils.strjoinNL("(project (?y)",
-                               "  (filter (exprlist (exists",
-                               "                      (filter (exprlist ?x)",
-                               "                        (table unit))))",
+                               "  (filter (exists",
+                               "            (filter ?z",
+                               "              (table unit)))",
                                "    (extend (?x true)",
                                "      (table unit))))"),
             "(project (?y)",
             "  (filter (exprlist (exists",
-            "                      (filter (exprlist ?x)",
+            "                      (filter (exprlist ?z)",
             "                        (table unit))))",
             "    (table unit)))");
         //@formatter:on
     }
 
+
     @Test
-    public void exists_02() {
-        // Could inline within an exists but still needs to meet other rules
-        // Even though an exists is technically a form of projection can't
-        // discount the variable being needed elsewhere
+    public void exists_03() {
+        // "?x" not used elsewhere.
         //@formatter:off
-        testNoChange("(project (?y)",
-                     "  (filter (exprlist (exists",
-                     "                      (filter (exprlist ?x)",
-                     "                        (extend (?x true)",
-                     "                          (table unit)))))",
-                     "    (table unit)))");
+        test(StrUtils.strjoinNL("(project (?y)",
+                                "  (filter (exists ",
+                                "            (filter ?x",
+                                "              (extend (?x true)",
+                                "                 (table unit))))",
+                                "    (table unit)))"),
+            "(project (?y)",
+            "  (filter (exists (filter true (table unit)))",
+            "     (table unit)",
+            "))") ;
+            
         //@formatter:on
     }
 
     @Test
-    public void exists_03() {
+    public void exists_04() {
         // Can inline within an exists provided it meets normal conditions of
         // being inside a projection
         //@formatter:off


[08/23] jena git commit: Expr.toString - output in algebra form.

Posted by an...@apache.org.
Expr.toString - output in algebra form.

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

Branch: refs/heads/master
Commit: c553b94c99f71b0496286e6543ca4149df1397c7
Parents: c1fde99
Author: Andy Seaborne <an...@apache.org>
Authored: Sat Apr 23 00:19:17 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/c553b94c/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java
index 58aa19f..9c0016b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java
@@ -27,7 +27,7 @@ import org.apache.jena.sparql.engine.binding.Binding ;
 import org.apache.jena.sparql.expr.nodevalue.XSDFuncOp ;
 import org.apache.jena.sparql.function.FunctionEnv ;
 import org.apache.jena.sparql.graph.NodeTransform;
-import org.apache.jena.sparql.util.ExprUtils ;
+import org.apache.jena.sparql.sse.writers.WriterExpr ;
 
 
 /** A node that is a constraint expression that can be evaluated
@@ -121,5 +121,5 @@ public abstract class ExprNode implements Expr
     public boolean isGraphPattern()     { return false ; }
     public Op getGraphPattern()         { return null ; }
     @Override
-    public String toString()            { return ExprUtils.fmtSPARQL(this) ; } 
+    public String toString()            { return WriterExpr.asString(this) ; } // was ExprUtils.fmtSPARQL(this) 
 }


[02/23] jena git commit: Deal with marked "todo" items

Posted by an...@apache.org.
Deal with marked "todo" items

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

Branch: refs/heads/master
Commit: 663f066764fcda37ff71bcd47127f539a6247d9b
Parents: cebdc3b
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Apr 25 19:22:42 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../algebra/walker/ApplyTransformVisitor.java   | 103 ++++---
 .../sparql/algebra/walker/OpVisitorByType.java  |   6 +-
 .../algebra/walker/OpVisitorByTypeAndExpr.java  |  20 +-
 .../jena/sparql/algebra/walker/Walker.java      |   6 +
 .../sparql/algebra/walker/WalkerVisitor0.java   | 308 +++++++++++++++++++
 .../jena/sparql/expr/ExprTransformer.java       |  11 +
 6 files changed, 398 insertions(+), 56 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/663f0667/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 126e985..499ab72 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
@@ -20,6 +20,7 @@ package org.apache.jena.sparql.algebra.walker;
 
 import java.util.* ;
 
+import org.apache.jena.atlas.lib.InternalErrorException ;
 import org.apache.jena.atlas.logging.Log ;
 import org.apache.jena.query.SortCondition ;
 import org.apache.jena.sparql.algebra.Op ;
@@ -64,34 +65,25 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
         return pop(exprStack) ;
     }
     
-    private static boolean ISOLATE = false ;
-
-    protected Op transform(Op op) {
-        // XXX XXX
-        //if ( ISOLATE ) { }
-        
-        int x1 = opStack.size() ;
-        int x2 = exprStack.size() ;
-        try {
-            // reuse this ApplyTransformVisitor? with stack checking?
-            return Walker.transform(op, this, beforeVisitor, afterVisitor) ;
-        } finally {
-            int y1 = opStack.size() ;
-            int y2 = exprStack.size() ;
-            if ( x1 != y1 )
-                System.err.println("Misaligned opStack") ;
-            if ( x2 != y2 )
-                System.err.println("Misaligned exprStack") ;
-        }
-    }
-    
+//    protected Op transform(Op op) {
+//        int x1 = opStack.size() ;
+//        int x2 = exprStack.size() ;
+//        try {
+//            return Walker.transform(op, this, beforeVisitor, afterVisitor) ;
+//        } finally {
+//            int y1 = opStack.size() ;
+//            int y2 = exprStack.size() ;
+//            if ( x1 != y1 )
+//                System.err.println("Misaligned opStack") ;
+//            if ( x2 != y2 )
+//                System.err.println("Misaligned exprStack") ;
+//        }
+//    }
+
+    // These three could be calls within WalkerVisitor followed by "collect".
     protected Expr transform(Expr expr) {
-        // XXX XXX
-        //if ( ISOLATE ) { }
-        
         int x1 = opStack.size() ;
         int x2 = exprStack.size() ;
-        // reuse this ApplyTransformVisitor? with stack checking?
         try {
             return Walker.transform(expr, this, beforeVisitor, afterVisitor) ;
         } finally {
@@ -112,6 +104,25 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
         return exprList2 ;
     }
 
+    protected List<SortCondition> transform(List<SortCondition> conditions) {
+        List<SortCondition> conditions2 = new ArrayList<>() ;
+        boolean changed = false ;
+
+        for ( SortCondition sc : conditions ) {
+            Expr e = sc.getExpression() ;
+            Expr e2 = transform(e) ;
+            conditions2.add(new SortCondition(e2, sc.getDirection())) ;
+            if ( e != e2 )
+                changed = true ;
+        }
+        if ( changed )
+            return conditions2 ;
+        else
+            return conditions ;
+  }
+
+    // Interact with WalkerVisitor.
+
     @Override
     public void visit(OpOrder opOrder) {
         List<SortCondition> conditions = opOrder.getConditions() ;
@@ -152,8 +163,8 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
     }
 
     // Special test cases for collectors.
-    
-    // XXX XXX Check order : Check for "same"/unchanged
+
+    // Careful about order.
     private VarExprList collect(VarExprList varExprList) {
         if ( varExprList == null )
             return varExprList ;
@@ -161,28 +172,41 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
       VarExprList varExpr2 = new VarExprList() ;
       
       List<Expr> x = collect(vars.size()) ;
+
+//      for ( int i = 0 ; i < vars.size() ; i++ ) {
+//          Var v = vars.get(i) ;
+//          Expr e2 = x.get(i) ;
+//          if ( e2 == null )
+//              varExpr2.add(v) ;
+//          else
+//              varExpr2.add(v, e2) ;
+//      }
+//      return varExpr2 ;
       
-      boolean changed = false ;     // XXX XXX
+      boolean changed = false ;
 
       for ( int i = 0 ; i < vars.size() ; i++ ) {
           Var v = vars.get(i) ;
           Expr e2 = x.get(i) ;
+          Expr e = varExpr2.getExpr(v) ;
+          if ( e != e2 )
+              changed = true ;
           if ( e2 == null )
               varExpr2.add(v) ;
-          else
+          else {
               varExpr2.add(v, e2) ;
+          }
       }
-      return varExpr2 ;
+      return changed ? varExpr2 : varExprList ;
+
     }  
         
-    // XXX XXX Check order : Check for "same"/unchanged
     private ExprList collect(ExprList exprList) {
         if ( exprList == null )
             return null ;
         return new ExprList(collect(exprList.size())) ;
     }
     
-    // XXX XXX Check order : Check for "same"/unchanged
     private ExprList collect(List<Expr> exprList) {
         if ( exprList == null )
             return null ;
@@ -338,7 +362,6 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
             push(opStack, op) ;
             return ;
         }
-        // op.getService()
         OpVisitorByTypeAndExpr.super.visit(op);
     }
 
@@ -349,22 +372,12 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
     
     @Override
     public void visitExpr(ExprList exprs) { 
-        // XXX XXX
-        // Not called?
-        System.err.println("visitExpr(ExprList)") ;
-        if ( exprs != null && exprTransform != null ) {
-            
-        }
+        throw new InternalErrorException("Didn't expect as call to ApplyTransformVisit.visitExpr") ;
     }
     
     @Override
     public void visitVarExpr(VarExprList exprVarExprList)  {
-        // XXX XXX
-        // Not called?
-        System.err.println("visitExpr(ExprList)") ;
-        if ( exprVarExprList != null && exprTransform != null ) {
-            
-        }
+        throw new InternalErrorException("Didn't expect as call to ApplyTransformVisit.visitVarExpr") ;
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/jena/blob/663f0667/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/OpVisitorByType.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/OpVisitorByType.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/OpVisitorByType.java
index 8116f13..3f37329 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/OpVisitorByType.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/OpVisitorByType.java
@@ -25,6 +25,8 @@ import org.apache.jena.sparql.algebra.op.* ;
  *  Does not visit expressions at all. */ 
 public interface OpVisitorByType extends OpVisitor
 {
+    public void DUMMY() ;
+
     public void visitN(OpN op) ;
 
     public void visit2(Op2 op) ;
@@ -163,8 +165,6 @@ public interface OpVisitorByType extends OpVisitor
 
     @Override
     public default void visit(OpOrder opOrder) {
-        // XXX XXX
-        //opOrder.getConditions() ;
         visitModifer(opOrder);
     }
 
@@ -175,8 +175,6 @@ public interface OpVisitorByType extends OpVisitor
 
     @Override
     public default void visit(OpTopN opTop) {
-        // XXX XXX
-        // opTop.getConditions() ;
         visit1(opTop);
     }
     

http://git-wip-us.apache.org/repos/asf/jena/blob/663f0667/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 b1a93f5..17ccca4 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
@@ -18,13 +18,18 @@
 
 package org.apache.jena.sparql.algebra.walker;
 
+import java.util.List ;
+
+import org.apache.jena.query.SortCondition ;
 import org.apache.jena.sparql.algebra.OpVisitor ;
 import org.apache.jena.sparql.algebra.op.* ;
 import org.apache.jena.sparql.core.VarExprList ;
+import org.apache.jena.sparql.expr.ExprAggregator ;
 import org.apache.jena.sparql.expr.ExprList ;
 
 /** A visitor helper that maps all visits to a few general ones.
- *  Includes visitring expressions.  */ 
+ *  Includes visiting expressions, sort conditions etc
+ */
 public interface OpVisitorByTypeAndExpr extends OpVisitor
 {
     public void visit0(Op0 op) ;    
@@ -43,6 +48,10 @@ public interface OpVisitorByTypeAndExpr extends OpVisitor
     public void visitVarExpr(VarExprList exprs) ;
     //public void visitAssignVar(Var var) ;
     
+    // Currently, we assume these are handled by the visitor/transformer.
+    public default void visitSortConditions(List<SortCondition> list)       {}
+    public default void visitAggregators(List<ExprAggregator> aggregators)  {}
+
     public default void visitModifer(OpModifier opMod) {
         visit1(opMod);
     }
@@ -171,23 +180,20 @@ public interface OpVisitorByTypeAndExpr extends OpVisitor
 
     @Override
     public default void visit(OpOrder opOrder) {
-        // XXX XXX
-        //opOrder.getConditions() ;
+        visitSortConditions(opOrder.getConditions()) ;
         visitModifer(opOrder);
     }
 
     @Override
     public default void visit(OpGroup opGroup) {
         visitVarExpr(opGroup.getGroupVars()) ;
-        // XXX XXX
-        //opGroup.getAggregators() ;
+        visitAggregators(opGroup.getAggregators()) ;
         visit1(opGroup);
     }
 
     @Override
     public default void visit(OpTopN opTop) {
-        // XXX XXX
-        // opTop.getConditions() ;
+        visitSortConditions(opTop.getConditions()) ;
         visit1(opTop);
     }
     

http://git-wip-us.apache.org/repos/asf/jena/blob/663f0667/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 2a31b4e..3b122d5 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
@@ -201,6 +201,12 @@ public class Walker {
     }
 
     /** Transform an {@link Expr}. */
+    public static Expr transform(Expr expr, Transform opTransform, ExprTransform exprTransform, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        ApplyTransformVisitor v = createTransformer(opTransform, exprTransform, beforeVisitor,afterVisitor) ;
+        return transform(expr, v, beforeVisitor, afterVisitor) ;
+    }
+
+    /** Transform an {@link Expr}. */
     public static Expr transform(Expr expr, ApplyTransformVisitor v) {
         walk(expr, v, v, null, null) ;
         return v.exprResult() ;

http://git-wip-us.apache.org/repos/asf/jena/blob/663f0667/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java
new file mode 100644
index 0000000..df99488
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java
@@ -0,0 +1,308 @@
+/*
+ * 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.algebra.walker;
+
+import java.util.Iterator ;
+
+import org.apache.jena.sparql.algebra.Op ;
+import org.apache.jena.sparql.algebra.OpVisitor ;
+import org.apache.jena.sparql.algebra.OpVisitorBase ;
+import org.apache.jena.sparql.algebra.op.* ;
+import org.apache.jena.sparql.core.VarExprList ;
+import org.apache.jena.sparql.expr.* ;
+
+/** Walk algebra and expressions */
+public class WalkerVisitor0 implements OpVisitorByTypeAndExpr, ExprVisitorFunction {
+    protected final ExprVisitor exprVisitor ;
+    protected final OpVisitor   opVisitor ;
+    protected int               opDepthLimit      = Integer.MAX_VALUE ;
+    protected int               exprDepthLimit    = Integer.MAX_VALUE ;
+
+    protected int               opDepth      = 0 ;
+    protected int               exprDepth    = 0 ;
+    
+    private final OpVisitor     beforeVisitor ;
+    private final OpVisitor     afterVisitor ;
+
+    /**
+     * A walker. If a visitor is null, then don't walk in. For
+     * "no action but keep walking inwards", use {@link OpVisitorBase} and
+     * {@link ExprVisitorBase}.
+     * 
+     * @see OpVisitorBase
+     * @see ExprVisitorBase
+     */
+    public WalkerVisitor0(OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor before, OpVisitor after) {
+        this.opVisitor = opVisitor ;
+        this.exprVisitor = exprVisitor ;
+        if ( opDepthLimit < 0 )
+            opDepthLimit = Integer.MAX_VALUE ;
+        if ( exprDepth < 0 )
+            exprDepthLimit = Integer.MAX_VALUE ;
+        opDepth = 0 ;
+        exprDepth = 0 ;
+        beforeVisitor = before ;
+        afterVisitor = after ;
+    }
+
+    protected final void before(Op op) {
+        if ( beforeVisitor != null )
+            op.visit(beforeVisitor) ;
+    }
+
+    protected final void after(Op op) {
+        if ( afterVisitor != null )
+            op.visit(afterVisitor) ;
+    }
+    
+    public void walk(Op op) {
+        if ( op == null )
+            return ;
+        if ( opDepth == opDepthLimit )
+            // No deeper.
+            return ;
+        opDepth++ ; 
+        try { op.visit(this); }
+        finally { opDepth-- ; }
+    }
+    
+    public void walk(Expr expr) {
+        if ( expr == null )
+            return ;
+        if ( exprDepth == exprDepthLimit )
+            return ;
+        exprDepth++ ;
+        try { expr.visit(this) ; }
+        finally { exprDepth-- ; }
+    }
+    
+    public void walk(ExprList exprList) {
+        if ( exprList == null )
+            return ;
+        exprList.forEach(e->walk(e));
+    }
+
+    public void walk(VarExprList varExprList) {
+        if ( varExprList == null )
+            return ;
+        // retains order.
+        varExprList.forEachVarExpr((v,e) -> {
+            Expr expr = (e!=null) ? e : ExprNone.NONE ; 
+            walk(expr) ;
+        });
+    }
+
+    // ---- Mode swapping between op and expr. visit=>?walk
+    @Override
+    public void visitExpr(ExprList exprList) {
+        if ( exprVisitor != null )
+            walk(exprList) ;
+    }
+
+    @Override
+    public void visitVarExpr(VarExprList varExprList) {
+        if ( exprVisitor != null )
+            walk(varExprList);
+    }
+    
+    // ----
+    
+    public void visitOp(Op op) {
+        before(op) ;
+        if ( opVisitor != null )
+            op.visit(this);
+        after(op) ;
+    }
+
+    @Override
+    public void visit0(Op0 op) {
+        before(op) ;
+        if ( opVisitor != null )
+            op.visit(opVisitor) ;
+        after(op) ;
+    }
+
+    @Override
+    public void visit1(Op1 op) {
+        before(op) ;
+        visit1$(op) ;
+        after(op) ;
+    }
+    
+    // Can be called via different routes. 
+    private void visit1$(Op1 op) {
+        if ( op.getSubOp() != null )
+            op.getSubOp().visit(this) ;
+        if ( opVisitor != null )
+            op.visit(opVisitor) ;
+    }
+
+    @Override
+    public void visit2(Op2 op) {
+        before(op) ;
+        if ( op.getLeft() != null )
+            op.getLeft().visit(this) ;
+        if ( op.getRight() != null )
+            op.getRight().visit(this) ;
+        if ( opVisitor != null )
+            op.visit(opVisitor) ;
+        after(op) ;
+    }
+
+    @Override
+    public void visitN(OpN op) {
+        before(op) ;
+        for (Iterator<Op> iter = op.iterator(); iter.hasNext();) {
+            Op sub = iter.next() ;
+            sub.visit(this) ;
+        }
+        if ( opVisitor != null )
+            op.visit(opVisitor) ;
+        after(op) ;
+    }
+    
+    @Override
+    public void visitExt(OpExt op) {
+        before(op) ;
+        if ( opVisitor != null )
+            op.visit(opVisitor) ;
+        after(op) ;
+    }
+
+    @Override
+    public void visit(OpOrder opOrder) {
+        // XXX XXX
+//        List<SortCondition> conditions = opOrder.getConditions() ;
+//        List<SortCondition> conditions2 = new ArrayList<>() ;
+//        boolean changed = false ;
+//
+//        for ( SortCondition sc : conditions ) {
+//            Expr e = sc.getExpression() ;
+//            Expr e2 = transform(e) ;
+//            conditions2.add(new SortCondition(e2, sc.getDirection())) ;
+//            if ( e != e2 )
+//                changed = true ;
+//        }
+//        OpOrder x = opOrder ;
+//        if ( changed )
+//            x = new OpOrder(opOrder.getSubOp(), conditions2) ;
+        visit1(opOrder) ;
+    }
+
+    @Override
+    public void visit(OpAssign opAssign) {
+        before(opAssign) ;
+        VarExprList varExpr = opAssign.getVarExprList() ;
+        visitVarExpr(varExpr); 
+        visit1$(opAssign) ;
+        after(opAssign) ;
+    }
+
+    @Override
+    public void visit(OpExtend opExtend) {
+        before(opExtend) ;
+        VarExprList varExpr = opExtend.getVarExprList() ;
+        visitVarExpr(varExpr); 
+        visit1$(opExtend) ;
+        after(opExtend) ;
+    }
+
+    
+    // Transforming to quads needs the graph node handled before doing the sub-algebra ops
+    // so it has to be done as before/after by the Walker. By the time visit(OpGraph) is called,
+    // the sub-tree has already been visited. 
+    
+    
+//    @Override
+//    public void visit(OpGraph op) {
+//        pushGraph(op.getNode()) ;
+//        OpVisitorByTypeAndExpr.super.visit(op) ;
+//        popGraph() ;
+//    }
+//    
+//    private Deque<Node> stack = new ArrayDeque<>() ;
+//    
+//    public Node getCurrentGraph() { return stack.peek() ; }
+//    
+//    private void pushGraph(Node node) {
+//        stack.push(node) ;   
+//    }
+//
+//    private void popGraph() {
+//        stack.pop() ;
+//    }
+
+    @Override
+    public void visit(ExprFunction0 func) { visitExprFunction(func) ; }
+    @Override
+    public void visit(ExprFunction1 func) { visitExprFunction(func) ; }
+    @Override
+    public void visit(ExprFunction2 func) { visitExprFunction(func) ; }
+    @Override
+    public void visit(ExprFunction3 func) { visitExprFunction(func) ; }
+    @Override
+    public void visit(ExprFunctionN func) { visitExprFunction(func) ; }
+    
+    @Override
+    public void visitExprFunction(ExprFunction func) {
+        for ( int i = 1 ; i <= func.numArgs() ; i++ ) {
+            Expr expr = func.getArg(i) ;
+            if ( expr == null )
+                // Put a dummy in, e.g. to keep the transform stack aligned.
+                NodeValue.nvNothing.visit(this) ;
+            else
+                expr.visit(this) ;
+        }
+        if ( exprVisitor != null )
+            func.visit(exprVisitor) ;
+    }
+    
+    @Override
+    public void visit(ExprFunctionOp funcOp) {
+        walk(funcOp.getGraphPattern());
+        if ( exprVisitor != null )
+            funcOp.visit(exprVisitor) ;
+    }
+    
+    @Override
+    public void visit(NodeValue nv) {
+        if ( exprVisitor != null )
+            nv.visit(exprVisitor) ;
+    }
+
+    @Override
+    public void visit(ExprVar v) {
+        if ( exprVisitor != null )
+            v.visit(exprVisitor) ;
+    }
+
+    @Override
+    public void visit(ExprAggregator eAgg) {
+        // This is the assignment variable of the aggregation
+        // not a normal variable of an expression.
+
+        // visitAssignVar(eAgg.getAggVar().asVar()) ;
+
+        // XXX XXX Hack for varsMentioned
+        if ( exprVisitor != null )
+            eAgg.visit(exprVisitor) ;
+    }
+}
+
+

http://git-wip-us.apache.org/repos/asf/jena/blob/663f0667/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java
index 970412d..494c945 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java
@@ -35,5 +35,16 @@ public class ExprTransformer
             exprList2.add(e2) ;
         }) ;
         return exprList2 ;
+//        boolean changed = false ;
+//        for ( Expr e : exprList ) {
+//            Expr e2 = transform(transform, e) ;
+//            exprList2.add(e2) ;
+//            if ( e != e2 )
+//                changed = true ;
+//        } ;
+//        if ( changed )
+//            return exprList2 ;
+//        else
+//            return exprList ;
     }
 }


[03/23] jena git commit: Tidy

Posted by an...@apache.org.
Tidy

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

Branch: refs/heads/master
Commit: cebdc3bf8cdfb096427c5a827d172ec81ef60ad2
Parents: c86069e
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Apr 25 18:41:43 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../src/main/java/org/apache/jena/sparql/algebra/Transformer.java | 3 ---
 1 file changed, 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/cebdc3bf/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 b724962..c4d828e 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
@@ -97,9 +97,6 @@ public class Transformer
     // To allow subclassing this class, we use a singleton pattern
     // and theses protected methods.
     protected Op transformation(Transform transform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
-        // XXX XXX
-        // ExprTransform exprTransform = new ExprTransformApplyTransform(transform,
-        // beforeVisitor, afterVisitor) ;
         return transformation(transform, null, op, beforeVisitor, afterVisitor) ;
     }
     


[23/23] jena git commit: Remove warnings, fix javadoc

Posted by an...@apache.org.
Remove warnings, fix javadoc


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

Branch: refs/heads/master
Commit: e8867ad1b64f0d2e76a92cce8a5d6d45120b85a1
Parents: 8c42890
Author: Andy Seaborne <an...@apache.org>
Authored: Sat May 21 19:11:03 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 19:11:03 2016 +0100

----------------------------------------------------------------------
 .../apache/jena/arq/querybuilder/AbstractQueryBuilder.java    | 2 +-
 .../java/org/apache/jena/arq/querybuilder/AskBuilder.java     | 1 -
 .../org/apache/jena/arq/querybuilder/ConstructBuilder.java    | 7 +------
 .../jena/arq/querybuilder/clauses/SolutionModifierClause.java | 1 -
 .../arq/querybuilder/handlers/SolutionModifierHandler.java    | 2 +-
 5 files changed, 3 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/e8867ad1/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilder.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilder.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilder.java
index 59f4bf2..2e25990 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilder.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AbstractQueryBuilder.java
@@ -82,7 +82,7 @@ public abstract class AbstractQueryBuilder<T extends AbstractQueryBuilder<T>>
 	 * 
 	 * @param expression The expression to parse.
 	 * @return the Expr object.
-	 * @throws QueryParseExcpetion on error.
+	 * @throws QueryParseException on error.
 	 */
 	public Expr makeExpr(String expression) throws QueryParseException
 	{

http://git-wip-us.apache.org/repos/asf/jena/blob/e8867ad1/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java
index feda3da..a42f5c9 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java
@@ -30,7 +30,6 @@ import org.apache.jena.graph.FrontsTriple;
 import org.apache.jena.graph.Node;
 import org.apache.jena.graph.Triple;
 import org.apache.jena.query.SortCondition;
-import org.apache.jena.sparql.core.Var;
 import org.apache.jena.sparql.expr.Expr;
 import org.apache.jena.sparql.lang.sparql_11.ParseException;
 

http://git-wip-us.apache.org/repos/asf/jena/blob/e8867ad1/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java
index e1147e3..f31b144 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java
@@ -23,16 +23,11 @@ import org.apache.jena.arq.querybuilder.clauses.ConstructClause;
 import org.apache.jena.arq.querybuilder.clauses.DatasetClause;
 import org.apache.jena.arq.querybuilder.clauses.SolutionModifierClause;
 import org.apache.jena.arq.querybuilder.clauses.WhereClause;
-import org.apache.jena.arq.querybuilder.handlers.ConstructHandler;
-import org.apache.jena.arq.querybuilder.handlers.DatasetHandler;
-import org.apache.jena.arq.querybuilder.handlers.HandlerBlock;
-import org.apache.jena.arq.querybuilder.handlers.SolutionModifierHandler;
-import org.apache.jena.arq.querybuilder.handlers.WhereHandler;
+import org.apache.jena.arq.querybuilder.handlers.* ;
 import org.apache.jena.graph.FrontsTriple;
 import org.apache.jena.graph.Node;
 import org.apache.jena.graph.Triple;
 import org.apache.jena.query.SortCondition;
-import org.apache.jena.sparql.core.Var;
 import org.apache.jena.sparql.expr.Expr;
 import org.apache.jena.sparql.lang.sparql_11.ParseException;
 

http://git-wip-us.apache.org/repos/asf/jena/blob/e8867ad1/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/SolutionModifierClause.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/SolutionModifierClause.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/SolutionModifierClause.java
index de445c1..608c966 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/SolutionModifierClause.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/SolutionModifierClause.java
@@ -21,7 +21,6 @@ import org.apache.jena.arq.querybuilder.AbstractQueryBuilder;
 import org.apache.jena.arq.querybuilder.Order;
 import org.apache.jena.arq.querybuilder.handlers.SolutionModifierHandler;
 import org.apache.jena.query.SortCondition;
-import org.apache.jena.sparql.core.Var;
 import org.apache.jena.sparql.expr.Expr;
 import org.apache.jena.sparql.lang.sparql_11.ParseException;
 

http://git-wip-us.apache.org/repos/asf/jena/blob/e8867ad1/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SolutionModifierHandler.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SolutionModifierHandler.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SolutionModifierHandler.java
index c170ae0..f99c7e7 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SolutionModifierHandler.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SolutionModifierHandler.java
@@ -116,7 +116,7 @@ public class SolutionModifierHandler implements Handler {
 
 	/**
 	 * Add a node to the group by clause. 
-	 * @param node The node to add.
+	 * @param var The variable to add.
 	 */
 	public void addGroupBy(Var var) {
 		query.addGroupBy(var);


[14/23] jena git commit: Switch ExprTransformaer to use new Walker transformations.

Posted by an...@apache.org.
Switch ExprTransformaer to use new Walker transformations.

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

Branch: refs/heads/master
Commit: 747373c91c61e000735c160a867a22a1df956f5d
Parents: b679b06
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Apr 24 22:39:33 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../jena/sparql/algebra/OpVisitorBase.java      |   3 +-
 .../apache/jena/sparql/algebra/Transformer.java |  22 ++-
 .../apache/jena/sparql/algebra/op/OpBGP.java    |   2 +-
 .../algebra/walker/ApplyTransformVisitor.java   |   5 +-
 .../jena/sparql/algebra/walker/Walker.java      |  43 +++--
 .../org/apache/jena/sparql/expr/ExprLib.java    |  10 +-
 .../jena/sparql/expr/ExprTransformer.java       | 180 +------------------
 7 files changed, 61 insertions(+), 204 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/747373c9/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpVisitorBase.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpVisitorBase.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpVisitorBase.java
index 9834580..14fe7c0 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpVisitorBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpVisitorBase.java
@@ -23,7 +23,8 @@ import org.apache.jena.sparql.algebra.op.* ;
 
 public class OpVisitorBase implements OpVisitor
 {
-
+    public OpVisitorBase() {}
+    
     @Override public void visit(OpBGP opBGP)                    {}
 
     @Override public void visit(OpQuadPattern quadPattern)      {}

http://git-wip-us.apache.org/repos/asf/jena/blob/747373c9/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 754e0ef..6982605 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
@@ -67,12 +67,24 @@ public class Transformer
     }
 
     /** Transform an algebra expression except skip (leave alone) any OpService nodes */
-    public static Op transformSkipService(Transform transform, ExprTransform exprTransform, Op op, OpVisitor beforeVisitor,
+    public static Op transformSkipService(Transform opTransform, ExprTransform exprTransform, Op op, OpVisitor beforeVisitor,
                                           OpVisitor afterVisitor) {
+
+        // XXX XXX Needs fixing
+//        if ( opTransform == null )
+//            opTransform = new TransformBase() ;
+//        if ( exprTransform == null )
+//            exprTransform = new ExprTransformCopy() ;
+//        Transform transform2 = new TransformSkipService(opTransform) ;
+//        ApplyTransformVisitor atv = new ApplyTransformVisitor(transform2, exprTransform, beforeVisitor, afterVisitor) ;
+//        WalkerVisitor wv = new WalkerVisitorSkipService(atv, atv, beforeVisitor, afterVisitor) ;
+//        return Walker.transform(op, atv) ;
+
+        // OLD
         // Simplest way but still walks the OpService subtree (and throws away the
         // transformation).
-        Transform walker = new TransformSkipService(transform) ;
-        return Transformer.transform(walker, exprTransform, op, beforeVisitor, afterVisitor) ;
+        Transform transform = new TransformSkipService(opTransform) ;
+        return Transformer.transform(transform, exprTransform, op, beforeVisitor, afterVisitor) ;
         // XXX XXX Better to modify the walk and force the transform to be a no-op.
     }
 
@@ -86,6 +98,10 @@ public class Transformer
     }
     
     protected Op transformation(Transform transform, ExprTransform exprTransform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        return transformation$(transform, exprTransform, op, beforeVisitor, afterVisitor) ;
+    }
+    
+    private Op transformation$(Transform transform, ExprTransform exprTransform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
         return Walker.transform(op, transform, exprTransform, beforeVisitor, afterVisitor) ;
     }
     

http://git-wip-us.apache.org/repos/asf/jena/blob/747373c9/jena-arq/src/main/java/org/apache/jena/sparql/algebra/op/OpBGP.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/op/OpBGP.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/op/OpBGP.java
index 42cbf81..368d4bf 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/op/OpBGP.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/op/OpBGP.java
@@ -48,7 +48,7 @@ public class OpBGP extends Op0
     @Override
     public void visit(OpVisitor opVisitor)  { opVisitor.visit(this) ; }
     @Override
-    public Op0 copy()                        { return new OpBGP(pattern) ; }
+    public Op0 copy()                       { return new OpBGP(pattern) ; }
     
     @Override
     public int hashCode()

http://git-wip-us.apache.org/repos/asf/jena/blob/747373c9/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 dc5e341..c58425b 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
@@ -433,6 +433,8 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
     }
 
     private <T> void push(Deque<T> stack, T value) {
+        if ( value == null )
+            Log.warn(ApplyTransformVisitor.class, "Pushing null onto the "+stackLabel(stack)+" stack") ;
         stack.push(value) ;
     }
 
@@ -440,10 +442,11 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
         try {
             T v = stack.pop() ;
             if ( v ==  null )
-                Log.warn(ApplyTransformVisitor.class, "Pop null from "+stackLabel(stack)+" stack") ;
+                Log.warn(ApplyTransformVisitor.class, "Pop null from the "+stackLabel(stack)+" stack") ;
             return v ;
         }
         catch (NoSuchElementException ex) {
+            if ( true ) throw new RuntimeException() ;
             Log.warn(ApplyTransformVisitor.class, "Empty "+stackLabel(stack)+" stack") ;
             return null ;
         }

http://git-wip-us.apache.org/repos/asf/jena/blob/747373c9/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 3952be5..766d5ab 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
@@ -133,10 +133,15 @@ public class Walker {
         if ( opVisitor == null )
             opVisitor = nullOpVisitor ;
         if ( exprVisitor == null )
-            exprVisitor = new ExprVisitorBase() ;
+            exprVisitor = nullExprVisitor ;
         return new WalkerVisitor(opVisitor, exprVisitor, beforeVisitor, afterVisitor)  ;
     }
     
+    /** Transform an algebra expression */
+    public static Op transform(Op op, Transform transform) {
+       return transform(op, transform, null) ;
+    }
+
     /** Transform an {@link Op}. */
     public static Op transform(Op op, Transform opTransform, ExprTransform exprTransform) {
         ApplyTransformVisitor v = createTransformer(opTransform, exprTransform) ;
@@ -149,12 +154,6 @@ public class Walker {
         return transform(op, v, beforeVisitor, afterVisitor) ;
     }
 
-    /** Transform an {@link Expr}. */
-    public static Expr transform(Expr expr, Transform opTransform, ExprTransform exprTransform) {
-        ApplyTransformVisitor v = createTransformer(opTransform, exprTransform) ;
-        return transform(expr, v) ;
-    }
-
     /** Transform an {@link Op}. */
     public static Op transform(Op op, ApplyTransformVisitor v) {
         return transform(op, v, null, null) ;
@@ -166,9 +165,20 @@ public class Walker {
         return v.opResult() ;
     }
 
+    /** Transform an expression */
+    public static Expr transform(Expr expr, ExprTransform exprTransform) {
+        return transform(expr, null, exprTransform) ;
+    }
+
+    /** Transform an {@link Expr}. */
+    public static Expr transform(Expr expr, Transform opTransform, ExprTransform exprTransform) {
+        ApplyTransformVisitor v = createTransformer(opTransform, exprTransform) ;
+        return transform(expr, v) ;
+    }
+
     /** Transform an {@link Expr}. */
     public static Expr transform(Expr expr, ApplyTransformVisitor v) {
-        walk(expr, v) ;
+        walk(expr, v, v, null, null) ;
         return v.exprResult() ;
     }
 
@@ -178,29 +188,18 @@ public class Walker {
         return v.exprResult() ;
     }
 
-    /** Transform an algebra expression */
-    public static Op transform(Op op, Transform transform) {
-       return transform(op, transform, null) ;
-    }
-    
-    /** Transform an expression */
-    public static Expr transform(Expr expr, ExprTransform exprTransform) {
-        return transform(expr, null, exprTransform) ;
-    }
-        
-    private static Transform     nullOpTransform   = new TransformBase() ;
-    private static ExprTransform nullExprTransform = new ExprTransformBase() ;
+    private static Transform     nullOpTransform   = new TransformCopy() ;
+    private static ExprTransform nullExprTransform = new ExprTransformCopy() ;
     
     public static ApplyTransformVisitor createTransformer(Transform opTransform, ExprTransform exprTransform) {
         return createTransformer(opTransform, exprTransform, null, null) ;
     }
  
     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 = new ExprTransformCopy() ;
+            exprTransform = nullExprTransform ;
         return new ApplyTransformVisitor(opTransform, exprTransform, null, null) ;
     }
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/747373c9/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprLib.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprLib.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprLib.java
index fc5e99d..4553884 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprLib.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprLib.java
@@ -95,11 +95,11 @@ public class ExprLib
         return ExprTransformer.transform(replaceAgg, expr) ;
     }
 
-    /** transform expressions that may involve aggregates into one that just uses the variable for the aggregate */  
-    public static ExprList replaceAggregateByVariable(ExprList exprs)
-    {
-        return ExprTransformer.transform(replaceAgg, exprs) ;
-    }
+//    /** transform expressions that may involve aggregates into one that just uses the variable for the aggregate */  
+//    public static ExprList replaceAggregateByVariable(ExprList exprs)
+//    {
+//        return ExprTransformer.transform(replaceAgg, exprs) ;
+//    }
     
     private static ExprTransform replaceAgg = new ExprTransformCopy()
     {

http://git-wip-us.apache.org/repos/asf/jena/blob/747373c9/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java
index 2d9c1b2..f5e8d1f 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java
@@ -18,185 +18,23 @@
 
 package org.apache.jena.sparql.expr;
 
-import java.util.* ;
-
-import org.apache.jena.atlas.logging.Log ;
-import org.apache.jena.sparql.algebra.Op ;
-import org.apache.jena.sparql.algebra.Transformer ;
+import org.apache.jena.sparql.algebra.walker.Walker ;
 
 public class ExprTransformer
 {
-    private static ExprTransformer singleton = new ExprTransformer();
-    
-    /** Get the current transformer of expressions */
-    public static ExprTransformer get() { return singleton; }
-    
     /** Transform an expression */
     public static Expr transform(ExprTransform transform, Expr expr)
-    { return get().transformation(transform, expr) ; }
+    //{ return get().transformation(transform, expr) ; }
+    { return Walker.transform(expr, transform) ;}
 
     /** Transform an expression list */
-    public static ExprList transform(ExprTransform transform, ExprList exprList)
-    { return get().transformation(transform, exprList) ; }
-    
-    private Expr transformation(ExprTransform transform, Expr expr)
-    {
-        ApplyExprTransformVisitor v = new ApplyExprTransformVisitor(transform) ;
-        return transformation(v, expr) ;
-    }
-
-    private ExprList transformation(ExprTransform transform, ExprList exprList)
-    {
-        ApplyExprTransformVisitor v = new ApplyExprTransformVisitor(transform) ;
+    public static ExprList transform(ExprTransform transform, ExprList exprList) {
         ExprList exprList2 = new ExprList() ;
-        for ( Expr expr : exprList )
-        {
-            Expr expr2 = transformation(v, expr) ;
-            exprList2.add(expr2) ;
-        }
+        exprList.forEach((e) -> {
+            // XXX XXX No change checking? 
+            Expr e2 = transform(transform, e) ;
+            exprList2.add(e2) ;
+        }) ;
         return exprList2 ;
     }
-    
-    private Expr transformation(ApplyExprTransformVisitor applyVisitor, Expr expr)
-    {
-        ExprWalker.walk(applyVisitor, expr) ;
-        return applyVisitor.result() ;
-    }
-    
-    public static
-    class ApplyExprTransformVisitor implements ExprVisitor
-    {
-        private ExprTransform transform ;
-        private final Deque<Expr> stack = new ArrayDeque<>() ;
-        
-        final Expr result()
-        { 
-            if ( stack.size() != 1 ) {
-                Log.warn(this, "Stack is not aligned (size = "+stack.size()+")") ;
-                if ( stack.isEmpty() )
-                    return null ;
-            }
-            return stack.pop() ; 
-        }
-
-        ApplyExprTransformVisitor(ExprTransform transform)
-        { this.transform = transform ; }
-
-        @Override
-        public void visit(ExprFunction0 func)
-        {
-            Expr e = func.apply(transform) ;
-            push(stack, e) ;
-        }
-        
-        @Override
-        public void visit(ExprFunction1 func)
-        {
-            Expr e1 = pop(stack) ;
-            Expr e = func.apply(transform, e1) ;
-            push(stack, e) ;
-        }
-
-        @Override
-        public void visit(ExprFunction2 func)
-        {
-            Expr e2 = pop(stack) ;
-            Expr e1 = pop(stack) ;
-            Expr e = func.apply(transform, e1, e2) ;
-            push(stack, e) ;
-        }
-
-        @Override
-        public void visit(ExprFunction3 func)
-        {
-            Expr e3 = pop(stack) ;
-            Expr e2 = pop(stack) ;
-            Expr e1 = pop(stack) ;
-            Expr e = func.apply(transform, e1, e2, e3) ;
-            push(stack, e) ;
-        }
-
-        @Override
-        public void visit(ExprFunctionN func)
-        {
-            ExprList x = process(func.getArgs()) ;
-            Expr e = func.apply(transform, x) ;
-            push(stack, e) ;
-        }
-        
-        private ExprList process(List<Expr> exprList)
-        {
-            int N = exprList.size() ;
-            List<Expr> x = new ArrayList<>(N) ;
-            for ( Expr anExprList : exprList )
-            {
-                Expr e2 = pop( stack );
-                // Add in reverse.
-                x.add( 0, e2 );
-            }
-            return new ExprList(x) ;
-        }
-        
-        @Override
-        public void visit(ExprFunctionOp funcOp)
-        {
-            ExprList x = null ;
-            if ( funcOp.getArgs() != null )
-                x = process(funcOp.getArgs()) ;
-            Op op = funcOp.getGraphPattern() ;
-            // Caution: the expression can have a pattern inside it.
-            // See also: ExprTransformApplyTransform which does much the same in a different way.
-            if ( transform instanceof ExprTransformOp )
-            {
-                ExprTransformOp t = (ExprTransformOp)transform ;
-                op = Transformer.transform(t.getTransform(), op) ; 
-            }
-            
-            Expr e = funcOp.apply(transform, x, op) ;
-            push(stack, e) ;
-
-        }
-
-        @Override
-        public void visit(NodeValue nv)
-        {
-            Expr e = nv.apply(transform) ;
-            push(stack, e) ;
-        }
-
-        @Override
-        public void visit(ExprVar var)
-        {
-            Expr e = var.apply(transform) ;
-            push(stack, e) ;
-        }
-        
-        @Override
-        public void visit(ExprAggregator eAgg)
-        {
-            Expr e = eAgg.apply(transform) ;
-            push(stack, e) ;
-        }
-        
-        private static void push(Deque<Expr> stack, Expr value)
-        {
-            stack.push(value) ;
-        }
-        
-        private static Expr pop(Deque<Expr> stack)
-        {
-            try {
-            Expr e = stack.pop();
-            if ( e == NodeValue.nvNothing )
-                e = null ;
-            return e ;
-            } catch ( EmptyStackException ex)
-            {
-                System.err.println("Empty stack") ;
-                return null ;
-            }
-        }
-    }
-    
-    
 }


[07/23] jena git commit: Towards new walker/transformation code

Posted by an...@apache.org.
Towards new walker/transformation code


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

Branch: refs/heads/master
Commit: c1fde992d024d1402639c9c2e98bfa486c324966
Parents: 86877d1
Author: Andy Seaborne <an...@apache.org>
Authored: Fri Apr 22 16:34:29 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../jena/sparql/algebra/TransformQuadGraph.java |   4 +
 .../apache/jena/sparql/algebra/Transformer.java |  31 +-
 .../algebra/walker/ApplyTransformVisitor.java   | 419 +++++++++++++++++++
 .../algebra/walker/ElementWalker_New.java       | 196 +++++++++
 .../algebra/walker/ExprVisitorFunction.java     |  38 ++
 .../algebra/walker/OpVisitorByTypeAndExpr.java  | 229 ++++++++++
 .../jena/sparql/algebra/walker/Walker.java      | 190 +++++++++
 .../sparql/algebra/walker/WalkerVisitor.java    | 272 ++++++++++++
 8 files changed, 1368 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/c1fde992/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 fffb57e..27d44e5 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
@@ -46,6 +46,9 @@ public class TransformQuadGraph extends TransformCopy
 
     @Override
     public Op transform(OpGraph opGraph, Op op) {
+        
+        //System.err.println("transform(OpGraph)\n"+opGraph+op) ;
+        
         // ?? Could just leave the (graph) in place always - just rewrite BGPs. 
         boolean noPattern = false ;
         
@@ -113,6 +116,7 @@ public class TransformQuadGraph extends TransformCopy
     
     @Override
     public Op transform(OpBGP opBGP) { 
+        //System.err.println("transform(OpBGP) : "+getNode()+"\n"+opBGP) ;
         return new OpQuadPattern(getNode(), opBGP.getPattern()) ;
     }
     

http://git-wip-us.apache.org/repos/asf/jena/blob/c1fde992/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 ba3ee21..9f155d4 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
@@ -25,6 +25,7 @@ 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 ;
 import org.apache.jena.sparql.expr.* ;
@@ -119,21 +120,30 @@ 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) ;
-    }
+    }   
+    
+    protected Op transformation(Transform transform, ExprTransform exprTransform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        // XXX Switch on before/after via the Walker.
+        if ( true )
+            return Walker.transform(op, transform, exprTransform, beforeVisitor, afterVisitor) ;
         
-    protected Op transformation(Transform transform, ExprTransform exprTransform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor)
-    {
+        if ( beforeVisitor == null && afterVisitor == null )
+            return Walker.transform(op, transform, exprTransform) ;
+//        static Set<Class<?>> seen = new HashSet<>() ;
+//        if ( ! seen.contains(beforeVisitor.getClass()) ) {
+//            System.out.println("T:"+beforeVisitor.getClass().getName()) ;
+//            seen.add(beforeVisitor.getClass()) ;
+//        }
         ApplyTransformVisitor v = new ApplyTransformVisitor(transform, exprTransform) ;
         return transformation(v, op, beforeVisitor, afterVisitor) ;
     }
     
-    protected Op transformation(ApplyTransformVisitor transformApply,
-                                Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor)
-    {
-        if ( op == null )
-        {
+    protected Op transformation(ApplyTransformVisitor transformApply, Op op, 
+                                OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        if ( op == null ) {
             Log.warn(this, "Attempt to transform a null Op - ignored") ;
             return op ;
         }
@@ -141,9 +151,8 @@ public class Transformer
     }
 
     /** The primitive operation to apply a transformation to an Op */
-    protected Op applyTransformation(ApplyTransformVisitor transformApply,
-                                     Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor)
-    {
+    private /*protected*/ Op applyTransformation(ApplyTransformVisitor transformApply, Op op,
+                                     OpVisitor beforeVisitor, OpVisitor afterVisitor) {
         OpWalker.walk(op, transformApply, beforeVisitor, afterVisitor) ;
         Op r = transformApply.result() ;
         return r ;

http://git-wip-us.apache.org/repos/asf/jena/blob/c1fde992/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
new file mode 100644
index 0000000..750f893
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ApplyTransformVisitor.java
@@ -0,0 +1,419 @@
+/*
+ * 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.algebra.walker;
+
+import java.util.* ;
+
+import org.apache.jena.atlas.logging.Log ;
+import org.apache.jena.query.SortCondition ;
+import org.apache.jena.sparql.algebra.Op ;
+import org.apache.jena.sparql.algebra.OpVisitor ;
+import org.apache.jena.sparql.algebra.Transform ;
+import org.apache.jena.sparql.algebra.op.* ;
+import org.apache.jena.sparql.core.Var ;
+import org.apache.jena.sparql.core.VarExprList ;
+import org.apache.jena.sparql.expr.* ;
+import org.apache.jena.sparql.expr.aggregate.Aggregator ;
+
+public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisitor {
+    private final Transform     opTransform ;
+    private final ExprTransform exprTransform ;
+
+    protected boolean           visitService = true ;
+    
+    private final Deque<Op>     opStack   = new ArrayDeque<>() ;
+    private final Deque<Expr>   exprStack = new ArrayDeque<>() ;
+    
+    private final OpVisitor     beforeVisitor ;
+    private final OpVisitor     afterVisitor ;
+
+    public ApplyTransformVisitor(Transform opTransform, ExprTransform exprTransform, OpVisitor before, OpVisitor after) {
+        this.opTransform = opTransform ;
+        this.exprTransform = exprTransform ;
+        this.beforeVisitor = before ;
+        this.afterVisitor = after ;
+    }
+
+    /*package*/ final Op opResult() {
+        return pop(opStack) ;
+    }
+
+    /*package*/ final Expr exprResult() {
+        return pop(exprStack) ;
+    }
+
+    protected Op transform(Op op) {
+        // reuse this ApplyTransformVisitor? with stack checking?
+        return Walker.transform(op, this, beforeVisitor, afterVisitor) ;
+    }
+    
+    protected Expr transform(Expr expr) {
+        // reuse this ApplyTransformVisitor? with stack checking?
+        return Walker.transform(expr, this, beforeVisitor, afterVisitor) ;
+    }
+    
+    protected ExprList transform(ExprList exprList) {
+//        if ( exprList == null || exprTransform == null )
+//            return exprList ;
+        ExprList exprList2 = new ExprList() ;
+        exprList.forEach( e->exprList2.add(transform(e)) );
+        return exprList2 ;
+    }
+
+    @Override
+    public void visit(OpOrder opOrder) {
+        List<SortCondition> conditions = opOrder.getConditions() ;
+        List<SortCondition> conditions2 = new ArrayList<>() ;
+        boolean changed = false ;
+
+        for ( SortCondition sc : conditions ) {
+            Expr e = sc.getExpression() ;
+            Expr e2 = transform(e) ;
+            conditions2.add(new SortCondition(e2, sc.getDirection())) ;
+            if ( e != e2 )
+                changed = true ;
+        }
+        OpOrder x = opOrder ;
+        if ( changed )
+            x = new OpOrder(opOrder.getSubOp(), conditions2) ;
+        visit1(x) ;
+    }
+
+    @Override
+    public void visit(OpAssign opAssign) {
+        VarExprList varExpr = opAssign.getVarExprList() ;
+        VarExprList varExpr2 = process(varExpr) ;
+        OpAssign opAssign2 = opAssign ;
+        if ( varExpr != varExpr2 )
+            opAssign2 = OpAssign.create(opAssign.getSubOp(), varExpr2) ;
+        visit1(opAssign2) ;
+    }
+
+    @Override
+    public void visit(OpExtend opExtend) {
+        VarExprList varExpr = opExtend.getVarExprList() ;
+        VarExprList varExpr2 = process(varExpr) ;
+        OpExtend opExtend2 = opExtend ;
+        if ( varExpr != varExpr2 )
+            opExtend2 = OpExtend.create(opExtend.getSubOp(), varExpr2) ;
+        visit1(opExtend2) ;
+    }
+
+    private VarExprList process(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 ;
+    }
+
+    private ExprList process(ExprList exprList) {
+        if ( exprList == null )
+            return null ;
+        ExprList exprList2 = new ExprList() ;
+        boolean changed = false ;
+        for ( Expr e : exprList ) {
+            Expr e2 = process(e) ;
+            exprList2.add(e2) ;
+            if ( e != e2 )
+                changed = true ;
+        }
+        if ( !changed )
+            return exprList ;
+        return exprList2 ;
+    }
+
+    private Expr process(Expr expr) {
+        Expr e = expr ;
+        Expr e2 = e ;
+        if ( e != null )
+            e2 = transform(e) ;
+        if ( e == e2 )
+            return expr ;
+        return e2 ;
+    }
+
+    @Override
+    public void visit(OpGroup opGroup) {
+        boolean changed = false ;
+
+        VarExprList varExpr = opGroup.getGroupVars() ;
+        VarExprList varExpr2 = process(varExpr) ;
+        if ( varExpr != varExpr2 )
+            changed = true ;
+
+        List<ExprAggregator> aggs = opGroup.getAggregators() ;
+        List<ExprAggregator> aggs2 = aggs ;
+
+        // And the aggregators...
+        aggs2 = new ArrayList<>() ;
+        for ( ExprAggregator agg : aggs ) {
+            Aggregator aggregator = agg.getAggregator() ;
+            Var v = agg.getVar() ;
+
+            // Variable associated with the aggregate
+            Expr eVar = agg.getAggVar() ;   // Not .getExprVar()
+            Expr eVar2 = transform(eVar) ;
+            if ( eVar != eVar2 )
+                changed = true ;
+
+            // The Aggregator expression
+            ExprList e = aggregator.getExprList() ;
+            ExprList e2 = e ;
+            if ( e != null )
+                // Null means "no relevant expression" e.g. COUNT(*)
+                e2 = transform(e) ;
+            if ( e != e2 )
+                changed = true ;
+            Aggregator a2 = aggregator.copy(e2) ;
+            aggs2.add(new ExprAggregator(eVar2.asVar(), a2)) ;
+        }
+
+        OpGroup opGroup2 = opGroup ;
+        if ( changed )
+            opGroup2 = new OpGroup(opGroup.getSubOp(), varExpr2, aggs2) ;
+        visit1(opGroup2) ;
+    }
+
+    @Override
+    public void visit0(Op0 op) {
+        push(opStack, op.apply(opTransform)) ;
+    }
+
+    @Override
+    public void visit1(Op1 op) {
+        Op subOp = null ;
+        if ( op.getSubOp() != null )
+            subOp = pop(opStack) ;
+        push(opStack, op.apply(opTransform, subOp)) ;
+    }
+
+    @Override
+    public void visit2(Op2 op) {
+        Op left = null ;
+        Op right = null ;
+
+        // Must do right-left because the pushes onto the stack were left-right.
+        if ( op.getRight() != null )
+            right = pop(opStack) ;
+        if ( op.getLeft() != null )
+            left = pop(opStack) ;
+        Op opX = op.apply(opTransform, left, right) ;
+        push(opStack, opX) ;
+    }
+
+    @Override
+    public void visitN(OpN op) {
+        List<Op> x = new ArrayList<>(op.size()) ;
+
+        for ( Iterator<Op> iter = op.iterator() ; iter.hasNext() ; ) {
+            Op sub = iter.next() ;
+            Op r = pop(opStack) ;
+            // Skip nulls.
+            if ( r != null )
+                // Add in reverse.
+                x.add(0, r) ;
+        }
+        Op opX = op.apply(opTransform, x) ;
+        push(opStack, opX) ;
+    }
+
+    @Override
+    public void visit(OpFilter opFilter) {
+        Op subOp = null ;
+        if ( opFilter.getSubOp() != null )
+            subOp = pop(opStack) ;
+        boolean changed = (opFilter.getSubOp() != subOp) ;
+
+        ExprList ex = opFilter.getExprs() ;
+        ExprList ex2 = process(ex) ;
+        OpFilter f = opFilter ;
+        if ( ex != ex2 )
+            f = (OpFilter)OpFilter.filter(ex2, subOp) ;
+        push(opStack, f.apply(opTransform, subOp)) ;
+    }
+
+    @Override
+    public void visit(OpLeftJoin op) {
+        Op left = null ;
+        Op right = null ;
+
+        // Must do right-left because the pushes onto the stack were left-right.
+        if ( op.getRight() != null )
+            right = pop(opStack) ;
+        if ( op.getLeft() != null )
+            left = pop(opStack) ;
+
+        ExprList exprs = op.getExprs() ;
+        ExprList exprs2 = process(exprs) ;
+        OpLeftJoin x = op ;
+        if ( exprs != exprs2 )
+            x = OpLeftJoin.createLeftJoin(left, right, exprs2) ;
+        Op opX = x.apply(opTransform, left, right) ;
+        push(opStack, opX) ;
+    }
+    
+    @Override
+    public void visit(OpService op) {
+        if ( ! visitService ) {
+            // No visit - push input.
+            push(opStack, op) ;
+            return ;
+        }
+        // op.getService()
+        OpVisitorByTypeAndExpr.super.visit(op);
+    }
+
+    @Override
+    public void visitExt(OpExt op) {
+        push(opStack, opTransform.transform(op)) ;
+    }
+    
+    @Override
+    public void visitExpr(ExprList exprs) { 
+        System.err.println("visitExpr(ExprList)") ;
+        if ( exprs != null && exprTransform != null ) {
+            
+        }
+    }
+    
+    @Override
+    public void visitExpr(VarExprList exprVarExprList)  {
+        System.err.println("visitExpr(ExprList)") ;
+        if ( exprVarExprList != null && exprTransform != null ) {
+            
+        }
+    }
+    
+    @Override
+    public void visit(ExprFunction0 func) {
+        Expr e = func.apply(exprTransform) ;
+        push(exprStack, e) ;
+    }
+
+    @Override
+    public void visit(ExprFunction1 func) {
+        Expr e1 = pop(exprStack) ;
+        Expr e = func.apply(exprTransform, e1) ;
+        push(exprStack, e) ;
+    }
+
+    @Override
+    public void visit(ExprFunction2 func) {
+        Expr e2 = pop(exprStack) ;
+        Expr e1 = pop(exprStack) ;
+        Expr e = func.apply(exprTransform, e1, e2) ;
+        push(exprStack, e) ;
+    }
+
+    @Override
+    public void visit(ExprFunction3 func) {
+        Expr e3 = pop(exprStack) ;
+        Expr e2 = pop(exprStack) ;
+        Expr e1 = pop(exprStack) ;
+        Expr e = func.apply(exprTransform, e1, e2, e3) ;
+        push(exprStack, e) ;
+    }
+
+    @Override
+    public void visit(ExprFunctionN func) {
+        ExprList x = process(func.getArgs()) ;
+        Expr e = func.apply(exprTransform, x) ;
+        push(exprStack, e) ;
+    }
+
+    private ExprList process(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 ;
+//        Op op = transform(funcOp.getGraphPattern()) ;
+        if ( funcOp.getArgs() != null )
+            x = process(funcOp.getArgs()) ;
+        Expr e = funcOp.apply(exprTransform, x, funcOp.getGraphPattern()) ;
+        push(exprStack, e) ;
+    }
+
+    @Override
+    public void visit(NodeValue nv) {
+        Expr e = nv.apply(exprTransform) ;
+        push(exprStack, e) ;
+    }
+
+    @Override
+    public void visit(ExprVar var) {
+        Expr e = var.apply(exprTransform) ;
+        push(exprStack, e) ;
+    }
+
+    @Override
+    public void visit(ExprAggregator eAgg) {
+        Expr e = eAgg.apply(exprTransform) ;
+        push(exprStack, e) ;
+    }
+
+    private <T> void push(Deque<T> stack, T value) {
+        stack.push(value) ;
+    }
+
+    private <T> T pop(Deque<T> stack) {
+        try {
+            T v = stack.pop() ;
+            if ( v ==  null )
+                Log.warn(ApplyTransformVisitor.class, "Pop null from "+stackLabel(stack)+" stack") ;
+            return v ;
+        }
+        catch (EmptyStackException ex) {
+            Log.warn(ApplyTransformVisitor.class, "Empty "+stackLabel(stack)+" stack") ;
+            return null ;
+        }
+    }
+    
+    private String stackLabel(Deque<?> stack) {
+        if ( stack == opStack ) return "Op" ;
+        if ( stack == exprStack ) return "Expr" ;
+        return "<other>" ;
+    }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/c1fde992/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
new file mode 100644
index 0000000..7ca53b9
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ElementWalker_New.java
@@ -0,0 +1,196 @@
+/*
+ * 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.algebra.walker;
+
+import org.apache.jena.sparql.expr.* ;
+import org.apache.jena.sparql.syntax.* ;
+
+/** An element visitor that walks the graph pattern tree for one query level. 
+ *  applying a visitor at each Element traversed.<br/>
+ *  Does not process subqueries.<br/>      
+ *  Does not process (NOT)EXISTS in filters.<br/>
+ *  These will need to call down themselves if it is meaningful for the visitor.
+ *  Bottom-up walk - apply to subelements before applying to current element.
+ */
+
+public class ElementWalker_New {
+    public static void walk(Element el, ElementVisitor visitor) {
+        walk(el, visitor, null) ;
+    }
+
+    public static void walk(Element el, ElementVisitor elVisitor, ExprVisitor exprVisitor) {
+        EltWalker w = new EltWalker(elVisitor, exprVisitor) ;
+        el.visit(w) ;
+    }
+
+//    protected static void walk$(Element el, Walker walker) {
+//        el.visit(walker) ;
+//    }
+
+    static public class EltWalker implements ElementVisitor, ExprVisitorFunction {
+        protected final ElementVisitor elementVisitor ;
+        protected final ExprVisitor exprVisitor ;
+
+        protected EltWalker(ElementVisitor visitor, ExprVisitor exprVisitor) {
+            this.elementVisitor = visitor ;
+            this.exprVisitor = exprVisitor ;
+        }
+
+        @Override
+        public void visit(ElementTriplesBlock el) {
+            elementVisitor.visit(el) ;
+        }
+
+        @Override
+        public void visit(ElementFilter el) {
+            el.getExpr().visit(this);
+            elementVisitor.visit(el) ;
+        }
+
+        @Override
+        public void visit(ElementAssign el) {
+            elementVisitor.visit(el) ;
+        }
+
+        @Override
+        public void visit(ElementBind el) {
+            elementVisitor.visit(el) ;
+        }
+
+        @Override
+        public void visit(ElementData el) {
+            elementVisitor.visit(el) ;
+        }
+
+        @Override
+        public void visit(ElementUnion el) {
+            for ( Element e : el.getElements() )
+                e.visit(this) ;
+            elementVisitor.visit(el) ;
+        }
+
+        @Override
+        public void visit(ElementGroup el) {
+            for ( Element e : el.getElements() )
+                e.visit(this) ;
+            elementVisitor.visit(el) ;
+        }
+
+        @Override
+        public void visit(ElementOptional el) {
+            if ( el.getOptionalElement() != null )
+                el.getOptionalElement().visit(this) ;
+            elementVisitor.visit(el) ;
+        }
+
+        @Override
+        public void visit(ElementDataset el) {
+            if ( el.getElement() != null )
+                el.getElement().visit(this) ;
+            elementVisitor.visit(el) ;
+        }
+
+        @Override
+        public void visit(ElementNamedGraph el) {
+            if ( el.getElement() != null )
+                el.getElement().visit(this) ;
+            elementVisitor.visit(el) ;
+        }
+
+        @Override
+        public void visit(ElementService el) {
+            if ( el.getElement() != null )
+                el.getElement().visit(this) ;
+            elementVisitor.visit(el) ;
+        }
+
+        // EXISTs, NOT EXISTs also occur in FILTERs via expressions.
+
+        @Override
+        public void visit(ElementExists el) {
+            elementVisitor.visit(el) ;
+        }
+
+        @Override
+        public void visit(ElementNotExists el) {
+            elementVisitor.visit(el) ;
+        }
+
+        @Override
+        public void visit(ElementMinus el) {
+            if ( el.getMinusElement() != null )
+                el.getMinusElement().visit(this) ;
+            elementVisitor.visit(el) ;
+        }
+
+        @Override
+        public void visit(ElementSubQuery el) {
+            // This does not automatically walk into the subquery.
+            elementVisitor.visit(el) ;
+        }
+
+        @Override
+        public void visit(ElementPathBlock el) {
+            elementVisitor.visit(el) ;
+        }
+        
+        @Override
+        public void visit(ExprFunction0 func) { visitExprFunction(func) ; }
+        @Override
+        public void visit(ExprFunction1 func) { visitExprFunction(func) ; }
+        @Override
+        public void visit(ExprFunction2 func) { visitExprFunction(func) ; }
+        @Override
+        public void visit(ExprFunction3 func) { visitExprFunction(func) ; }
+        @Override
+        public void visit(ExprFunctionN func) { visitExprFunction(func) ; }
+        
+        @Override
+        public void visitExprFunction(ExprFunction func) {
+            for ( int i = 1 ; i <= func.numArgs() ; i++ )
+            {
+                Expr expr = func.getArg(i) ;
+                if ( expr == null )
+                    // Put a dummy in, e.g. to keep the transform stack aligned.
+                    NodeValue.nvNothing.visit(this) ;
+                else
+                    expr.visit(this) ;
+            }
+            func.visit(exprVisitor) ;
+        }
+        
+        @Override
+        public void visit(ExprFunctionOp funcOp) {
+            // Walk the op
+            funcOp.getElement().visit(this);
+            funcOp.visit(exprVisitor) ;
+        }
+        
+        @Override
+        public void visit(NodeValue nv)         { nv.visit(exprVisitor) ; }
+        @Override
+        public void visit(ExprVar v)            { v.visit(exprVisitor) ; }
+        @Override
+        public void visit(ExprAggregator eAgg)  {
+            //eAgg.getAggVar().visit(visitorExpr);
+            // XXX Hack for varsMentioned
+            eAgg.visit(exprVisitor) ; 
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/c1fde992/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ExprVisitorFunction.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ExprVisitorFunction.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ExprVisitorFunction.java
new file mode 100644
index 0000000..fa72d89
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ExprVisitorFunction.java
@@ -0,0 +1,38 @@
+/*
+ * 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.algebra.walker;
+
+import org.apache.jena.sparql.expr.* ;
+
+/** Convert all visit calls on the expressions in a call to a generic visit operation for expression functions */
+public interface ExprVisitorFunction extends ExprVisitor 
+{
+    @Override
+    public default void visit(ExprFunction0 func) { visitExprFunction(func) ; }
+    @Override
+    public default void visit(ExprFunction1 func) { visitExprFunction(func) ; }
+    @Override
+    public default void visit(ExprFunction2 func) { visitExprFunction(func) ; }
+    @Override
+    public default void visit(ExprFunction3 func) { visitExprFunction(func) ; }
+    @Override
+    public default void visit(ExprFunctionN func) { visitExprFunction(func) ; }
+
+    public void visitExprFunction(ExprFunction func) ;
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/c1fde992/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
new file mode 100644
index 0000000..7dfb65f
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/OpVisitorByTypeAndExpr.java
@@ -0,0 +1,229 @@
+/*
+ * 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.algebra.walker;
+
+import org.apache.jena.sparql.algebra.OpVisitor ;
+import org.apache.jena.sparql.algebra.op.* ;
+import org.apache.jena.sparql.core.VarExprList ;
+import org.apache.jena.sparql.expr.ExprList ;
+
+/** A visitor helper that maps all visits to a few general ones */ 
+public interface OpVisitorByTypeAndExpr extends OpVisitor
+{
+    public void visitN(OpN op) ;
+
+    public void visit2(Op2 op) ;
+    
+    public void visit1(Op1 op) ;
+    
+    public void visit0(Op0 op) ;    
+    
+    public default void visitExt(OpExt op) {
+        op.effectiveOp().visit(this);
+    }
+
+    public void visitExpr(ExprList exprs) ;
+    public void visitExpr(VarExprList exprs) ;
+    //public void visitAssignVar(Var var) ;
+    
+    public default void visitModifer(OpModifier opMod) {
+        visit1(opMod);
+    }
+
+    @Override
+    public default void visit(OpBGP opBGP) {
+        visit0(opBGP);
+    }
+
+    @Override
+    public default void visit(OpQuadPattern quadPattern) {
+        visit0(quadPattern);
+    }
+
+    @Override
+    public default void visit(OpQuadBlock quadBlock) {
+        visit0(quadBlock);
+    }
+
+    @Override
+    public default void visit(OpTriple opTriple) {
+        visit0(opTriple);
+    }
+
+    @Override
+    public default void visit(OpQuad opQuad) {
+        visit0(opQuad);
+    }
+
+    @Override
+    public default void visit(OpPath opPath) {
+        visit0(opPath);
+    }
+
+    @Override
+    public default void visit(OpProcedure opProcedure) {
+        visit1(opProcedure);
+    }
+
+    @Override
+    public default void visit(OpPropFunc opPropFunc) {
+        visit1(opPropFunc);
+    }
+
+    @Override
+    public default void visit(OpJoin opJoin) {
+        visit2(opJoin);
+    }
+
+    @Override
+    public default void visit(OpSequence opSequence) {
+        visitN(opSequence);
+    }
+
+    @Override
+    public default void visit(OpDisjunction opDisjunction) {
+        visitN(opDisjunction);
+    }
+
+    @Override
+    public default void visit(OpLeftJoin opLeftJoin) {
+        visitExpr(opLeftJoin.getExprs());
+        visit2(opLeftJoin);
+    }
+
+    @Override
+    public default void visit(OpDiff opDiff) {
+        visit2(opDiff);
+    }
+
+    @Override
+    public default void visit(OpMinus opMinus) {
+        visit2(opMinus);
+    }
+
+    @Override
+    public default void visit(OpUnion opUnion) {
+        visit2(opUnion);
+    }
+
+    @Override
+    public default void visit(OpConditional opCond) {
+        visit2(opCond);
+    }
+
+    @Override
+    public default void visit(OpFilter opFilter) {
+        visitExpr(opFilter.getExprs());
+        visit1(opFilter);
+    }
+
+    @Override
+    public default void visit(OpGraph opGraph) {
+        visit1(opGraph);
+    }
+
+    @Override
+    public default void visit(OpService opService) {
+        visit1(opService);
+    }
+
+    @Override
+    public default void visit(OpDatasetNames dsNames) {
+        visit0(dsNames);
+    }
+
+    @Override
+    public default void visit(OpTable opUnit) {
+        visit0(opUnit);
+    }
+
+    @Override
+    public default void visit(OpExt opExt) {
+        visitExt(opExt);
+    }
+
+    @Override
+    public default void visit(OpNull opNull) {
+        visit0(opNull);
+    }
+
+    @Override
+    public default void visit(OpLabel opLabel) {
+        visit1(opLabel);
+    }
+
+    @Override
+    public default void visit(OpOrder opOrder) {
+        // XXX
+        //opOrder.getConditions() ;
+        visitModifer(opOrder);
+    }
+
+    @Override
+    public default void visit(OpGroup opGroup) {
+        visitExpr(opGroup.getGroupVars()) ;
+        // XXX
+        //opGroup.getAggregators() ;
+        visit1(opGroup);
+    }
+
+    @Override
+    public default void visit(OpTopN opTop) {
+        // XXX
+        // opTop.getConditions() ;
+        visit1(opTop);
+    }
+    
+    @Override
+    public default void visit(OpAssign opAssign) {
+        visitExpr(opAssign.getVarExprList()) ;
+        visit1(opAssign);
+    }
+
+    @Override
+    public default void visit(OpExtend opExtend) {
+        visitExpr(opExtend.getVarExprList()) ;
+        visit1(opExtend);
+    }
+
+    @Override
+    public default void visit(OpList opList) {
+        visitModifer(opList);
+    }
+
+    @Override
+    public default void visit(OpProject opProject) {
+        visitModifer(opProject);
+    }
+
+    @Override
+    public default void visit(OpReduced opReduced) {
+        visitModifer(opReduced);
+    }
+
+    @Override
+    public default void visit(OpDistinct opDistinct) {
+        visitModifer(opDistinct);
+    }
+
+    @Override
+    public default void visit(OpSlice opSlice) {
+        visitModifer(opSlice);
+    }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/c1fde992/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
new file mode 100644
index 0000000..6135416
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/Walker.java
@@ -0,0 +1,190 @@
+/*
+ * 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.algebra.walker;
+
+import java.util.Objects ;
+
+import org.apache.jena.sparql.algebra.* ;
+import org.apache.jena.sparql.core.VarExprList ;
+import org.apache.jena.sparql.expr.* ;
+
+/** Walk algebra, {@link Op}s and {@link Expr}s. */
+public class Walker {
+
+    /** Walk visiting every {@link Op} with an {@link OpVisitor},
+     * including inside expressions.
+     */
+    public static void walk(Op op, OpVisitor opVisitor) {
+        Objects.requireNonNull(opVisitor) ;
+        walk(op, opVisitor, null);
+    }
+    
+    /** Walk visiting every {@link Op} and every {@link Expr},
+     *  starting from an {@link Op}.
+     */
+    public static void walk(Op op, OpVisitor opVisitor, ExprVisitor exprVisitor) {
+        walk(op, opVisitor, exprVisitor, null, null) ; 
+    }
+    
+    /** Walk visiting every {@link Op} and every {@link Expr},
+     *  starting from an {@link Op}.
+     */
+    public static void walk(Op op, OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        if ( op == null )
+            return ;
+        createWalker(opVisitor, exprVisitor, beforeVisitor, afterVisitor).walk(op);
+    }
+
+    /** Walk visiting every {@link Expr} with an {@link ExprVisitor},
+     * including inside any {@link Op} in expressions.
+     */
+    public static void walk(Expr expr, ExprVisitor exprVisitor) {
+        Objects.requireNonNull(exprVisitor) ;
+        walk(expr, null, exprVisitor);
+    }
+    
+    /** Walk visiting every {@link Op} and every {@link Expr},
+     *  starting from an {@link Expr}.
+     */
+    public static void walk(Expr expr, OpVisitor opVisitor, ExprVisitor exprVisitor) {
+        walk(expr, opVisitor, exprVisitor, null, null) ;
+    }
+    
+    /** Walk visiting every {@link Op} and every {@link Expr},
+     *  starting from an {@link Expr}.
+     */
+    public static void walk(Expr expr, OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        if ( expr == null )
+            return ;
+        Objects.requireNonNull(expr) ;
+        createWalker(opVisitor, exprVisitor, beforeVisitor,afterVisitor).walk(expr);
+    }
+    
+
+    /** Walk visiting every {@link Expr} with an {@link ExprVisitor},
+     * including inside any {@link Op} in expressions.
+     */
+    public static void walk(ExprList exprList, ExprVisitor exprVisitor) {
+       walk(exprList, null, exprVisitor);
+    }
+    
+    /** Walk visiting every {@link Op} and every {@link Expr},
+     *  starting from an {@link ExprList}.
+     */
+    public static void walk(ExprList exprList, OpVisitor opVisitor, ExprVisitor exprVisitor) {
+        if ( exprList == null )
+            return ;
+        Objects.requireNonNull(exprVisitor) ;
+        exprList.forEach(e->walk(e,opVisitor, exprVisitor)) ;
+    }
+
+    public static void walk(VarExprList varExprList, ExprVisitor exprVisitor) {
+        Objects.requireNonNull(exprVisitor) ;
+        walk(varExprList, null, exprVisitor);
+     }
+     
+     public static void walk(VarExprList varExprList, OpVisitor opVisitor, ExprVisitor exprVisitor) {
+         if ( varExprList == null )
+             return ;
+         varExprList.forEach((v,e)->walk(e,opVisitor, exprVisitor)) ;
+     }
+ 
+    private static OpVisitor   nullOpVisitor   = new OpVisitorBase() ;
+    private static ExprVisitor nullExprVisitor = new ExprVisitorBase() ;
+     
+    public static WalkerVisitor createWalker(OpVisitor opVisitor, ExprVisitor exprVisitor) {
+        return createWalker(opVisitor, exprVisitor, null, null) ;
+    }
+    
+    public static WalkerVisitor createWalker(OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        
+        if ( opVisitor == null )
+            opVisitor = nullOpVisitor ;
+        if ( exprVisitor == null )
+            exprVisitor = new ExprVisitorBase() ;
+        return new WalkerVisitor(opVisitor, exprVisitor, beforeVisitor, afterVisitor)  ;
+    }
+    
+    /** Transform an {@link Op}. */
+    public static Op transform(Op op, Transform opTransform, ExprTransform exprTransform) {
+        ApplyTransformVisitor v = createTransformer(opTransform, exprTransform) ;
+        return transform(op, v) ;
+    }
+    
+    /** Transform an {@link Op}. */
+    public static Op transform(Op op, Transform opTransform, ExprTransform exprTransform, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        ApplyTransformVisitor v = createTransformer(opTransform, exprTransform) ;
+        return transform(op, v, beforeVisitor, afterVisitor) ;
+    }
+
+    /** Transform an {@link Expr}. */
+    public static Expr transform(Expr expr, Transform opTransform, ExprTransform exprTransform) {
+        ApplyTransformVisitor v = createTransformer(opTransform, exprTransform) ;
+        return transform(expr, v) ;
+    }
+
+    /** Transform an {@link Op}. */
+    public static Op transform(Op op, ApplyTransformVisitor v) {
+        return transform(op, v, null, null) ;
+    }
+
+    /** Transform an {@link Op}. */
+    public static Op transform(Op op, ApplyTransformVisitor v, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        walk(op, v, v, beforeVisitor, afterVisitor) ;
+        return v.opResult() ;
+    }
+
+    /** Transform an {@link Expr}. */
+    public static Expr transform(Expr expr, ApplyTransformVisitor v) {
+        walk(expr, v) ;
+        return v.exprResult() ;
+    }
+
+    /** Transform an {@link Expr}. */
+    public static Expr transform(Expr expr, ApplyTransformVisitor v, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        walk(expr, v, v, beforeVisitor, afterVisitor) ;
+        return v.exprResult() ;
+    }
+
+    /** Transform an algebra expression */
+    public static Op transform(Op op, Transform transform) {
+       return transform(op, transform, null) ;
+    }
+    
+    /** Transform an expression */
+    public static Expr transform(Expr expr, ExprTransform exprTransform) {
+        return transform(expr, null, exprTransform) ;
+    }
+        
+    private static Transform     nullOpTransform   = new TransformBase() ;
+    private static ExprTransform nullExprTransform = new ExprTransformBase() ;
+    
+    public static ApplyTransformVisitor createTransformer(Transform opTransform, ExprTransform exprTransform) {
+        return createTransformer(opTransform, exprTransform, null, null) ;
+    }
+ 
+    public static ApplyTransformVisitor createTransformer(Transform opTransform, ExprTransform exprTransform, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        if ( opTransform == null )
+            opTransform = nullOpTransform ;
+        if ( exprTransform == null )
+            exprTransform = nullExprTransform ;
+        return new ApplyTransformVisitor(opTransform, exprTransform, null, null) ;
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/jena/blob/c1fde992/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
new file mode 100644
index 0000000..59fa8a0
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor.java
@@ -0,0 +1,272 @@
+/*
+ * 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.algebra.walker;
+
+import java.util.Iterator ;
+
+import org.apache.jena.sparql.algebra.Op ;
+import org.apache.jena.sparql.algebra.OpVisitor ;
+import org.apache.jena.sparql.algebra.OpVisitorBase ;
+import org.apache.jena.sparql.algebra.op.* ;
+import org.apache.jena.sparql.core.VarExprList ;
+import org.apache.jena.sparql.expr.* ;
+
+/** Walk algebra and expressions */
+public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunction {
+    protected final ExprVisitor exprVisitor ;
+    protected final OpVisitor   opVisitor ;
+    protected boolean           visitService      = true ;
+    protected int               opDepthLimit      = Integer.MAX_VALUE ;
+    protected int               exprDepthLimit    = Integer.MAX_VALUE ;
+
+    protected int               opDepth      = 0 ;
+    protected int               exprDepth    = 0 ;
+    
+    private final OpVisitor     beforeVisitor ;
+    private final OpVisitor     afterVisitor ;
+
+    /**
+     * A walker. If a visitor is null, then don't walk in. For
+     * "no action but keep walking inwards", use {@link OpVisitorBase} and
+     * {@link ExprVisitorBase}.
+     * 
+     * @see OpVisitorBase
+     * @see ExprVisitorBase
+     */
+    public WalkerVisitor(OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor before, OpVisitor after) {
+        this.opVisitor = opVisitor ;
+        this.exprVisitor = exprVisitor ;
+        if ( opDepthLimit < 0 )
+            opDepthLimit = Integer.MAX_VALUE ;
+        if ( exprDepth < 0 )
+            exprDepthLimit = Integer.MAX_VALUE ;
+        opDepth = 0 ;
+        exprDepth = 0 ;
+        beforeVisitor = before ;
+        afterVisitor = after ;
+    }
+
+    private void before(Op op) {
+        if ( beforeVisitor != null )
+            op.visit(beforeVisitor) ;
+    }
+
+    private void after(Op op) {
+        if ( afterVisitor != null )
+            op.visit(afterVisitor) ;
+    }
+    
+    public void walk(Op op) {
+        if ( op == null )
+            return ;
+        if ( opDepth == opDepthLimit )
+            // No deeper.
+            return ;
+        opDepth++ ; 
+        try { op.visit(this); }
+        finally { opDepth-- ; }
+    }
+    
+    public void walk(Expr expr) {
+        if ( expr == null )
+            return ;
+        if ( exprDepth == exprDepthLimit )
+            return ;
+        exprDepth++ ;
+        try { expr.visit(this) ; }
+        finally { exprDepth-- ; }
+    }
+    
+    public void walk(ExprList exprList) {
+        if ( exprList == null )
+            return ;
+        exprList.forEach(e->walk(e));
+    }
+
+    public void walk(VarExprList varExprList) {
+        if ( varExprList == null )
+            return ;
+        varExprList.forEach((v,e) -> walk(e));
+    }
+
+    // ---- Mode swapping between op and expr. visit=>?walk
+    // XXX
+    @Override
+    public void visitExpr(ExprList exprList) {
+        if ( exprVisitor != null )
+            walk(exprList) ;
+    }
+
+    @Override
+    public void visitExpr(VarExprList varExprList) {
+        if ( exprVisitor != null )
+            walk(varExprList);
+    }
+    
+    // ----
+    
+    public void visitOp(Op op) {
+        before(op) ;
+        if ( opVisitor != null )
+            op.visit(this);
+        after(op) ;
+    }
+
+    @Override
+    public void visit0(Op0 op) {
+        if ( opVisitor != null )
+            op.visit(opVisitor) ;
+    }
+
+    @Override
+    public void visit1(Op1 op) {
+        before(op) ;
+        if ( op.getSubOp() != null )
+            op.getSubOp().visit(this) ;
+        if ( opVisitor != null )
+            op.visit(opVisitor) ;
+        after(op) ;
+    }
+    
+    @Override
+    public void visit2(Op2 op) {
+        before(op) ;
+        if ( op.getLeft() != null )
+            op.getLeft().visit(this) ;
+        if ( op.getRight() != null )
+            op.getRight().visit(this) ;
+        if ( opVisitor != null )
+            op.visit(opVisitor) ;
+        after(op) ;
+    }
+
+    @Override
+    public void visitN(OpN op) {
+        before(op) ;
+        for (Iterator<Op> iter = op.iterator(); iter.hasNext();) {
+            Op sub = iter.next() ;
+            sub.visit(this) ;
+        }
+        if ( opVisitor != null )
+            op.visit(opVisitor) ;
+        after(op) ;
+    }
+
+    @Override
+    public void visitExt(OpExt op) {
+        before(op) ;
+        if ( opVisitor != null )
+            op.visit(opVisitor) ;
+        after(op) ;
+    }
+
+    // Special case Ops.
+    // These should call super.visit to do full processing.
+    
+    @Override
+    public void visit(OpService op) {
+        if ( ! visitService )
+            return ;
+        OpVisitorByTypeAndExpr.super.visit(op) ;
+    }
+    
+    // Transforming to quads needs the graph node handled before doing the sub-algebra ops
+    // so it has to be done as before/after by the Walker. By the time visit(OpGraph) is called,
+    // the sub-tree has already been visited. 
+    
+    
+//    @Override
+//    public void visit(OpGraph op) {
+//        pushGraph(op.getNode()) ;
+//        OpVisitorByTypeAndExpr.super.visit(op) ;
+//        popGraph() ;
+//    }
+//    
+//    private Deque<Node> stack = new ArrayDeque<>() ;
+//    
+//    public Node getCurrentGraph() { return stack.peek() ; }
+//    
+//    private void pushGraph(Node node) {
+//        stack.push(node) ;   
+//    }
+//
+//    private void popGraph() {
+//        stack.pop() ;
+//    }
+
+    // Shared with ElementWalker - mixin
+    @Override
+    public void visit(ExprFunction0 func) { visitExprFunction(func) ; }
+    @Override
+    public void visit(ExprFunction1 func) { visitExprFunction(func) ; }
+    @Override
+    public void visit(ExprFunction2 func) { visitExprFunction(func) ; }
+    @Override
+    public void visit(ExprFunction3 func) { visitExprFunction(func) ; }
+    @Override
+    public void visit(ExprFunctionN func) { visitExprFunction(func) ; }
+    
+    @Override
+    public void visitExprFunction(ExprFunction func) {
+        for ( int i = 1 ; i <= func.numArgs() ; i++ ) {
+            Expr expr = func.getArg(i) ;
+            if ( expr == null )
+                // Put a dummy in, e.g. to keep the transform stack aligned.
+                NodeValue.nvNothing.visit(this) ;
+            else
+                expr.visit(this) ;
+        }
+        if ( exprVisitor != null )
+            func.visit(exprVisitor) ;
+    }
+    
+    @Override
+    public void visit(ExprFunctionOp funcOp) {
+        walk(funcOp.getGraphPattern());
+        if ( exprVisitor != null )
+            funcOp.visit(exprVisitor) ;
+    }
+    
+    @Override
+    public void visit(NodeValue nv) {
+        if ( exprVisitor != null )
+            nv.visit(exprVisitor) ;
+    }
+
+    @Override
+    public void visit(ExprVar v) {
+        if ( exprVisitor != null )
+            v.visit(exprVisitor) ;
+    }
+
+    @Override
+    public void visit(ExprAggregator eAgg) {
+        // This is the assignment variable of the aggregation
+        // not a normal variable of an expression.
+
+        // visitAssignVar(eAgg.getAggVar().asVar()) ;
+
+        // XXX Hack for varsMentioned
+
+        if ( exprVisitor != null )
+            eAgg.visit(exprVisitor) ;
+    }
+}
+
+


[05/23] jena git commit: Put in "fail early" check.

Posted by an...@apache.org.
Put in "fail early" check.

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

Branch: refs/heads/master
Commit: 4c3e91b23a229b402c9af0d01256c091a0c5fad7
Parents: e028645
Author: Andy Seaborne <an...@apache.org>
Authored: Fri Apr 22 10:42:12 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprVar.java | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/4c3e91b2/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprVar.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprVar.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprVar.java
index d2bcef8..0147fa1 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprVar.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprVar.java
@@ -89,7 +89,10 @@ public class ExprVar extends ExprNode
     @Override
     public void visit(ExprVisitor visitor) { visitor.visit(this) ; }
     
-    public Expr apply(ExprTransform transform)  { return transform.transform(this) ; }
+    public Expr apply(ExprTransform transform)  { 
+        if ( transform == null )
+            throw new NullPointerException() ;
+        return transform.transform(this) ; }
     
     public void format(Query query, IndentedWriter out)
     {


[22/23] jena git commit: Remove startVisit/finishVisit. Removed from the ExprVisitor interface

Posted by an...@apache.org.
Remove startVisit/finishVisit. Removed from the ExprVisitor interface


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

Branch: refs/heads/master
Commit: 8c428904d4687f970e3341caff5851a161ba725d
Parents: af9e747
Author: Andy Seaborne <an...@apache.org>
Authored: Sat May 21 19:10:43 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 19:10:43 2016 +0100

----------------------------------------------------------------------
 .../jena/arq/querybuilder/rewriters/ExprRewriter.java   | 12 ------------
 1 file changed, 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/8c428904/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/rewriters/ExprRewriter.java
----------------------------------------------------------------------
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/rewriters/ExprRewriter.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/rewriters/ExprRewriter.java
index 9626ac1..ba148c4 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/rewriters/ExprRewriter.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/rewriters/ExprRewriter.java
@@ -46,12 +46,6 @@ public class ExprRewriter extends AbstractRewriter<Expr> implements ExprVisitor
 	}
 
 	@Override
-	public void startVisit() {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
 	public void visit(ExprFunction0 func) {
 		push(func);
 	}
@@ -154,12 +148,6 @@ public class ExprRewriter extends AbstractRewriter<Expr> implements ExprVisitor
 
 	}
 
-	@Override
-	public void finishVisit() {
-		// TODO Auto-generated method stub
-
-	}
-
 	public final List<SortCondition> rewriteSortConditionList(
 			List<SortCondition> lst) {
 		if (lst == null) {


[11/23] jena git commit: Intermediate towards new walker/transformer.

Posted by an...@apache.org.
Intermediate towards new walker/transformer.

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

Branch: refs/heads/master
Commit: 4a9ead549eae83aeba8aff522f32c891c11991f9
Parents: bbd9d59
Author: Andy Seaborne <an...@apache.org>
Authored: Sat Apr 23 00:21:14 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../algebra/walker/ApplyTransformVisitor.java   | 122 +++++++++++++------
 .../sparql/algebra/walker/WalkerVisitor.java    |  50 +++++++-
 2 files changed, 133 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/4a9ead54/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 750f893..2d545dd 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
@@ -57,15 +57,48 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
     /*package*/ final Expr exprResult() {
         return pop(exprStack) ;
     }
+    
+    private static boolean ISOLATE = false ;
 
     protected Op transform(Op op) {
-        // reuse this ApplyTransformVisitor? with stack checking?
-        return Walker.transform(op, this, beforeVisitor, afterVisitor) ;
+        if ( ISOLATE ) {
+            ApplyTransformVisitor atv = new ApplyTransformVisitor(opTransform, exprTransform, beforeVisitor, afterVisitor) ;
+            return Walker.transform(op, atv, beforeVisitor, afterVisitor) ;
+        }
+        
+        int x1 = opStack.size() ;
+        int x2 = exprStack.size() ;
+        try {
+            // reuse this ApplyTransformVisitor? with stack checking?
+            return Walker.transform(op, this, beforeVisitor, afterVisitor) ;
+        } finally {
+            int y1 = opStack.size() ;
+            int y2 = exprStack.size() ;
+            if ( x1 != y1 )
+                System.err.println("Misaligned opStack") ;
+            if ( x2 != y2 )
+                System.err.println("Misaligned exprStack") ;
+        }
     }
     
     protected Expr transform(Expr expr) {
+        if ( ISOLATE ) {
+            ApplyTransformVisitor atv = new ApplyTransformVisitor(opTransform, exprTransform, beforeVisitor, afterVisitor) ;
+            return Walker.transform(expr, atv, beforeVisitor, afterVisitor) ;
+        }
+        int x1 = opStack.size() ;
+        int x2 = exprStack.size() ;
         // reuse this ApplyTransformVisitor? with stack checking?
-        return Walker.transform(expr, this, beforeVisitor, afterVisitor) ;
+        try {
+            return Walker.transform(expr, this, beforeVisitor, afterVisitor) ;
+        } finally {
+            int y1 = opStack.size() ;
+            int y2 = exprStack.size() ;
+            if ( x1 != y1 )
+                System.err.println("Misaligned opStack") ;
+            if ( x2 != y2 )
+                System.err.println("Misaligned exprStack") ;
+        }
     }
     
     protected ExprList transform(ExprList exprList) {
@@ -115,6 +148,8 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
         visit1(opExtend2) ;
     }
 
+    // VarExprLists are not visited by OpVisitorByTypeAndExpr 
+    // XXX Maybe they should.
     private VarExprList process(VarExprList varExprList) {
         if ( varExprList == null )
             return varExprList ;
@@ -138,32 +173,39 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
         return varExpr2 ;
     }
 
-    private ExprList process(ExprList exprList) {
+    private ExprList collect(ExprList exprList) {
         if ( exprList == null )
             return null ;
-        ExprList exprList2 = new ExprList() ;
-        boolean changed = false ;
-        for ( Expr e : exprList ) {
-            Expr e2 = process(e) ;
-            exprList2.add(e2) ;
-            if ( e != e2 )
-                changed = true ;
-        }
-        if ( !changed )
-            return exprList ;
-        return exprList2 ;
-    }
-
-    private Expr process(Expr expr) {
-        Expr e = expr ;
-        Expr e2 = e ;
-        if ( e != null )
-            e2 = transform(e) ;
-        if ( e == e2 )
-            return expr ;
-        return e2 ;
-    }
-
+        ExprList ex2 = new ExprList() ;
+        exprList.forEach((e)->ex2.add(pop(exprStack)));
+        return ex2 ; 
+    }
+     
+//    private ExprList process(ExprList exprList) {
+//        if ( exprList == null )
+//            return null ;
+//        ExprList exprList2 = new ExprList() ;
+//        boolean changed = false ;
+//        for ( Expr e : exprList ) {
+//            Expr e2 = process(e) ;
+//            exprList2.add(e2) ;
+//            if ( e != e2 )
+//                changed = true ;
+//        }
+//        if ( !changed )
+//            return exprList ;
+//        return exprList2 ;
+//
+//    private Expr process(Expr expr) {
+//        Expr e = expr ;
+//        Expr e2 = e ;
+//        if ( e != null )
+//            e2 = transform(e) ;
+//        if ( e == e2 )
+//            return expr ;
+//        return e2 ;
+//    }
+//
     @Override
     public void visit(OpGroup opGroup) {
         boolean changed = false ;
@@ -249,6 +291,14 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
         push(opStack, opX) ;
     }
 
+    private void dump(String label) {
+        System.out.println(label) ;
+        String x = opStack.toString().replace('\n', ' ').replaceAll("  +", " ") ;
+        String y = exprStack.toString().replace('\n', ' ').replaceAll("  +", " ") ;
+        System.out.println("    O:"+x);
+        System.out.println("    E:"+y);
+    }
+    
     @Override
     public void visit(OpFilter opFilter) {
         Op subOp = null ;
@@ -257,7 +307,8 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
         boolean changed = (opFilter.getSubOp() != subOp) ;
 
         ExprList ex = opFilter.getExprs() ;
-        ExprList ex2 = process(ex) ;
+        ExprList ex2 = collect(ex) ;
+        
         OpFilter f = opFilter ;
         if ( ex != ex2 )
             f = (OpFilter)OpFilter.filter(ex2, subOp) ;
@@ -276,7 +327,7 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
             left = pop(opStack) ;
 
         ExprList exprs = op.getExprs() ;
-        ExprList exprs2 = process(exprs) ;
+        ExprList exprs2 = collect(exprs) ;
         OpLeftJoin x = op ;
         if ( exprs != exprs2 )
             x = OpLeftJoin.createLeftJoin(left, right, exprs2) ;
@@ -302,6 +353,7 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
     
     @Override
     public void visitExpr(ExprList exprs) { 
+        // XXX
         System.err.println("visitExpr(ExprList)") ;
         if ( exprs != null && exprTransform != null ) {
             
@@ -309,7 +361,7 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
     }
     
     @Override
-    public void visitExpr(VarExprList exprVarExprList)  {
+    public void visitVarExpr(VarExprList exprVarExprList)  {
         System.err.println("visitExpr(ExprList)") ;
         if ( exprVarExprList != null && exprTransform != null ) {
             
@@ -348,12 +400,12 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
 
     @Override
     public void visit(ExprFunctionN func) {
-        ExprList x = process(func.getArgs()) ;
+        ExprList x = collect(func.getArgs()) ;
         Expr e = func.apply(exprTransform, x) ;
         push(exprStack, e) ;
     }
 
-    private ExprList process(List<Expr> exprList) {
+    private ExprList collect(List<Expr> exprList) {
         if ( exprList == null )
             return null ;
         int N = exprList.size() ;
@@ -369,10 +421,10 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
     @Override
     public void visit(ExprFunctionOp funcOp) {
         ExprList x = null ;
-//        Op op = transform(funcOp.getGraphPattern()) ;
         if ( funcOp.getArgs() != null )
-            x = process(funcOp.getArgs()) ;
-        Expr e = funcOp.apply(exprTransform, x, funcOp.getGraphPattern()) ;
+            x = collect(funcOp.getArgs()) ;
+        Op op = pop(opStack) ;
+        Expr e = funcOp.apply(exprTransform, x, op) ;
         push(exprStack, e) ;
     }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/4a9ead54/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 59fa8a0..a54572a 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
@@ -114,7 +114,7 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
     }
 
     @Override
-    public void visitExpr(VarExprList varExprList) {
+    public void visitVarExpr(VarExprList varExprList) {
         if ( exprVisitor != null )
             walk(varExprList);
     }
@@ -137,13 +137,17 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
     @Override
     public void visit1(Op1 op) {
         before(op) ;
+        visit1$(op) ;
+        after(op) ;
+    }
+    
+    private void visit1$(Op1 op) {
         if ( op.getSubOp() != null )
             op.getSubOp().visit(this) ;
         if ( opVisitor != null )
             op.visit(opVisitor) ;
-        after(op) ;
     }
-    
+
     @Override
     public void visit2(Op2 op) {
         before(op) ;
@@ -186,6 +190,45 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
         OpVisitorByTypeAndExpr.super.visit(op) ;
     }
     
+    @Override
+    public void visit(OpOrder opOrder) {
+        // XXX
+//        List<SortCondition> conditions = opOrder.getConditions() ;
+//        List<SortCondition> conditions2 = new ArrayList<>() ;
+//        boolean changed = false ;
+//
+//        for ( SortCondition sc : conditions ) {
+//            Expr e = sc.getExpression() ;
+//            Expr e2 = transform(e) ;
+//            conditions2.add(new SortCondition(e2, sc.getDirection())) ;
+//            if ( e != e2 )
+//                changed = true ;
+//        }
+//        OpOrder x = opOrder ;
+//        if ( changed )
+//            x = new OpOrder(opOrder.getSubOp(), conditions2) ;
+        visit1(opOrder) ;
+    }
+
+    @Override
+    public void visit(OpAssign opAssign) {
+        before(opAssign) ;
+        VarExprList varExpr = opAssign.getVarExprList() ;
+        visitVarExpr(varExpr); 
+        visit1$(opAssign) ;
+        after(opAssign) ;
+    }
+
+    @Override
+    public void visit(OpExtend opExtend) {
+        before(opExtend) ;
+        VarExprList varExpr = opExtend.getVarExprList() ;
+        visitVarExpr(varExpr); 
+        visit1$(opExtend) ;
+        after(opExtend) ;
+    }
+
+    
     // Transforming to quads needs the graph node handled before doing the sub-algebra ops
     // so it has to be done as before/after by the Walker. By the time visit(OpGraph) is called,
     // the sub-tree has already been visited. 
@@ -210,7 +253,6 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
 //        stack.pop() ;
 //    }
 
-    // Shared with ElementWalker - mixin
     @Override
     public void visit(ExprFunction0 func) { visitExprFunction(func) ; }
     @Override


[16/23] jena git commit: Skip service. Replace ExprWalker. Use new walker for ExprTransformer.

Posted by an...@apache.org.
Skip service. Replace ExprWalker.  Use new walker for ExprTransformer.

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

Branch: refs/heads/master
Commit: 10dbcf9c3e0c89a692f183b22323ecb06ec8fa5e
Parents: 3c08cde
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Apr 25 13:32:01 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../apache/jena/sparql/algebra/Transformer.java |  40 ++++---
 .../algebra/walker/ApplyTransformVisitor.java   |  24 ++--
 .../jena/sparql/algebra/walker/Walker.java      |  30 ++++-
 .../walker/WalkerVisitorSkipService.java        |   4 +-
 .../org/apache/jena/sparql/expr/ExprLib.java    |   3 +-
 .../org/apache/jena/sparql/expr/ExprList.java   |   4 +-
 .../jena/sparql/expr/ExprTransformer.java       |   1 -
 .../org/apache/jena/sparql/expr/ExprVars.java   |   7 +-
 .../org/apache/jena/sparql/expr/ExprWalker.java | 114 -------------------
 9 files changed, 74 insertions(+), 153 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/10dbcf9c/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 6982605..b724962 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
@@ -19,8 +19,10 @@
 package org.apache.jena.sparql.algebra;
 
 import org.apache.jena.sparql.algebra.op.OpService ;
+import org.apache.jena.sparql.algebra.walker.ApplyTransformVisitor ;
 import org.apache.jena.sparql.algebra.walker.Walker ;
 import org.apache.jena.sparql.expr.ExprTransform ;
+import org.apache.jena.sparql.expr.ExprTransformCopy ;
 
 /** A bottom-top application of a transformation of SPARQL algebra */  
 public class Transformer
@@ -67,25 +69,29 @@ public class Transformer
     }
 
     /** Transform an algebra expression except skip (leave alone) any OpService nodes */
-    public static Op transformSkipService(Transform opTransform, ExprTransform exprTransform, Op op, OpVisitor beforeVisitor,
-                                          OpVisitor afterVisitor) {
-
-        // XXX XXX Needs fixing
-//        if ( opTransform == null )
-//            opTransform = new TransformBase() ;
-//        if ( exprTransform == null )
-//            exprTransform = new ExprTransformCopy() ;
-//        Transform transform2 = new TransformSkipService(opTransform) ;
-//        ApplyTransformVisitor atv = new ApplyTransformVisitor(transform2, exprTransform, beforeVisitor, afterVisitor) ;
-//        WalkerVisitor wv = new WalkerVisitorSkipService(atv, atv, beforeVisitor, afterVisitor) ;
-//        return Walker.transform(op, atv) ;
-
-        // OLD
-        // Simplest way but still walks the OpService subtree (and throws away the
-        // transformation).
+    public static Op transformSkipService(Transform opTransform, ExprTransform exprTransform, Op op,
+                                          OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        
+        if ( true ) {
+            // XXX XXX Better work with Walker.
+            if ( opTransform == null )
+                opTransform = new TransformCopy() ;
+            if ( exprTransform == null )
+                exprTransform = new ExprTransformCopy() ;
+            Transform transform2 = new TransformSkipService(opTransform) ;
+            transform2 = opTransform ;
+            ApplyTransformVisitor atv = new ApplyTransformVisitor(transform2, exprTransform, false, beforeVisitor, afterVisitor) ;
+            return Walker.transformSkipService(op, atv, beforeVisitor, afterVisitor) ;
+        }
+        
         Transform transform = new TransformSkipService(opTransform) ;
         return Transformer.transform(transform, exprTransform, op, beforeVisitor, afterVisitor) ;
-        // XXX XXX Better to modify the walk and force the transform to be a no-op.
+//        // OLD
+//        // Simplest way but still walks the OpService subtree (and throws away the
+//        // transformation).
+//        Transform transform = new TransformSkipService(opTransform) ;
+//        return Transformer.transform(transform, exprTransform, op, beforeVisitor, afterVisitor) ;
+//        // XXX XXX Better to modify the walk and force the transform to be a no-op.
     }
 
     // To allow subclassing this class, we use a singleton pattern

http://git-wip-us.apache.org/repos/asf/jena/blob/10dbcf9c/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 c58425b..126e985 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
@@ -38,7 +38,7 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
     private final Transform     opTransform ;
     private final ExprTransform exprTransform ;
 
-    protected boolean           visitService = true ;
+    protected final boolean     visitService ;
     
     private final Deque<Op>     opStack   = new ArrayDeque<>() ;
     private final Deque<Expr>   exprStack = new ArrayDeque<>() ;
@@ -46,14 +46,17 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
     private final OpVisitor     beforeVisitor ;
     private final OpVisitor     afterVisitor ;
 
-    public ApplyTransformVisitor(Transform opTransform, ExprTransform exprTransform, OpVisitor before, OpVisitor after) {
+    public ApplyTransformVisitor(Transform opTransform, ExprTransform exprTransform,
+                                 boolean visitService,
+                                 OpVisitor before, OpVisitor after) {
         this.opTransform = opTransform ;
         this.exprTransform = exprTransform ;
         this.beforeVisitor = before ;
         this.afterVisitor = after ;
+        this.visitService = visitService ;
     }
 
-    /*package*/ final Op opResult() {
+    public /*package*/ final Op opResult() {
         return pop(opStack) ;
     }
 
@@ -64,10 +67,8 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
     private static boolean ISOLATE = false ;
 
     protected Op transform(Op op) {
-        if ( ISOLATE ) {
-            ApplyTransformVisitor atv = new ApplyTransformVisitor(opTransform, exprTransform, beforeVisitor, afterVisitor) ;
-            return Walker.transform(op, atv, beforeVisitor, afterVisitor) ;
-        }
+        // XXX XXX
+        //if ( ISOLATE ) { }
         
         int x1 = opStack.size() ;
         int x2 = exprStack.size() ;
@@ -85,10 +86,9 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
     }
     
     protected Expr transform(Expr expr) {
-        if ( ISOLATE ) {
-            ApplyTransformVisitor atv = new ApplyTransformVisitor(opTransform, exprTransform, beforeVisitor, afterVisitor) ;
-            return Walker.transform(expr, atv, beforeVisitor, afterVisitor) ;
-        }
+        // XXX XXX
+        //if ( ISOLATE ) { }
+        
         int x1 = opStack.size() ;
         int x2 = exprStack.size() ;
         // reuse this ApplyTransformVisitor? with stack checking?
@@ -334,7 +334,7 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
     @Override
     public void visit(OpService op) {
         if ( ! visitService ) {
-            // No visit - push input.
+            // No visit - no transform - push input.
             push(opStack, op) ;
             return ;
         }

http://git-wip-us.apache.org/repos/asf/jena/blob/10dbcf9c/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 766d5ab..2a31b4e 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
@@ -51,11 +51,22 @@ public class Walker {
         walk$(op, opVisitor, exprVisitor, beforeVisitor, afterVisitor) ;
     }
     
+    public static void walkSkipService(Op op, OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        if ( op == null )
+            return ;
+        walkSkipService$(op, opVisitor, exprVisitor, beforeVisitor, afterVisitor) ;
+    }
+
     private static void walk$(Op op, OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
         WalkerVisitor wv = createWalker(opVisitor, exprVisitor, beforeVisitor, afterVisitor) ;
         walk$(op, wv) ;
     }
     
+    private static void walkSkipService$(Op op, OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        WalkerVisitor wv = createWalkerSkipService(opVisitor, exprVisitor, beforeVisitor, afterVisitor) ;
+        walk$(op, wv) ;
+    }
+
     private static void walk$(Op op, WalkerVisitor walker) {
         walker.walk(op);
     }
@@ -129,7 +140,6 @@ public class Walker {
     }
     
     public static WalkerVisitor createWalker(OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
-        
         if ( opVisitor == null )
             opVisitor = nullOpVisitor ;
         if ( exprVisitor == null )
@@ -137,6 +147,14 @@ public class Walker {
         return new WalkerVisitor(opVisitor, exprVisitor, beforeVisitor, afterVisitor)  ;
     }
     
+    public static WalkerVisitor createWalkerSkipService(OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        if ( opVisitor == null )
+            opVisitor = nullOpVisitor ;
+        if ( exprVisitor == null )
+            exprVisitor = nullExprVisitor ;
+        return new WalkerVisitorSkipService(opVisitor, exprVisitor, beforeVisitor, afterVisitor)  ;
+    }
+
     /** Transform an algebra expression */
     public static Op transform(Op op, Transform transform) {
        return transform(op, transform, null) ;
@@ -150,7 +168,7 @@ public class Walker {
     
     /** Transform an {@link Op}. */
     public static Op transform(Op op, Transform opTransform, ExprTransform exprTransform, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
-        ApplyTransformVisitor v = createTransformer(opTransform, exprTransform) ;
+        ApplyTransformVisitor v = createTransformer(opTransform, exprTransform, beforeVisitor,afterVisitor) ;
         return transform(op, v, beforeVisitor, afterVisitor) ;
     }
 
@@ -165,6 +183,12 @@ public class Walker {
         return v.opResult() ;
     }
 
+    /** Transform an {@link Op}. */
+    public static Op transformSkipService(Op op, ApplyTransformVisitor v, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
+        walkSkipService(op, v, v, beforeVisitor, afterVisitor) ;
+        return v.opResult() ;
+    }
+
     /** Transform an expression */
     public static Expr transform(Expr expr, ExprTransform exprTransform) {
         return transform(expr, null, exprTransform) ;
@@ -200,7 +224,7 @@ public class Walker {
             opTransform = nullOpTransform ;
         if ( exprTransform == null )
             exprTransform = nullExprTransform ;
-        return new ApplyTransformVisitor(opTransform, exprTransform, null, null) ;
+        return new ApplyTransformVisitor(opTransform, exprTransform, true, null, null) ;
     }
 }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/10dbcf9c/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitorSkipService.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitorSkipService.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitorSkipService.java
index 9adc426..ebf0130 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitorSkipService.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitorSkipService.java
@@ -31,7 +31,9 @@ public class WalkerVisitorSkipService extends WalkerVisitor {
     
     @Override
     public void visit(OpService op) {
-        return ;
+        // Visit the op itself but not the subOp. 
+        if ( opVisitor != null )
+            op.visit(opVisitor) ;
     }
 }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/10dbcf9c/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprLib.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprLib.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprLib.java
index 4553884..123b5e0 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprLib.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprLib.java
@@ -21,6 +21,7 @@ package org.apache.jena.sparql.expr;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.sparql.ARQInternalErrorException ;
 import org.apache.jena.sparql.algebra.optimize.ExprTransformConstantFold ;
+import org.apache.jena.sparql.algebra.walker.Walker ;
 import org.apache.jena.sparql.core.Var ;
 import org.apache.jena.sparql.engine.binding.Binding ;
 import org.apache.jena.sparql.function.FunctionEnv ;
@@ -191,7 +192,7 @@ public class ExprLib
      */
     public static boolean isStable(Expr expr) {
         try {
-            ExprWalker.walk(exprVisitorCheckForNonFunctions, expr) ;
+            Walker.walk(expr, exprVisitorCheckForNonFunctions) ;
             return true ;
         } catch ( ExprUnstable ex ) {
             return false ;

http://git-wip-us.apache.org/repos/asf/jena/blob/10dbcf9c/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprList.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprList.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprList.java
index d386ca3..7662e0c 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprList.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprList.java
@@ -19,6 +19,8 @@
 package org.apache.jena.sparql.expr;
 
 import java.util.* ;
+
+import org.apache.jena.sparql.algebra.walker.Walker ;
 import org.apache.jena.sparql.core.Var ;
 import org.apache.jena.sparql.engine.ExecutionContext ;
 import org.apache.jena.sparql.engine.binding.Binding ;
@@ -109,7 +111,7 @@ public class ExprList implements Iterable<Expr>
         ExprBuild build = new ExprBuild(context) ;
         // Give each expression the chance to set up (bind functions)
         for (Expr expr : expressions)
-            ExprWalker.walk(build, expr) ;
+            Walker.walk(expr, build) ;
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/jena/blob/10dbcf9c/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java
index f5e8d1f..970412d 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformer.java
@@ -24,7 +24,6 @@ public class ExprTransformer
 {
     /** Transform an expression */
     public static Expr transform(ExprTransform transform, Expr expr)
-    //{ return get().transformation(transform, expr) ; }
     { return Walker.transform(expr, transform) ;}
 
     /** Transform an expression list */

http://git-wip-us.apache.org/repos/asf/jena/blob/10dbcf9c/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprVars.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprVars.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprVars.java
index d173682..17a034e 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprVars.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprVars.java
@@ -24,6 +24,7 @@ import java.util.Set ;
 
 import org.apache.jena.query.SortCondition ;
 import org.apache.jena.sparql.algebra.OpVars ;
+import org.apache.jena.sparql.algebra.walker.Walker ;
 import org.apache.jena.sparql.core.Var ;
 
 public class ExprVars
@@ -56,7 +57,7 @@ public class ExprVars
                 }
             } ;
         ExprVarsWorker<Var> vv = new ExprVarsWorker<>(acc, action) ;
-        ExprWalker.walk(vv, expr) ;
+        Walker.walk(expr, vv) ;
     }
     
     public static void nonOpVarsMentioned(Collection<Var> acc, Expr expr)
@@ -70,7 +71,7 @@ public class ExprVars
                     }
                 } ;
         ExprNoOpVarsWorker<Var> vv = new ExprNoOpVarsWorker<>(acc, action) ;
-        ExprWalker.walk(vv, expr) ;
+        Walker.walk(expr, vv) ;
     }
     
     public static Set<String> getVarNamesMentioned(Expr expr)
@@ -91,7 +92,7 @@ public class ExprVars
                 }
             } ;
         ExprVarsWorker<String> vv = new ExprVarsWorker<>(acc, action) ;
-        ExprWalker.walk(vv, expr) ;
+        Walker.walk(expr, vv) ;
     }
     
     

http://git-wip-us.apache.org/repos/asf/jena/blob/10dbcf9c/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprWalker.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprWalker.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprWalker.java
deleted file mode 100644
index 2a29156..0000000
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprWalker.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * 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.expr;
-/** Walk the expression tree, bottom up */
-public class ExprWalker 
-{
-    ExprVisitor visitor ;
-    
-    public ExprWalker(ExprVisitor visitor)
-    {
-        this.visitor = visitor ;
-    }
-    
-    public void walk(Expr expr) { expr.visit(visitor) ; }
-
-    static public void walk(ExprVisitor visitor, Expr expr)
-    {
-        if ( expr == null )
-            return ;
-        expr.visit(new WalkerBottomUp(visitor)) ;
-    }
-    
-//    static public void walk(ExprVisitor visitor, Expr expr)
-//    { expr.visit(new WalkerTopDown(visitor)) ; }
-
-    static class Walker extends ExprVisitorFunction
-    {
-        ExprVisitor visitor ;
-        boolean topDown = true ;
-        
-        private Walker(ExprVisitor visitor, boolean topDown)
-        { 
-            this.visitor = visitor ;
-            this.topDown = topDown ;
-        }
-        
-        @Override
-        protected void visitExprFunction(ExprFunction func)
-        {
-            if ( topDown )
-                func.visit(visitor) ;    
-            for ( int i = 1 ; i <= func.numArgs() ; i++ )
-            {
-                Expr expr = func.getArg(i) ;
-                if ( expr == null )
-                    // Put a dummy in, e.g. to keep the transform stack aligned.
-                    NodeValue.nvNothing.visit(this) ;
-                else
-                    expr.visit(this) ;
-            }
-            if ( !topDown )
-                func.visit(visitor) ;
-        }
-        
-//        @Override
-//        public void visit(ExprFunction3 func)
-//        {
-//            if ( topDown )
-//                func.visit(visitor) ; 
-//            // These are 2 or 3 args.  Put a dummy in. 
-//            func.getArg1().visit(this) ;
-//            func.getArg2().visit(this) ;
-//            if ( func.getArg3() == null )
-//                NodeValue.nvNothing.visit(this) ;
-//            else
-//                func.getArg3().visit(this) ;
-//            if ( !topDown )
-//                func.visit(visitor) ;
-//        }
-        
-        @Override
-        public void visit(ExprFunctionOp funcOp)
-        { funcOp.visit(visitor) ; }
-        
-        @Override
-        public void visit(NodeValue nv)         { nv.visit(visitor) ; }
-        @Override
-        public void visit(ExprVar v)            { v.visit(visitor) ; }
-        @Override
-        public void visit(ExprAggregator eAgg)    { eAgg.visit(visitor) ; }
-        
-    }
-    
-    // Visit current element then visit subelements
-    public static class WalkerTopDown extends Walker
-    {
-        private WalkerTopDown(ExprVisitor visitor)
-        { super(visitor, true) ; }
-    }
-
-    // Visit current element then visit subelements
-    public static class WalkerBottomUp extends Walker
-    {
-        private WalkerBottomUp(ExprVisitor visitor)
-        { super(visitor, false) ; }
-    }
-
-}


[06/23] jena git commit: Rename ElementWalker.Walker

Posted by an...@apache.org.
Rename ElementWalker.Walker


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

Branch: refs/heads/master
Commit: 86877d1918ca68300dd957e585f82c4e9d156e52
Parents: 4c3e91b
Author: Andy Seaborne <an...@apache.org>
Authored: Fri Apr 22 10:45:11 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../java/org/apache/jena/sparql/syntax/ElementWalker.java    | 8 ++++----
 .../main/java/org/apache/jena/sparql/syntax/PatternVars.java | 4 ++--
 2 files changed, 6 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/86877d19/jena-arq/src/main/java/org/apache/jena/sparql/syntax/ElementWalker.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/ElementWalker.java b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/ElementWalker.java
index 11ea61a..36c0434 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/ElementWalker.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/ElementWalker.java
@@ -36,22 +36,22 @@ public class ElementWalker
     
     public static void walk(Element el, ElementVisitor visitor, ElementVisitor beforeVisitor, ElementVisitor afterVisitor)
     {
-        Walker w = new Walker(visitor, beforeVisitor, afterVisitor) ;
+        EltWalker w = new EltWalker(visitor, beforeVisitor, afterVisitor) ;
         el.visit(w) ;
     }
 
-    protected static void walk$(Element el, Walker walker)
+    protected static void walk$(Element el, EltWalker walker)
     {
         el.visit(walker) ;
     }
 
-    static public class Walker implements ElementVisitor
+    static class EltWalker implements ElementVisitor
     {
         protected final ElementVisitor proc ;
         protected final ElementVisitor beforeVisitor ;
         protected final ElementVisitor afterVisitor ;
         
-        protected Walker(ElementVisitor visitor, ElementVisitor beforeVisitor, ElementVisitor afterVisitor)
+        protected EltWalker(ElementVisitor visitor, ElementVisitor beforeVisitor, ElementVisitor afterVisitor)
         { 
             proc = visitor ;
             this.beforeVisitor= beforeVisitor ; 

http://git-wip-us.apache.org/repos/asf/jena/blob/86877d19/jena-arq/src/main/java/org/apache/jena/sparql/syntax/PatternVars.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/PatternVars.java b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/PatternVars.java
index cb19e81..247c933 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/PatternVars.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/PatternVars.java
@@ -40,11 +40,11 @@ public class PatternVars
     
     public static void vars(Element element, PatternVarsVisitor visitor)
     {
-        ElementWalker.Walker walker = new WalkerSkipMinus(visitor) ;
+        ElementWalker.EltWalker walker = new WalkerSkipMinus(visitor) ;
         ElementWalker.walk$(element, walker) ;
     }
     
-    public static class WalkerSkipMinus extends ElementWalker.Walker
+    public static class WalkerSkipMinus extends ElementWalker.EltWalker
     {
         protected WalkerSkipMinus(ElementVisitor visitor)
         {


[10/23] jena git commit: visitExpr -> visitVarExpr

Posted by an...@apache.org.
visitExpr -> visitVarExpr

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

Branch: refs/heads/master
Commit: bbd9d59d850bb47a3bd70405c41f6bc7d922a7e5
Parents: 5db5e02
Author: Andy Seaborne <an...@apache.org>
Authored: Sat Apr 23 00:20:26 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../jena/sparql/algebra/walker/OpVisitorByTypeAndExpr.java   | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/bbd9d59d/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 7dfb65f..8c1ee3e 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
@@ -39,7 +39,7 @@ public interface OpVisitorByTypeAndExpr extends OpVisitor
     }
 
     public void visitExpr(ExprList exprs) ;
-    public void visitExpr(VarExprList exprs) ;
+    public void visitVarExpr(VarExprList exprs) ;
     //public void visitAssignVar(Var var) ;
     
     public default void visitModifer(OpModifier opMod) {
@@ -177,7 +177,7 @@ public interface OpVisitorByTypeAndExpr extends OpVisitor
 
     @Override
     public default void visit(OpGroup opGroup) {
-        visitExpr(opGroup.getGroupVars()) ;
+        visitVarExpr(opGroup.getGroupVars()) ;
         // XXX
         //opGroup.getAggregators() ;
         visit1(opGroup);
@@ -192,13 +192,13 @@ public interface OpVisitorByTypeAndExpr extends OpVisitor
     
     @Override
     public default void visit(OpAssign opAssign) {
-        visitExpr(opAssign.getVarExprList()) ;
+        visitVarExpr(opAssign.getVarExprList()) ;
         visit1(opAssign);
     }
 
     @Override
     public default void visit(OpExtend opExtend) {
-        visitExpr(opExtend.getVarExprList()) ;
+        visitVarExpr(opExtend.getVarExprList()) ;
         visit1(opExtend);
     }
 


[13/23] jena git commit: Conversion to quads does not alter (service)

Posted by an...@apache.org.
Conversion to quads does not alter (service)

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

Branch: refs/heads/master
Commit: bcc4aa92b1e5390d8ccebe2406e1031aeb93ed73
Parents: 747373c
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Apr 25 11:55:52 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../jena/sparql/algebra/TestTransformQuads.java | 33 +++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/bcc4aa92/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestTransformQuads.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestTransformQuads.java b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestTransformQuads.java
index f1304e5..20d7f3a 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestTransformQuads.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestTransformQuads.java
@@ -151,7 +151,38 @@ public class TestTransformQuads extends BaseTest
                                          "                         (quadpattern (quad ?g ?x ?y ?z))))))",
                                          "    (table unit))") ; }
 
-        
+    // Don't touch SERVICE 
+    @Test public void quads38() { test ("{ {?s ?p ?o } UNION { SERVICE <http://host/endpoint> { GRAPH ?gr { ?sr ?pr ?or }}} }",
+                                        "(union",
+                                        "  (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?s ?p ?o))",
+                                        "  (service <http://host/endpoint>",
+                                        "    (graph ?gr",
+                                        "      (bgp (triple ?sr ?pr ?or))))",
+                                        ")") ; }
+    
+    // Don't touch SERVICE 
+    @Test public void quads39() { test ("{ { GRAPH ?g { ?s ?p ?o } } UNION { SERVICE <http://host/endpoint> { GRAPH ?gr { ?sr ?pr ?or }}} }",
+                                        "(union",
+                                        "  (quadpattern (?g ?s ?p ?o))",
+                                        "  (service <http://host/endpoint>",
+                                        "    (graph ?gr",
+                                        "      (bgp (triple ?sr ?pr ?or))))",
+                                        ")") ; }
+    
+    // Don't touch SERVICE 
+    @Test public void quads40() { test ("{ GRAPH ?g { SERVICE <http://host/endpoint> { ?s ?p ?o }}}",
+                                        "(service <http://host/endpoint> (bgp (triple ?s ?p ?o)))") ;
+                                }
+
+    // Don't touch SERVICE 
+    @Test public void quads41() { test ("{ GRAPH ?g1 { SERVICE <http://host/endpoint> { ?s ?p ?o } ?s1 ?p1 ?o1 } }",
+                                        "(sequence",
+                                        "   (service <http://host/endpoint> (bgp (triple ?s ?p ?o)))",
+                                        "   (quadpattern (?g1 ?s1 ?p1 ?o1))",
+                                        ")") ;
+                                }
+
+
 
     private static void test(String patternString, String... strExpected) {
         test(patternString, true, strExpected) ;


[09/23] jena git commit: Add comment.

Posted by an...@apache.org.
Add comment.

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

Branch: refs/heads/master
Commit: 5db5e02cb05b6717381989045de945c4a4c94b59
Parents: c553b94
Author: Andy Seaborne <an...@apache.org>
Authored: Sat Apr 23 00:19:39 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../java/org/apache/jena/sparql/algebra/AlgebraGenerator.java    | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/5db5e02c/jena-arq/src/main/java/org/apache/jena/sparql/algebra/AlgebraGenerator.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/AlgebraGenerator.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/AlgebraGenerator.java
index 6578ee7..1a975aa 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/AlgebraGenerator.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/AlgebraGenerator.java
@@ -39,8 +39,8 @@ import org.apache.jena.sparql.syntax.* ;
 import org.apache.jena.sparql.util.Context ;
 
 /**
- * Class used to compile SPARQL queries into SPARQL algebra
- *
+ * Class used to compile SPARQL queries into SPARQL algebra.
+ * This is the SPARQL standard defined process of abstract syntax to algebra.
  */
 public class AlgebraGenerator 
 {


[17/23] jena git commit: Correct tests in the light of deep walking abnd transformation.

Posted by an...@apache.org.
Correct tests in the light of deep walking abnd transformation.

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

Branch: refs/heads/master
Commit: 41f6e1ab317b6ffdb0997cc1f3b17ced6c10827a
Parents: 10dbcf9
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Apr 25 18:38:01 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../TestTransformEliminateAssignments.java      | 79 +++++++++++++-------
 1 file changed, 53 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/41f6e1ab/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestTransformEliminateAssignments.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestTransformEliminateAssignments.java b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestTransformEliminateAssignments.java
index 2de716c..38b8b82 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestTransformEliminateAssignments.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestTransformEliminateAssignments.java
@@ -451,32 +451,59 @@ public class TestTransformEliminateAssignments {
         //@formatter:on
     }
 
-    @Test
-    public void ineligible_10() {
-        // We can't inline out of an EXISTS since the assignment isn't projected
-        // out anyway
-        //@formatter:off
-        testNoChange("(project (?y)",
-                     "  (filter (exprlist ?x (exists",
-                     "                         (extend (?x true)",
-                     "                           (table unit))))",
-                     "    (table unit)))");
-        //@formatter:on
-    }
-
-    @Test
-    public void ineligible_11() {
-        // We can't inline out of an EXISTS since the assignment isn't projected
-        // out anyway
-        //@formatter:off
-        testNoChange("(project (?y)",
-                     "  (filter (exprlist ?x)",
-                     "    (filter (exprlist (exists",
-                     "                         (extend (?x true)",
-                     "                           (table unit))))",
-                     "      (table unit))))");
-        //@formatter:on
-    }
+    // Test not correct.
+    // The "(extend (?x ...))" is not used - it does not cause ?x to come out of (exists).
+    // This would be true regardless of the (project) but the current code is only
+    // triggered by (project)
+
+    // OLD - wrong (new walker correctly waks into the exist). 
+//    @Test
+//    public void ineligible_10() {
+//        // We can't inline out of an EXISTS since the assignment isn't projected
+//        // out anyway
+//        //@formatter:off
+//        testNoChange("(project (?y)",
+//                     "  (filter (exprlist ?x (exists",
+//                     "                         (extend (?x true)",
+//                     "                           (table unit))))",
+//                     "    (table unit)))");
+//        //@formatter:on
+//    }
+    
+    // Checks the right output though for the wrong reason. 
+//    @Test
+//    public void eligible_10() {
+//        // The "(extend (?x ...)" is not used - it does not com eout of the (exists).
+//        // This would be true reagrdless of the (project) but the current code is only
+//        // triggered by (project)
+//        //@formatter:off
+//        test(StrUtils.strjoinNL("(project (?y)",
+//                                "  (filter (exprlist ?x (exists",
+//                                "                         (extend (?x true)",
+//                                "                           (table unit))))",
+//                                "    (table unit)))"),
+//             "(project (?y)",
+//             "  (filter (exprlist ?x (exists",
+//             "                         (extend (?x true)",
+//             "                           (table unit))))",
+//             "    (table unit)))");
+//             ;
+//        //@formatter:on
+//    }
+//
+//    @Test
+//    public void ineligible_11() {
+//        // We can't inline out of an EXISTS since the assignment isn't projected
+//        // out anyway
+//        //@formatter:off
+//        testNoChange("(project (?y)",
+//                     "  (filter (exprlist ?x)",
+//                     "    (filter (exprlist (exists",
+//                     "                         (extend (?x true)",
+//                     "                           (table unit))))",
+//                     "      (table unit))))");
+//        //@formatter:on
+//    }
 
     @Test
     public void ineligible_12() {


[21/23] jena git commit: Remove old comment.

Posted by an...@apache.org.
Remove old comment.

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

Branch: refs/heads/master
Commit: c86069e8261769a0b1c09c28a091f898c9105fbd
Parents: 41f6e1a
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Apr 25 18:39:05 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/c86069e8/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java
index 9c0016b..afa9cdd 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNode.java
@@ -121,5 +121,5 @@ public abstract class ExprNode implements Expr
     public boolean isGraphPattern()     { return false ; }
     public Op getGraphPattern()         { return null ; }
     @Override
-    public String toString()            { return WriterExpr.asString(this) ; } // was ExprUtils.fmtSPARQL(this) 
+    public String toString()            { return WriterExpr.asString(this) ; } 
 }


[20/23] jena git commit: Proper Expr.NONE

Posted by an...@apache.org.
Proper Expr.NONE

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

Branch: refs/heads/master
Commit: ee9aff073069bf01f1e908ddbb91e7582c937659
Parents: 663f066
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Apr 25 19:45:28 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../algebra/walker/ApplyTransformVisitor.java   |  2 +-
 .../jena/sparql/algebra/walker/ExprNone.java    | 10 ----
 .../sparql/algebra/walker/WalkerVisitor.java    |  2 +-
 .../sparql/algebra/walker/WalkerVisitor0.java   |  2 +-
 .../java/org/apache/jena/sparql/expr/Expr.java  |  2 +
 .../org/apache/jena/sparql/expr/ExprNone.java   | 60 ++++++++++++++++++++
 6 files changed, 65 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/ee9aff07/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 499ab72..43544c6 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
@@ -219,7 +219,7 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
         List<Expr> x = new ArrayList<>(N) ;
         for ( int i = N-1 ; i >= 0 ; i-- ) {
             Expr e2 = pop(exprStack) ;
-            if ( e2 ==  ExprNone.NONE )
+            if ( e2 ==  Expr.NONE )
                 e2 = null ;
             x.add(0, e2) ;
         }

http://git-wip-us.apache.org/repos/asf/jena/blob/ee9aff07/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
deleted file mode 100644
index f7acae9..0000000
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ExprNone.java
+++ /dev/null
@@ -1,10 +0,0 @@
-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/ee9aff07/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 4537cd7..451aedb 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
@@ -103,7 +103,7 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
             return ;
         // retains order.
         varExprList.forEachVarExpr((v,e) -> {
-            Expr expr = (e!=null) ? e : ExprNone.NONE ; 
+            Expr expr = (e!=null) ? e : Expr.NONE ; 
             walk(expr) ;
         });
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/ee9aff07/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java
index df99488..2b9dace 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java
@@ -103,7 +103,7 @@ public class WalkerVisitor0 implements OpVisitorByTypeAndExpr, ExprVisitorFuncti
             return ;
         // retains order.
         varExprList.forEachVarExpr((v,e) -> {
-            Expr expr = (e!=null) ? e : ExprNone.NONE ; 
+            Expr expr = (e!=null) ? e : Expr.NONE ; 
             walk(expr) ;
         });
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/ee9aff07/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java
index a1cde07..90efc4f 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java
@@ -30,6 +30,8 @@ import org.apache.jena.sparql.graph.NodeTransform;
 
 public interface Expr
 {
+    public static final Expr NONE = ExprNone.NONE0 ;
+    
     public static final int CMP_GREATER  =  DatatypeConstants.GREATER ;
     public static final int CMP_EQUAL    =  DatatypeConstants.EQUAL ;
     public static final int CMP_LESS     =  DatatypeConstants.LESSER ;

http://git-wip-us.apache.org/repos/asf/jena/blob/ee9aff07/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNone.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNone.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNone.java
new file mode 100644
index 0000000..a0e07f4
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNone.java
@@ -0,0 +1,60 @@
+/*
+ * 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.expr;
+
+import org.apache.jena.atlas.lib.InternalErrorException ;
+import org.apache.jena.sparql.engine.binding.Binding ;
+import org.apache.jena.sparql.function.FunctionEnv ;
+import org.apache.jena.sparql.graph.NodeTransform ;
+
+/** Marker, used in place of a null.
+ *  This may be tested for using {@code ==} */
+
+/*package*/ class ExprNone extends ExprNode {
+    
+    /*paclage*/ static Expr NONE0 = new ExprNone() ; 
+    
+    private ExprNone() {}
+
+    @Override public void visit(ExprVisitor visitor) {}
+
+    @Override public NodeValue eval(Binding binding, FunctionEnv env) {
+        throw new InternalErrorException("Attempt to evalk ExprNone") ;
+    }
+
+    @Override
+    public int hashCode() {
+        return -999999 ;
+    }
+
+    @Override
+    public boolean equals(Expr other, boolean bySyntax) {
+        return other == this ;
+    }
+
+    @Override
+    public Expr copySubstitute(Binding binding) {
+        return this ;
+    }
+
+    @Override
+    public Expr applyNodeTransform(NodeTransform transform) {
+        return this ;
+    }
+}


[19/23] jena git commit: Introduce Expr.NONE to replace NodeValue.nvNothing.

Posted by an...@apache.org.
Introduce Expr.NONE to replace NodeValue.nvNothing.


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

Branch: refs/heads/master
Commit: e4ef5bc78c6e381a8428819c941bc60b14ffae3c
Parents: ee9aff0
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Apr 25 21:48:06 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 21 18:29:13 2016 +0100

----------------------------------------------------------------------
 .../algebra/walker/ApplyTransformVisitor.java   |  7 +-
 .../algebra/walker/ElementWalker_New.java       |  2 +-
 .../sparql/algebra/walker/WalkerVisitor.java    | 12 ++-
 .../sparql/algebra/walker/WalkerVisitor0.java   |  4 +-
 .../java/org/apache/jena/sparql/expr/Expr.java  |  1 +
 .../org/apache/jena/sparql/expr/ExprNone.java   | 18 +++--
 .../apache/jena/sparql/expr/ExprTransform.java  |  2 +
 .../jena/sparql/expr/ExprTransformBase.java     |  1 +
 .../jena/sparql/expr/ExprTransformCopy.java     | 81 +++++++++-----------
 .../apache/jena/sparql/expr/ExprVisitor.java    | 10 +--
 .../org/apache/jena/sparql/expr/NodeValue.java  |  4 +-
 11 files changed, 74 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/e4ef5bc7/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 43544c6..5020647 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
@@ -219,7 +219,7 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
         List<Expr> x = new ArrayList<>(N) ;
         for ( int i = N-1 ; i >= 0 ; i-- ) {
             Expr e2 = pop(exprStack) ;
-            if ( e2 ==  Expr.NONE )
+            if ( e2 == Expr.NONE )
                 e2 = null ;
             x.add(0, e2) ;
         }
@@ -444,6 +444,11 @@ public class ApplyTransformVisitor implements OpVisitorByTypeAndExpr, ExprVisito
         Expr e = eAgg.apply(exprTransform) ;
         push(exprStack, e) ;
     }
+    
+    @Override
+    public void visit(ExprNone e) {
+        push(exprStack, e) ;
+    }
 
     private <T> void push(Deque<T> stack, T value) {
         if ( value == null )

http://git-wip-us.apache.org/repos/asf/jena/blob/e4ef5bc7/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 aab404a..b0fb10a 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
@@ -168,7 +168,7 @@ public class ElementWalker_New {
                 Expr expr = func.getArg(i) ;
                 if ( expr == null )
                     // Put a dummy in, e.g. to keep the transform stack aligned.
-                    NodeValue.nvNothing.visit(this) ;
+                    Expr.NONE.visit(this) ;
                 else
                     expr.visit(this) ;
             }

http://git-wip-us.apache.org/repos/asf/jena/blob/e4ef5bc7/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 451aedb..f4c9e43 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
@@ -103,7 +103,7 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
             return ;
         // retains order.
         varExprList.forEachVarExpr((v,e) -> {
-            Expr expr = (e!=null) ? e : Expr.NONE ; 
+            Expr expr = (e!=null) ? e : Expr.NONE ;
             walk(expr) ;
         });
     }
@@ -265,7 +265,7 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
             Expr expr = func.getArg(i) ;
             if ( expr == null )
                 // Put a dummy in, e.g. to keep the transform stack aligned.
-                NodeValue.nvNothing.visit(this) ;
+                Expr.NONE.visit(this) ;
             else
                 expr.visit(this) ;
         }
@@ -293,6 +293,12 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
     }
 
     @Override
+    public void visit(ExprNone none) {
+        if ( exprVisitor != null )
+            none.visit(exprVisitor) ;
+    }
+
+    @Override
     public void visit(ExprAggregator eAgg) {
         // This is the assignment variable of the aggregation
         // not a normal variable of an expression.
@@ -304,5 +310,3 @@ public class WalkerVisitor implements OpVisitorByTypeAndExpr, ExprVisitorFunctio
             eAgg.visit(exprVisitor) ;
     }
 }
-
-

http://git-wip-us.apache.org/repos/asf/jena/blob/e4ef5bc7/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java
index 2b9dace..2acd7b6 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/WalkerVisitor0.java
@@ -265,7 +265,7 @@ public class WalkerVisitor0 implements OpVisitorByTypeAndExpr, ExprVisitorFuncti
             Expr expr = func.getArg(i) ;
             if ( expr == null )
                 // Put a dummy in, e.g. to keep the transform stack aligned.
-                NodeValue.nvNothing.visit(this) ;
+                Expr.NONE.visit(this) ;
             else
                 expr.visit(this) ;
         }
@@ -304,5 +304,3 @@ public class WalkerVisitor0 implements OpVisitorByTypeAndExpr, ExprVisitorFuncti
             eAgg.visit(exprVisitor) ;
     }
 }
-
-

http://git-wip-us.apache.org/repos/asf/jena/blob/e4ef5bc7/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java
index 90efc4f..8c24001 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/Expr.java
@@ -39,6 +39,7 @@ public interface Expr
     public static final int CMP_UNEQUAL  = -9 ;
     public static final int CMP_INDETERMINATE  = DatatypeConstants.INDETERMINATE ;
     
+    
     /** Test whether a Constraint is satisfied, given a set of bindings
      *  Includes error propagtion and Effective Boolean Value rules.
      * 

http://git-wip-us.apache.org/repos/asf/jena/blob/e4ef5bc7/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNone.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNone.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNone.java
index a0e07f4..8012c9a 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNone.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprNone.java
@@ -26,16 +26,22 @@ import org.apache.jena.sparql.graph.NodeTransform ;
 /** Marker, used in place of a null.
  *  This may be tested for using {@code ==} */
 
-/*package*/ class ExprNone extends ExprNode {
-    
-    /*paclage*/ static Expr NONE0 = new ExprNone() ; 
+//public /*package*/ class ExprNone extends ExprVar { // extends ExprNode {
+//    
+//    /*package*/ static Expr NONE0 = new ExprNone() ; 
+//    
+//    private ExprNone() { super("") ; }
+//}
+
+public class ExprNone extends ExprNode {
     
+    /*package*/ static Expr NONE0 = new ExprNone() ;
     private ExprNone() {}
-
-    @Override public void visit(ExprVisitor visitor) {}
+    
+    @Override public void visit(ExprVisitor visitor) { visitor.visit(this); }
 
     @Override public NodeValue eval(Binding binding, FunctionEnv env) {
-        throw new InternalErrorException("Attempt to evalk ExprNone") ;
+        throw new InternalErrorException("Attempt to eval ExprNone") ;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/jena/blob/e4ef5bc7/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransform.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransform.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransform.java
index b8f0a2b..484d6c2 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransform.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransform.java
@@ -29,6 +29,8 @@ public interface ExprTransform
     public Expr transform(ExprFunctionN func, ExprList args) ;
     public Expr transform(ExprFunctionOp funcOp, ExprList args, Op opArg) ;
     public Expr transform(NodeValue nv) ;
+    //default public Expr transform(ExprNone exprNone) { return exprNone ; }
+    public Expr transform(ExprNone exprNone) ;
     public Expr transform(ExprVar nv) ;
     public Expr transform(ExprAggregator eAgg) ;
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/e4ef5bc7/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformBase.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformBase.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformBase.java
index b364327..b50c92b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformBase.java
@@ -29,6 +29,7 @@ public class ExprTransformBase implements ExprTransform
     @Override public Expr transform(ExprFunctionN func, ExprList args)                        { return func ; }
     @Override public Expr transform(ExprFunctionOp funcOp, ExprList args, Op opArg)           { return funcOp ; }
     @Override public Expr transform(NodeValue nv)                                             { return nv ; }
+    @Override public Expr transform(ExprNone exprNone)                                        { return exprNone ; }
     @Override public Expr transform(ExprVar ev)                                               { return ev ; }
     @Override public Expr transform(ExprAggregator eAgg)                                      { return eAgg ; }
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/e4ef5bc7/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformCopy.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformCopy.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformCopy.java
index 174be6a..06c5b38 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformCopy.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformCopy.java
@@ -59,6 +59,10 @@ public class ExprTransformCopy implements ExprTransform
     public Expr transform(NodeValue nv)     
     { return xform(nv) ; }
     
+    @Override 
+    public Expr transform(ExprNone exprNone)
+    { return xform(exprNone) ; }
+
     @Override
     public Expr transform(ExprVar exprVar)       
     { return xform(exprVar) ; }
@@ -67,88 +71,75 @@ public class ExprTransformCopy implements ExprTransform
     public Expr transform(ExprAggregator eAgg)       
     { return xform(eAgg) ; }
 
-    private Expr xform(ExprFunction0 func)
-    {
+    private Expr xform(ExprFunction0 func) {
         if ( !alwaysCopy )
             return func ;
         return func.copy() ;
     }
 
-    private Expr xform(ExprFunction1 func, Expr expr1)
-    {
+    private Expr xform(ExprFunction1 func, Expr expr1) {
         if ( !alwaysCopy && expr1 == func.getArg() )
             return func ;
         return func.copy(expr1) ;
     }
-    
-    private Expr xform(ExprFunction2 func, Expr expr1, Expr expr2)
-    {
-        if ( !alwaysCopy && 
-                expr1 == func.getArg1() &&
-                expr2 == func.getArg2() )
+
+    private Expr xform(ExprFunction2 func, Expr expr1, Expr expr2) {
+        if ( !alwaysCopy && expr1 == func.getArg1() && expr2 == func.getArg2() )
             return func ;
         return func.copy(expr1, expr2) ;
     }
-    
-    private Expr xform(ExprFunction3 func, Expr expr1, Expr expr2, Expr expr3)
-    {
-        if ( !alwaysCopy && 
-                expr1 == func.getArg1() &&
-                expr2 == func.getArg2() &&
-                expr3 == func.getArg3() )
-        return func ;
-    return func.copy(expr1, expr2, expr3) ;
+
+    private Expr xform(ExprFunction3 func, Expr expr1, Expr expr2, Expr expr3) {
+        if ( !alwaysCopy && expr1 == func.getArg1() && expr2 == func.getArg2() && expr3 == func.getArg3() )
+            return func ;
+        return func.copy(expr1, expr2, expr3) ;
     }
-    
-    private Expr xform(ExprFunctionN func, ExprList args)
-    {
-        if ( ! alwaysCopy && equals1(func.getArgs(), args.getList()) )
+
+    private Expr xform(ExprFunctionN func, ExprList args) {
+        if ( !alwaysCopy && equals1(func.getArgs(), args.getList()) )
             return func ;
         return func.copy(args) ;
     }
-    
-    private boolean equals1(List<Expr> list1, List<Expr> list2)
-    {
+
+    private boolean equals1(List<Expr> list1, List<Expr> list2) {
         if ( list1 == null && list2 == null )
             return true ;
         if ( list1 == null )
             return false ;
         if ( list2 == null )
             return false ;
-        
+
         if ( list1.size() != list2.size() )
             return false ;
-        for ( int i = 0 ; i < list1.size() ; i++ )
-        {
+        for ( int i = 0 ; i < list1.size() ; i++ ) {
             if ( list1.get(i) != list2.get(i) )
                 return false ;
         }
         return true ;
     }
-    
-    private Expr xform(ExprFunctionOp funcOp, ExprList args, Op opArg)
-    {
-        if ( ! alwaysCopy && equals1(funcOp.getArgs(), args.getList()) && funcOp.getGraphPattern() == opArg )
+
+    private Expr xform(ExprFunctionOp funcOp, ExprList args, Op opArg) {
+        if ( !alwaysCopy && equals1(funcOp.getArgs(), args.getList()) && funcOp.getGraphPattern() == opArg )
             return funcOp ;
         return funcOp.copy(args, opArg) ;
     }
-    
-    private Expr xform(NodeValue nv)
-    {
+
+    private Expr xform(NodeValue nv) {
         return nv ;
     }
-    
-    private Expr xform(ExprVar exprVar)
-    {
+
+    private Expr xform(ExprNone exprNone) {
+        return exprNone ;
+    }
+
+    private Expr xform(ExprVar exprVar) {
         return exprVar ;
     }
-    
-    private Expr xform(ExprAggregator eAgg)
-    {
-        if ( ! alwaysCopy )
+
+    private Expr xform(ExprAggregator eAgg) {
+        if ( !alwaysCopy )
             return eAgg ;
-        
+
         return eAgg.copy(eAgg.getVar()) ;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/e4ef5bc7/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprVisitor.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprVisitor.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprVisitor.java
index 796e3b4..5b7cea0 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprVisitor.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprVisitor.java
@@ -18,6 +18,7 @@
 
 package org.apache.jena.sparql.expr;
 
+import org.apache.jena.atlas.lib.InternalErrorException ;
 
 public interface ExprVisitor
 {
@@ -31,11 +32,6 @@ public interface ExprVisitor
     void visit(NodeValue nv) ;
     void visit(ExprVar nv) ;
     void visit(ExprAggregator eAgg) ;
-
-    /** @deprecated To be removed */
-    @Deprecated
-    default void startVisit() {}
-    /** @deprecated To be removed */
-    @Deprecated
-    default void finishVisit() {}
+    //void visit(ExprNone exprNone) ;
+    default void visit(ExprNone exprNone) { throw new InternalErrorException("Visit Expr.NONE") ; }
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/e4ef5bc7/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
index dd149d6..21fe672 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
@@ -138,7 +138,9 @@ public abstract class NodeValue extends ExprNode
     
     // Use "==" for equality.
     private static final String strForUnNode = "node value nothing" ;
-    public static final NodeValue nvNothing = NodeValue.makeNode(NodeFactory.createBlankNode("node value nothing")) ;
+    /** @deprecated Use Expr.NONE */
+    @Deprecated
+    public static final NodeValue nvNothing = NodeValue.makeNode(NodeFactory.createBlankNode(strForUnNode)) ;
     
     public static final String xsdNamespace = XSD+"#" ;