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