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 ch...@apache.org on 2014/11/13 08:33:19 UTC
svn commit: r1639260 - in /jackrabbit/oak/trunk/oak-lucene/src:
main/java/org/apache/jackrabbit/oak/plugins/index/lucene/
test/java/org/apache/jackrabbit/oak/plugins/index/lucene/
Author: chetanm
Date: Thu Nov 13 07:33:19 2014
New Revision: 1639260
URL: http://svn.apache.org/r1639260
Log:
OAK-2261 - Enable support for NodeType based indexing rules (WIP)
Provide config option to disable IndexRule inheritance. By default the rules would be inheritable
Modified:
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/LuceneIndexConstants.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinitionTest.java
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=1639260&r1=1639259&r2=1639260&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 Thu Nov 13 07:33:19 2014
@@ -383,7 +383,10 @@ class IndexDefinition {
* @param state a node state.
* @return the indexing rule or <code>null</code> if none applies.
*/
+ @CheckForNull
public IndexingRule getApplicableIndexingRule(Tree state) {
+ //This method would be invoked for every node. So be as
+ //conservative as possible in object creation
List<IndexingRule> rules = null;
List<IndexingRule> r = indexRules.get(getPrimaryTypeName(state));
if (r != null) {
@@ -427,14 +430,20 @@ class IndexDefinition {
//Use Tree API to read ordered child nodes
ImmutableTree ruleTree = new ImmutableTree(indexRules);
+ final List<String> allNames = getAllNodeTypes(ntReg);
for (Tree ruleEntry : ruleTree.getChildren()) {
IndexingRule rule = new IndexingRule(ruleEntry.getName(), indexRules.getChildNode(ruleEntry.getName()));
// register under node type and all its sub types
log.debug("Found rule '{}' for NodeType '{}'", rule, rule.getNodeTypeName());
- NodeTypeIterator ntItr = getAllNodeTypes(ntReg);
- while (ntItr.hasNext()) {
- String ntName = ntItr.nextNodeType().getName();
+ List<String> ntNames = allNames;
+ if (!rule.inherited){
+ //Trim the list to rule's nodeType so that inheritance check
+ //is not performed for other nodeTypes
+ ntNames = Collections.singletonList(rule.getNodeTypeName());
+ }
+
+ for (String ntName : ntNames) {
if (ntReg.isNodeType(ntName, rule.getNodeTypeName())) {
List<IndexingRule> perNtConfig = nt2rules.get(ntName);
if (perNtConfig == null) {
@@ -460,11 +469,13 @@ class IndexDefinition {
private final Map<String, PropertyDefinition> propConfigs;
private final List<NamePattern> namePatterns;
final float boost;
+ final boolean inherited;
IndexingRule(String nodeTypeName, NodeState config) {
this.nodeTypeName = nodeTypeName;
this.baseNodeType = nodeTypeName;
this.boost = getOptionalValue(config, FIELD_BOOST, DEFAULT_BOOST);
+ this.inherited = getOptionalValue(config, LuceneIndexConstants.RULE_INHERITED, true);
List<NamePattern> namePatterns = newArrayList();
this.propConfigs = collectPropConfigs(config, namePatterns);
@@ -485,6 +496,7 @@ class IndexDefinition {
this.propConfigs = original.propConfigs;
this.namePatterns = original.namePatterns;
this.boost = original.boost;
+ this.inherited = original.inherited;
}
/**
@@ -655,9 +667,14 @@ class IndexDefinition {
return ImmutableSet.copyOf(result);
}
- private static NodeTypeIterator getAllNodeTypes(ReadOnlyNodeTypeManager ntReg) {
+ private static List<String> getAllNodeTypes(ReadOnlyNodeTypeManager ntReg) {
try {
- return ntReg.getAllNodeTypes();
+ List<String> typeNames = newArrayList();
+ NodeTypeIterator ntItr = ntReg.getAllNodeTypes();
+ while (ntItr.hasNext()){
+ typeNames.add(ntItr.nextNodeType().getName());
+ }
+ return typeNames;
} catch (RepositoryException e) {
throw new RuntimeException(e);
}
Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java?rev=1639260&r1=1639259&r2=1639260&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java Thu Nov 13 07:33:19 2014
@@ -114,4 +114,6 @@ public interface LuceneIndexConstants {
String PROP_NAME = "name";
String PROP_IS_REGEX = "isRegexp";
+
+ String RULE_INHERITED = "inherited";
}
Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinitionTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinitionTest.java?rev=1639260&r1=1639259&r2=1639260&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinitionTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexDefinitionTest.java Thu Nov 13 07:33:19 2014
@@ -197,6 +197,22 @@ public class IndexDefinitionTest {
}
@Test
+ public void indexRuleInheritanceDisabled() throws Exception{
+ NodeBuilder rules = builder.child(INDEX_RULES);
+ builder.setProperty(PROP_NAME, "testIndex");
+ rules.child("nt:hierarchyNode")
+ .setProperty(LuceneIndexConstants.FIELD_BOOST, 2.0)
+ .setProperty(LuceneIndexConstants.RULE_INHERITED, false);
+
+ IndexDefinition defn = new IndexDefinition(root, builder.getNodeState());
+
+ assertNull(defn.getApplicableIndexingRule(newTree(newNode("nt:base"))));
+ assertNotNull(defn.getApplicableIndexingRule(newTree(newNode("nt:hierarchyNode"))));
+ assertNull("nt:folder should not be index as rule is not inheritable",
+ defn.getApplicableIndexingRule(newTree(newNode("nt:folder"))));
+ }
+
+ @Test
public void indexRuleInheritanceOrdering() throws Exception{
NodeBuilder rules = builder.child(INDEX_RULES);
rules.setProperty(OAK_CHILD_ORDER, ImmutableList.of("nt:hierarchyNode", "nt:base"),NAMES);