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 2012/09/12 13:35:31 UTC

svn commit: r1383892 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query: Query.java ast/ComparisonImpl.java ast/EquiJoinConditionImpl.java

Author: thomasm
Date: Wed Sep 12 11:35:30 2012
New Revision: 1383892

URL: http://svn.apache.org/viewvc?rev=1383892&view=rev
Log:
OAK-28 Query implementation: queries should not fail just because the value can't be converted

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/EquiJoinConditionImpl.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java?rev=1383892&r1=1383891&r2=1383892&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java Wed Sep 12 11:35:30 2012
@@ -420,6 +420,13 @@ public class Query {
         return ifUnknown;
     }
 
+    /**
+     * Convert a value to the given target type, if possible.
+     * 
+     * @param v the value to convert
+     * @param targetType the target property type
+     * @return the converted value, or null if converting is not possible
+     */
     public CoreValue convert(CoreValue v, int targetType) {
         // TODO support full set of conversion features defined in the JCR spec
         // at 3.6.4 Property Type Conversion
@@ -444,40 +451,49 @@ public class Query {
             }
             return vf.createValue(v.getString(), targetType);
         }
-        switch (targetType) {
-        case PropertyType.STRING:
-            return vf.createValue(v.getString());
-        case PropertyType.BOOLEAN:
-            return vf.createValue(v.getBoolean());
-        case PropertyType.DATE:
-            return vf.createValue(v.getString(), PropertyType.DATE);
-        case PropertyType.LONG:
-            return vf.createValue(v.getLong());
-        case PropertyType.DOUBLE:
-            return vf.createValue(v.getDouble());
-        case PropertyType.DECIMAL:
-            return vf.createValue(v.getString(), PropertyType.DECIMAL);
-        case PropertyType.NAME:
-            return vf.createValue(getOakPath(v.getString()), PropertyType.NAME);
-        case PropertyType.PATH:
-            return vf.createValue(v.getString(), PropertyType.PATH);
-        case PropertyType.REFERENCE:
-            return vf.createValue(v.getString(), PropertyType.REFERENCE);
-        case PropertyType.WEAKREFERENCE:
-            return vf.createValue(v.getString(), PropertyType.WEAKREFERENCE);
-        case PropertyType.URI:
-            return vf.createValue(v.getString(), PropertyType.URI);
-        case PropertyType.BINARY:
-            try {
-                byte[] data = v.getString().getBytes("UTF-8");
-                return vf.createValue(new ByteArrayInputStream(data));
-            } catch (IOException e) {
-                // I don't know in what case that could really occur
-                // except if UTF-8 isn't supported
-                throw new IllegalArgumentException(v.getString(), e);
+        try {
+            switch (targetType) {
+            case PropertyType.STRING:
+                return vf.createValue(v.getString());
+            case PropertyType.BOOLEAN:
+                return vf.createValue(v.getBoolean());
+            case PropertyType.DATE:
+                return vf.createValue(v.getString(), PropertyType.DATE);
+            case PropertyType.LONG:
+                return vf.createValue(v.getLong());
+            case PropertyType.DOUBLE:
+                return vf.createValue(v.getDouble());
+            case PropertyType.DECIMAL:
+                return vf.createValue(v.getString(), PropertyType.DECIMAL);
+            case PropertyType.NAME:
+                return vf.createValue(getOakPath(v.getString()), PropertyType.NAME);
+            case PropertyType.PATH:
+                return vf.createValue(v.getString(), PropertyType.PATH);
+            case PropertyType.REFERENCE:
+                return vf.createValue(v.getString(), PropertyType.REFERENCE);
+            case PropertyType.WEAKREFERENCE:
+                return vf.createValue(v.getString(), PropertyType.WEAKREFERENCE);
+            case PropertyType.URI:
+                return vf.createValue(v.getString(), PropertyType.URI);
+            case PropertyType.BINARY:
+                try {
+                    byte[] data = v.getString().getBytes("UTF-8");
+                    return vf.createValue(new ByteArrayInputStream(data));
+                } catch (IOException e) {
+                    // I don't know in what case that could really occur
+                    // except if UTF-8 isn't supported
+                    throw new IllegalArgumentException(v.getString(), e);
+                }
             }
+            throw new IllegalArgumentException("Unknown property type: " + targetType);
+        } catch (UnsupportedOperationException e) {
+            // TODO detect unsupported conversions, so that no exception is thrown
+            // because exceptions are slow
+            return null;
+            // throw new IllegalArgumentException("<unsupported conversion of " + 
+            //        v + " (" + PropertyType.nameFromValue(v.getType()) + ") to type " + 
+            //        PropertyType.nameFromValue(targetType) + ">");
         }
-        throw new IllegalArgumentException("Unknown property type: " + targetType);
     }
 
     public String getOakPath(String jcrPath) {

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=1383892&r1=1383891&r2=1383892&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 Sep 12 11:35:30 2012
@@ -71,6 +71,9 @@ public class ComparisonImpl extends Cons
             // "the value of operand2 is converted to the
             // property type of the value of operand1"
             v2 = query.convert(v2, v1Type);
+            if (v2 == null) {
+                return false;
+            }
         }
         if (!isArray) {
             return evaluate(p1.getValue(), v2);

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/EquiJoinConditionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/EquiJoinConditionImpl.java?rev=1383892&r1=1383891&r2=1383892&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/EquiJoinConditionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/EquiJoinConditionImpl.java Wed Sep 12 11:35:30 2012
@@ -97,7 +97,7 @@ public class EquiJoinConditionImpl exten
                 if (y.getType() != x.getType()) {
                     y = query.convert(y, x.getType());
                 }
-                if (x.equals(y)) {
+                if (y != null && x.equals(y)) {
                     return true;
                 }
             }