Author: catholicon
Date: Wed Jan 6 12:27:18 2016
New Revision: 1723300
URL: http://svn.apache.org/viewvc?rev=1723300&view=rev
Log:
OAK-3838: IndexPlanner incorrectly lets all full text indices to participate
for suggest/spellcheck queries
Reverting fix done at r1723142 as oak-core/*/ast isn't exported to be used
outside oak-core. Would discuss how to handle and fix later
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexSuggestionTest.java
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=1723300&r1=1723299&r2=1723300&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
Wed Jan 6 12:27:18 2016
@@ -193,10 +193,6 @@ public class SelectorImpl extends Source
return selectorName;
}
- public String getNodeTypeName() {
- return nodeTypeName;
- }
-
public boolean matchesAllTypes() {
return matchesAllTypes;
}
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java?rev=1723300&r1=1723299&r2=1723300&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinition.java
Wed Jan 6 12:27:18 2016
@@ -207,10 +207,6 @@ class IndexDefinition implements Aggrega
private final boolean secureFacets;
- private final boolean suggestEnabled;
-
- private final boolean spellcheckEnabled;
-
public IndexDefinition(NodeState root, NodeState defn) {
this(root, defn, null);
}
@@ -278,8 +274,6 @@ class IndexDefinition implements Aggrega
this.saveDirListing = getOptionalValue(defn,
LuceneIndexConstants.SAVE_DIR_LISTING, true);
this.suggestAnalyzed = getOptionalValue(defn,
LuceneIndexConstants.SUGGEST_ANALYZED, false);
this.secureFacets = defn.hasChildNode(FACETS) &&
getOptionalValue(defn.getChildNode(FACETS), PROP_SECURE_FACETS, true);
- this.suggestEnabled = evaluateSuggestionEnabled();
- this.spellcheckEnabled = evaluateSpellcheckEnabled();
}
public NodeState getDefinitionNodeState() {
@@ -601,7 +595,7 @@ class IndexDefinition implements Aggrega
return ntBaseRule != null;
}
- private boolean evaluateSuggestionEnabled() {
+ public boolean isSuggestEnabled() {
boolean suggestEnabled = false;
for (IndexingRule indexingRule : definedRules) {
for (PropertyDefinition propertyDefinition :
indexingRule.propConfigs.values()) {
@@ -620,33 +614,6 @@ class IndexDefinition implements Aggrega
return suggestEnabled;
}
- public boolean isSuggestEnabled() {
- return suggestEnabled;
- }
-
- private boolean evaluateSpellcheckEnabled() {
- boolean spellcheckEnabled = false;
- for (IndexingRule indexingRule : definedRules) {
- for (PropertyDefinition propertyDefinition :
indexingRule.propConfigs.values()) {
- if (propertyDefinition.useInSpellcheck) {
- spellcheckEnabled = true;
- break;
- }
- }
- for (NamePattern np : indexingRule.namePatterns) {
- if (np.getConfig().useInSpellcheck) {
- spellcheckEnabled = true;
- break;
- }
- }
- }
- return spellcheckEnabled;
- }
-
- public boolean isSpellcheckEnabled() {
- return spellcheckEnabled;
- }
-
@CheckForNull
public String getIndexPathFromConfig() {
return definition.getString(LuceneIndexConstants.INDEX_PATH);
@@ -763,13 +730,6 @@ class IndexDefinition implements Aggrega
return nodeTypeName;
}
- /**
- * @return name of the base node type.
- */
- public String getBaseNodeType() {
- return baseNodeType;
- }
-
public List<PropertyDefinition> getNullCheckEnabledProperties() {
return nullCheckEnabledProperties;
}
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java?rev=1723300&r1=1723299&r2=1723300&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java
Wed Jan 6 12:27:18 2016
@@ -30,7 +30,6 @@ import javax.annotation.CheckForNull;
import com.google.common.collect.Iterables;
import org.apache.jackrabbit.JcrConstants;
-import org.apache.jackrabbit.oak.api.PropertyValue;
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.commons.PathUtils;
import
org.apache.jackrabbit.oak.plugins.index.lucene.IndexDefinition.IndexingRule;
@@ -140,30 +139,9 @@ class IndexPlanner {
if (definition.hasFunctionDefined()
&& filter.getPropertyRestriction(definition.getFunctionName())
!= null) {
- boolean canHandleNativeFunction = true;
-
- PropertyValue pv =
filter.getPropertyRestriction(definition.getFunctionName()).first;
- String query = String.valueOf(pv.getValue(pv.getType()));
-
- if (query.startsWith("suggest?term=")) {
- if (definition.isSuggestEnabled()) {
- canHandleNativeFunction =
-
indexingRule.getBaseNodeType().equals(filter.getSelector().getNodeTypeName());
- } else {
- canHandleNativeFunction = false;
- }
- } else if (query.startsWith("spellcheck?term=")) {
- if (definition.isSpellcheckEnabled()) {
- canHandleNativeFunction =
-
indexingRule.getBaseNodeType().equals(filter.getSelector().getNodeTypeName());
- } else {
- canHandleNativeFunction = false;
- }
- }
-
- //If native function can be handled by this index then ensure
+ //If native function is handled by this index then ensure
// that lowest cost if returned
- return canHandleNativeFunction ?
defaultPlan().setEstimatedEntryCount(1) : null;
+ return defaultPlan().setEstimatedEntryCount(1);
}
List<String> indexedProps =
newArrayListWithCapacity(filter.getPropertyRestrictions().size());
Modified:
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java?rev=1723300&r1=1723299&r2=1723300&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java
Wed Jan 6 12:27:18 2016
@@ -54,7 +54,6 @@ import static javax.jcr.PropertyType.TYP
import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
import static org.apache.jackrabbit.oak.api.Type.NAMES;
import static org.apache.jackrabbit.oak.api.Type.STRINGS;
-import static
org.apache.jackrabbit.oak.plugins.index.IndexConstants.DECLARING_NODE_TYPES;
import static
org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
import static
org.apache.jackrabbit.oak.plugins.index.PathFilter.PROP_INCLUDED_PATHS;
import static
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.INDEX_DATA_CHILD_NAME;
@@ -460,127 +459,6 @@ public class IndexPlannerTest {
assertNull(plan);
}
- //------ Suggestion/spellcheck plan tests
- @Test
- public void nonSuggestIndex() throws Exception {
- //An index which doesn't define any property to support suggestions
shouldn't turn up in plan.
- String indexNodeType = "nt:base";
- String queryNodeType = "nt:base";
- boolean enableSuggestionIndex = false;
- boolean enableSpellcheckIndex = false;
- boolean queryForSugggestion = true;
-
- IndexNode node = createSuggestionOrSpellcheckIndex(indexNodeType,
enableSuggestionIndex, enableSpellcheckIndex);
- QueryIndex.IndexPlan plan = getSuggestOrSpellcheckIndexPlan(node,
queryNodeType, queryForSugggestion);
-
- assertNull(plan);
- }
-
- @Test
- public void nonSpellcheckIndex() throws Exception {
- //An index which doesn't define any property to support spell check
shouldn't turn up in plan.
- String indexNodeType = "nt:base";
- String queryNodeType = "nt:base";
- boolean enableSuggestionIndex = false;
- boolean enableSpellcheckIndex = false;
- boolean queryForSugggestion = false;
-
- IndexNode node = createSuggestionOrSpellcheckIndex(indexNodeType,
enableSuggestionIndex, enableSpellcheckIndex);
- QueryIndex.IndexPlan plan = getSuggestOrSpellcheckIndexPlan(node,
queryNodeType, queryForSugggestion);
-
- assertNull(plan);
- }
-
- @Test
- public void simpleSuggestIndexPlan() throws Exception {
- //An index defining a property for suggestions should turn up in plan.
- String indexNodeType = "nt:base";
- String queryNodeType = "nt:base";
- boolean enableSuggestionIndex = true;
- boolean enableSpellcheckIndex = false;
- boolean queryForSugggestion = true;
-
- IndexNode node = createSuggestionOrSpellcheckIndex(indexNodeType,
enableSuggestionIndex, enableSpellcheckIndex);
- QueryIndex.IndexPlan plan = getSuggestOrSpellcheckIndexPlan(node,
queryNodeType, queryForSugggestion);
-
- assertNotNull(plan);
- }
-
- @Test
- public void simpleSpellcheckIndexPlan() throws Exception {
- //An index defining a property for spellcheck should turn up in plan.
- String indexNodeType = "nt:base";
- String queryNodeType = "nt:base";
- boolean enableSuggestionIndex = false;
- boolean enableSpellcheckIndex = true;
- boolean queryForSugggestion = false;
-
- IndexNode node = createSuggestionOrSpellcheckIndex(indexNodeType,
enableSuggestionIndex, enableSpellcheckIndex);
- QueryIndex.IndexPlan plan = getSuggestOrSpellcheckIndexPlan(node,
queryNodeType, queryForSugggestion);
-
- assertNotNull(plan);
- }
-
- @Test
- public void suggestionIndexingRuleHierarchy() throws Exception {
- //An index defining a property for suggestion on a base type shouldn't
turn up in plan.
- String indexNodeType = "nt:base";
- String queryNodeType = "nt:unstructured";
- boolean enableSuggestionIndex = true;
- boolean enableSpellcheckIndex = false;
- boolean queryForSugggestion = true;
-
- IndexNode node = createSuggestionOrSpellcheckIndex(indexNodeType,
enableSuggestionIndex, enableSpellcheckIndex);
- QueryIndex.IndexPlan plan = getSuggestOrSpellcheckIndexPlan(node,
queryNodeType, queryForSugggestion);
-
- assertNull(plan);
- }
-
- @Test
- public void spellcheckIndexingRuleHierarchy() throws Exception {
- //An index defining a property for spellcheck on a base type shouldn't
turn up in plan.
- String indexNodeType = "nt:base";
- String queryNodeType = "nt:unstructured";
- boolean enableSuggestionIndex = false;
- boolean enableSpellcheckIndex = true;
- boolean queryForSugggestion = false;
-
- IndexNode node = createSuggestionOrSpellcheckIndex(indexNodeType,
enableSuggestionIndex, enableSpellcheckIndex);
- QueryIndex.IndexPlan plan = getSuggestOrSpellcheckIndexPlan(node,
queryNodeType, queryForSugggestion);
-
- assertNull(plan);
- }
-
- private IndexNode createSuggestionOrSpellcheckIndex(String nodeType,
- boolean
enableSuggestion,
- boolean
enableSpellcheck) throws Exception {
- NodeBuilder defn = newLucenePropertyIndexDefinition(builder, "test",
of("foo"), "async");
- defn.setProperty(DECLARING_NODE_TYPES, nodeType);
-
- defn = IndexDefinition.updateDefinition(defn.getNodeState().builder());
- NodeBuilder foob = getNode(defn, "indexRules/" + nodeType +
"/properties/foo");
- foob.setProperty(LuceneIndexConstants.PROP_ANALYZED, true);
- if (enableSuggestion) {
- foob.setProperty(LuceneIndexConstants.PROP_USE_IN_SUGGEST, true);
- } if (enableSpellcheck) {
- foob.setProperty(LuceneIndexConstants.PROP_USE_IN_SPELLCHECK,
true);
- }
-
- IndexDefinition indexDefinition = new IndexDefinition(root,
defn.getNodeState());
- return createIndexNode(indexDefinition);
- }
-
- private QueryIndex.IndexPlan getSuggestOrSpellcheckIndexPlan(IndexNode
indexNode, String nodeType,
- boolean
forSugggestion) throws Exception {
- FilterImpl filter = createFilter(nodeType);
- filter.restrictProperty(indexNode.getDefinition().getFunctionName(),
Operator.EQUAL,
-
PropertyValues.newString((forSugggestion?"suggest":"spellcheck") +
"?term=foo"));
- IndexPlanner planner = new IndexPlanner(indexNode, "/foo", filter,
Collections.<OrderEntry>emptyList());
-
- return planner.getPlan();
- }
- //------ END - Suggestion/spellcheck plan tests
-
private IndexNode createIndexNode(IndexDefinition defn, long numOfDocs)
throws IOException {
return new IndexNode("foo", defn, createSampleDirectory(numOfDocs),
null);
}
Modified:
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexSuggestionTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexSuggestionTest.java?rev=1723300&r1=1723299&r2=1723300&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexSuggestionTest.java
(original)
+++
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexSuggestionTest.java
Wed Jan 6 12:27:18 2016
@@ -201,7 +201,7 @@ public class LuceneIndexSuggestionTest {
final String indexPropName = "description";
final String indexPropValue = "this is just a sample text which should
get some response in suggestions";
final String suggestQueryText = "th";
- final boolean shouldSuggest = false;
+ final boolean shouldSuggest = true;
checkSuggestions(indexNodeType, queryNodeType,
indexPropName, indexPropValue,