mirror of https://github.com/apache/lucene.git
LUCENE-4882: FacetsAccumulator did not allow to count dimensions directly
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1460977 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
83027eca9e
commit
509e84dede
|
@ -163,6 +163,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
|
||||
|
|
|
@ -152,12 +152,15 @@ public class CountingListBuilder implements CategoryListBuilder {
|
|||
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--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
@ -190,5 +191,41 @@ public class TestFacetsCollector extends FacetTestCase {
|
|||
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue