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 al...@apache.org on 2014/10/30 19:59:17 UTC

svn commit: r1635586 - 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: alexparvulescu
Date: Thu Oct 30 18:59:16 2014
New Revision: 1635586

URL: http://svn.apache.org/r1635586
Log:
OAK-2240 - Support for indexing relative properties
 - added max level traversal for deleted content based on the relative properties defined

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/LuceneIndexEditor.java
    jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorTest.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=1635586&r1=1635585&r2=1635586&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 Oct 30 18:59:16 2014
@@ -94,6 +94,8 @@ class IndexDefinition {
 
     private final Set<String> relativePropNames;
 
+    private final int relativePropsMaxLevels;
+
     /**
      * Defines the maximum estimated entry count configured.
      * Defaults to {#DEFAULT_ENTRY_COUNT}
@@ -131,6 +133,7 @@ class IndexDefinition {
         this.relativeProps = collectRelativeProps(Iterables.concat(includes, orderedProps));
         this.propDefns = collectPropertyDefns(defn);
         this.relativePropNames = collectRelPropertyNames(this.relativeProps.values());
+        this.relativePropsMaxLevels = getRelPropertyMaxLevels(this.relativeProps.values());
 
         String functionName = getOptionalValue(defn, LuceneIndexConstants.FUNC_NAME, null);
         this.funcName = functionName != null ? "native*" + functionName : null;
@@ -299,12 +302,24 @@ class IndexDefinition {
 
     private Set<String> collectRelPropertyNames(Collection<RelativeProperty> props) {
         Set<String> propNames = newHashSet();
-        for (RelativeProperty prop : props){
+        for (RelativeProperty prop : props) {
             propNames.add(prop.name);
         }
         return ImmutableSet.copyOf(propNames);
     }
 
+    private int getRelPropertyMaxLevels(Collection<RelativeProperty> props) {
+        int max = -1;
+        for (RelativeProperty prop : props) {
+            max = Math.max(max, prop.ancestors.length);
+        }
+        return max;
+    }
+
+    public int getRelPropertyMaxLevels() {
+        return relativePropsMaxLevels;
+    }
+
     private Codec createCodec() {
         String codecName = getOptionalValue(definition, LuceneIndexConstants.CODEC_NAME, null);
         Codec codec = null;

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java?rev=1635586&r1=1635585&r2=1635586&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java Thu Oct 30 18:59:16 2014
@@ -98,6 +98,8 @@ public class LuceneIndexEditor implement
      */
     private final boolean isDeleted;
 
+    private final int deletedMaxLevels;
+
     LuceneIndexEditor(NodeState root, NodeBuilder definition, Analyzer analyzer,
         IndexUpdateCallback updateCallback) throws CommitFailedException {
         this.parent = null;
@@ -112,9 +114,11 @@ public class LuceneIndexEditor implement
             typePredicate = Predicates.alwaysTrue();
         }
         this.isDeleted = false;
+        this.deletedMaxLevels = -1;
     }
 
-    private LuceneIndexEditor(LuceneIndexEditor parent, String name, boolean isDeleted) {
+    private LuceneIndexEditor(LuceneIndexEditor parent, String name,
+            boolean isDeleted, int deletedMaxLevels) {
         this.parent = parent;
         this.name = name;
         this.path = null;
@@ -122,6 +126,7 @@ public class LuceneIndexEditor implement
         this.root = parent.root;
         this.typePredicate = parent.typePredicate;
         this.isDeleted = isDeleted;
+        this.deletedMaxLevels = deletedMaxLevels;
     }
 
     public String getPath() {
@@ -189,13 +194,13 @@ public class LuceneIndexEditor implement
 
     @Override
     public Editor childNodeAdded(String name, NodeState after) {
-        return new LuceneIndexEditor(this, name, false);
+        return new LuceneIndexEditor(this, name, false, -1);
     }
 
     @Override
     public Editor childNodeChanged(
             String name, NodeState before, NodeState after) {
-        return new LuceneIndexEditor(this, name, false);
+        return new LuceneIndexEditor(this, name, false, -1);
     }
 
     @Override
@@ -219,8 +224,17 @@ public class LuceneIndexEditor implement
         }
 
         if (context.getDefinition().hasRelativeProperties()) {
-            // need to possibly update aggregated properties
-            return new LuceneIndexEditor(this, name, true);
+            int maxLevelsDown;
+            if (isDeleted) {
+                maxLevelsDown = deletedMaxLevels - 1;
+            } else {
+                maxLevelsDown = context.getDefinition()
+                        .getRelPropertyMaxLevels();
+            }
+            if (maxLevelsDown > 0) {
+                // need to update aggregated properties on deletes
+                return new LuceneIndexEditor(this, name, true, maxLevelsDown);
+            }
         }
         return null; // no need to recurse down the removed subtree
     }

Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorTest.java?rev=1635586&r1=1635585&r2=1635586&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditorTest.java Thu Oct 30 18:59:16 2014
@@ -193,12 +193,15 @@ public class LuceneIndexEditorTest {
         releaseIndexNode();
         before = indexed;
         builder = before.builder();
-        builder.child("test").child("jcr:content").child("metadata").remove();
+        builder.child("test").child("jcr:content").remove();
         after = builder.getNodeState();
         indexed = HOOK.processCommit(before, after, CommitInfo.EMPTY);
         tracker.update(indexed);
-        assertNull("relative removes must be persisted too",
-                getPath(new TermQuery(new Term("jcr:content/metadata/type", "image"))));
+        assertNull("removes must be persisted too, 1st level",
+                getPath(new TermQuery(new Term("jcr:content/mime", "pdf"))));
+        assertNull("removes must be persisted too, 2nd level",
+                getPath(new TermQuery(new Term("jcr:content/metadata/type",
+                        "image"))));
     }
 
     //@Test