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 2013/01/21 00:49:06 UTC

svn commit: r1436008 - in /lucene/dev/branches/lucene4547/lucene: codecs/src/java/org/apache/lucene/codecs/diskdv/ core/src/java/org/apache/lucene/index/ grouping/src/test/org/apache/lucene/search/grouping/

Author: mikemccand
Date: Sun Jan 20 23:49:06 2013
New Revision: 1436008

URL: http://svn.apache.org/viewvc?rev=1436008&view=rev
Log:
fix GroupFacetCollectorTest

Modified:
    lucene/dev/branches/lucene4547/lucene/codecs/src/java/org/apache/lucene/codecs/diskdv/DiskDocValuesProducer.java
    lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/DocValuesProcessor.java
    lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/SegmentCoreReaders.java
    lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/SortedDocValues.java
    lucene/dev/branches/lucene4547/lucene/grouping/src/test/org/apache/lucene/search/grouping/AbstractGroupingTestCase.java
    lucene/dev/branches/lucene4547/lucene/grouping/src/test/org/apache/lucene/search/grouping/GroupFacetCollectorTest.java

Modified: lucene/dev/branches/lucene4547/lucene/codecs/src/java/org/apache/lucene/codecs/diskdv/DiskDocValuesProducer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/lucene/codecs/src/java/org/apache/lucene/codecs/diskdv/DiskDocValuesProducer.java?rev=1436008&r1=1436007&r2=1436008&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/lucene/codecs/src/java/org/apache/lucene/codecs/diskdv/DiskDocValuesProducer.java (original)
+++ lucene/dev/branches/lucene4547/lucene/codecs/src/java/org/apache/lucene/codecs/diskdv/DiskDocValuesProducer.java Sun Jan 20 23:49:06 2013
@@ -161,7 +161,7 @@ class DiskDocValuesProducer extends DocV
         long address = bytes.offset + docID * (long)bytes.maxLength;
         try {
           data.seek(address);
-          if (result.length < bytes.maxLength) {
+          if (result.bytes.length < bytes.maxLength) {
             result.offset = 0;
             result.bytes = new byte[bytes.maxLength];
           }
@@ -185,7 +185,7 @@ class DiskDocValuesProducer extends DocV
         int length = (int) (endAddress - startAddress);
         try {
           data.seek(startAddress);
-          if (result.length < length) {
+          if (result.bytes.length < length) {
             result.offset = 0;
             result.bytes = new byte[length];
           }

Modified: lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/DocValuesProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/DocValuesProcessor.java?rev=1436008&r1=1436007&r2=1436008&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/DocValuesProcessor.java (original)
+++ lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/DocValuesProcessor.java Sun Jan 20 23:49:06 2013
@@ -44,6 +44,8 @@ final class DocValuesProcessor extends S
 
   @Override
   void finishDocument() {
+    // nocommit catch missing DV fields here?  else we have
+    // null/"" depending on how docs landed in segments?
   }
 
   @Override

Modified: lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/SegmentCoreReaders.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/SegmentCoreReaders.java?rev=1436008&r1=1436007&r2=1436008&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/SegmentCoreReaders.java (original)
+++ lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/SegmentCoreReaders.java Sun Jan 20 23:49:06 2013
@@ -97,8 +97,6 @@ final class SegmentCoreReaders {
     }
   };
 
-  // nocommit norms too
-  
   private final Set<CoreClosedListener> coreClosedListeners = 
       Collections.synchronizedSet(new LinkedHashSet<CoreClosedListener>());
   
@@ -132,6 +130,7 @@ final class SegmentCoreReaders {
       // TODO: since we don't write any norms file if there are no norms,
       // kinda jaky to assume the codec handles the case of no norms file at all gracefully?!
       // nocommit shouldn't need null check:
+      assert codec.docValuesFormat() != null;
       if (codec.docValuesFormat() != null) {
         if (fieldInfos.hasDocValues()) {
           simpleDVProducer = codec.docValuesFormat().fieldsProducer(segmentReadState);
@@ -255,6 +254,8 @@ final class SegmentCoreReaders {
       return null;
     }
 
+    assert simpleDVProducer != null;
+
     // nocommit change to assert != null!!
     if (simpleDVProducer == null) {
       return null;

Modified: lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/SortedDocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/SortedDocValues.java?rev=1436008&r1=1436007&r2=1436008&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/SortedDocValues.java (original)
+++ lucene/dev/branches/lucene4547/lucene/core/src/java/org/apache/lucene/index/SortedDocValues.java Sun Jan 20 23:49:06 2013
@@ -176,10 +176,16 @@ public abstract class SortedDocValues ex
       } else if (cmp > 0) {
         high = mid - 1;
       } else {
+        // nocommit is this the right way... else caller can
+        // pass this spare down to DiskDV, which will then
+        // "use" our byte[] ...
+        spare.bytes = BytesRef.EMPTY_BYTES;
         return mid; // key found
       }
     }
 
+    // nocommit is this the right way...
+    spare.bytes = BytesRef.EMPTY_BYTES;
     return -(low + 1);  // key not found.
   }
 }

Modified: lucene/dev/branches/lucene4547/lucene/grouping/src/test/org/apache/lucene/search/grouping/AbstractGroupingTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/lucene/grouping/src/test/org/apache/lucene/search/grouping/AbstractGroupingTestCase.java?rev=1436008&r1=1436007&r2=1436008&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/lucene/grouping/src/test/org/apache/lucene/search/grouping/AbstractGroupingTestCase.java (original)
+++ lucene/dev/branches/lucene4547/lucene/grouping/src/test/org/apache/lucene/search/grouping/AbstractGroupingTestCase.java Sun Jan 20 23:49:06 2013
@@ -33,6 +33,7 @@ public abstract class AbstractGroupingTe
       // For that reason we don't generate empty string
       // groups.
       randomValue = _TestUtil.randomRealisticUnicodeString(random());
+      //randomValue = _TestUtil.randomSimpleString(random());
     } while ("".equals(randomValue));
     return randomValue;
   }

Modified: lucene/dev/branches/lucene4547/lucene/grouping/src/test/org/apache/lucene/search/grouping/GroupFacetCollectorTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene4547/lucene/grouping/src/test/org/apache/lucene/search/grouping/GroupFacetCollectorTest.java?rev=1436008&r1=1436007&r2=1436008&view=diff
==============================================================================
--- lucene/dev/branches/lucene4547/lucene/grouping/src/test/org/apache/lucene/search/grouping/GroupFacetCollectorTest.java (original)
+++ lucene/dev/branches/lucene4547/lucene/grouping/src/test/org/apache/lucene/search/grouping/GroupFacetCollectorTest.java Sun Jan 20 23:49:06 2013
@@ -88,7 +88,7 @@ public class GroupFacetCollectorTest ext
     w.addDocument(doc);
 
     IndexSearcher indexSearcher = new IndexSearcher(w.getReader());
-    AbstractGroupFacetCollector groupedAirportFacetCollector = createRandomCollector(groupField, "airport", null, false, useDv);
+    AbstractGroupFacetCollector groupedAirportFacetCollector = createRandomCollector(useDv ? "hotel_dv" : "hotel", useDv ? "airport_dv" : "airport", null, false);
     indexSearcher.search(new MatchAllDocsQuery(), groupedAirportFacetCollector);
     TermGroupFacetCollector.GroupedFacetResult airportResult = groupedAirportFacetCollector.mergeSegmentResults(10, 0, false);
     assertEquals(3, airportResult.getTotalCount());
@@ -102,7 +102,7 @@ public class GroupFacetCollectorTest ext
     assertEquals(1, entries.get(1).getCount());
 
 
-    AbstractGroupFacetCollector groupedDurationFacetCollector = createRandomCollector(groupField, "duration", null, false, useDv);
+    AbstractGroupFacetCollector groupedDurationFacetCollector = createRandomCollector(useDv ? "hotel_dv" : "hotel", useDv ? "duration_dv" : "duration", null, false);
     indexSearcher.search(new MatchAllDocsQuery(), groupedDurationFacetCollector);
     TermGroupFacetCollector.GroupedFacetResult durationResult = groupedDurationFacetCollector.mergeSegmentResults(10, 0, false);
     assertEquals(4, durationResult.getTotalCount());
@@ -118,6 +118,10 @@ public class GroupFacetCollectorTest ext
     // 5
     doc = new Document();
     addField(doc, groupField, "b", useDv);
+    // missing airport
+    if (useDv) {
+      addField(doc, "airport", "", useDv);
+    }
     addField(doc, "duration", "5", useDv);
     w.addDocument(doc);
 
@@ -144,20 +148,28 @@ public class GroupFacetCollectorTest ext
 
     indexSearcher.getIndexReader().close();
     indexSearcher = new IndexSearcher(w.getReader());
-    groupedAirportFacetCollector = createRandomCollector(groupField, "airport", null, true, useDv);
+    groupedAirportFacetCollector = createRandomCollector(useDv ? "hotel_dv" : "hotel", useDv ? "airport_dv" : "airport", null, !useDv);
     indexSearcher.search(new MatchAllDocsQuery(), groupedAirportFacetCollector);
     airportResult = groupedAirportFacetCollector.mergeSegmentResults(3, 0, true);
-    assertEquals(5, airportResult.getTotalCount());
-    assertEquals(1, airportResult.getTotalMissingCount());
-
     entries = airportResult.getFacetEntries(1, 2);
     assertEquals(2, entries.size());
-    assertEquals("bru", entries.get(0).getValue().utf8ToString());
-    assertEquals(2, entries.get(0).getCount());
-    assertEquals("dus", entries.get(1).getValue().utf8ToString());
-    assertEquals(1, entries.get(1).getCount());
+    if (useDv) {
+      assertEquals(6, airportResult.getTotalCount());
+      assertEquals(0, airportResult.getTotalMissingCount());
+      assertEquals("bru", entries.get(0).getValue().utf8ToString());
+      assertEquals(2, entries.get(0).getCount());
+      assertEquals("", entries.get(1).getValue().utf8ToString());
+      assertEquals(1, entries.get(1).getCount());
+    } else {
+      assertEquals(5, airportResult.getTotalCount());
+      assertEquals(1, airportResult.getTotalMissingCount());
+      assertEquals("bru", entries.get(0).getValue().utf8ToString());
+      assertEquals(2, entries.get(0).getCount());
+      assertEquals("dus", entries.get(1).getValue().utf8ToString());
+      assertEquals(1, entries.get(1).getCount());
+    }
 
-    groupedDurationFacetCollector = createRandomCollector(groupField, "duration", null, false, useDv);
+    groupedDurationFacetCollector = createRandomCollector(useDv ? "hotel_dv" : "hotel", useDv ? "duration_dv" : "duration", null, false);
     indexSearcher.search(new MatchAllDocsQuery(), groupedDurationFacetCollector);
     durationResult = groupedDurationFacetCollector.mergeSegmentResults(10, 2, true);
     assertEquals(5, durationResult.getTotalCount());
@@ -184,22 +196,35 @@ public class GroupFacetCollectorTest ext
 
     indexSearcher.getIndexReader().close();
     indexSearcher = new IndexSearcher(w.getReader());
-    groupedAirportFacetCollector = createRandomCollector(groupField, "airport", null, false, useDv);
+    groupedAirportFacetCollector = createRandomCollector(useDv ? "hotel_dv" : "hotel", useDv ? "airport_dv" : "airport", null, false);
     indexSearcher.search(new MatchAllDocsQuery(), groupedAirportFacetCollector);
     airportResult = groupedAirportFacetCollector.mergeSegmentResults(10, 0, false);
-    assertEquals(7, airportResult.getTotalCount());
-    assertEquals(1, airportResult.getTotalMissingCount());
-
     entries = airportResult.getFacetEntries(0, 10);
-    assertEquals(3, entries.size());
-    assertEquals("ams", entries.get(0).getValue().utf8ToString());
-    assertEquals(2, entries.get(0).getCount());
-    assertEquals("bru", entries.get(1).getValue().utf8ToString());
-    assertEquals(3, entries.get(1).getCount());
-    assertEquals("dus", entries.get(2).getValue().utf8ToString());
-    assertEquals(2, entries.get(2).getCount());
+    if (useDv) {
+      assertEquals(8, airportResult.getTotalCount());
+      assertEquals(0, airportResult.getTotalMissingCount());
+      assertEquals(4, entries.size());
+      assertEquals("", entries.get(0).getValue().utf8ToString());
+      assertEquals(1, entries.get(0).getCount());
+      assertEquals("ams", entries.get(1).getValue().utf8ToString());
+      assertEquals(2, entries.get(1).getCount());
+      assertEquals("bru", entries.get(2).getValue().utf8ToString());
+      assertEquals(3, entries.get(2).getCount());
+      assertEquals("dus", entries.get(3).getValue().utf8ToString());
+      assertEquals(2, entries.get(3).getCount());
+    } else {
+      assertEquals(7, airportResult.getTotalCount());
+      assertEquals(1, airportResult.getTotalMissingCount());
+      assertEquals(3, entries.size());
+      assertEquals("ams", entries.get(0).getValue().utf8ToString());
+      assertEquals(2, entries.get(0).getCount());
+      assertEquals("bru", entries.get(1).getValue().utf8ToString());
+      assertEquals(3, entries.get(1).getCount());
+      assertEquals("dus", entries.get(2).getValue().utf8ToString());
+      assertEquals(2, entries.get(2).getCount());
+    }
 
-    groupedDurationFacetCollector = createRandomCollector(groupField, "duration", "1", false, useDv);
+    groupedDurationFacetCollector = createRandomCollector(useDv ? "hotel_dv" : "hotel", useDv ? "duration_dv" : "duration", "1", false);
     indexSearcher.search(new MatchAllDocsQuery(), groupedDurationFacetCollector);
     durationResult = groupedDurationFacetCollector.mergeSegmentResults(10, 0, true);
     assertEquals(5, durationResult.getTotalCount());
@@ -235,13 +260,13 @@ public class GroupFacetCollectorTest ext
 
     // 0
     Document doc = new Document();
-    addField(doc, "x", "x", useDv);
+    doc.add(new StringField("x", "x", Field.Store.NO));
     w.addDocument(doc);
 
     // 1
     doc = new Document();
     addField(doc, groupField, "a", useDv);
-    addField(doc, "airport", "ams", useDv);
+    doc.add(new StringField("airport", "ams", Field.Store.NO));
     w.addDocument(doc);
 
     w.commit();
@@ -250,43 +275,44 @@ public class GroupFacetCollectorTest ext
     // 2
     doc = new Document();
     addField(doc, groupField, "a", useDv);
-    addField(doc, "airport", "ams", useDv);
+    doc.add(new StringField("airport", "ams", Field.Store.NO));
     w.addDocument(doc);
 
     // 3
     doc = new Document();
     addField(doc, groupField, "a", useDv);
-    addField(doc, "airport", "dus", useDv);
+    doc.add(new StringField("airport", "dus", Field.Store.NO));
+
     w.addDocument(doc);
 
     // 4
     doc = new Document();
     addField(doc, groupField, "b", useDv);
-    addField(doc, "airport", "ams", useDv);
+    doc.add(new StringField("airport", "ams", Field.Store.NO));
     w.addDocument(doc);
 
     // 5
     doc = new Document();
     addField(doc, groupField, "b", useDv);
-    addField(doc, "airport", "ams", useDv);
+    doc.add(new StringField("airport", "ams", Field.Store.NO));
     w.addDocument(doc);
 
     // 6
     doc = new Document();
     addField(doc, groupField, "b", useDv);
-    addField(doc, "airport", "ams", useDv);
+    doc.add(new StringField("airport", "ams", Field.Store.NO));
     w.addDocument(doc);
     w.commit();
 
     // 7
     doc = new Document();
-    addField(doc, "x", "x", useDv);
+    doc.add(new StringField("x", "x", Field.Store.NO));
     w.addDocument(doc);
     w.commit();
 
     w.close();
     IndexSearcher indexSearcher = new IndexSearcher(DirectoryReader.open(dir));
-    AbstractGroupFacetCollector groupedAirportFacetCollector = createRandomCollector(groupField, "airport", null, true, useDv);
+    AbstractGroupFacetCollector groupedAirportFacetCollector = createRandomCollector(groupField, "airport", null, true);
     indexSearcher.search(new MatchAllDocsQuery(), groupedAirportFacetCollector);
     TermGroupFacetCollector.GroupedFacetResult airportResult = groupedAirportFacetCollector.mergeSegmentResults(10, 0, false);
     assertEquals(3, airportResult.getTotalCount());
@@ -306,7 +332,7 @@ public class GroupFacetCollectorTest ext
   private void addField(Document doc, String field, String value, boolean canUseIDV) {
     doc.add(new StringField(field, value, Field.Store.NO));
     if (canUseIDV) {
-      doc.add(new SortedBytesDocValuesField(field, new BytesRef(value)));
+      doc.add(new SortedBytesDocValuesField(field + "_dv", new BytesRef(value)));
     }
   }
 
@@ -318,8 +344,15 @@ public class GroupFacetCollectorTest ext
       IndexContext context = createIndexContext(multipleFacetsPerDocument);
       final IndexSearcher searcher = newSearcher(context.indexReader);
 
+      if (VERBOSE) {
+        System.out.println("TEST: searcher=" + searcher);
+      }
+
       for (int searchIter = 0; searchIter < 100; searchIter++) {
-        boolean useDv = context.useDV && random.nextBoolean();
+        if (VERBOSE) {
+          System.out.println("TEST: searchIter=" + searchIter);
+        }
+        boolean useDv = !multipleFacetsPerDocument && context.useDV && random.nextBoolean();
         String searchTerm = context.contentStrings[random.nextInt(context.contentStrings.length)];
         int limit = random.nextInt(context.facetValues.size());
         int offset = random.nextInt(context.facetValues.size() - limit);
@@ -342,7 +375,7 @@ public class GroupFacetCollectorTest ext
         }
 
         GroupedFacetResult expectedFacetResult = createExpectedFacetResult(searchTerm, context, offset, limit, minCount, orderByCount, facetPrefix);
-        AbstractGroupFacetCollector groupFacetCollector = createRandomCollector(useDv ? "group_dv" : "group", useDv ? "facet_dv" : "facet", facetPrefix, multipleFacetsPerDocument, useDv);
+        AbstractGroupFacetCollector groupFacetCollector = createRandomCollector(useDv ? "group_dv" : "group", useDv ? "facet_dv" : "facet", facetPrefix, multipleFacetsPerDocument);
         searcher.search(new TermQuery(new Term("content", searchTerm)), groupFacetCollector);
         TermGroupFacetCollector.GroupedFacetResult actualFacetResult = groupFacetCollector.mergeSegmentResults(size, minCount, orderByCount);
 
@@ -350,6 +383,7 @@ public class GroupFacetCollectorTest ext
         List<TermGroupFacetCollector.FacetEntry> actualFacetEntries = actualFacetResult.getFacetEntries(offset, limit);
 
         if (VERBOSE) {
+          System.out.println("Use DV: " + useDv);
           System.out.println("Collector: " + groupFacetCollector.getClass().getSimpleName());
           System.out.println("Num group: " + context.numGroups);
           System.out.println("Num doc: " + context.numDocs);
@@ -367,7 +401,7 @@ public class GroupFacetCollectorTest ext
           System.out.println("\n=== Expected: \n");
           System.out.println("Total count " + expectedFacetResult.getTotalCount());
           System.out.println("Total missing count " + expectedFacetResult.getTotalMissingCount());
-          int counter = 1;
+          int counter = 0;
           for (TermGroupFacetCollector.FacetEntry expectedFacetEntry : expectedFacetEntries) {
             System.out.println(
                 String.format(Locale.ROOT,
@@ -380,7 +414,7 @@ public class GroupFacetCollectorTest ext
           System.out.println("\n=== Actual: \n");
           System.out.println("Total count " + actualFacetResult.getTotalCount());
           System.out.println("Total missing count " + actualFacetResult.getTotalMissingCount());
-          counter = 1;
+          counter = 0;
           for (TermGroupFacetCollector.FacetEntry actualFacetEntry : actualFacetEntries) {
             System.out.println(
                 String.format(Locale.ROOT,
@@ -391,15 +425,15 @@ public class GroupFacetCollectorTest ext
           }
           System.out.println("\n===================================================================================");
         }
-
+        
         assertEquals(expectedFacetResult.getTotalCount(), actualFacetResult.getTotalCount());
         assertEquals(expectedFacetResult.getTotalMissingCount(), actualFacetResult.getTotalMissingCount());
         assertEquals(expectedFacetEntries.size(), actualFacetEntries.size());
         for (int i = 0; i < expectedFacetEntries.size(); i++) {
           TermGroupFacetCollector.FacetEntry expectedFacetEntry = expectedFacetEntries.get(i);
           TermGroupFacetCollector.FacetEntry actualFacetEntry = actualFacetEntries.get(i);
-          assertEquals(expectedFacetEntry.getValue().utf8ToString() + " != " + actualFacetEntry.getValue().utf8ToString(), expectedFacetEntry.getValue(), actualFacetEntry.getValue());
-          assertEquals(expectedFacetEntry.getCount() + " != " + actualFacetEntry.getCount(), expectedFacetEntry.getCount(), actualFacetEntry.getCount());
+          assertEquals("i=" + i + ": " + expectedFacetEntry.getValue().utf8ToString() + " != " + actualFacetEntry.getValue().utf8ToString(), expectedFacetEntry.getValue(), actualFacetEntry.getValue());
+          assertEquals("i=" + i + ": " + expectedFacetEntry.getCount() + " != " + actualFacetEntry.getCount(), expectedFacetEntry.getCount(), actualFacetEntry.getCount());
         }
       }
 
@@ -447,7 +481,7 @@ public class GroupFacetCollectorTest ext
         )
     );
     boolean canUseDV = true;
-    boolean useDv = canUseDV && random.nextBoolean();
+    boolean useDv = canUseDV && !multipleFacetValuesPerDocument && random.nextBoolean();
 
     Document doc = new Document();
     Document docNoGroup = new Document();
@@ -463,6 +497,7 @@ public class GroupFacetCollectorTest ext
     docNoFacet.add(group);
     Field[] facetFields;
     if (useDv) {
+      assert !multipleFacetValuesPerDocument;
       facetFields = new Field[2];
       facetFields[0] = newStringField("facet", "", Field.Store.NO);
       doc.add(facetFields[0]);
@@ -507,7 +542,11 @@ public class GroupFacetCollectorTest ext
       if (random.nextInt(24) == 17) {
         // So we test the "doc doesn't have the group'd
         // field" case:
-        groupValue = null;
+        if (useDv) {
+          groupValue = "";
+        } else {
+          groupValue = null;
+        }
       } else {
         groupValue = groups.get(random.nextInt(groups.size()));
       }
@@ -519,7 +558,7 @@ public class GroupFacetCollectorTest ext
       Map<String, Set<String>> facetToGroups = searchTermToFacetToGroups.get(contentStr);
 
       List<String> facetVals = new ArrayList<String>();
-      if (random.nextInt(24) != 18) {
+      if (useDv || random.nextInt(24) != 18) {
         if (useDv) {
           String facetValue = facetValues.get(random.nextInt(facetValues.size()));
           uniqueFacetValues.add(facetValue);
@@ -571,6 +610,9 @@ public class GroupFacetCollectorTest ext
           groupDc.setBytesValue(new BytesRef(groupValue));
         }
         group.setStringValue(groupValue);
+      } else if (useDv) {
+        // DV cannot have missing values:
+        groupDc.setBytesValue(new BytesRef());
       }
       content.setStringValue(contentStr);
       if (groupValue == null && facetVals.isEmpty()) {
@@ -660,8 +702,10 @@ public class GroupFacetCollectorTest ext
     return new GroupedFacetResult(totalCount, totalMissCount, entriesResult);
   }
 
-  private AbstractGroupFacetCollector createRandomCollector(String groupField, String facetField, String facetPrefix, boolean multipleFacetsPerDocument, boolean useDv) {
+  private AbstractGroupFacetCollector createRandomCollector(String groupField, String facetField, String facetPrefix, boolean multipleFacetsPerDocument) {
     BytesRef facetPrefixBR = facetPrefix == null ? null : new BytesRef(facetPrefix);
+    // DocValues cannot be multi-valued:
+    assert !multipleFacetsPerDocument || !groupField.endsWith("_dv");
     return TermGroupFacetCollector.createTermGroupFacetCollector(groupField, facetField, multipleFacetsPerDocument, facetPrefixBR, random().nextInt(1024));
   }