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 2017/05/05 13:03:37 UTC

svn commit: r1794048 - in /jackrabbit/oak/branches/1.6: ./ oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/XPathToSQL2Converter.java oak-core/src/test/java/org/apache/jackrabbit/oak/query/XPathTest.java

Author: thomasm
Date: Fri May  5 13:03:37 2017
New Revision: 1794048

URL: http://svn.apache.org/viewvc?rev=1794048&view=rev
Log:
OAK-6116 SQL generated from xpath with 3 or more ORed paths along with order by clause throws parseException

Modified:
    jackrabbit/oak/branches/1.6/   (props changed)
    jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/XPathToSQL2Converter.java
    jackrabbit/oak/branches/1.6/oak-core/src/test/java/org/apache/jackrabbit/oak/query/XPathTest.java

Propchange: jackrabbit/oak/branches/1.6/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri May  5 13:03:37 2017
@@ -1,3 +1,3 @@
 /jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1781068,1781075,1781248,1781386,1781846,1781907,1782000,1782029,1782196,1782447,1782476,1782770,1782945,1782966,1782973,1782990,1783061,1783066,1783089,1783104-1783105,1783110,1783619,1783720,1783731,1783733,1783738,1783742,1783773,1783855,1783891,1784023,1784130,1784162,1784251,1784401,1784551,1784574,1784689,1785095,1785108,1785283,1785838,1785919,1785946,1787074,1787217,1788378,1788387-1788389,1790382,1792463,1792742,1793088,1793618,1793627,1793644
+/jackrabbit/oak/trunk:1781068,1781075,1781248,1781386,1781846,1781907,1782000,1782029,1782196,1782447,1782476,1782770,1782945,1782966,1782973,1782990,1783061,1783066,1783089,1783104-1783105,1783110,1783619,1783720,1783731,1783733,1783738,1783742,1783773,1783855,1783891,1784023,1784130,1784162,1784251,1784401,1784551,1784574,1784689,1785095,1785108,1785283,1785838,1785919,1785946,1787074,1787217,1788378,1788387-1788389,1790382,1792463,1792742,1792746,1793088,1793618,1793627,1793644
 /jackrabbit/trunk:1345480

Modified: jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/XPathToSQL2Converter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/XPathToSQL2Converter.java?rev=1794048&r1=1794047&r2=1794048&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/XPathToSQL2Converter.java (original)
+++ jackrabbit/oak/branches/1.6/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/XPathToSQL2Converter.java Fri May  5 13:03:37 2017
@@ -1113,24 +1113,28 @@ public class XPathToSQL2Converter {
         parts.add(or);        
         String end = partList.substring(parseIndex);
         Statement result = null;
+        ArrayList<Order> orderList = null;
+        QueryOptions queryOptions = null;
         for(String p : parts) {
             String q = begin + p + end;
             converter = new XPathToSQL2Converter();
             Statement stat = converter.convertToStatement(q);
+            orderList = stat.orderList;
+            queryOptions = stat.queryOptions;
+            // reset fields that are used in the union,
+            // but no longer in the individual statements
+            // (can not use clear, because it is shared)
+            stat.orderList = new ArrayList<Order>();
+            stat.queryOptions = new QueryOptions();
             if (result == null) {
                 result = stat;
             } else {
                 UnionStatement union = new UnionStatement(result, stat);
-                union.orderList = stat.orderList;
-                union.queryOptions = stat.queryOptions;
                 result = union;
             }
-            // reset fields that are used in the union,
-            // but no longer in the individual statements
-            // (can not use clear, because it is shared)
-            stat.orderList = new ArrayList<Order>();
-            stat.queryOptions = new QueryOptions();
         }
+        result.orderList = orderList;
+        result.queryOptions = queryOptions;
         return result;
     }
 

Modified: jackrabbit/oak/branches/1.6/oak-core/src/test/java/org/apache/jackrabbit/oak/query/XPathTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.6/oak-core/src/test/java/org/apache/jackrabbit/oak/query/XPathTest.java?rev=1794048&r1=1794047&r2=1794048&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.6/oak-core/src/test/java/org/apache/jackrabbit/oak/query/XPathTest.java (original)
+++ jackrabbit/oak/branches/1.6/oak-core/src/test/java/org/apache/jackrabbit/oak/query/XPathTest.java Fri May  5 13:03:37 2017
@@ -36,6 +36,35 @@ public class XPathTest {
     
     @Test
     public void queryOptions() throws ParseException {
+        verify("(/jcr:root/a//* | /jcr:root/b//*) order by @jcr:score", 
+                "select [jcr:path], [jcr:score], * " +
+                "from [nt:base] as a " +
+                "where isdescendantnode(a, '/a') " +
+                "/* xpath: /jcr:root/a//* \n" +
+                "order by @jcr:score */ " +
+                "union select [jcr:path], [jcr:score], * " +
+                "from [nt:base] as a " +
+                "where isdescendantnode(a, '/b') " +
+                "/* xpath: /jcr:root/b//* " +
+                "order by @jcr:score */ " +
+                "order by [jcr:score]");         
+        verify("(/jcr:root/a//* | /jcr:root/b//* | /jcr:root/c//*) order by @jcr:score", 
+                "select [jcr:path], [jcr:score], * " +
+                "from [nt:base] as a " +
+                "where isdescendantnode(a, '/a') " +
+                "/* xpath: /jcr:root/a//* \n" +
+                "order by @jcr:score */ " +
+                "union select [jcr:path], [jcr:score], * " +
+                "from [nt:base] as a " +
+                "where isdescendantnode(a, '/b') " +
+                "/* xpath: /jcr:root/b//* \n" +
+                "order by @jcr:score */ " +
+                "union select [jcr:path], [jcr:score], * " +
+                "from [nt:base] as a " +
+                "where isdescendantnode(a, '/c') " +
+                "/* xpath: /jcr:root/c//* " +
+                "order by @jcr:score */ " +
+                "order by [jcr:score]"); 
         verify("//(element(*, nt:address))", 
                 "select [jcr:path], [jcr:score], * " +
                 "from [nt:address] as a " +
@@ -261,7 +290,7 @@ public class XPathTest {
     }
     
     static String formatSQL(String sql) {
-        sql = sql.replace("\n", " ");
+        sql = sql.replace('\n', ' ');
         sql = sql.replaceAll(" from ", "\nfrom ");
         sql = sql.replaceAll(" where ", "\nwhere ");
         sql = sql.replaceAll(" and ", "\nand ");