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/01/08 23:36:45 UTC

[1/3] jena git commit: JENA-1113: Only expand IN and NOT IN for lists below a limit.

Repository: jena
Updated Branches:
  refs/heads/master b1fd4f0b7 -> 83654525e


JENA-1113: Only expand IN and NOT IN for lists below a limit.

The limit is set to 250.
Large fopr jand writtern expressions,
but small enough to protect the stack.



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

Branch: refs/heads/master
Commit: 9c33e84865ba985a62df2d5c17181a63d43a8974
Parents: b1fd4f0
Author: Andy Seaborne <an...@apache.org>
Authored: Fri Jan 8 21:34:12 2016 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Fri Jan 8 21:34:12 2016 +0000

----------------------------------------------------------------------
 .../algebra/optimize/TransformExpandOneOf.java  | 39 ++++++++++++++------
 1 file changed, 27 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/9c33e848/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformExpandOneOf.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformExpandOneOf.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformExpandOneOf.java
index 7816f4a..9bff870 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformExpandOneOf.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformExpandOneOf.java
@@ -20,6 +20,8 @@ package org.apache.jena.sparql.algebra.optimize;
 
 import static org.apache.jena.sparql.expr.NodeValue.FALSE ;
 import static org.apache.jena.sparql.expr.NodeValue.TRUE ;
+
+import org.apache.jena.sparql.ARQInternalErrorException ;
 import org.apache.jena.sparql.algebra.Op ;
 import org.apache.jena.sparql.algebra.TransformCopy ;
 import org.apache.jena.sparql.algebra.op.OpFilter ;
@@ -62,28 +64,39 @@ public class TransformExpandOneOf extends TransformCopy
         return expand(exprList) ; 
     }
     
+    /** Prescan to see if anything to consider */ 
     private static boolean interesting(ExprList exprList)
     {
-        for ( Expr e : exprList )
-        {
-            if ( e instanceof E_OneOf ) return true ;
-            if ( e instanceof E_NotOneOf ) return true ;
-        }
-        return false ;
+        return exprList.getList().stream().anyMatch((e)->processable(e)) ;
     }
-
+    
+    private static boolean processable(Expr e) {
+        return ( e instanceof E_OneOfBase ) && ((E_OneOfBase)e).getRHS().size() < REWRITE_LIMIT ;
+    }
+    
+    private static int REWRITE_LIMIT = 250 ;
+    
     private static ExprList expand(ExprList exprList)
     {
         ExprList exprList2 = new ExprList() ;
         
         for (  Expr e : exprList)
         {
+            
+            if ( ! processable(e) ) {
+                exprList2.add(e) ;
+                continue ;
+            }
+            
             if ( e instanceof E_OneOf )
             {
                 // ?x IN (a,b) ===> (?x == a) || (?x == b)
                 // ?x IN ()    ===> false
-                
+
                 E_OneOf exprOneOf = (E_OneOf)e ;
+                if ( exprOneOf.getRHS().size() > REWRITE_LIMIT )
+                    // Too large - leave it alone.
+                    continue ;
                 Expr x = exprOneOf.getLHS() ;
                 Expr disjunction = null ;
                 // if ?x IN () then it's false regardless.  
@@ -95,7 +108,7 @@ public class TransformExpandOneOf extends TransformCopy
                     else
                         disjunction = new E_LogicalOr(disjunction, e2) ;
                 }
-                
+
                 if ( disjunction == null )
                     exprList2.add(FALSE) ;
                 else
@@ -107,6 +120,9 @@ public class TransformExpandOneOf extends TransformCopy
                 // ?x NOT IN (a,b) ===> (?x != a) && (?x != b)
                 // ?x NOT IN () ===> TRUE (or nothing)
                 E_NotOneOf exprNotOneOf = (E_NotOneOf)e ;
+                if ( exprNotOneOf.getRHS().size() > REWRITE_LIMIT )
+                    // Too large - leave it alone.
+                    continue ;
                 Expr x = exprNotOneOf.getLHS() ;
                 if ( exprNotOneOf.getRHS().size() == 0 )
                     exprList2.add(TRUE) ;
@@ -117,10 +133,9 @@ public class TransformExpandOneOf extends TransformCopy
                 }
                 continue ;
             }
-            
-            exprList2.add(e) ;
+            throw new ARQInternalErrorException() ;
         }
-        
+
         return exprList2 ;
     }
 }


[3/3] jena git commit: Test for JENA-1113.

Posted by an...@apache.org.
Test for JENA-1113.

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

Branch: refs/heads/master
Commit: 83654525e54240b6d70b7b36728cef561520a6c8
Parents: 925ef10
Author: Andy Seaborne <an...@apache.org>
Authored: Fri Jan 8 22:36:32 2016 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Fri Jan 8 22:36:32 2016 +0000

----------------------------------------------------------------------
 .../algebra/optimize/TransformExpandOneOf.java  |  2 +-
 .../algebra/optimize/TestTransformFilters.java  | 24 ++++++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/83654525/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformExpandOneOf.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformExpandOneOf.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformExpandOneOf.java
