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
+}

Reply via email to