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 2016/02/12 09:37:47 UTC
svn commit: r1729957 - 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: Fri Feb 12 08:37:47 2016
New Revision: 1729957
URL: http://svn.apache.org/viewvc?rev=1729957&view=rev
Log:
OAK-4009 - Search done via Lucene index might return duplicate results
Modified:
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java
jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java
Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java?rev=1729957&r1=1729956&r2=1729957&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlanner.java Fri Feb 12 08:37:47 2016
@@ -246,6 +246,11 @@ class IndexPlanner {
}
}
+ //Suggestion and SpellCheck use virtual paths which is same for all results
+ if (canHandleNativeFunction) {
+ result.disableUniquePaths();
+ }
+
//If native function can be handled by this index then ensure
// that lowest cost if returned
return canHandleNativeFunction ? defaultPlan().setEstimatedEntryCount(1) : null;
@@ -530,6 +535,7 @@ class IndexPlanner {
private boolean relativize;
private boolean nodeTypeRestrictions;
private boolean nodeNameRestriction;
+ private boolean uniquePathsRequired = true;
public PlanResult(String indexPath, IndexDefinition defn, IndexingRule indexingRule) {
this.indexPath = indexPath;
@@ -549,6 +555,10 @@ class IndexPlanner {
return relativize;
}
+ public boolean isUniquePathsRequired() {
+ return uniquePathsRequired;
+ }
+
/**
* Transforms the given path if the query involved relative properties and index
* is not making use of aggregated properties. If the path
@@ -604,5 +614,9 @@ class IndexPlanner {
private void enableNodeNameRestriction(){
nodeNameRestriction = true;
}
+
+ private void disableUniquePaths(){
+ uniquePathsRequired = false;
+ }
}
}
Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java?rev=1729957&r1=1729956&r2=1729957&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java Fri Feb 12 08:37:47 2016
@@ -1499,7 +1499,7 @@ public class LucenePropertyIndex impleme
}
};
- pathCursor = new PathCursor(pathIterator, false, settings);
+ pathCursor = new PathCursor(pathIterator, getPlanResult(plan).isUniquePathsRequired(), settings);
}
Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java?rev=1729957&r1=1729956&r2=1729957&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexPlannerTest.java Fri Feb 12 08:37:47 2016
@@ -70,6 +70,7 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent.INITIAL_CONTENT;
import static org.apache.jackrabbit.oak.spi.query.QueryIndex.OrderEntry;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@@ -87,6 +88,7 @@ public class IndexPlannerTest {
IndexPlanner planner = new IndexPlanner(node, "/foo", createFilter("nt:base"),
ImmutableList.of(new OrderEntry("foo", Type.LONG, OrderEntry.Order.ASCENDING)));
assertNotNull(planner.getPlan());
+ assertTrue(pr(planner.getPlan()).isUniquePathsRequired());
}
@Test
@@ -504,6 +506,7 @@ public class IndexPlannerTest {
QueryIndex.IndexPlan plan = getSuggestOrSpellcheckIndexPlan(node, queryNodeType, queryForSugggestion);
assertNotNull(plan);
+ assertFalse(pr(plan).isUniquePathsRequired());
}
@Test
@@ -519,6 +522,7 @@ public class IndexPlannerTest {
QueryIndex.IndexPlan plan = getSuggestOrSpellcheckIndexPlan(node, queryNodeType, queryForSugggestion);
assertNotNull(plan);
+ assertFalse(pr(plan).isUniquePathsRequired());
}
@Test
Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java?rev=1729957&r1=1729956&r2=1729957&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexTest.java Fri Feb 12 08:37:47 2016
@@ -74,7 +74,9 @@ import static org.apache.jackrabbit.oak.
import com.google.common.base.Function;
import com.google.common.collect.Iterators;
+import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.jackrabbit.oak.api.Blob;
@@ -354,7 +356,14 @@ public class LuceneIndexTest {
// would have already picked up 50 docs which would not be considered
//deleted by QE for the revision at which query was triggered
//So just checking for >
- Assert.assertTrue(Iterators.size(cursor) > 0);
+ List<String> resultPaths = Lists.newArrayList();
+ while(cursor.hasNext()){
+ resultPaths.add(cursor.next().getPath());
+ }
+
+ Set<String> uniquePaths = Sets.newHashSet(resultPaths);
+ assertEquals(resultPaths.size(), uniquePaths.size());
+ assertTrue(!uniquePaths.isEmpty());
}
private void purgeDeletedDocs(NodeBuilder idx, IndexDefinition definition) throws IOException {