index 76f8c2d..16df28c 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformExpandOneOf.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformExpandOneOf.java
@@ -71,7 +71,7 @@ public class TransformExpandOneOf extends TransformCopy
         return (e instanceof E_OneOfBase) && ((E_OneOfBase)e).getRHS().size() < REWRITE_LIMIT;
     }
 
-    private static int REWRITE_LIMIT = 250;
+    /*package*/ static int REWRITE_LIMIT = 250;
 
     private static ExprList expand(ExprList exprList) {
         ExprList exprList2 = new ExprList() ;

http://git-wip-us.apache.org/repos/asf/jena/blob/83654525/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestTransformFilters.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestTransformFilters.java b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestTransformFilters.java
index 02ae27a..12c2903 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestTransformFilters.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestTransformFilters.java
@@ -486,6 +486,30 @@ public class TestTransformFilters extends AbstractTestTransform
                t_expandOneOf,
                "(filter true (distinct (filter (exprlist (!= ?x 1) (!= ?x 2)) (bgp (triple ?s ?p ?x)) )))") ;
     }
+    
+    @Test
+    public void oneOf6() {
+        // JENA-1113
+        int x = TransformExpandOneOf.REWRITE_LIMIT ;
+        try {
+            TransformExpandOneOf.REWRITE_LIMIT = 3 ;
+            testOp("(filter true (distinct (filter (notin ?x 1 2) (bgp (?s ?p ?x)) )))",
+                   t_expandOneOf,
+                "(filter true (distinct (filter (exprlist (!= ?x 1) (!= ?x 2)) (bgp (triple ?s ?p ?x)) )))") ;
+            testOp("(filter true (distinct (filter (notin ?x 1 2 3) (bgp (?s ?p ?x)) )))",
+                   t_expandOneOf,
+                   // No change.
+                   "(filter true (distinct (filter (notin ?x 1 2 3) (bgp (?s ?p ?x)) )))") ;
+            
+        } finally {
+            TransformExpandOneOf.REWRITE_LIMIT = x ;
+        }
+        // Check reset.
+        testOp("(filter true (distinct (filter (notin ?x 1 2 3) (bgp (?s ?p ?x)) )))",
+               t_expandOneOf,
+               "(filter true (distinct (filter (exprlist (!= ?x 1) (!= ?x 2)) (bgp (triple ?s ?p ?x)) )))") ;
+    }
+
 
     @Test public void implicitJoin01() {
         testOp(


[2/3] jena git commit: Reformat

Posted by an...@apache.org.
Reformat

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

Branch: refs/heads/master
Commit: 925ef1079f60e486a71c81e4e11e5c6dcdb9cdfc
Parents: 9c33e84
Author: Andy Seaborne <an...@apache.org>
Authored: Fri Jan 8 21:36:02 2016 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Fri Jan 8 21:36:02 2016 +0000

----------------------------------------------------------------------
 .../algebra/optimize/TransformExpandOneOf.java  | 116 +++++++++----------
 1 file changed, 54 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/925ef107/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformExpandOneOf.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformExpandOneOf.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformExpandOneOf.java
index 9bff870..76f8c2d 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformExpandOneOf.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformExpandOneOf.java
@@ -18,15 +18,15 @@
 
 package org.apache.jena.sparql.algebra.optimize;
 
-import static org.apache.jena.sparql.expr.NodeValue.FALSE ;
-import static org.apache.jena.sparql.expr.NodeValue.TRUE ;
+import static org.apache.jena.sparql.expr.NodeValue.FALSE;
+import static org.apache.jena.sparql.expr.NodeValue.TRUE;
 
-import org.apache.jena.sparql.ARQInternalErrorException ;
-import org.apache.jena.sparql.algebra.Op ;
-import org.apache.jena.sparql.algebra.TransformCopy ;
-import org.apache.jena.sparql.algebra.op.OpFilter ;
-import org.apache.jena.sparql.algebra.op.OpLeftJoin ;
-import org.apache.jena.sparql.expr.* ;
+import org.apache.jena.sparql.ARQInternalErrorException;
+import org.apache.jena.sparql.algebra.Op;
+import org.apache.jena.sparql.algebra.TransformCopy;
+import org.apache.jena.sparql.algebra.op.OpFilter;
+import org.apache.jena.sparql.algebra.op.OpLeftJoin;
+import org.apache.jena.sparql.expr.*;
 
 public class TransformExpandOneOf extends TransformCopy
 {
@@ -35,91 +35,83 @@ public class TransformExpandOneOf extends TransformCopy
     // Expressions to expand can be in two places: OpFilter and the expr of OpLeftJoin. 
     
     @Override
-    public Op transform(OpFilter opFilter, Op subOp)
-    {
-        ExprList exprList = opFilter.getExprs() ;
-        ExprList exprList2 = process(exprList) ;
+    public Op transform(OpFilter opFilter, Op subOp) {
+        ExprList exprList = opFilter.getExprs();
+        ExprList exprList2 = process(exprList);
         if ( exprList2 == null )
-            return super.transform(opFilter, subOp) ;
-        Op opFilter2 = OpFilter.filter(exprList2, subOp) ;
-        return opFilter2 ;
+            return super.transform(opFilter, subOp);
+        Op opFilter2 = OpFilter.filter(exprList2, subOp);
+        return opFilter2;
     }
-    
+
     @Override
-    public Op transform(OpLeftJoin opLeftJoin, Op opLeft, Op opRight)
-    {
-        ExprList exprList = opLeftJoin.getExprs() ;
+    public Op transform(OpLeftJoin opLeftJoin, Op opLeft, Op opRight) {
+        ExprList exprList = opLeftJoin.getExprs();
         if ( exprList == null )
-            return opLeftJoin ;
-        ExprList exprList2 = process(exprList) ;
+            return opLeftJoin;
+        ExprList exprList2 = process(exprList);
         if ( exprList2 == null )
-            return opLeftJoin ;
-        return OpLeftJoin.create(opLeft, opRight, exprList2) ;
+            return opLeftJoin;
+        return OpLeftJoin.create(opLeft, opRight, exprList2);
     }
 
-    private static ExprList process(ExprList exprList)
-    {
+    private static ExprList process(ExprList exprList) {
         if ( !interesting(exprList) )
-            return null ;
-        return expand(exprList) ; 
+            return null;
+        return expand(exprList);
     }
     
     /** Prescan to see if anything to consider */ 
-    private static boolean interesting(ExprList exprList)
-    {
-        return exprList.getList().stream().anyMatch((e)->processable(e)) ;
+    private static boolean interesting(ExprList exprList) {
+        return exprList.getList().stream().anyMatch((e) -> processable(e));
     }
-    
+
+    /** Check whether the expression is to be processed here */ 
     private static boolean processable(Expr e) {
-        return ( e instanceof E_OneOfBase ) && ((E_OneOfBase)e).getRHS().size() < REWRITE_LIMIT ;
+        return (e instanceof E_OneOfBase) && ((E_OneOfBase)e).getRHS().size() < REWRITE_LIMIT;
     }
-    
-    private static int REWRITE_LIMIT = 250 ;
-    
-    private static ExprList expand(ExprList exprList)
-    {
+
+    private static int REWRITE_LIMIT = 250;
+
+    private static ExprList expand(ExprList exprList) {
         ExprList exprList2 = new ExprList() ;
         
-        for (  Expr e : exprList)
-        {
-            
-            if ( ! processable(e) ) {
-                exprList2.add(e) ;
-                continue ;
+        for ( Expr e : exprList ) {
+
+            if ( !processable(e) ) {
+                exprList2.add(e);
+                continue;
             }
-            
-            if ( e instanceof E_OneOf )
-            {
+
+            if ( e instanceof E_OneOf ) {
                 // ?x IN (a,b) ===> (?x == a) || (?x == b)
-                // ?x IN ()    ===> false
+                // ?x IN () ===> false
 
                 E_OneOf exprOneOf = (E_OneOf)e ;
                 if ( exprOneOf.getRHS().size() > REWRITE_LIMIT )
                     // Too large - leave it alone.
-                    continue ;
-                Expr x = exprOneOf.getLHS() ;
-                Expr disjunction = null ;
-                // if ?x IN () then it's false regardless.  
-                for ( Expr sub : exprOneOf.getRHS() )
-                {
-                    Expr e2 = new E_Equals(x, sub) ;
+                    continue;
+                Expr x = exprOneOf.getLHS();
+                Expr disjunction = null;
+                // if ?x IN () then it's false regardless.
+                for ( Expr sub : exprOneOf.getRHS() ) {
+                    Expr e2 = new E_Equals(x, sub);
                     if ( disjunction == null )
-                        disjunction = e2 ;
+                        disjunction = e2;
                     else
-                        disjunction = new E_LogicalOr(disjunction, e2) ;
+                        disjunction = new E_LogicalOr(disjunction, e2);
                 }
 
                 if ( disjunction == null )
-                    exprList2.add(FALSE) ;
+                    exprList2.add(FALSE);
                 else
-                    exprList2.add(disjunction) ;
-                continue ;
+                    exprList2.add(disjunction);
+                continue;
             }
-            if ( e instanceof E_NotOneOf )
-            {
+            if ( e instanceof E_NotOneOf ) {
                 // ?x NOT IN (a,b) ===> (?x != a) && (?x != b)
                 // ?x NOT IN () ===> TRUE (or nothing)
-                E_NotOneOf exprNotOneOf = (E_NotOneOf)e ;
+                E_NotOneOf exprNotOneOf = (E_NotOneOf)e;
                 if ( exprNotOneOf.getRHS().size() > REWRITE_LIMIT )
                     // Too large - leave it alone.
                     continue ;