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/07/14 21:55:15 UTC

svn commit: r1610500 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/ oak-core/src/test/resources/org/apache/jackrabbit/oak/query/ oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/

Author: jukka
Date: Mon Jul 14 19:55:14 2014
New Revision: 1610500

URL: http://svn.apache.org/r1610500
Log:
OAK-1965: Support for constraints like: foo = 'X' OR bar = 'Y'

Simplify the LiteralImpl string representation for STRING and LONG
values types that can be correctly parsed without a cast().

Add better equals() and hashCode() methods to LiteralImpl and
BindVariableValueImpl to make detecting duplicates easier/faster.

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LiteralImpl.java
    jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_index.txt
    jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_native.txt
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryFulltextTest.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.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/BindVariableValueImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl.java?rev=1610500&r1=1610499&r2=1610500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/BindVariableValueImpl.java Mon Jul 14 19:55:14 2014
@@ -41,11 +41,6 @@ public class BindVariableValueImpl exten
     }
 
     @Override
-    public String toString() {
-        return '$' + bindVariableName;
-    }
-
-    @Override
     PropertyValue currentValue() {
         return query.getBindVariableValue(bindVariableName);
     }
@@ -56,4 +51,28 @@ public class BindVariableValueImpl exten
         return v.getType().tag();
     }
 
+    //------------------------------------------------------------< Object >--
+
+    @Override
+    public String toString() {
+        return '$' + bindVariableName;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        } else if (that instanceof BindVariableValueImpl) {
+            return bindVariableName.equals(
+                    ((BindVariableValueImpl) that).bindVariableName);
+        } else {
+            return false;
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        return bindVariableName.hashCode();
+    }
+
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LiteralImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LiteralImpl.java?rev=1610500&r1=1610499&r2=1610500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LiteralImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/LiteralImpl.java Mon Jul 14 19:55:14 2014
@@ -46,12 +46,6 @@ public class LiteralImpl extends StaticO
         return v.visit(this);
     }
 
-    @Override
-    public String toString() {
-        String type = PropertyType.nameFromValue(value.getType().tag());
-        return "cast(" + escape() + " as " + type.toLowerCase(Locale.ENGLISH) + ')';
-    }
-
     private String escape() {
         return SQL2Parser.escapeStringLiteral(value.getValue(Type.STRING));
     }
@@ -68,4 +62,34 @@ public class LiteralImpl extends StaticO
         return v == null ? PropertyType.UNDEFINED : v.getType().tag();
     }
 
+    //------------------------------------------------------------< Object >--
+
+    @Override
+    public String toString() {
+        if (value.getType() == Type.STRING) {
+            return escape();
+        } else if (value.getType() == Type.LONG) {
+            return Long.toString(value.getValue(Type.LONG));
+        } else {
+            String type = PropertyType.nameFromValue(value.getType().tag());
+            return "cast(" + escape() + " as " + type.toLowerCase(Locale.ENGLISH) + ')';
+        }
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        } else if (that instanceof LiteralImpl) {
+            return value.equals(((LiteralImpl) that).value);
+        } else {
+            return false;
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        return value.hashCode();
+    }
+
 }

