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);