You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2013/02/07 16:02:49 UTC
svn commit: r1443530 - in /jena/trunk/jena-arq/src:
main/java/com/hp/hpl/jena/sparql/algebra/
main/java/com/hp/hpl/jena/sparql/algebra/optimize/
test/java/com/hp/hpl/jena/sparql/algebra/
Author: andy
Date: Thu Feb 7 15:02:49 2013
New Revision: 1443530
URL: http://svn.apache.org/viewvc?rev=1443530&view=rev
Log:
JENA-340
Transformation of the NOT EXISTS expression needs the quad stack before/after visitors.
Removed:
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformApplyInsideExprFunctionOp.java
Modified:
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/Transformer.java
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/ExprTransformApplyTransform.java
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformQuads.java
Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/Transformer.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/Transformer.java?rev=1443530&r1=1443529&r2=1443530&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/Transformer.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/Transformer.java Thu Feb 7 15:02:49 2013
@@ -28,10 +28,7 @@ import com.hp.hpl.jena.sparql.algebra.op
import com.hp.hpl.jena.sparql.algebra.optimize.ExprTransformApplyTransform ;
import com.hp.hpl.jena.sparql.core.Var ;
import com.hp.hpl.jena.sparql.core.VarExprList ;
-import com.hp.hpl.jena.sparql.expr.Expr ;
-import com.hp.hpl.jena.sparql.expr.ExprAggregator ;
-import com.hp.hpl.jena.sparql.expr.ExprList ;
-import com.hp.hpl.jena.sparql.expr.ExprTransformer ;
+import com.hp.hpl.jena.sparql.expr.* ;
import com.hp.hpl.jena.sparql.expr.aggregate.Aggregator ;
/** A botton-top application of a transformation of SPARQL algebra */
@@ -69,12 +66,14 @@ public class Transformer
{
// Simplest way but still walks the OpService subtree (and throws away the transformation).
Transform walker = new TransformSkipService(transform) ;
+ ExprTransform exprTransform = new ExprTransformApplyTransform(transform, beforeVisitor, afterVisitor) ;
return Transformer.transform(walker, op, beforeVisitor, afterVisitor) ;
}
else
{
// Don't transform OpService and don't walk the sub-op
- ApplyTransformVisitorServiceAsLeaf v = new ApplyTransformVisitorServiceAsLeaf(transform) ;
+ ExprTransform exprTransform = new ExprTransformApplyTransform(transform, beforeVisitor, afterVisitor) ;
+ ApplyTransformVisitorServiceAsLeaf v = new ApplyTransformVisitorServiceAsLeaf(transform, exprTransform) ;
WalkerVisitorSkipService walker = new WalkerVisitorSkipService(v, beforeVisitor, afterVisitor) ;
OpWalker.walk(walker, op) ;
return v.result() ;
@@ -93,7 +92,8 @@ public class Transformer
// and theses protected methods.
protected Op transformation(Transform transform, Op op, OpVisitor beforeVisitor, OpVisitor afterVisitor)
{
- ApplyTransformVisitor v = new ApplyTransformVisitor(transform) ;
+ ExprTransform exprTransform = new ExprTransformApplyTransform(transform, beforeVisitor, afterVisitor) ;
+ ApplyTransformVisitor v = new ApplyTransformVisitor(transform, exprTransform) ;
return transformation(v, op, beforeVisitor, afterVisitor) ;
}
@@ -124,7 +124,7 @@ public class Transformer
class ApplyTransformVisitor extends OpVisitorByType
{
protected final Transform transform ;
- private final ExprTransformApplyTransform exprTransform ;
+ private final ExprTransform exprTransform ;
private final Deque<Op> stack = new ArrayDeque<Op>() ;
protected final Op pop()
@@ -136,11 +136,10 @@ public class Transformer
stack.push(op) ;
}
- public ApplyTransformVisitor(Transform transform)
+ public ApplyTransformVisitor(Transform transform, ExprTransform exprTransform)
{
this.transform = transform ;
- this.exprTransform = new ExprTransformApplyTransform(transform) ;
-
+ this.exprTransform = exprTransform ;
}
final Op result()
@@ -149,7 +148,21 @@ public class Transformer
Log.warn(this, "Stack is not aligned") ;
return pop() ;
}
-
+
+ private ExprList transform(ExprList exprList, ExprTransform exprTransform)
+ {
+ if ( exprTransform == null )
+ return exprList ;
+ return ExprTransformer.transform(exprTransform, exprList) ;
+ }
+
+ private Expr transform(Expr expr, ExprTransform exprTransform)
+ {
+ if ( exprTransform == null )
+ return expr ;
+ return ExprTransformer.transform(exprTransform, expr) ;
+ }
+
// ----
// Algebra operations that involve an Expr, and so might include NOT EXISTS
@@ -163,7 +176,7 @@ public class Transformer
for ( SortCondition sc : conditions )
{
Expr e = sc.getExpression() ;
- Expr e2 = ExprTransformer.transform(exprTransform, e) ;
+ Expr e2 = transform(e, exprTransform) ;
conditions2.add(new SortCondition(e2, sc.getDirection())) ;
if ( e != e2 )
changed = true ;
@@ -188,7 +201,6 @@ public class Transformer
@Override
public void visit(OpExtend opExtend)
{
-
VarExprList varExpr = opExtend.getVarExprList() ;
VarExprList varExpr2 = process(varExpr) ;
OpExtend opExtend2 = opExtend ;
@@ -207,7 +219,7 @@ public class Transformer
Expr e = varExpr.getExpr(v) ;
Expr e2 = e ;
if ( e != null )
- e2 = ExprTransformer.transform(exprTransform, e) ;
+ e2 = transform(e, exprTransform) ;
if ( e2 == null )
varExpr2.add(v) ;
else
@@ -242,7 +254,7 @@ public class Transformer
// Variable associated with the aggregate
Expr eVar = agg.getAggVar() ; // Not .getExprVar()
- Expr eVar2 = ExprTransformer.transform(exprTransform, eVar) ;
+ Expr eVar2 = transform(eVar, exprTransform) ;
if ( eVar != eVar2 )
changed = true ;
@@ -250,7 +262,7 @@ public class Transformer
Expr e = aggregator.getExpr() ;
Expr e2 = e ;
if ( e != null ) // Null means "no relevant expression" e.g. COUNT(*)
- ExprTransformer.transform(exprTransform, e) ;
+ e2 = transform(e, exprTransform) ;
if ( e != e2 )
changed = true ;
Aggregator a2 = aggregator.copy(e2) ;
@@ -319,7 +331,7 @@ public class Transformer
boolean changed = false ;
for ( Expr e : opFilter.getExprs() )
{
- Expr e2 = ExprTransformer.transform(exprTransform, e) ;
+ Expr e2 = transform(e, exprTransform) ;
ex.add(e2) ;
if ( e != e2 )
changed = true ;
@@ -349,9 +361,9 @@ public class Transformer
/** Treat OpService as a leaf of the tree */
static class ApplyTransformVisitorServiceAsLeaf extends ApplyTransformVisitor
{
- public ApplyTransformVisitorServiceAsLeaf(Transform transform)
+ public ApplyTransformVisitorServiceAsLeaf(Transform transform, ExprTransform exprTransform)
{
- super(transform) ;
+ super(transform, exprTransform) ;
}
@Override
@@ -440,6 +452,6 @@ public class Transformer
@Override
protected void visitExt(OpExt op)
- { op.apply(transform) ; }
+ { result = op.apply(transform) ; }
}
}
Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/ExprTransformApplyTransform.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/ExprTransformApplyTransform.java?rev=1443530&r1=1443529&r2=1443530&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/ExprTransformApplyTransform.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/ExprTransformApplyTransform.java Thu Feb 7 15:02:49 2013
@@ -20,6 +20,7 @@ package com.hp.hpl.jena.sparql.algebra.o
import com.hp.hpl.jena.sparql.ARQInternalErrorException ;
import com.hp.hpl.jena.sparql.algebra.Op ;
+import com.hp.hpl.jena.sparql.algebra.OpVisitor ;
import com.hp.hpl.jena.sparql.algebra.Transform ;
import com.hp.hpl.jena.sparql.algebra.Transformer ;
import com.hp.hpl.jena.sparql.expr.E_Exists ;
@@ -29,20 +30,29 @@ import com.hp.hpl.jena.sparql.expr.ExprF
import com.hp.hpl.jena.sparql.expr.ExprList ;
import com.hp.hpl.jena.sparql.expr.ExprTransformCopy ;
-/** A copying transform that applies a Transform to the algebra operator of E_Exist and E_NoExists */
+/** A copying transform that applies an Op Transform to the algebra operator of E_Exist and E_NoExists */
public class ExprTransformApplyTransform extends ExprTransformCopy
{
- // See also ExprTransformer.transform(ExprFunctionOp func, ..) and ExprTransformOp
private final Transform transform ;
+ private OpVisitor beforeVisitor ;
+ private OpVisitor afterVisitor ;
+
public ExprTransformApplyTransform(Transform transform)
{
+ this(transform, null, null) ;
+ }
+
+ public ExprTransformApplyTransform(Transform transform, OpVisitor beforeVisitor, OpVisitor afterVisitor)
+ {
this.transform = transform ;
+ this.beforeVisitor = beforeVisitor ;
+ this.afterVisitor = afterVisitor ;
}
@Override
public Expr transform(ExprFunctionOp funcOp, ExprList args, Op opArg)
{
- Op opArg2 = Transformer.transform(transform, opArg) ;
+ Op opArg2 = Transformer.transform(transform, opArg, beforeVisitor, afterVisitor) ;
if ( opArg2 == opArg )
return super.transform(funcOp, args, opArg) ;
if ( funcOp instanceof E_Exists )
@@ -52,3 +62,4 @@ public class ExprTransformApplyTransform
throw new ARQInternalErrorException("Unrecognized ExprFunctionOp: \n"+funcOp) ;
}
}
+
Modified: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformQuads.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformQuads.java?rev=1443530&r1=1443529&r2=1443530&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformQuads.java (original)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestTransformQuads.java Thu Feb 7 15:02:49 2013
@@ -99,6 +99,20 @@ public class TestTransformQuads extends
" (quadpattern (quad ?*g1 ?s ?p ?o)))))"
) ; }
+ // NOT EXISTS
+ @Test public void quads31() { test ( "{ GRAPH ?g { ?s ?p ?o FILTER NOT EXISTS { GRAPH ?g1 { ?s1 ?p ?o1 } } } }",
+ "(filter (notexists",
+ " (quadpattern (quad ?g1 ?s1 ?p ?o1)))",
+ " (quadpattern (quad ?g ?s ?p ?o)))"
+ ) ; }
+
+ // NOT EXISTS
+ @Test public void quads32() { test ( "{ ?s ?p ?o FILTER NOT EXISTS { GRAPH ?g1 { ?s1 ?p ?o1 } } }",
+ "(filter (notexists",
+ " (quadpattern (quad ?g1 ?s1 ?p ?o1)))",
+ " (quadpattern (quad <urn:x-arq:DefaultGraphNode> ?s ?p ?o)))"
+ ) ; }
+
private static void test(String patternString, String... strExpected)
{
Query q = QueryFactory.create("SELECT * WHERE "+patternString) ;