Author: thomasm
Date: Thu Nov 17 09:40:38 2016
New Revision: 1770136

URL: http://svn.apache.org/viewvc?rev=1770136&view=rev
Log:
OAK-5120 Automatically convert *all* "or" queries to "union" for SQL-2, take 2

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AndImpl.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2OptimiseQueryTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AndImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AndImpl.java?rev=1770136&r1=1770135&r2=1770136&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AndImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/AndImpl.java
 Thu Nov 17 09:40:38 2016
@@ -254,11 +254,12 @@ public class AndImpl extends ConstraintI
         if (getLastConstraint() instanceof OrImpl) {
             return this;
         }
-        for (int i = 0; i < constraints.size() - 1; i++) {
-            ConstraintImpl c = constraints.get(i);
+        ArrayList<ConstraintImpl> andList = getAllAndConditions();
+        for (int i = 0; i < andList.size() - 1; i++) {
+            ConstraintImpl c = andList.get(i);
             if (c instanceof OrImpl) {
                 ArrayList<ConstraintImpl> list = new 
ArrayList<ConstraintImpl>();
-                list.addAll(constraints);
+                list.addAll(andList);
                 list.remove(i);
                 list.add(c);
                 return new AndImpl(list);
@@ -266,6 +267,18 @@ public class AndImpl extends ConstraintI
         }
         return this;
     }
+    
+    private ArrayList<ConstraintImpl> getAllAndConditions() {
+        ArrayList<ConstraintImpl> list = new ArrayList<ConstraintImpl>();
+        for(ConstraintImpl c : constraints) {
+            if (c instanceof AndImpl) {
+                list.addAll(((AndImpl) c).getAllAndConditions());
+            } else {
+                list.add(c);
+            }
+        }
+        return list;
+    }    
 
     @Override
     public Set<ConstraintImpl> convertToUnion() {

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2OptimiseQueryTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2OptimiseQueryTest.java?rev=1770136&r1=1770135&r2=1770136&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2OptimiseQueryTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2OptimiseQueryTest.java
 Thu Nov 17 09:40:38 2016
@@ -236,6 +236,14 @@ public class SQL2OptimiseQueryTest exten
     public void optimiseAndOrAnd() throws ParseException {
         optimiseAndOrAnd(
                 "select * from [nt:unstructured] as [c] " + 
+                "where isdescendantnode('/tmp') " + 
+                "and ([a]=1 or [b]=2) and ([c]=3 or [d]=4)",
+                "(isdescendantnode(c, /tmp)) and (d = 4) and (b = 2), " + 
+                "(isdescendantnode(c, /tmp)) and (d = 4) and (a = 1), " + 
+                "(isdescendantnode(c, /tmp)) and (c = 3) and (b = 2), " + 
+                "(isdescendantnode(c, /tmp)) and (c = 3) and (a = 1)");
+        optimiseAndOrAnd(
+                "select * from [nt:unstructured] as [c] " + 
                 "where ([a]=1 or [b]=2) and ([x]=3 or [y]=4)",
                 "(y = 4) and (b = 2), " + 
                 "(y = 4) and (a = 1), " + 


Reply via email to