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