You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2020/09/30 17:23:03 UTC

[lucene-solr] branch branch_8x updated: LUCENE-9444: Improve test coverage for TaxonomyFacetLabels (#1928)

This is an automated email from the ASF dual-hosted git repository.

mikemccand pushed a commit to branch branch_8x
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git


The following commit(s) were added to refs/heads/branch_8x by this push:
     new cc34129  LUCENE-9444: Improve test coverage for TaxonomyFacetLabels (#1928)
cc34129 is described below

commit cc341292d2f2dd4bd0a6ccbd379424d8c2f23644
Author: goankur <47...@users.noreply.github.com>
AuthorDate: Wed Sep 30 10:21:18 2020 -0700

    LUCENE-9444: Improve test coverage for TaxonomyFacetLabels (#1928)
    
    Co-authored-by: Ankur Goel <go...@amazon.com>
---
 .../org/apache/lucene/facet/FacetTestCase.java     | 43 ++++++++++++++++------
 .../facet/taxonomy/TestTaxonomyFacetCounts.java    | 24 +++++++-----
 2 files changed, 46 insertions(+), 21 deletions(-)

diff --git a/lucene/facet/src/test/org/apache/lucene/facet/FacetTestCase.java b/lucene/facet/src/test/org/apache/lucene/facet/FacetTestCase.java
index 6a7b9ec..39fe212 100644
--- a/lucene/facet/src/test/org/apache/lucene/facet/FacetTestCase.java
+++ b/lucene/facet/src/test/org/apache/lucene/facet/FacetTestCase.java
@@ -70,32 +70,51 @@ public abstract class FacetTestCase extends LuceneTestCase {
    *
    * @param taxoReader {@link TaxonomyReader} used to read taxonomy during search. This instance is expected to be open for reading.
    * @param fc         {@link FacetsCollector} A collector with matching hits.
-   * @return {@code List<List<FacetLabel>} where outer list has one non-null entry per document
+   * @param dimension  facet dimension for which labels are requested. A null value fetches labels for all dimensions.
+   * @return {@code List<List<FacetLabel>} where outer list has one non-null entry per document.
    * and inner list contain all {@link FacetLabel} entries that belong to a document.
    * @throws IOException when a low-level IO issue occurs.
    */
-  public List<List<FacetLabel>> getAllTaxonomyFacetLabels(TaxonomyReader taxoReader, FacetsCollector fc) throws IOException {
+  public List<List<FacetLabel>> getAllTaxonomyFacetLabels(String dimension, TaxonomyReader taxoReader, FacetsCollector fc) throws IOException {
     List<List<FacetLabel>> actualLabels = new ArrayList<>();
     TaxonomyFacetLabels taxoLabels = new TaxonomyFacetLabels(taxoReader, FacetsConfig.DEFAULT_INDEX_FIELD_NAME);
-
     for (MatchingDocs m : fc.getMatchingDocs()) {
       FacetLabelReader facetLabelReader = taxoLabels.getFacetLabelReader(m.context);
-
       DocIdSetIterator disi = m.bits.iterator();
       while (disi.nextDoc() != DocIdSetIterator.NO_MORE_DOCS) {
-        List<FacetLabel> facetLabels = new ArrayList<>();
-        int docId = disi.docID();
-        FacetLabel facetLabel = facetLabelReader.nextFacetLabel(docId);
-        while (facetLabel != null) {
-          facetLabels.add(facetLabel);
-          facetLabel = facetLabelReader.nextFacetLabel(docId);
-        }
-        actualLabels.add(facetLabels);
+        actualLabels.add(allFacetLabels(disi.docID(), dimension, facetLabelReader));
       }
     }
     return actualLabels;
   }
 
+  /**
+   * Utility method to get all facet labels for an input docId and dimension using the supplied
+   * {@link FacetLabelReader}.
+   *
+   * @param docId docId for which facet labels are needed.
+   * @param dimension Retain facet labels for supplied dimension only. A null value fetches all facet labels.
+   * @param facetLabelReader {@FacetLabelReader} instance use to get facet labels for input docId.
+   * @return {@code List<FacetLabel>} containing matching facet labels.
+   * @throws IOException when a low-level IO issue occurs while reading facet labels.
+   */
+  List<FacetLabel> allFacetLabels(int docId, String dimension, FacetLabelReader facetLabelReader) throws IOException {
+    List<FacetLabel> facetLabels = new ArrayList<>();
+    FacetLabel facetLabel;
+    if (dimension != null) {
+      for (facetLabel = facetLabelReader.nextFacetLabel(docId, dimension); facetLabel != null; ) {
+        facetLabels.add(facetLabel);
+        facetLabel = facetLabelReader.nextFacetLabel(docId, dimension);
+      }
+    } else {
+      for (facetLabel = facetLabelReader.nextFacetLabel(docId); facetLabel != null; ) {
+        facetLabels.add(facetLabel);
+        facetLabel = facetLabelReader.nextFacetLabel(docId);
+      }
+    }
+    return facetLabels;
+  }
+
   protected String[] getRandomTokens(int count) {
     String[] tokens = new String[count];
     for(int i=0;i<tokens.length;i++) {
diff --git a/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/TestTaxonomyFacetCounts.java b/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/TestTaxonomyFacetCounts.java
index deb8208..ecd67c6 100644
--- a/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/TestTaxonomyFacetCounts.java
+++ b/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/TestTaxonomyFacetCounts.java
@@ -22,7 +22,7 @@ import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
+import java.util.HashSet; 
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -696,7 +696,6 @@ public class TestTaxonomyFacetCounts extends FacetTestCase {
               } else {
                 expectedCounts[j].put(doc.dims[j], v.intValue() + 1);
               }
-
               // Add document facet labels
               facetLabels.add(new FacetLabel("dim" + j, doc.dims[j]));
             }
@@ -719,11 +718,6 @@ public class TestTaxonomyFacetCounts extends FacetTestCase {
         }
       }
 
-      // Test facet labels for each matching test doc
-      List<List<FacetLabel>> actualLabels = getAllTaxonomyFacetLabels(tr, fc);
-      assertEquals(expectedLabels.size(), actualLabels.size());
-      assertTrue(sortedFacetLabels(expectedLabels).equals(sortedFacetLabels(actualLabels)));
-
       // Sort by highest value, tie break by value:
       sortFacetResults(expected);
 
@@ -733,6 +727,18 @@ public class TestTaxonomyFacetCounts extends FacetTestCase {
       sortTies(actual);
 
       assertEquals(expected, actual);
+
+      // Test facet labels for each matching test doc
+      List<List<FacetLabel>> actualLabels = getAllTaxonomyFacetLabels(null, tr, fc);
+      assertEquals(expectedLabels.size(), actualLabels.size());
+      assertTrue(sortedFacetLabels(expectedLabels).equals(sortedFacetLabels(actualLabels)));
+
+      // Test facet labels for each matching test doc, given a specific dimension chosen randomly
+      final String dimension = "dim" + random().nextInt(numDims);
+      expectedLabels.forEach(list -> list.removeIf(f -> f.components[0].equals(dimension) == false));
+
+      actualLabels = getAllTaxonomyFacetLabels(dimension, tr, fc);
+      assertTrue(sortedFacetLabels(expectedLabels).equals(sortedFacetLabels(actualLabels)));
     }
 
     w.close();
@@ -740,8 +746,8 @@ public class TestTaxonomyFacetCounts extends FacetTestCase {
   }
 
   private static List<List<FacetLabel>> sortedFacetLabels(List<List<FacetLabel>> allFacetLabels) {
-    // sort each inner list since there is no guaranteed order in which FacetLabels
-    // are expected to be retrieved for each document
+    // Sort each inner list since there is no guaranteed order in which
+    // FacetLabels are expected to be retrieved for each document.
     for (List<FacetLabel> facetLabels : allFacetLabels) {
       Collections.sort(facetLabels);
     }