gaobinlong commented on code in PR #15660:
URL: https://github.com/apache/lucene/pull/15660#discussion_r3223375041


##########
lucene/sandbox/src/test/org/apache/lucene/sandbox/search/TestLargeNumHitsTopDocsCollector.java:
##########
@@ -82,93 +89,127 @@ public void testRequestLessHitsThanCollected() throws 
Exception {
 
   public void testIllegalArguments() throws IOException {
     IndexSearcher searcher = newSearcher(reader);
-    LargeNumHitsTopDocsCollector largeCollector = new 
LargeNumHitsTopDocsCollector(15);
+    LargeNumHitsTopDocsCollectorManager largeCollectorManager =
+        new LargeNumHitsTopDocsCollectorManager(15);
     TopScoreDocCollectorManager regularCollectorManager =
         new TopScoreDocCollectorManager(15, Integer.MAX_VALUE);
 
-    searcher.search(testQuery, largeCollector);
-    TopDocs topDocs = searcher.search(testQuery, regularCollectorManager);
+    TopDocs largeTopDocs = searcher.search(testQuery, largeCollectorManager);
+    TopDocs regularTopDocs = searcher.search(testQuery, 
regularCollectorManager);
 
-    assertEquals(largeCollector.totalHits, topDocs.totalHits.value());
+    assertEquals(largeTopDocs.totalHits.value(), 
regularTopDocs.totalHits.value());
 
+    LargeNumHitsTopDocsCollector collector = 
largeCollectorManager.newCollector();
     IllegalArgumentException expected =
-        expectThrows(
-            IllegalArgumentException.class,
-            () -> {
-              largeCollector.topDocs(350_000);
-            });
+        expectThrows(IllegalArgumentException.class, () -> 
collector.topDocs(350_000));
 
     assertTrue(expected.getMessage().contains("Incorrect number of hits 
requested"));
   }
 
   public void testNoPQBuild() throws IOException {
     IndexSearcher searcher = newSearcher(reader);
-    LargeNumHitsTopDocsCollector largeCollector = new 
LargeNumHitsTopDocsCollector(250_000);
+    LargeNumHitsTopDocsCollectorManager largeCollectorManager =
+        new LargeNumHitsTopDocsCollectorManager(250_000);
     TopScoreDocCollectorManager regularCollectorManager =
         new TopScoreDocCollectorManager(reader.numDocs(), Integer.MAX_VALUE);
 
-    searcher.search(testQuery, largeCollector);
-    TopDocs topDocs = searcher.search(testQuery, regularCollectorManager);
+    TopDocs largeTopDocs = searcher.search(testQuery, largeCollectorManager);
+    TopDocs regularTopDocs = searcher.search(testQuery, 
regularCollectorManager);
 
-    assertEquals(largeCollector.totalHits, topDocs.totalHits.value());
-
-    assertNull(largeCollector.pq);
-    assertNull(largeCollector.pqTop);
+    assertEquals(largeTopDocs.totalHits.value(), 
regularTopDocs.totalHits.value());
+    CheckHits.checkEqual(testQuery, largeTopDocs.scoreDocs, 
regularTopDocs.scoreDocs);
   }
 
   public void testPQBuild() throws IOException {
     IndexSearcher searcher = newSearcher(reader);
-    LargeNumHitsTopDocsCollector largeCollector = new 
LargeNumHitsTopDocsCollector(50);
+    LargeNumHitsTopDocsCollectorManager largeCollectorManager =
+        new LargeNumHitsTopDocsCollectorManager(50);
     TopScoreDocCollectorManager regularCollectorManager =
         new TopScoreDocCollectorManager(50, Integer.MAX_VALUE);
 
-    searcher.search(testQuery, largeCollector);
-    TopDocs topDocs = searcher.search(testQuery, regularCollectorManager);
-
-    assertEquals(largeCollector.totalHits, topDocs.totalHits.value());
+    TopDocs largeTopDocs = searcher.search(testQuery, largeCollectorManager);
+    TopDocs regularTopDocs = searcher.search(testQuery, 
regularCollectorManager);
 
-    assertNotNull(largeCollector.pq);
-    assertNotNull(largeCollector.pqTop);
+    assertEquals(largeTopDocs.totalHits.value(), 
regularTopDocs.totalHits.value());
+    CheckHits.checkEqual(testQuery, largeTopDocs.scoreDocs, 
regularTopDocs.scoreDocs);
   }
 
   public void testNoPQHitsOrder() throws IOException {
     IndexSearcher searcher = newSearcher(reader);
-    LargeNumHitsTopDocsCollector largeCollector = new 
LargeNumHitsTopDocsCollector(250_000);
+    LargeNumHitsTopDocsCollectorManager largeCollectorManager =
+        new LargeNumHitsTopDocsCollectorManager(250_000);
     TopScoreDocCollectorManager regularCollectorManager =
         new TopScoreDocCollectorManager(reader.numDocs(), Integer.MAX_VALUE);
 
-    searcher.search(testQuery, largeCollector);
-    TopDocs topDocs = searcher.search(testQuery, regularCollectorManager);
-
-    assertEquals(largeCollector.totalHits, topDocs.totalHits.value());
+    TopDocs largeTopDocs = searcher.search(testQuery, largeCollectorManager);
+    TopDocs regularTopDocs = searcher.search(testQuery, 
regularCollectorManager);
 
-    assertNull(largeCollector.pq);
-    assertNull(largeCollector.pqTop);
+    assertEquals(largeTopDocs.totalHits.value(), 
regularTopDocs.totalHits.value());
 
-    topDocs = largeCollector.topDocs();
-
-    if (topDocs.scoreDocs.length > 0) {
-      float preScore = topDocs.scoreDocs[0].score;
-      for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
+    if (largeTopDocs.scoreDocs.length > 0) {
+      float preScore = largeTopDocs.scoreDocs[0].score;
+      for (ScoreDoc scoreDoc : largeTopDocs.scoreDocs) {
         assert scoreDoc.score <= preScore;
         preScore = scoreDoc.score;
       }
     }
   }
 
+  public void testInvalidNumHitsInConstructor() {
+    expectThrows(IllegalArgumentException.class, () -> new 
LargeNumHitsTopDocsCollectorManager(0));
+    expectThrows(IllegalArgumentException.class, () -> new 
LargeNumHitsTopDocsCollectorManager(-1));
+  }
+
+  public void testReduceWithZeroHitCollector() throws IOException {
+    // reduce() must skip collectors with 0 hits without throwing 
IllegalArgumentException.
+    Directory localDir = newDirectory();
+    IndexWriter writer = new IndexWriter(localDir, newIndexWriterConfig());
+    Document doc = new Document();
+    doc.add(newStringField("field", "hit", Field.Store.NO));
+    writer.addDocument(doc);
+    writer.commit();
+    writer.addDocument(new Document());
+    writer.commit();
+    writer.close();

Review Comment:
   The index writer used here is to make sure we generate 2 segments, one 
segment would have non-zero search hits, another segment would have zero search 
hits because no document containing the search field; the custom executor is to 
force one collector per segment, if not the 2 segments may share one collector, 
then the zero search hits in one collector test case wouldn't be covered.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to