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