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"));
+    }
+
 }