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 ju...@apache.org on 2014/04/16 21:28:36 UTC

svn commit: r1588042 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexQueryTest.java

Author: jukka
Date: Wed Apr 16 19:28:36 2014
New Revision: 1588042

URL: http://svn.apache.org/r1588042
Log:
OAK-1739: Incorrect handling of multivalued comparisons in queries

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexQueryTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java?rev=1588042&r1=1588041&r2=1588042&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java Wed Apr 16 19:28:36 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/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexQueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexQueryTest.java?rev=1588042&r1=1588041&r2=1588042&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexQueryTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexQueryTest.java Wed Apr 16 19:28:36 2014
@@ -23,7 +23,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 +235,14 @@ public class TraversingIndexQueryTest ex
         assertQuery("//*[(*/@prop > 1000)]", "xpath", new ArrayList<String>());
     }
 
-    @Test @Ignore("OAK-1379")
+    @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 +255,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 +279,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"));
+    }
+
 }