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 "";
+    }
+    
 }