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();