Author: thomasm
Date: Tue Nov  8 15:03:25 2016
New Revision: 1768711

URL: http://svn.apache.org/viewvc?rev=1768711&view=rev
Log:
OAK-5085 XPath: union bugfix

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/XPathToSQL2Converter.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/xpath/XPathToSQL2Converter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/XPathToSQL2Converter.java?rev=1768711&r1=1768710&r2=1768711&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/XPathToSQL2Converter.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/XPathToSQL2Converter.java
 Tue Nov  8 15:03:25 2016
@@ -1095,10 +1095,12 @@ public class XPathToSQL2Converter {
             parseIndex = converter.parseIndex;
             if (converter.readIf("(")) {
                 level++;
-            } else if (converter.readIf(")") && level-- <= 0) {
-                break;
+            } else if (converter.readIf(")")) {
+                if (level-- <= 0) {
+                    break;
+                }
             } else if (converter.readIf("|") && level == 0) {
-                String or = partList.substring(lastOrIndex, lastParseIndex);
+                String or = partList.substring(lastOrIndex, parseIndex - 1);
                 parts.add(or);
                 lastOrIndex = parseIndex;
             } else if (converter.currentTokenType == END) {
@@ -1106,9 +1108,8 @@ public class XPathToSQL2Converter {
             } else {
                 converter.read();
             }
-            lastParseIndex = parseIndex;
         }
-        String or = partList.substring(lastOrIndex, lastParseIndex);
+        String or = partList.substring(lastOrIndex, parseIndex - 1);
         parts.add(or);        
         String end = partList.substring(parseIndex);
         Statement result = null;

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=1768711&r1=1768710&r2=1768711&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
 Tue Nov  8 15:03:25 2016
@@ -87,6 +87,33 @@ public class XPathTest {
     
     @Test
     public void union() throws ParseException {
+        verify("//(a|(b|c))",
+                "select [jcr:path], [jcr:score], * " +
+                "from [nt:base] as a " +
+                "where name(a) = 'a' " +
+                "/* xpath: //a */ " +
+                "union select [jcr:path], [jcr:score], * " +
+                "from [nt:base] as a " +
+                "where name(a) = 'b' " +
+                "/* xpath: //b */ " +
+                "union select [jcr:path], [jcr:score], * " +
+                "from [nt:base] as a " +
+                "where name(a) = 'c' " +
+                "/* xpath: //c */");
+        verify("(//*[jcr:contains(., 'some')])",
+                "select [jcr:path], [jcr:score], * " + 
+                "from [nt:base] as a " + 
+                "where contains(*, 'some') " + 
+                "/* xpath: //*[jcr:contains(., 'some')] */");
+        verify("(//*[jcr:contains(., 'x')] | //*[jcr:contains(., 'y')])",
+                "select [jcr:path], [jcr:score], * " + 
+                "from [nt:base] as a " + 
+                "where contains(*, 'x') " + 
+                "/* xpath: //*[jcr:contains(., 'x')] */ " + 
+                "union select [jcr:path], [jcr:score], * " + 
+                "from [nt:base] as a " + 
+                "where contains(*, 'y') " + 
+                "/* xpath: //*[jcr:contains(., 'y')] */");
         try {
             verify("(/jcr:root/x[@a][@b][@c]","");
             fail();
@@ -99,7 +126,7 @@ public class XPathTest {
                 "where [a] is not null " +
                 "and [c] is not null " +
                 "and issamenode(a, '/x') " +
-                "/* xpath: /jcr:root/x[@a][@c] */ " +
+                "/* xpath: /jcr:root/x[@a] [@c] */ " +
                 "union select [jcr:path], [jcr:score], * " +
                 "from [nt:base] as a " +
                 "where [b] is not null " +
@@ -129,7 +156,7 @@ public class XPathTest {
                 "from [nt:base] as a " + 
                 "where [a] is not null " + 
                 "and isdescendantnode(a, '/content') " + 
-                "/* xpath: /jcr:root/content//*[@a] " + 
+                "/* xpath: /jcr:root/content//*[@a]  " + 
                 "order by @c */ " + 
                 "union select [jcr:path], [jcr:score], * " + 
                 "from [nt:base] as a " + 


Reply via email to