Author: thomasm
Date: Wed Jun 21 06:30:19 2017
New Revision: 1799389

URL: http://svn.apache.org/viewvc?rev=1799389&view=rev
Log:
OAK-6359 Change behavior for very complex queries

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
    
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/XPathTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java?rev=1799389&r1=1799388&r2=1799389&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
 Wed Jun 21 06:30:19 2017
@@ -105,6 +105,10 @@ import com.google.common.collect.Orderin
  */
 public class QueryImpl implements Query {
 
+    public static final UnsupportedOperationException TOO_MANY_UNION = 
+            new UnsupportedOperationException("Too many union queries");
+    public final static int MAX_UNION = Integer.getInteger("oak.sql2MaxUnion", 
1000);
+
     private static final Logger LOG = LoggerFactory.getLogger(QueryImpl.class);
     
     private boolean potentiallySlowTraversalQueryLogged;
@@ -1231,7 +1235,13 @@ public class QueryImpl implements Query
         Query result = this;
         
         if (constraint != null) {
-            Set<ConstraintImpl> unionList = constraint.convertToUnion();
+            Set<ConstraintImpl> unionList;
+            try {
+                unionList = constraint.convertToUnion();
+            } catch (UnsupportedOperationException e) {
+                // too many union
+                return this;
+            }
             if (unionList.size() > 1) {
                 // there are some cases where multiple ORs simplify into a 
single one. If we get a
                 // union list of just one we don't really have to UNION 
anything.

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=1799389&r1=1799388&r2=1799389&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
 Wed Jun 21 06:30:19 2017
@@ -34,6 +34,7 @@ import java.util.Set;
 import org.apache.jackrabbit.oak.spi.query.QueryEngineSettings;
 import org.apache.jackrabbit.oak.spi.query.fulltext.FullTextAnd;
 import org.apache.jackrabbit.oak.spi.query.fulltext.FullTextExpression;
+import org.apache.jackrabbit.oak.query.QueryImpl;
 import org.apache.jackrabbit.oak.query.index.FilterImpl;
 
 import com.google.common.collect.Sets;
@@ -295,6 +296,9 @@ public class AndImpl extends ConstraintI
                 nonUnion.add(c);
             } else {
                 union.addAll(converted);
+                if (union.size() > QueryImpl.MAX_UNION) {
+                    throw QueryImpl.TOO_MANY_UNION;
+                }
             }
         }
         if (!union.isEmpty() && nonUnion.size() == 1) {

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/XPathTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/XPathTest.java?rev=1799389&r1=1799388&r2=1799389&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/XPathTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/XPathTest.java
 Wed Jun 21 06:30:19 2017
@@ -65,6 +65,9 @@ public class XPathTest {
         String xpath = buff.toString();
         String sql2 = new XPathToSQL2Converter().convert(xpath);
         assertTrue("Length: " + sql2.length(), sql2.length() < 200000);
+        SQL2Parser p = new SQL2Parser(null, nodeTypes, new 
QueryEngineSettings());
+        Query q = p.parse(sql2, false);
+        q.buildAlternativeQuery();
     }
     
     @Test


Reply via email to