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 2013/09/09 17:09:47 UTC

svn commit: r1521152 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/aggregate/AggregateIndex.java oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAggregationTest.java

Author: alexparvulescu
Date: Mon Sep  9 15:09:46 2013
New Revision: 1521152

URL: http://svn.apache.org/r1521152
Log:
OAK-828 Full-text support for index aggregates
 - added fix to prevent duplication of aggregation results


Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/aggregate/AggregateIndex.java
    jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAggregationTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/aggregate/AggregateIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/aggregate/AggregateIndex.java?rev=1521152&r1=1521151&r2=1521152&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/aggregate/AggregateIndex.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/aggregate/AggregateIndex.java Mon Sep  9 15:09:46 2013
@@ -16,8 +16,10 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.aggregate;
 
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
+import java.util.Set;
 
 import org.apache.jackrabbit.oak.query.index.FilterImpl;
 import org.apache.jackrabbit.oak.query.index.IndexRowImpl;
@@ -28,6 +30,8 @@ import org.apache.jackrabbit.oak.spi.que
 import org.apache.jackrabbit.oak.spi.query.QueryIndex.FulltextQueryIndex;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterators;
 
@@ -101,10 +105,22 @@ public class AggregateIndex implements F
 
         private boolean init;
         private boolean closed;
-        private Iterator<String> aggregates;
 
+        /**
+         * current item of the cursor
+         */
         private String item;
 
+        /**
+         * all of the item's known aggregates
+         */
+        private Iterator<String> aggregates;
+
+        /**
+         * should enforce uniqueness of the aggregated paths
+         */
+        private Set<String> seenPaths = new HashSet<String>();
+
         public AggregationCursor(Cursor cursor, NodeAggregator aggregator,
                 NodeState rootState) {
             this.cursor = cursor;
@@ -131,8 +147,10 @@ public class AggregateIndex implements F
             if (cursor.hasNext()) {
                 IndexRow row = cursor.next();
                 String path = row.getPath();
-                aggregates = Iterators.concat(ImmutableSet.of(path).iterator(),
-                        aggregator.getParents(rootState, path));
+                aggregates = Iterators.filter(Iterators.concat(
+                        ImmutableSet.of(path).iterator(),
+                        aggregator.getParents(rootState, path)), Predicates
+                        .not(Predicates.in(seenPaths)));
                 fetchNext();
                 return;
             }
@@ -144,6 +162,7 @@ public class AggregateIndex implements F
             if (!hasNext()) {
                 throw new NoSuchElementException();
             }
+            seenPaths.add(item);
             init = false;
             return new IndexRowImpl(item);
         }

Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAggregationTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAggregationTest.java?rev=1521152&r1=1521151&r2=1521152&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAggregationTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAggregationTest.java Mon Sep  9 15:09:46 2013
@@ -278,4 +278,24 @@ public class LuceneIndexAggregationTest 
 
     }
 
+    @Test
+    public void testPreventDoubleAggregation() throws Exception {
+        Tree file = root.getTree("/").addChild("myFile");
+        file.setProperty(JCR_PRIMARYTYPE, NT_FILE, Type.NAME);
+        file.setProperty("jcr:title", "fox");
+
+        Tree resource = file.addChild(JCR_CONTENT);
+        resource.setProperty(JCR_PRIMARYTYPE, "nt:resource", Type.NAME);
+        resource.setProperty("jcr:lastModified", Calendar.getInstance());
+        resource.setProperty("jcr:encoding", "UTF-8");
+        resource.setProperty("jcr:mimeType", "text/plain");
+        resource.setProperty(binaryProperty(JCR_DATA,
+                "the quick brown fox jumps over the lazy dog."));
+        root.commit();
+
+        String matchChildSimple = "//element(*, nt:file)[( jcr:contains(., 'fox') )]";
+        assertQuery(matchChildSimple, "xpath",
+                ImmutableList.of("/myFile"));
+    }
+
 }