This is an automated email from the ASF dual-hosted git repository.
reschke pushed a commit to branch 1.22
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
The following commit(s) were added to refs/heads/1.22 by this push:
new c842b6bc25 OAK-8711 | Queries with facets should not use traversal
(Patch by Amrit Verma)
c842b6bc25 is described below
commit c842b6bc256578ac70a7ee148ad36cddf8bda9dc
Author: Nitin Gupta <[email protected]>
AuthorDate: Tue Feb 11 11:06:17 2020 +0000
OAK-8711 | Queries with facets should not use traversal (Patch by Amrit
Verma)
git-svn-id: https://svn.apache.org/repos/asf/jackrabbit/oak/trunk@1873892
13f79535-47bb-0310-9956-ffa450edef68
---
.../oak/query/index/TraversingIndex.java | 7 ++++++
.../oak/query/index/TraversingIndexTest.java | 13 +++++++++++
.../apache/jackrabbit/oak/jcr/query/FacetTest.java | 27 +++++++++++++++++++++-
3 files changed, 46 insertions(+), 1 deletion(-)
diff --git
a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java
b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java
index 00a7f3f7a3..cad4f4d847 100644
---
a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java
+++
b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/TraversingIndex.java
@@ -28,6 +28,8 @@ import
org.apache.jackrabbit.oak.spi.query.Filter.PathRestriction;
import org.apache.jackrabbit.oak.spi.query.QueryIndex;
import org.apache.jackrabbit.oak.spi.state.NodeState;
+import static org.apache.jackrabbit.oak.spi.query.QueryConstants.REP_FACET;
+
/**
* An index that traverses over a given subtree.
*/
@@ -79,6 +81,11 @@ public class TraversingIndex implements QueryIndex {
// not an appropriate index for native search
return Double.POSITIVE_INFINITY;
}
+ Filter.PropertyRestriction facetRestriction =
filter.getPropertyRestriction(REP_FACET);
+ if (facetRestriction != null) {
+ // not an appropriate index for facets
+ return Double.POSITIVE_INFINITY;
+ }
if (filter.isAlwaysFalse()) {
return 0;
}
diff --git
a/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexTest.java
b/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexTest.java
index d791793a92..49a116fdd6 100644
---
a/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexTest.java
+++
b/oak-core/src/test/java/org/apache/jackrabbit/oak/query/index/TraversingIndexTest.java
@@ -19,8 +19,11 @@
package org.apache.jackrabbit.oak.query.index;
import static
org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
+import static org.apache.jackrabbit.oak.spi.query.QueryConstants.REP_FACET;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
@@ -28,8 +31,10 @@ import java.util.Collections;
import java.util.List;
import org.apache.jackrabbit.oak.spi.query.Cursor;
+import org.apache.jackrabbit.oak.spi.query.Filter;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.junit.Assert;
import org.junit.Test;
/**
@@ -79,4 +84,12 @@ public class TraversingIndexTest {
assertFalse(c.hasNext());
}
+ @Test
+ public void testFacets() {
+ TraversingIndex traversingIndex = new TraversingIndex();
+ Filter mockFilter = mock(Filter.class);
+
when(mockFilter.getPropertyRestriction(REP_FACET)).thenReturn(mock(Filter.PropertyRestriction.class));
+ Assert.assertEquals(traversingIndex.getCost(mockFilter, null),
Double.POSITIVE_INFINITY, 0.001);
+ }
+
}
diff --git
a/oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/query/FacetTest.java
b/oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/query/FacetTest.java
index 1a0acb46be..7f8cffd439 100644
---
a/oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/query/FacetTest.java
+++
b/oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/query/FacetTest.java
@@ -34,6 +34,7 @@ import java.util.stream.Collectors;
import
org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
import org.apache.jackrabbit.core.query.AbstractQueryTest;
+import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
import org.apache.jackrabbit.oak.plugins.index.search.FulltextIndexConstants;
import org.apache.jackrabbit.oak.query.facet.FacetResult;
import org.junit.After;
@@ -850,6 +851,30 @@ public class FacetTest extends AbstractQueryTest {
assertEquals("Unexpected facet labels", newHashSet("t1", "t2", "t3"),
facetLabels);
}
+ /**
+ * Tests the scenario where we have a facet query and the traversal cost
is less than the index cost that
+ * serves the facet query. TraversingIndex should not be used for facets.
+ * @throws Exception in case of errors.
+ */
+ public void testTraversalNotAllowed() throws Exception {
+ // Increase cost of lucene index
+ Node luceneGlobal = superuser.getNode("/oak:index/luceneGlobal");
+ luceneGlobal.setProperty(IndexConstants.ENTRY_COUNT_PROPERTY_NAME,
Long.MAX_VALUE);
+ // remove test mode as entry count property is ignored in test mode
+ luceneGlobal.getProperty("testMode").remove();
+ Node n1 = testRootNode.addNode("node1");
+ n1.setProperty("text", "t1");
+ n1.setProperty("name","Node1");
+ markIndexForReindex();
+ superuser.save();
+ QueryManager qm = superuser.getWorkspace().getQueryManager();
+ // use issamenode() so that traversal cost comes low
+ String xpath = "select [rep:facet(text)] from [nt:base] where
issamenode('" + n1.getPath() + "') and [text]='t1'";
+ Query q = qm.createQuery(xpath, Query.JCR_SQL2);
+ QueryResult result = q.execute();
+ assertEquals(result.getRows().getSize(), 1);
+ }
+
public void testMergedFacetsOverUnionSummingCount() throws Exception {
// the distribution of nodes with t1 and t2 are intentionally across
first and second set (below)
// put such that second condition turns facet count around
@@ -915,4 +940,4 @@ public class FacetTest extends AbstractQueryTest {
private void markIndexForReindex() throws RepositoryException {
superuser.getNode("/oak:index/luceneGlobal").setProperty(REINDEX_PROPERTY_NAME,
true);
}
-}
\ No newline at end of file
+}