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 ca...@apache.org on 2016/04/27 23:09:24 UTC
svn commit: r1741343 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java
test/java/org/apache/jackrabbit/oak/query/NativeQueryTest.java
Author: catholicon
Date: Wed Apr 27 21:09:23 2016
New Revision: 1741343
URL: http://svn.apache.org/viewvc?rev=1741343&view=rev
Log:
OAK-4313: QueryImpl should avoid traversal with queries containing native constraints
Added:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/NativeQueryTest.java (with props)
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java?rev=1741343&r1=1741342&r2=1741343&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Cursors.java Wed Apr 27 21:09:23 2016
@@ -241,6 +241,12 @@ public class Cursors {
NodeState parent = null;
NodeState node = rootState;
+ if (filter.containsNativeConstraint()) {
+ // OAK-4313: if no other index was found,
+ // then, for native queries, we won't match anything
+ return;
+ }
+
if (filter.isAlwaysFalse()) {
// nothing can match this filter, leave nodes empty
return;
Added: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/NativeQueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/NativeQueryTest.java?rev=1741343&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/NativeQueryTest.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/NativeQueryTest.java Wed Apr 27 21:09:23 2016
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.query;
+
+import org.apache.jackrabbit.oak.api.Result;
+import org.apache.jackrabbit.oak.api.ResultRow;
+import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.core.ImmutableRoot;
+import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.junit.Test;
+
+import java.text.ParseException;
+import java.util.Iterator;
+
+import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
+import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_NODE_TYPES;
+import static org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent.INITIAL_CONTENT;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+public class NativeQueryTest {
+
+ private final NodeState types = INITIAL_CONTENT.getChildNode(JCR_SYSTEM)
+ .getChildNode(JCR_NODE_TYPES);
+
+ private final ImmutableRoot ROOT = new ImmutableRoot(INITIAL_CONTENT);
+ private final QueryEngineImpl QUERY_ENGINE = (QueryEngineImpl)ROOT.getQueryEngine();
+
+ private final SQL2Parser p = new SQL2Parser(NamePathMapper.DEFAULT, types, new QueryEngineSettings());
+
+ @Test
+ public void dontTraverseForSuggest() throws Exception {
+ String sql = "select [rep:suggest()] from [nt:base] where suggest('test')";
+ assertDontTraverseFor(sql);
+ }
+
+ @Test
+ public void dontTraverseForSpellcheck() throws Exception {
+ String sql = "select [rep:spellcheck()] from [nt:base] where spellcheck('test')";
+ assertDontTraverseFor(sql);
+ }
+
+ @Test
+ public void dontTraverseForNative() throws Exception {
+ String sql = "select [jcr:path] from [nt:base] where native('solr', 'name:(Hello OR World)')";
+ assertDontTraverseFor(sql);
+ }
+
+ @Test
+ public void dontTraverseForSimilar() throws Exception {
+ String sql = "select [rep:similar()] from [nt:base] where similar(., '/test/a')";
+ assertDontTraverseFor(sql);
+ }
+
+ private void assertDontTraverseFor(String sql) throws ParseException {
+ QueryImpl query = (QueryImpl)p.parse(sql);
+ query.setExecutionContext(QUERY_ENGINE.getExecutionContext());
+ Result result = query.executeQuery();
+ Iterator<? extends ResultRow> it = result.getRows().iterator();
+ assertFalse("Zero results expected", it.hasNext());
+
+ query = (QueryImpl)p.parse("measure " + sql);
+ query.setExecutionContext(QUERY_ENGINE.getExecutionContext());
+ result = query.executeQuery();
+ it = result.getRows().iterator();
+ while(it.hasNext()) {
+ ResultRow row = it.next();
+ String selector = row.getValue("selector").getValue(Type.STRING);
+ if ("nt:base".equals(selector)) {
+ long scanCount = row.getValue("scanCount").getValue(Type.LONG);
+ // we expect that no was scanned that's it
+ // - no traversal of the whole respository
+ assertEquals("Repository's scan count doesn't match", 0, scanCount);
+ }
+ }
+ }
+}
\ No newline at end of file
Propchange: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/NativeQueryTest.java
------------------------------------------------------------------------------
svn:eol-style = native