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+"#" ;