You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sh...@apache.org on 2013/03/26 19:11:54 UTC
svn commit: r1461250 - in /lucene/dev/branches/branch_4x: ./ lucene/
lucene/facet/ lucene/facet/src/java/org/apache/lucene/facet/index/
lucene/facet/src/java/org/apache/lucene/facet/search/
lucene/facet/src/test/org/apache/lucene/facet/search/
Author: shaie
Date: Tue Mar 26 18:11:54 2013
New Revision: 1461250
URL: http://svn.apache.org/r1461250
Log:
LUCENE-4882: backport from trunk + fix TestFacetsCollector to be less sensitive to rounding issues
Modified:
lucene/dev/branches/branch_4x/ (props changed)
lucene/dev/branches/branch_4x/lucene/ (props changed)
lucene/dev/branches/branch_4x/lucene/CHANGES.txt (contents, props changed)
lucene/dev/branches/branch_4x/lucene/facet/ (props changed)
lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/index/CountingListBuilder.java
lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/FacetsAccumulator.java
lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/search/TestFacetsCollector.java
Modified: lucene/dev/branches/branch_4x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/CHANGES.txt?rev=1461250&r1=1461249&r2=1461250&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/lucene/CHANGES.txt Tue Mar 26 18:11:54 2013
@@ -136,6 +136,9 @@ Bug Fixes
* LUCENE-4868: SumScoreFacetsAggregator used an incorrect index into
the scores array. (Shai Erera)
+* LUCENE-4882: FacetsAccumulator did not allow to count ROOT category (i.e.
+ count dimensions). (Shai Erera)
+
Documentation
* LUCENE-4841: Added example SimpleSortedSetFacetsExample to show how
Modified: lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/index/CountingListBuilder.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/index/CountingListBuilder.java?rev=1461250&r1=1461249&r2=1461250&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/index/CountingListBuilder.java (original)
+++ lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/index/CountingListBuilder.java Tue Mar 26 18:11:54 2013
@@ -152,12 +152,15 @@ public class CountingListBuilder impleme
if (op != OrdinalPolicy.NO_PARENTS) {
// need to add parents too
int parent = taxoWriter.getParent(ordinal);
- while (parent > 0) {
- ordinals.ints[ordinals.length++] = parent;
- parent = taxoWriter.getParent(parent);
- }
- if (op == OrdinalPolicy.ALL_BUT_DIMENSION) { // discard the last added parent, which is the dimension
- ordinals.length--;
+ if (parent > 0) {
+ // only do this if the category is not a dimension itself, otherwise, it was just discarded by the 'if' below
+ while (parent > 0) {
+ ordinals.ints[ordinals.length++] = parent;
+ parent = taxoWriter.getParent(parent);
+ }
+ if (op == OrdinalPolicy.ALL_BUT_DIMENSION) { // discard the last added parent, which is the dimension
+ ordinals.length--;
+ }
}
}
}
Modified: lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/FacetsAccumulator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/FacetsAccumulator.java?rev=1461250&r1=1461249&r2=1461250&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/FacetsAccumulator.java (original)
+++ lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/FacetsAccumulator.java Tue Mar 26 18:11:54 2013
@@ -182,10 +182,12 @@ public class FacetsAccumulator {
continue;
}
CategoryListParams clp = searchParams.indexingParams.getCategoryListParams(fr.categoryPath);
- OrdinalPolicy ordinalPolicy = clp .getOrdinalPolicy(fr.categoryPath.components[0]);
- if (ordinalPolicy == OrdinalPolicy.NO_PARENTS) {
- // rollup values
- aggregator.rollupValues(fr, rootOrd, children, siblings, facetArrays);
+ if (fr.categoryPath.length > 0) { // someone might ask to aggregate the ROOT category
+ OrdinalPolicy ordinalPolicy = clp.getOrdinalPolicy(fr.categoryPath.components[0]);
+ if (ordinalPolicy == OrdinalPolicy.NO_PARENTS) {
+ // rollup values
+ aggregator.rollupValues(fr, rootOrd, children, siblings, facetArrays);
+ }
}
FacetResultsHandler frh = createFacetResultsHandler(fr);
Modified: lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/search/TestFacetsCollector.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/search/TestFacetsCollector.java?rev=1461250&r1=1461249&r2=1461250&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/search/TestFacetsCollector.java (original)
+++ lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/search/TestFacetsCollector.java Tue Mar 26 18:11:54 2013
@@ -1,6 +1,7 @@
package org.apache.lucene.facet.search;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -22,11 +23,10 @@ import org.apache.lucene.facet.taxonomy.
import org.apache.lucene.facet.taxonomy.directory.DirectoryTaxonomyWriter;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.index.Term;
+import org.apache.lucene.search.ConstantScoreQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.MultiCollector;
-import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.store.Directory;
@@ -85,13 +85,16 @@ public class TestFacetsCollector extends
};
FacetsCollector fc = FacetsCollector.create(fa);
TopScoreDocCollector topDocs = TopScoreDocCollector.create(10, false);
- new IndexSearcher(r).search(new TermQuery(new Term("f", "v")), MultiCollector.wrap(fc, topDocs));
+ ConstantScoreQuery csq = new ConstantScoreQuery(new MatchAllDocsQuery());
+ csq.setBoost(2.0f);
+
+ new IndexSearcher(r).search(csq, MultiCollector.wrap(fc, topDocs));
List<FacetResult> res = fc.getFacetResults();
float value = (float) res.get(0).getFacetResultNode().value;
TopDocs td = topDocs.topDocs();
- float expected = td.getMaxScore() * td.totalHits;
- assertEquals(expected, value, 1E-4);
+ int expected = (int) (td.getMaxScore() * td.totalHits);
+ assertEquals(expected, (int) value);
IOUtils.close(taxo, taxoDir, r, indexDir);
}
@@ -190,5 +193,41 @@ public class TestFacetsCollector extends
IOUtils.close(taxo, taxoDir, r, indexDir);
}
+
+ @Test
+ public void testCountRoot() throws Exception {
+ // LUCENE-4882: FacetsAccumulator threw NPE if a FacetRequest was defined on CP.EMPTY
+ Directory indexDir = newDirectory();
+ Directory taxoDir = newDirectory();
+
+ TaxonomyWriter taxonomyWriter = new DirectoryTaxonomyWriter(taxoDir);
+ IndexWriter iw = new IndexWriter(indexDir, newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random())));
+
+ FacetFields facetFields = new FacetFields(taxonomyWriter);
+ for(int i = atLeast(30); i > 0; --i) {
+ Document doc = new Document();
+ facetFields.addFields(doc, Arrays.asList(new CategoryPath("a"), new CategoryPath("b")));
+ iw.addDocument(doc);
+ }
+
+ taxonomyWriter.close();
+ iw.close();
+
+ DirectoryReader r = DirectoryReader.open(indexDir);
+ DirectoryTaxonomyReader taxo = new DirectoryTaxonomyReader(taxoDir);
+
+ FacetSearchParams fsp = new FacetSearchParams(new CountFacetRequest(CategoryPath.EMPTY, 10));
+
+ final FacetsAccumulator fa = random().nextBoolean() ? new FacetsAccumulator(fsp, r, taxo) : new StandardFacetsAccumulator(fsp, r, taxo);
+ FacetsCollector fc = FacetsCollector.create(fa);
+ new IndexSearcher(r).search(new MatchAllDocsQuery(), fc);
+
+ FacetResult res = fc.getFacetResults().get(0);
+ for (FacetResultNode node : res.getFacetResultNode().subResults) {
+ assertEquals(r.numDocs(), (int) node.value);
+ }
+
+ IOUtils.close(taxo, taxoDir, r, indexDir);
+ }
}