Index: lucene/facet/src/test/org/apache/lucene/facet/search/TestDemoFacets.java =================================================================== --- lucene/facet/src/test/org/apache/lucene/facet/search/TestDemoFacets.java (revision 1515994) +++ lucene/facet/src/test/org/apache/lucene/facet/search/TestDemoFacets.java (working copy) @@ -29,6 +29,7 @@ import org.apache.lucene.analysis.MockAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; +import org.apache.lucene.document.TextField; import org.apache.lucene.facet.FacetTestCase; import org.apache.lucene.facet.FacetTestUtils; import org.apache.lucene.facet.codecs.facet45.Facet45Codec; @@ -42,10 +43,16 @@ import org.apache.lucene.facet.taxonomy.directory.DirectoryTaxonomyReader; import org.apache.lucene.facet.taxonomy.directory.DirectoryTaxonomyWriter; import org.apache.lucene.facet.util.PrintTaxonomyStats; +import org.apache.lucene.index.DirectoryReader; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.RandomIndexWriter; +import org.apache.lucene.index.Term; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.MatchAllDocsQuery; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.similarities.DefaultSimilarity; import org.apache.lucene.search.similarities.PerFieldSimilarityWrapper; import org.apache.lucene.search.similarities.Similarity; @@ -309,4 +316,67 @@ IOUtils.close(searcher.getIndexReader(), taxoReader, dir, taxoDir); } + + // LUCENE-5184 + public void testSumTotalCounts() throws Exception { + + Directory index = newDirectory(); + Directory taxoIndex = newDirectory(); + + IndexWriterConfig config = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random())); + + FacetIndexingParams fip = new FacetIndexingParams(new CategoryListParams() { + @Override + public OrdinalPolicy getOrdinalPolicy(String dim) { + // NO_PARENTS also works: + return OrdinalPolicy.ALL_PARENTS; + } + }); + + IndexWriter w = new IndexWriter(index, config); + TaxonomyWriter taxoWriter = new DirectoryTaxonomyWriter(taxoIndex); + FacetFields facetFields = new FacetFields(taxoWriter, fip); + + // add a root document + Document doc = new Document(); + doc.add(new TextField("title", "All Books", Field.Store.YES)); + ArrayList categoryPaths = new ArrayList(); + categoryPaths.add(new CategoryPath("book")); + facetFields.addFields(doc, categoryPaths ); + w.addDocument(doc); + + // add a leaf document + doc = new Document(); + doc.add(new TextField("title", "Lucene in Action", Field.Store.YES)); + categoryPaths = new ArrayList(); + categoryPaths.add(new CategoryPath("book|comp", '|')); + facetFields.addFields(doc, categoryPaths ); + w.addDocument(doc); + + w.close(); + taxoWriter.close(); + + // 2. query + IndexReader reader = DirectoryReader.open(index); + IndexSearcher searcher = new IndexSearcher(reader); + TaxonomyReader taxoReader = new DirectoryTaxonomyReader(taxoIndex); + + Query query = new TermQuery(new Term("title", "lucene")); + + FacetSearchParams facetSearchParams = new FacetSearchParams(fip, new CountFacetRequest(new CategoryPath("book", '|'), 10)); + FacetsCollector facetsCollector = FacetsCollector.create(facetSearchParams, reader, taxoReader); + searcher.search(query, facetsCollector); + + FacetResultNode facetNode = facetsCollector.getFacetResults().get(0).getFacetResultNode(); + + int subTotal = 0; + for (FacetResultNode subNode: facetNode.subResults) { + subTotal += subNode.value; + } + assertEquals(subTotal, (int) facetNode.value); + taxoReader.close(); + reader.close(); + index.close(); + taxoIndex.close(); + } }