You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by th...@apache.org on 2016/02/14 08:13:45 UTC
svn commit: r1730290 -
/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/LargeQueryTest.java
Author: thomasm
Date: Sun Feb 14 07:13:45 2016
New Revision: 1730290
URL: http://svn.apache.org/viewvc?rev=1730290&view=rev
Log:
OAK-3991 Incorrect resultset from XPATH, multiple ORs and Lucene full-text (test)
OAK-3999 ParseException thrown for xpath query on 3 or more jcr:primaryType "or" conditions (test)
Modified:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/LargeQueryTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/LargeQueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/LargeQueryTest.java?rev=1730290&r1=1730289&r2=1730290&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/LargeQueryTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/LargeQueryTest.java Sun Feb 14 07:13:45 2016
@@ -16,14 +16,23 @@
*/
package org.apache.jackrabbit.oak.query;
+import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_NODE_TYPES;
+import static org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent.INITIAL_CONTENT;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import java.text.ParseException;
+import java.util.Random;
import org.apache.jackrabbit.oak.query.xpath.XPathToSQL2Converter;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.junit.Test;
public class LargeQueryTest {
+
+ private final NodeState types =
+ INITIAL_CONTENT.getChildNode(JCR_SYSTEM).getChildNode(JCR_NODE_TYPES);
@Test
public void testSimpleOr() throws ParseException {
@@ -83,4 +92,61 @@ public class LargeQueryTest {
assertEquals(buff2.toString(), sql2);
}
+
+ @Test
+ public void testRandomizedCondition() throws ParseException {
+ Random r = new Random(0);
+ for (int i = 0; i < 5000; i++) {
+ testRandomizedCondition(r.nextInt());
+ }
+ }
+
+ private void testRandomizedCondition(int seed) throws ParseException {
+ Random r = new Random(seed);
+ StringBuilder buff = new StringBuilder("//*[");
+ buff.append(randomCondition(r));
+ buff.append("]");
+ String xpath = buff.toString();
+ XPathToSQL2Converter conv = new XPathToSQL2Converter();
+ String sql2 = conv.convert(xpath);
+ int xpathIndex = sql2.lastIndexOf(" /* xpath: ");
+ sql2 = sql2.substring(0, xpathIndex);
+ // should use union now
+ assertTrue(sql2.indexOf(" or ") < 0);
+ SQL2Parser p = new SQL2Parser(null, types, new QueryEngineSettings());
+ p.parse(sql2);
+ }
+
+ private String randomCondition(Random r) {
+ switch (r.nextInt(14)) {
+ case 0:
+ case 1:
+ return "@" + (char) ('a' + r.nextInt(3));
+ case 2:
+ case 3:
+ return "@" + (char) ('a' + r.nextInt(3)) + "=" + r.nextInt(4);
+ case 4:
+ return "@" + (char) ('a' + r.nextInt(3)) + ">" + r.nextInt(3);
+ case 5:
+ return "jcr:contains(., 'x')";
+ case 6:
+ case 7:
+ return randomCondition(r) + " or " + randomCondition(r);
+ case 8:
+ case 9:
+ return randomCondition(r) + " and " + randomCondition(r);
+ case 10:
+ return "(" + randomCondition(r) + ")";
+ case 11:
+ return "@jcr:primaryType='nt:base'";
+ case 12:
+ return "@jcr:primaryType='nt:file'";
+ case 13:
+ return "@jcr:primaryType='nt:folder'";
+ case 14:
+ // return "not(" + randomCondition(r) + ")";
+ }
+ return "";
+ }
+
}