Modified: jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_index.txt
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_index.txt?rev=1610500&r1=1610499&r2=1610500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_index.txt (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_index.txt Mon Jul 14 19:55:14 2014
@@ -28,7 +28,7 @@ explain select *
   from [nt:base]
   where [jcr:uuid] like '%'
 [nt:base] as [nt:base] /* property jcr:uuid
-  where [nt:base].[jcr:uuid] like cast('%' as string) */
+  where [nt:base].[jcr:uuid] like '%' */
 
 explain select e.[jcr:path]
   from [nt:base] as a
@@ -44,18 +44,18 @@ explain select e.[jcr:path]
   and (e.[jcr:uuid] = '1' or e.[jcr:uuid] = '2' or e.[jcr:uuid] = '3' or e.[jcr:uuid] = '4')
 [nt:base] as [e] /* property jcr:uuid
   where ([e].[jcr:uuid] is not null)
-  and ([e].[jcr:uuid] in(cast('1' as string), cast('2' as string), cast('3' as string), cast('4' as string))) */
+  and ([e].[jcr:uuid] in('1', '2', '3', '4')) */
   inner join [nt:base] as [d] /* traverse "* && //parent/of/join"
-  where name([d]) = cast('e' as string) */
+  where name([d]) = 'e' */
   on ischildnode([e], [d])
   inner join [nt:base] as [c] /* traverse "* && //parent/of/join"
-  where name([c]) = cast('d' as string) */
+  where name([c]) = 'd' */
   on ischildnode([d], [c])
   inner join [nt:base] as [b] /* traverse "* && //parent/of/join"
-  where name([b]) = cast('c' as string) */
+  where name([b]) = 'c' */
   on ischildnode([c], [b])
   inner join [nt:base] as [a] /* traverse "/b//* && //parent/of/join"
-  where (name([a]) = cast('a' as string))
+  where (name([a]) = 'a')
   and (isdescendantnode([a], [/b])) */
   on ischildnode([b], [a])
 
@@ -73,18 +73,18 @@ explain select e.[jcr:path]
   and (e.[jcr:uuid] = '1' or e.[jcr:uuid] = '2' or e.[jcr:uuid] = '3' or e.[jcr:uuid] = '4')
 [nt:base] as [e] /* property jcr:uuid
   where ([e].[jcr:uuid] is not null)
-  and ([e].[jcr:uuid] in(cast('1' as string), cast('2' as string), cast('3' as string), cast('4' as string))) */
+  and ([e].[jcr:uuid] in('1', '2', '3', '4')) */
   inner join [nt:base] as [d] /* traverse "* && //parent/of/join"
-  where name([d]) = cast('e' as string) */
+  where name([d]) = 'e' */
   on ischildnode([e], [d])
   inner join [nt:base] as [c] /* traverse "* && //parent/of/join"
-  where name([c]) = cast('d' as string) */
+  where name([c]) = 'd' */
   on ischildnode([d], [c])
   inner join [nt:base] as [b] /* traverse "* && //parent/of/join"
-  where name([b]) = cast('c' as string) */
+  where name([b]) = 'c' */
   on ischildnode([c], [b])
   inner join [nt:base] as [a] /* traverse "/b//* && //parent/of/join"
-  where (name([a]) = cast('a' as string))
+  where (name([a]) = 'a')
   and (isdescendantnode([a], [/b])) */
   on ischildnode([b], [a])
 
@@ -92,21 +92,21 @@ explain select excerpt(.)
   from [nt:resource]
   where contains(*, 'jackrabbit')
 [nt:resource] as [nt:resource] /* traverse "*"
-  where contains([nt:resource].[*], cast('jackrabbit' as string)) */
+  where contains([nt:resource].[*], 'jackrabbit') */
 
 explain select excerpt(.)
   from [nt:resource]
   where contains(*, 'jackrabbit') or contains(*, 'jackrabbit')
 [nt:resource] as [nt:resource] /* traverse "*"
-  where contains([nt:resource].[*], cast('jackrabbit' as string)) */
+  where contains([nt:resource].[*], 'jackrabbit') */
 
 explain select excerpt(.)
   from [nt:resource]
   where (contains(*, 'jackrabbit') or contains(*, 'jackrabbit'))
   and x = '1'
 [nt:resource] as [nt:resource] /* traverse "*"
-  where (contains([nt:resource].[*], cast('jackrabbit' as string)))
-  and ([nt:resource].[x] = cast('1' as string)) */
+  where (contains([nt:resource].[*], 'jackrabbit'))
+  and ([nt:resource].[x] = '1') */
 
 explain select *
   from [nt:base]
@@ -119,7 +119,7 @@ explain select b.[jcr:uuid]
   where (a.[jcr:uuid] = '1' or a.[jcr:uuid] = '2')
 [nt:base] as [a] /* property jcr:uuid
   where ([a].[jcr:uuid] is not null)
-  and ([a].[jcr:uuid] in(cast('1' as string), cast('2' as string))) */
+  and ([a].[jcr:uuid] in('1', '2')) */
   inner join [nt:base] as [b] /* traverse "* && //path/from/join//*" */
   on isdescendantnode([b], [a])
 
@@ -130,7 +130,7 @@ explain select b.[jcr:uuid]
   and b.[jcr:uuid] is not null
 [nt:base] as [a] /* property jcr:uuid
   where ([a].[jcr:uuid] is not null)
-  and ([a].[jcr:uuid] in(cast('1' as string), cast('2' as string))) */
+  and ([a].[jcr:uuid] in('1', '2')) */
   inner join [nt:base] as [b] /* property jcr:uuid
   where [b].[jcr:uuid] is not null */
   on isdescendantnode([b], [a])
@@ -147,26 +147,26 @@ explain select *
   and [b] = '3')
 [nt:base] as [nt:base] /* property jcr:uuid
   where ([nt:base].[jcr:uuid] is not null)
-  and ([nt:base].[jcr:uuid] in(cast('1' as string), cast('2' as string))) */
+  and ([nt:base].[jcr:uuid] in('1', '2')) */
 
 explain select *
   from [nt:base]
   where [jcr:uuid] in('1', '2')
 [nt:base] as [nt:base] /* property jcr:uuid
-  where [nt:base].[jcr:uuid] in(cast('1' as string), cast('2' as string)) */
+  where [nt:base].[jcr:uuid] in('1', '2') */
 
 explain select *
   from [nt:base]
   where [jcr:uuid] = '1' or [jcr:uuid] = '2'
 [nt:base] as [nt:base] /* property jcr:uuid
   where ([nt:base].[jcr:uuid] is not null)
-  and ([nt:base].[jcr:uuid] in(cast('1' as string), cast('2' as string))) */
+  and ([nt:base].[jcr:uuid] in('1', '2')) */
 
 explain select *
   from [nt:base]
   where [jcr:uuid] = '123'
 [nt:base] as [nt:base] /* property jcr:uuid=123
-  where [nt:base].[jcr:uuid] = cast('123' as string) */
+  where [nt:base].[jcr:uuid] = '123' */
 
 explain select *
   from [nt:base]
