Author: catholicon
Date: Wed Feb 10 13:58:11 2016
New Revision: 1729599
URL: http://svn.apache.org/viewvc?rev=1729599&view=rev
Log:
OAK-3994: Simple query on suggestion/spellcheck with unambiguous index def and
one descendant clause should work
Checking against path restriction would work using ancestor field. Term range
query over a sub-tree can create a big 'in' clause internally.
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexDescendantSpellcheckTest.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexDescendantSuggestionTest.java
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java?rev=1729599&r1=1729598&r2=1729599&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
Wed Feb 10 13:58:11 2016
@@ -456,7 +456,7 @@ public class LucenePropertyIndex impleme
for (SuggestWord suggestion : suggestWords) {
Query query = qp.createPhraseQuery(aclCheckField,
suggestion.string);
- query = addDescendantClause(query, plan);
+ query = addDescendantClauseIfRequired(query, plan);
TopDocs topDocs = searcher.search(query, 100);
if (topDocs.totalHits > 0) {
@@ -484,7 +484,7 @@ public class LucenePropertyIndex impleme
for (Lookup.LookupResult suggestion : lookupResults) {
Query query = qp.parse("\"" +
suggestion.key.toString() + "\"");
- query = addDescendantClause(query, plan);
+ query = addDescendantClauseIfRequired(query, plan);
TopDocs topDocs = searcher.search(query, 100);
if (topDocs.totalHits > 0) {
@@ -552,21 +552,24 @@ public class LucenePropertyIndex impleme
return new LucenePathCursor(itr, plan, settings, sizeEstimator);
}
- private static Query addDescendantClause(Query query, IndexPlan plan) {
+ private static Query addDescendantClauseIfRequired(Query query, IndexPlan
plan) {
Filter filter = plan.getFilter();
if (filter.getPathRestriction() ==
Filter.PathRestriction.ALL_CHILDREN) {
String path = getPathRestriction(plan);
if (!PathUtils.denotesRoot(path)) {
- BooleanQuery compositeQuery = new BooleanQuery();
- compositeQuery.add(query, BooleanClause.Occur.MUST);
+ if
(getPlanResult(plan).indexDefinition.evaluatePathRestrictions()) {
- Query pathQuery =
TermRangeQuery.newStringRange(FieldNames.PATH, path + "/",
- path + "0", false, false);
+ BooleanQuery compositeQuery = new BooleanQuery();
+ compositeQuery.add(query, BooleanClause.Occur.MUST);
- compositeQuery.add(pathQuery, BooleanClause.Occur.MUST);
+ Query pathQuery = new TermQuery(newAncestorTerm(path));
+ compositeQuery.add(pathQuery, BooleanClause.Occur.MUST);
- query = compositeQuery;
+ query = compositeQuery;
+ } else {
+ LOG.warn("Descendant clause could not be added without
path restrictions enabled. Plan: {}", plan);
+ }
}
}
Modified:
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexDescendantSpellcheckTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexDescendantSpellcheckTest.java?rev=1729599&r1=1729598&r2=1729599&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexDescendantSpellcheckTest.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexDescendantSpellcheckTest.java
Wed Feb 10 13:58:11 2016
@@ -41,6 +41,7 @@ import static org.apache.jackrabbit.oak.
import static
org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NODE_TYPE;
import static
org.apache.jackrabbit.oak.plugins.index.IndexConstants.REINDEX_PROPERTY_NAME;
import static
org.apache.jackrabbit.oak.plugins.index.IndexConstants.TYPE_PROPERTY_NAME;
+import static
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.EVALUATE_PATH_RESTRICTION;
import static
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.INDEX_RULES;
import static
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PROPDEF_PROP_NODE_NAME;
import static
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PROP_USE_IN_SPELLCHECK;
@@ -114,6 +115,7 @@ public class LuceneIndexDescendantSpellc
def.setProperty(REINDEX_PROPERTY_NAME, true);
def.setProperty("name", name);
def.setProperty(LuceneIndexConstants.COMPAT_MODE,
IndexFormatVersion.V2.getVersion());
+ def.setProperty(EVALUATE_PATH_RESTRICTION, true);
Node propertyIdxDef = def.addNode(INDEX_RULES,
JcrConstants.NT_UNSTRUCTURED)
.addNode(indexedNodeType, JcrConstants.NT_UNSTRUCTURED)
@@ -166,6 +168,20 @@ public class LuceneIndexDescendantSpellc
}
//OAK-3994
+ @Test
+ public void descendantSuggestionRequirePathRestrictionIndex() throws
Exception {
+ Node rootIndexDef = root.getNode("oak:index/spellcheck-idx");
+ rootIndexDef.getProperty(EVALUATE_PATH_RESTRICTION).remove();
+ rootIndexDef.setProperty(REINDEX_PROPERTY_NAME, true);
+ session.save();
+
+ //Without path restriction indexing, descendant clause shouldn't be
respected
+ validateSpellchecks(
+ createSpellcheckQuery(NT_OAK_UNSTRUCTURED, "taste",
"/content1"),
+ newHashSet("test1", "test2", "test3", "test4", "test5",
"test6"));
+ }
+
+ //OAK-3994
@Test
public void unambiguousSubtreeIndexWithDescendantConstraint() throws
Exception {
validateSpellchecks(
Modified:
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexDescendantSuggestionTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexDescendantSuggestionTest.java?rev=1729599&r1=1729598&r2=1729599&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexDescendantSuggestionTest.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexDescendantSuggestionTest.java
Wed Feb 10 13:58:11 2016
@@ -42,6 +42,7 @@ import static org.apache.jackrabbit.oak.
import static
org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NODE_TYPE;
import static
org.apache.jackrabbit.oak.plugins.index.IndexConstants.REINDEX_PROPERTY_NAME;
import static
org.apache.jackrabbit.oak.plugins.index.IndexConstants.TYPE_PROPERTY_NAME;
+import static
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.EVALUATE_PATH_RESTRICTION;
import static
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.INDEX_RULES;
import static
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PROPDEF_PROP_NODE_NAME;
import static
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.PROP_USE_IN_SUGGEST;
@@ -116,6 +117,7 @@ public class LuceneIndexDescendantSugges
def.setProperty(REINDEX_PROPERTY_NAME, true);
def.setProperty("name", name);
def.setProperty(LuceneIndexConstants.COMPAT_MODE,
IndexFormatVersion.V2.getVersion());
+ def.setProperty(EVALUATE_PATH_RESTRICTION, true);
Node propertyIdxDef = def.addNode(INDEX_RULES,
JcrConstants.NT_UNSTRUCTURED)
.addNode(indexedNodeType, JcrConstants.NT_UNSTRUCTURED)
@@ -167,6 +169,20 @@ public class LuceneIndexDescendantSugges
newHashSet("test2", "test3"));
}
+ //OAK-3994
+ @Test
+ public void descendantSuggestionRequirePathRestrictionIndex() throws
Exception {
+ Node rootIndexDef = root.getNode("oak:index/sugg-idx");
+ rootIndexDef.getProperty(EVALUATE_PATH_RESTRICTION).remove();
+ rootIndexDef.setProperty(REINDEX_PROPERTY_NAME, true);
+ session.save();
+
+ //Without path restriction indexing, descendant clause shouldn't be
respected
+ validateSuggestions(
+ createSuggestQuery(NT_OAK_UNSTRUCTURED, "te", "/content1"),
+ newHashSet("test1", "test2", "test3", "test4", "test5",
"test6"));
+ }
+
@Ignore("OAK-3992")
@Test
public void ambiguousSubtreeIndexWithDescendantConstraint() throws
Exception {