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 th...@apache.org on 2015/03/24 15:51:11 UTC

svn commit: r1668914 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java

Author: thomasm
Date: Tue Mar 24 14:51:11 2015
New Revision: 1668914

URL: http://svn.apache.org/r1668914
Log:
OAK-2497 Range query with incorrectly formatted date

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.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=1668914&r1=1668913&r2=1668914&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 Tue Mar 24 14:51:11 2015
@@ -87,12 +87,14 @@ public class ComparisonImpl extends Cons
             return false;
         }
         // "the value of operand2 is converted to the
-        // property type of the value of operand1"
-        try {
-            p2 = convertValueToType(p2, p1);
-        } catch (IllegalArgumentException ex) {
-            // unable to convert, just skip this node
-            return false;
+        // property type of the value of operand1" if possible
+        p2 = convertValueToType(p2, p1);
+        // if not possible, convert to the same type
+        if (p1.getType().tag() != p2.getType().tag()) {
+            // conversion failed: convert both to binary or string
+            int targetType = getCommonType(p1, p2);
+            p1 = convertToType(p1, targetType);
+            p2 = convertToType(p2, targetType);
         }
         if (p1.isArray()) {
             // JCR 2.0 spec, 6.7.16 Comparison:
@@ -111,6 +113,22 @@ public class ComparisonImpl extends Cons
             return operator.evaluate(p1, p2);
         }
     }
+    
+    private static int getCommonType(PropertyValue p1, PropertyValue p2) {
+        if (p1.getType().tag() == PropertyType.BINARY || p2.getType().tag() == PropertyType.BINARY) {
+            return PropertyType.BINARY;
+        }
+        return PropertyType.STRING;
+    }
+    
+    private PropertyValue convertToType(PropertyValue v, int targetType) {
+        try {
+            return PropertyValues.convert(v, targetType, query.getNamePathMapper());
+        } catch (IllegalArgumentException e) {
+            // not possible to convert
+            return v;
+        }        
+    }
 
     @Override
     boolean accept(AstVisitor v) {

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java?rev=1668914&r1=1668913&r2=1668914&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java Tue Mar 24 14:51:11 2015
@@ -69,6 +69,25 @@ public class QueryTest extends AbstractR
     }
     
     @Test
+    public void typeConversion() throws Exception {
+        Session session = getAdminSession();
+        Node root = session.getRootNode();
+        
+        Node test = root.addNode("test");
+        test.addNode("a", "oak:Unstructured").setProperty("time", "2001-01-01T00:00:00.000Z", PropertyType.DATE);
+        test.addNode("b", "oak:Unstructured").setProperty("time", "2010-01-01T00:00:00.000Z", PropertyType.DATE);
+        test.addNode("c", "oak:Unstructured").setProperty("time", "2020-01-01T00:00:00.000Z", PropertyType.DATE);
+        session.save();
+        
+        assertEquals("/test/c",
+                getNodeList(session, 
+                "select [jcr:path] " +
+                "from [nt:base] " + 
+                "where [time] > '2011-01-01T00:00:00.000z'", Query.JCR_SQL2));
+
+    }
+    
+    @Test
     public void twoSelectors() throws Exception {
         Session session = getAdminSession();
         Node root = session.getRootNode();