From 28d909c5e03fb6e535aa7dbbde7f00265fd303f3 Mon Sep 17 00:00:00 2001 From: Jukka Zitting Date: Wed, 16 Apr 2014 13:55:55 -0400 Subject: [PATCH] OAK-1076: XPath failures for typed properties Correct implementation of multi-valued comparisons --- .../jackrabbit/oak/query/ast/ComparisonImpl.java | 19 ++++++++++++++++++- .../oak/query/index/TraversingIndexQueryTest.java | 18 +++++++++--------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java index a77a85c..585b44e 100644 --- a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java @@ -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 ConstraintImpl { // 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); + } } /** diff --git a/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexQueryTest.java b/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexQueryTest.java index 3b102da..5d2ca59 100644 --- a/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexQueryTest.java +++ b/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexQueryTest.java @@ -258,13 +258,13 @@ public class TraversingIndexQueryTest extends AbstractQueryTest { root.commit(); - assertQuery("//*[*/@a > 2]", "xpath", Arrays.asList()); + assertQuery("//*[*/@a > 2]", "xpath", Arrays.asList("/content")); assertQuery("//*[*/@a > '1']", "xpath", Arrays.asList("/content")); - assertQuery("//*[*/@a > 'abb']", "xpath", Arrays.asList()); + assertQuery("//*[*/@a > 'abd']", "xpath", Arrays.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.asList()); + assertQuery("//*[*/@a >= 'abc']", "xpath", Arrays.asList("/content")); assertQuery("//*[*/@b > 2]", "xpath", Arrays.asList("/content")); assertQuery("//*[*/@b > 2048]", "xpath", Arrays.asList()); @@ -280,9 +280,9 @@ public class TraversingIndexQueryTest extends AbstractQueryTest { 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.asList()); -} - + // this may be unexpected: it is evaluated as + // ['x', 'y', '10', '1', '2'] < '3' + assertQuery("//*[*/@d < 3]", "xpath", Arrays.asList("/content")); + } + } -- 1.8.4.msysgit.0