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 2011/06/30 18:02:42 UTC
svn commit: r1141591 - in /incubator/jena/Jena2/ARQ/trunk:
src-dev/dev/DevARQ.java src-dev/reports/ReportFilterEquality.java
src/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterEquality.java
src/com/hp/hpl/jena/sparql/expr/ExprVars.java
Author: andy
Date: Thu Jun 30 16:02:41 2011
New Revision: 1141591
URL: http://svn.apache.org/viewvc?rev=1141591&view=rev
Log:
JENA-79
Added:
incubator/jena/Jena2/ARQ/trunk/src-dev/reports/ReportFilterEquality.java (with props)
Modified:
incubator/jena/Jena2/ARQ/trunk/src-dev/dev/DevARQ.java
incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterEquality.java
incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/expr/ExprVars.java
Modified: incubator/jena/Jena2/ARQ/trunk/src-dev/dev/DevARQ.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src-dev/dev/DevARQ.java?rev=1141591&r1=1141590&r2=1141591&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src-dev/dev/DevARQ.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src-dev/dev/DevARQ.java Thu Jun 30 16:02:41 2011
@@ -2,7 +2,9 @@ package dev ;
public class DevARQ
{
- // FILTER(?x=?y) optimization - at least FILTER(sameTerm(?x,?y))
+ // FILTER(?x=?y) optimization - at least FILTER(sameTerm(?x,?y))
+ // FILTER(?x=<x> && ...) does not push down on the ?x=<x>
+
// QueryEngineHTTP - content negotiation, Apache httpClient.
Added: incubator/jena/Jena2/ARQ/trunk/src-dev/reports/ReportFilterEquality.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src-dev/reports/ReportFilterEquality.java?rev=1141591&view=auto
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src-dev/reports/ReportFilterEquality.java (added)
+++ incubator/jena/Jena2/ARQ/trunk/src-dev/reports/ReportFilterEquality.java Thu Jun 30 16:02:41 2011
@@ -0,0 +1,79 @@
+/*
+ * (c) Copyright 2011 Epimorphics Ltd.
+ * All rights reserved.
+ * [See end of file]
+ */
+
+package reports;
+
+import org.openjena.atlas.lib.StrUtils ;
+
+import com.hp.hpl.jena.graph.Graph ;
+import com.hp.hpl.jena.graph.Triple ;
+import com.hp.hpl.jena.query.Query ;
+import com.hp.hpl.jena.query.QueryExecution ;
+import com.hp.hpl.jena.query.QueryExecutionFactory ;
+import com.hp.hpl.jena.query.QueryFactory ;
+import com.hp.hpl.jena.query.ResultSet ;
+import com.hp.hpl.jena.query.ResultSetFormatter ;
+import com.hp.hpl.jena.rdf.model.Model ;
+import com.hp.hpl.jena.rdf.model.ModelFactory ;
+import com.hp.hpl.jena.sparql.algebra.Algebra ;
+import com.hp.hpl.jena.sparql.algebra.Op ;
+import com.hp.hpl.jena.sparql.sse.SSE ;
+import com.hp.hpl.jena.sparql.util.graph.GraphFactory ;
+
+public class ReportFilterEquality
+{
+ public static void main(String...argv)
+ {
+ String qs = StrUtils.strjoinNL(
+ "PREFIX ex: <http://example.com/ns#>" ,
+ "SELECT ?x WHERE {" ,
+ " ?s a ?c" ,
+ " OPTIONAL { ?s ex:property ?x }" ,
+ " FILTER (?c = ex:v)",
+ "}") ;
+ Query query = QueryFactory.create(qs) ;
+
+ Op op = Algebra.compile(query) ;
+ Op op2 = Algebra.optimize(op) ;
+ System.out.println(op) ;
+ System.out.println(op2) ;
+
+ Graph g = GraphFactory.createGraphMem() ;
+ Triple t = SSE.parseTriple("(<x> rdf:type <T>)") ;
+ g.add(t) ;
+ Model m = ModelFactory.createModelForGraph(g) ;
+ QueryExecution qExec = QueryExecutionFactory.create(query, m) ;
+ ResultSet rs = qExec.execSelect() ;
+ ResultSetFormatter.out(rs) ;
+ }
+}
+
+/*
+ * (c) Copyright 2011 Epimorphics Ltd.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
\ No newline at end of file
Propchange: incubator/jena/Jena2/ARQ/trunk/src-dev/reports/ReportFilterEquality.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterEquality.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterEquality.java?rev=1141591&r1=1141590&r2=1141591&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterEquality.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterEquality.java Thu Jun 30 16:02:41 2011
@@ -27,6 +27,7 @@ import com.hp.hpl.jena.sparql.expr.Expr
import com.hp.hpl.jena.sparql.expr.ExprFunction2 ;
import com.hp.hpl.jena.sparql.expr.ExprList ;
import com.hp.hpl.jena.sparql.expr.ExprVar ;
+import com.hp.hpl.jena.sparql.expr.ExprVars ;
import com.hp.hpl.jena.sparql.expr.NodeValue ;
public class TransformFilterEquality extends TransformCopy
@@ -49,10 +50,11 @@ public class TransformFilterEquality ext
@Override
public Op transform(OpFilter opFilter, Op subOp)
{
- if ( ! safeToTransform(subOp) )
+ ExprList exprs = opFilter.getExprs() ;
+
+ if ( ! safeToTransform(exprs, subOp) )
return super.transform(opFilter, subOp) ;
- ExprList exprs = opFilter.getExprs() ;
Op op = subOp ;
// Variables set
Set<Var> patternVars = OpVars.patternVars(op) ;
@@ -86,15 +88,34 @@ public class TransformFilterEquality ext
return op2 ;
}
- private static boolean safeToTransform(Op op)
+ private static boolean safeToTransform(Expr expr, Op op)
+ {
+ return safeToTransform(new ExprList(expr), op) ;
+ }
+
+ private static boolean safeToTransform(ExprList exprs, Op op)
{
if ( op instanceof OpBGP || op instanceof OpQuadPattern ) return true ;
- if ( op instanceof OpConditional || op instanceof OpSequence ) return true ;
+ if ( op instanceof OpSequence ) return true ;
+
+ // Not safe unless filter is on the RHS.
+ if ( op instanceof OpConditional )
+ {
+ OpConditional opCond = (OpConditional)op ;
+ Op opLeft = opCond.getLeft() ;
+
+ Set<Var> x = OpVars.patternVars(opLeft) ;
+ Set<Var> y = ExprVars.getVarsMentioned(exprs) ;
+ if ( x.containsAll(y) )
+ return true ;
+ return false ;
+ }
if ( op instanceof OpGraph )
{
+ // ???
OpGraph opg = (OpGraph)op ;
- return safeToTransform(opg.getSubOp()) ;
+ return safeToTransform(exprs, opg.getSubOp()) ;
}
return false ;
@@ -104,7 +125,7 @@ public class TransformFilterEquality ext
/** Return null for "no change" */
public static Op processFilter(Expr e, Op subOp)
{
- if ( ! safeToTransform(subOp) )
+ if ( ! safeToTransform(e, subOp) )
return null ;
return processFilterWorker(e, subOp, null) ;
}
Modified: incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/expr/ExprVars.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/expr/ExprVars.java?rev=1141591&r1=1141590&r2=1141591&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/expr/ExprVars.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/expr/ExprVars.java Thu Jun 30 16:02:41 2011
@@ -23,7 +23,15 @@ public class ExprVars
varsMentioned(acc, expr) ;
return acc ;
}
-
+
+ public static Set<Var> getVarsMentioned(ExprList exprs)
+ {
+ Set<Var> acc = new HashSet<Var>() ;
+ for ( Expr expr : exprs )
+ varsMentioned(acc, expr) ;
+ return acc ;
+ }
+
public static void varsMentioned(Collection<Var> acc, Expr expr)
{
ExprVars.Action<Var> action =