Author: chetanm
Date: Tue Jan 17 13:28:37 2017
New Revision: 1779190

URL: http://svn.apache.org/viewvc?rev=1779190&view=rev
Log:
OAK-5448 - Aggregate logic should optimize for case where patterns do not 
include wildcard

Ensure that ChildNodeEntry is not duplicated if there are more than one 
relative property on same node

Modified:
    
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/Aggregate.java
    
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/AggregateTest.java

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/Aggregate.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/Aggregate.java?rev=1779190&r1=1779189&r2=1779190&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/Aggregate.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/Aggregate.java
 Tue Jan 17 13:28:37 2017
@@ -23,6 +23,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.regex.Pattern;
 
 import javax.annotation.CheckForNull;
@@ -31,6 +32,7 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.plugins.index.lucene.util.ConfigUtil;
@@ -136,16 +138,16 @@ class Aggregate {
 
     private static void collectAggregatesForDirectMatchers(NodeState 
nodeState, List<Matcher> matchers,
                                           ResultCollector collector) {
-        List<ChildNodeEntry> entries = Lists.newArrayList();
+        Map<String, ChildNodeEntry> children = Maps.newHashMap();
         //Collect potentially matching child nodestates based on matcher name
         for (Matcher m : matchers){
             String nodeName = m.getNodeName();
             NodeState child = nodeState.getChildNode(nodeName);
             if (child.exists()){
-                entries.add(new MemoryChildNodeEntry(nodeName, child));
+                children.put(nodeName, new MemoryChildNodeEntry(nodeName, 
child));
             }
         }
-        matchChildren(matchers, collector, entries);
+        matchChildren(matchers, collector, children.values());
     }
 
     private static void collectAggregatesForPatternMatchers(NodeState 
nodeState, List<Matcher> matchers,

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/AggregateTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/AggregateTest.java?rev=1779190&r1=1779189&r2=1779190&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/AggregateTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/AggregateTest.java
 Tue Jan 17 13:28:37 2017
@@ -26,6 +26,8 @@ import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
 
+import javax.jcr.PropertyType;
+
 import com.google.common.base.Function;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Iterables;
@@ -37,9 +39,14 @@ import org.apache.jackrabbit.oak.commons
 import org.apache.jackrabbit.oak.plugins.index.lucene.Aggregate.NodeInclude;
 import 
org.apache.jackrabbit.oak.plugins.index.lucene.Aggregate.NodeIncludeResult;
 import 
org.apache.jackrabbit.oak.plugins.index.lucene.Aggregate.PropertyIncludeResult;
+import 
org.apache.jackrabbit.oak.plugins.index.lucene.util.IndexDefinitionBuilder;
+import 
org.apache.jackrabbit.oak.plugins.index.lucene.writer.DefaultIndexWriterFactory;
+import org.apache.jackrabbit.oak.plugins.index.lucene.writer.LuceneIndexWriter;
+import org.apache.jackrabbit.oak.spi.mount.Mounts;
 import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.lucene.document.Document;
 import org.junit.Test;
 
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -396,6 +403,30 @@ public class AggregateTest {
     }
 
     @Test
+    public void propOneLevelNamedDirect() throws Exception{
+        IndexDefinitionBuilder builder = new IndexDefinitionBuilder();
+        builder.indexRule("nt:folder")
+                
.property("jcr:content/a").ordered(PropertyType.TYPENAME_LONG).propertyIndex()
+                
.property("jcr:content/b").ordered(PropertyType.TYPENAME_LONG).propertyIndex();
+
+
+        IndexDefinition defn = new IndexDefinition(root, builder.build(), 
"/foo");
+        Aggregate ag = 
defn.getApplicableIndexingRule("nt:folder").getAggregate();
+
+        NodeBuilder nb = newNode("nt:folder");
+        nb.child("jcr:content").setProperty("a", 1);
+        nb.child("jcr:content").setProperty("b", 1);
+
+        LuceneDocumentMaker maker = new LuceneDocumentMaker(defn, 
defn.getApplicableIndexingRule("nt:folder"), "/bar");
+        Document doc = maker.makeDocument(nb.getNodeState());
+
+        DefaultIndexWriterFactory writerFactory = new 
DefaultIndexWriterFactory(Mounts.defaultMountInfoProvider(), null, null);
+        LuceneIndexWriter writer = writerFactory.newInstance(defn, 
EMPTY_NODE.builder(), false);
+        writer.updateDocument("/bar", doc);
+        writer.close(100);
+    }
+
+    @Test
     public void propOneLevelRegex() throws Exception{
         NodeBuilder rules = builder.child(INDEX_RULES);
         rules.child("nt:folder");


Reply via email to