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 al...@apache.org on 2014/04/30 14:04:04 UTC
svn commit: r1591265 - in /jackrabbit/oak/branches/1.0: ./
oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java
oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexQueryTest.java
Author: alexparvulescu
Date: Wed Apr 30 12:04:03 2014
New Revision: 1591265
URL: http://svn.apache.org/r1591265
Log:
OAK-1739 Incorrect handling of multivalued comparisons in queries
- merged to 1.0 branch
Modified:
jackrabbit/oak/branches/1.0/ (props changed)
jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java
jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexQueryTest.java
Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
Merged /jackrabbit/oak/trunk:r1588042,1591229
Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java?rev=1591265&r1=1591264&r2=1591265&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java Wed Apr 30 12:04:03 2014
@@ -24,8 +24,10 @@ import java.util.Set;
import javax.jcr.PropertyType;
+import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.PropertyValue;
import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
import org.apache.jackrabbit.oak.query.fulltext.LikePattern;
import org.apache.jackrabbit.oak.query.index.FilterImpl;
import org.apache.jackrabbit.oak.spi.query.PropertyValues;
@@ -101,7 +103,22 @@ public class ComparisonImpl extends Cons
// unable to convert, just skip this node
return false;
}
- return evaluate(p1, p2);
+ if (p1.isArray()) {
+ // JCR 2.0 spec, 6.7.16 Comparison:
+ // "... constraint is satisfied as a whole if the comparison
+ // against any element of the array is satisfied."
+ Type<?> base = p1.getType().getBaseType();
+ for (int i = 0; i < p1.count(); i++) {
+ PropertyState value = PropertyStates.createProperty(
+ "value", p1.getValue(base, i), base);
+ if (evaluate(PropertyValues.create(value), p2)) {
+ return true;
+ }
+ }
+ return false;
+ } else {
+ return evaluate(p1, p2);
+ }
}
/**
Modified: jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexQueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexQueryTest.java?rev=1591265&r1=1591264&r2=1591265&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexQueryTest.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexQueryTest.java Wed Apr 30 12:04:03 2014
@@ -13,6 +13,8 @@
*/
package org.apache.jackrabbit.oak.query.index;
+import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
+
import java.util.ArrayList;
import java.util.Arrays;
@@ -23,7 +25,6 @@ import org.apache.jackrabbit.oak.api.Typ
import org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent;
import org.apache.jackrabbit.oak.query.AbstractQueryTest;
import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider;
-import org.junit.Ignore;
import org.junit.Test;
import com.google.common.collect.ImmutableList;
@@ -236,14 +237,77 @@ public class TraversingIndexQueryTest ex
assertQuery("//*[(*/@prop > 1000)]", "xpath", new ArrayList<String>());
}
- @Test @Ignore("OAK-1379")
+ @Test
+ public void testRelativeProperties2() throws Exception {
+ Tree t = root.getTree("/").addChild("content").addChild("nodes");
+ Tree a = t.addChild("a");
+ a.setProperty(JCR_PRIMARYTYPE, "nt:unstructured", Type.NAME);
+ Tree b = a.addChild("b");
+ b.setProperty(JCR_PRIMARYTYPE, "nt:unstructured", Type.NAME);
+ Tree c = b.addChild("c");
+ c.setProperty(JCR_PRIMARYTYPE, "nt:unstructured", Type.NAME);
+
+ Tree d1 = c.addChild("d1");
+ d1.setProperty("prop", 10);
+ d1.setProperty(JCR_PRIMARYTYPE, "nt:unstructured", Type.NAME);
+ Tree d2 = c.addChild("d2");
+ d2.setProperty("prop", 20);
+ d2.setProperty(JCR_PRIMARYTYPE, "nt:unstructured", Type.NAME);
+ Tree d3 = c.addChild("d3");
+ d3.setProperty("prop", 30);
+ d3.setProperty(JCR_PRIMARYTYPE, "nt:unstructured", Type.NAME);
+ root.commit();
+
+ assertQuery("/jcr:root/content/nodes//*[(*/*/*/@prop >= 9)]", "xpath",
+ ImmutableList.of("/content/nodes/a", "/content/nodes/a/b",
+ "/content/nodes/a/b/c"));
+
+ assertQuery(
+ "/jcr:root/content/nodes//element(*, nt:unstructured)[(*/*/*/@prop >= 9)]",
+ "xpath", ImmutableList.of("/content/nodes/a",
+ "/content/nodes/a/b", "/content/nodes/a/b/c"));
+
+ assertQuery("/jcr:root/content/nodes//*[(*/*/*/@prop >= 10)]", "xpath",
+ ImmutableList.of("/content/nodes/a", "/content/nodes/a/b",
+ "/content/nodes/a/b/c"));
+ assertQuery(
+ "/jcr:root/content/nodes//element(*, nt:unstructured)[(*/*/*/@prop >= 10)]",
+ "xpath", ImmutableList.of("/content/nodes/a",
+ "/content/nodes/a/b", "/content/nodes/a/b/c"));
+
+ assertQuery("/jcr:root/content/nodes//*[(*/*/*/@prop >= 15)]", "xpath",
+ ImmutableList.of("/content/nodes/a", "/content/nodes/a/b",
+ "/content/nodes/a/b/c"));
+ assertQuery(
+ "/jcr:root/content/nodes//element(*, nt:unstructured)[(*/*/*/@prop >= 15)]",
+ "xpath", ImmutableList.of("/content/nodes/a",
+ "/content/nodes/a/b", "/content/nodes/a/b/c"));
+
+ assertQuery("/jcr:root/content/nodes//*[(*/*/*/@prop >= 20)]", "xpath",
+ ImmutableList.of("/content/nodes/a", "/content/nodes/a/b",
+ "/content/nodes/a/b/c"));
+ assertQuery(
+ "/jcr:root/content/nodes//element(*, nt:unstructured)[(*/*/*/@prop >= 20)]",
+ "xpath", ImmutableList.of("/content/nodes/a",
+ "/content/nodes/a/b", "/content/nodes/a/b/c"));
+
+ assertQuery("/jcr:root/content/nodes//*[(*/*/*/@prop >= 30)]", "xpath",
+ ImmutableList.of("/content/nodes/a", "/content/nodes/a/b",
+ "/content/nodes/a/b/c"));
+ assertQuery(
+ "/jcr:root/content/nodes//element(*, nt:unstructured)[(*/*/*/@prop >= 30)]",
+ "xpath", ImmutableList.of("/content/nodes/a",
+ "/content/nodes/a/b", "/content/nodes/a/b/c"));
+ }
+
+ @Test
public void testMultipleRelativeProperties() throws Exception {
Tree content = root.getTree("/").addChild("content");
-
+
content.addChild("node1").setProperty("a", 128);
content.addChild("node2").setProperty("a", "abc");
content.addChild("node3").setProperty("a", "1280");
-
+
content.addChild("node1").setProperty("b", 128);
content.addChild("node2").setProperty("b", 1024);
content.addChild("node3").setProperty("b", 2048);
@@ -256,16 +320,15 @@ public class TraversingIndexQueryTest ex
content.addChild("node2").setProperty("d", 10);
content.addChild("node3").setProperty("d", Arrays.asList(1L, 2L), Type.LONGS);
-
root.commit();
- assertQuery("//*[*/@a > 2]", "xpath", Arrays.<String>asList());
+ assertQuery("//*[*/@a > 2]", "xpath", Arrays.asList("/content"));
assertQuery("//*[*/@a > '1']", "xpath", Arrays.asList("/content"));
- assertQuery("//*[*/@a > 'abb']", "xpath", Arrays.<String>asList());
+ assertQuery("//*[*/@a > 'abd']", "xpath", Arrays.<String>asList());
assertQuery("//*[*/@a = 'abc']", "xpath", Arrays.asList("/content"));
- // this may be unexpected: it is evalucated as
+ // this may be unexpected: it is evaluated as
// ['128', 'abc', '1280'] >= 'abc'
- assertQuery("//*[*/@a >= 'abc']", "xpath", Arrays.<String>asList());
+ assertQuery("//*[*/@a >= 'abc']", "xpath", Arrays.asList("/content"));
assertQuery("//*[*/@b > 2]", "xpath", Arrays.asList("/content"));
assertQuery("//*[*/@b > 2048]", "xpath", Arrays.<String>asList());
@@ -281,9 +344,9 @@ public class TraversingIndexQueryTest ex
assertQuery("//*[*/@d > 11]", "xpath", Arrays.asList("/content"));
assertQuery("//*[*/@d > '1']", "xpath", Arrays.asList("/content"));
assertQuery("//*[*/@d = 10]", "xpath", Arrays.asList("/content"));
- // this may be unexpected: it is evalucated as
- // ['x', 'y', '10', '1', '2'] < '3'
- assertQuery("//*[*/@d < 3]", "xpath", Arrays.<String>asList());
-}
-
+ // this may be unexpected: it is evaluated as
+ // ['x', 'y', '10', '1', '2'] < '3'
+ assertQuery("//*[*/@d < 3]", "xpath", Arrays.asList("/content"));
+ }
+
}