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 2014/01/30 15:03:58 UTC

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

Author: thomasm
Date: Thu Jan 30 14:03:58 2014
New Revision: 1562831

URL: http://svn.apache.org/r1562831
Log:
OAK-1372 XPath queries with both path and property restrictions are slow (apply the selector condition to the filter)

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/CompositeQueryIndexProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java
    jackrabbit/oak/trunk/oak-core/src/test/resources/org/apache/jackrabbit/oak/query/sql2_index.txt

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java?rev=1562831&r1=1562830&r2=1562831&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java Thu Jan 30 14:03:58 2014
@@ -265,6 +265,9 @@ public class SelectorImpl extends Source
             FullTextExpression ft = queryConstraint.getFullTextConstraint(this);
             f.setFullTextConstraint(ft);
         }
+        if (selectorCondition != null) {
+            selectorCondition.restrict(f);
+        }
 
         return f;
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/CompositeQueryIndexProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/CompositeQueryIndexProvider.java?rev=1562831&r1=1562830&r2=1562831&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/CompositeQueryIndexProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/CompositeQueryIndexProvider.java Thu Jan 30 14:03:58 2014
@@ -33,6 +33,16 @@ import com.google.common.collect.Lists;
  */
 public class CompositeQueryIndexProvider implements QueryIndexProvider {
 
+    private final List<QueryIndexProvider> providers;
+
+    private CompositeQueryIndexProvider(List<QueryIndexProvider> providers) {
+        this.providers = providers;
+    }
+
+    public CompositeQueryIndexProvider(QueryIndexProvider... providers) {
+        this(Arrays.asList(providers));
+    }
+
     @Nonnull
     public static QueryIndexProvider compose(
             @Nonnull Collection<QueryIndexProvider> providers) {
@@ -51,16 +61,6 @@ public class CompositeQueryIndexProvider
         }
     }
 
-    private final List<QueryIndexProvider> providers;
-
-    private CompositeQueryIndexProvider(List<QueryIndexProvider> providers) {
-        this.providers = providers;
-    }
-
-    public CompositeQueryIndexProvider(QueryIndexProvider... providers) {
-        this(Arrays.asList(providers));
-    }
-
     @Override @Nonnull
     public List<? extends QueryIndex> getQueryIndexes(NodeState nodeState) {
         List<QueryIndex> indexes = Lists.newArrayList();

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java?rev=1562831&r1=1562830&r2=1562831&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java Thu Jan 30 14:03:58 2014
@@ -52,9 +52,9 @@ public interface Filter {
     /**
      * Get the fulltext search conditions, if any.
      *
-     * @deprecated
      * @return the conditions (an empty collection if not used)
      */
+    @Deprecated
     Collection<String> getFulltextConditions();
     
     /**
@@ -199,7 +199,7 @@ public interface Filter {
                 }
                 buff.append(p.toString());
             }
-            buff.append(' ');
+            buff.append(')');
             return buff.toString();
         }
         

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=1562831&r1=1562830&r2=1562831&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 Thu Jan 30 14:03:58 2014
@@ -23,7 +23,8 @@
 # * new tests are typically be added on top, after the syntax docs
 # * use ascii character only
 
-# property type (value prefix) index
+explain select e.[jcr:path] from [nt:base] as a inner join [nt:base] as b on ischildnode(b, a) inner join [nt:base] as c on ischildnode(c, b) inner join [nt:base] as d on ischildnode(d, c) inner join [nt:base] as e on ischildnode(e, d) where name(a) = 'a' and isdescendantnode(a, '/b') and name(b) = 'c' and name(c) = 'd' and name(d) = 'e' and (e.[type] = '1' or e.[type] = '2' or e.[type] = '3' or e.[type] = '4')
+[nt:base] as [a] /* traverse "/b//*" where (name([a]) = cast('a' as string)) and (isdescendantnode([a], [/b])) */ inner join [nt:base] as [b] /* traverse "/path/from/the/join/selector/*" where name([b]) = cast('c' as string) */ on ischildnode([b], [a]) inner join [nt:base] as [c] /* traverse "/path/from/the/join/selector/*" where name([c]) = cast('d' as string) */ on ischildnode([c], [b]) inner join [nt:base] as [d] /* traverse "/path/from/the/join/selector/*" where name([d]) = cast('e' as string) */ on ischildnode([d], [c]) inner join [nt:base] as [e] /* traverse "/path/from/the/join/selector/*" where ([e].[type] is not null) and ([e].[type] in(cast('1' as string), cast('2' as string), cast('3' as string), cast('4' as string))) */ on ischildnode([e], [d])
 
 explain select excerpt(.) from [nt:resource] where contains(*, 'jackrabbit')
 [nt:resource] as [nt:resource] /* traverse "*" where contains([nt:resource].[*], cast('jackrabbit' as string)) */