@@ -192,10 +192,10 @@ explain select *
   and (b.[jcr:uuid]=3 or b.[jcr:uuid]=4)
 [nt:base] as [a] /* property jcr:uuid
   where ([a].[jcr:uuid] is not null)
-  and ([a].[jcr:uuid] in(cast('1' as long), cast('2' as long))) */
+  and ([a].[jcr:uuid] in(1, 2)) */
   inner join [nt:base] as [b] /* property jcr:uuid
   where ([b].[jcr:uuid] is not null)
-  and ([b].[jcr:uuid] in(cast('3' as long), cast('4' as long))) */
+  and ([b].[jcr:uuid] in(3, 4)) */
   on isdescendantnode([b], [a])
 
 explain select *

Modified: jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_native.txt
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_native.txt?rev=1610500&r1=1610499&r2=1610500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_native.txt (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_native.txt Mon Jul 14 19:55:14 2014
@@ -28,15 +28,15 @@ commit / + "test": { "a": { "name": "Hel
 
 select [jcr:path] from [nt:base]
   where native('solr', 'name:(Hello OR World)')
-java.lang.IllegalArgumentException: No full-text index was found that can process the condition native([nt:base], [solr], cast('name:(Hello OR World)' as string))
+java.lang.IllegalArgumentException: No full-text index was found that can process the condition native([nt:base], [solr], 'name:(Hello OR World)')
 
 select [jcr:path] from [nt:base] as a
   where native(a, 'solr', 'path_child:\/test _val_:"recip(rord(name),1,2,3)"')
-java.lang.IllegalArgumentException: No full-text index was found that can process the condition native([a], [solr], cast('path_child:\/test _val_:"recip(rord(name),1,2,3)"' as string))
+java.lang.IllegalArgumentException: No full-text index was found that can process the condition native([a], [solr], 'path_child:\/test _val_:"recip(rord(name),1,2,3)"')
 
 select [jcr:path] from [nt:base]
   where native('solr', 'path_child:\/test _val_:"recip(rord(name),1,2,3)"')
-java.lang.IllegalArgumentException: No full-text index was found that can process the condition native([nt:base], [solr], cast('path_child:\/test _val_:"recip(rord(name),1,2,3)"' as string))
+java.lang.IllegalArgumentException: No full-text index was found that can process the condition native([nt:base], [solr], 'path_child:\/test _val_:"recip(rord(name),1,2,3)"')
 
 xpath2sql //*[rep:native('solr', 'xyz')]
 select [jcr:path], [jcr:score], *

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryFulltextTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryFulltextTest.java?rev=1610500&r1=1610499&r2=1610500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryFulltextTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryFulltextTest.java Mon Jul 14 19:55:14 2014
@@ -115,7 +115,7 @@ public class QueryFulltextTest extends A
         q = qm.createQuery("explain " + sql2, Query.JCR_SQL2);
 
         assertEquals("[nt:base] as [nt:base] /* traverse \"*\" " + 
-                "where contains([nt:base].[text], cast('hello OR hallo' as string)) */", 
+                "where contains([nt:base].[text], 'hello OR hallo') */",
                 getResult(q.execute(), "plan"));
         
         // verify the result

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java?rev=1610500&r1=1610499&r2=1610500&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryPlanTest.java Mon Jul 14 19:55:14 2014
@@ -125,8 +125,8 @@ public class QueryPlanTest extends Abstr
         // System.out.println("plan: " + plan);
         // should not use the index on "jcr:uuid"
         assertEquals("[nt:base] as [a] /* property notNull " + 
-                "where (([a].[notNull] is not null) " + 
-                "and ([a].[equals] = cast('1' as long))) " + 
+                "where (([a].[notNull] is not null) " +
+                "and ([a].[equals] = 1)) " +
                 "and (isdescendantnode([a], [/])) */", 
                 plan);
     }           

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=1610500&r1=1610499&r2=1610500&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 Mon Jul 14 19:55:14 2014
@@ -116,19 +116,19 @@ public class QueryTest extends AbstractR
         r = session.getWorkspace().getQueryManager()
                 .createQuery("explain " + query, "xpath").execute();
         rit = r.getRows();
-        assertEquals("[nt:base] as [a] /* ordered order by lastMod ancestor 1 " + 
-                "where ([a].[jcr:primaryType] = cast('oak:Unstructured' as string)) " + 
+        assertEquals("[nt:base] as [a] /* ordered order by lastMod ancestor 1 " +
+                "where ([a].[jcr:primaryType] = 'oak:Unstructured') " +
                 "and (isdescendantnode([a], [/test])) */", rit.nextRow().getValue("plan").getString());
 
-        query = "/jcr:root/test//*[@jcr:primaryType='oak:Unstructured' " + 
+        query = "/jcr:root/test//*[@jcr:primaryType='oak:Unstructured' " +
                 "and  content/@lastMod > '2001-02-01']";
         r = session.getWorkspace().getQueryManager()
                 .createQuery("explain " + query, "xpath").execute();
         rit = r.getRows();
-        assertEquals("[nt:base] as [a] /* ordered lastMod > 2001-02-01 " + 
-                "where (([a].[jcr:primaryType] = cast('oak:Unstructured' as string)) " + 
-                "and ([a].[content/lastMod] > cast('2001-02-01' as string))) " + 
-                "and (isdescendantnode([a], [/test])) */", 
+        assertEquals("[nt:base] as [a] /* ordered lastMod > 2001-02-01 " +
+                "where (([a].[jcr:primaryType] = 'oak:Unstructured') " +
+                "and ([a].[content/lastMod] > '2001-02-01')) " +
+                "and (isdescendantnode([a], [/test])) */",
                 rit.nextRow().getValue("plan").getString());
         
     }