mkhludnev commented on a change in pull request #1462: URL: https://github.com/apache/lucene-solr/pull/1462#discussion_r419010144
########## File path: lucene/grouping/src/test/org/apache/lucene/search/grouping/AllGroupHeadsCollectorTest.java ########## @@ -153,23 +187,149 @@ public void testBasic() throws Exception { assertTrue(openBitSetContains(new int[]{1, 5}, allGroupHeadsCollector.retrieveGroupHeads(maxDoc), maxDoc)); // STRING sort type triggers different implementation - Sort sortWithinGroup2 = new Sort(new SortField("id_2", SortField.Type.STRING, true)); - allGroupHeadsCollector = createRandomCollector(groupField, sortWithinGroup2); + for (Function<Boolean,SortField> sortFunc : new Function[] { + // (r) -> new SortField("id_2", SortField.Type.STRING, (boolean) r), + // (r) -> new SortedSetSortField("id_3", (boolean) r), + (r) -> new SortedSetSortField("id_4", (boolean) r) + }) { + + Sort sortWithinGroup2 = new Sort(sortFunc.apply(true)); + allGroupHeadsCollector = createRandomCollector(groupField, sortWithinGroup2); + indexSearcher.search(new TermQuery(new Term("content", "random")), allGroupHeadsCollector); + assertTrue(arrayContains(new int[] {2, 3, 5, 7}, allGroupHeadsCollector.retrieveGroupHeads())); + assertTrue(openBitSetContains(new int[] {2, 3, 5, 7}, allGroupHeadsCollector.retrieveGroupHeads(maxDoc), maxDoc)); + + Sort sortWithinGroup3 = new Sort(sortFunc.apply(false)); + allGroupHeadsCollector = createRandomCollector(groupField, sortWithinGroup3); + indexSearcher.search(new TermQuery(new Term("content", "random")), allGroupHeadsCollector); + // 7 b/c higher doc id wins, even if order of field is in not in reverse. + assertTrue(arrayContains(new int[] {0, 3, 4, 6}, allGroupHeadsCollector.retrieveGroupHeads())); + assertTrue(openBitSetContains(new int[] {0, 3, 4, 6}, allGroupHeadsCollector.retrieveGroupHeads(maxDoc), maxDoc)); + } + indexSearcher.getIndexReader().close(); + dir.close(); + } + + public void testBasicBlockJoin() throws Exception { + final String groupField = "author"; + Directory dir = newDirectory(); + RandomIndexWriter w = new RandomIndexWriter( + random(), + dir, + newIndexWriterConfig(new MockAnalyzer(random())).setMergePolicy(newLogMergePolicy())); + DocValuesType valueType = DocValuesType.SORTED; + + // 0 + Document doc = new Document(); + addGroupField(doc, groupField, "author1", valueType); + doc.add(newTextField("content", "random text", Field.Store.NO)); + doc.add(new NumericDocValuesField("id_1", 1)); + doc.add(new SortedDocValuesField("id_2", new BytesRef("1"))); + addParent(w, doc, new SortedSetDocValuesField("id_3", new BytesRef("10")), + new SortedSetDocValuesField("id_3", new BytesRef("11"))); + + // 1 + doc = new Document(); + addGroupField(doc, groupField, "author1", valueType); + doc.add(newTextField("content", "some more random text blob", Field.Store.NO)); + doc.add(new NumericDocValuesField("id_1", 2)); + doc.add(new SortedDocValuesField("id_2", new BytesRef("2"))); + addParent(w, doc, new SortedSetDocValuesField("id_3", new BytesRef("20")), + new SortedSetDocValuesField("id_3", new BytesRef("21"))); + + // 2 + doc = new Document(); + addGroupField(doc, groupField, "author1", valueType); + doc.add(newTextField("content", "some more random textual data", Field.Store.NO)); + doc.add(new NumericDocValuesField("id_1", 3)); + doc.add(new SortedDocValuesField("id_2", new BytesRef("3"))); + addParent(w, doc, new SortedSetDocValuesField("id_3", new BytesRef("30")), + new SortedSetDocValuesField("id_3", new BytesRef("31"))); + w.commit(); // To ensure a second segment + + // 3 + doc = new Document(); + addGroupField(doc, groupField, "author2", valueType); + doc.add(newTextField("content", "some random text", Field.Store.NO)); + doc.add(new NumericDocValuesField("id_1", 4)); + doc.add(new SortedDocValuesField("id_2", new BytesRef("4"))); + addParent(w, doc, new SortedSetDocValuesField("id_3", new BytesRef("40")), + new SortedSetDocValuesField("id_3", new BytesRef("41"))); + + // 4 + doc = new Document(); + addGroupField(doc, groupField, "author3", valueType); + doc.add(newTextField("content", "some more random text", Field.Store.NO)); + doc.add(new NumericDocValuesField("id_1", 5)); + doc.add(new SortedDocValuesField("id_2", new BytesRef("5"))); + addParent(w, doc, new SortedSetDocValuesField("id_3", new BytesRef("50")), + new SortedSetDocValuesField("id_3", new BytesRef("51"))); + + // 5 + doc = new Document(); + addGroupField(doc, groupField, "author3", valueType); + doc.add(newTextField("content", "random blob", Field.Store.NO)); + doc.add(new NumericDocValuesField("id_1", 6)); + doc.add(new SortedDocValuesField("id_2", new BytesRef("6"))); + addParent(w, doc, new SortedSetDocValuesField("id_3", new BytesRef("60")), + new SortedSetDocValuesField("id_3", new BytesRef("61"))); + w.addDocument(doc); + + // 6 -- no author field + doc = new Document(); + doc.add(newTextField("content", "random word stuck in alot of other text", Field.Store.NO)); + doc.add(new NumericDocValuesField("id_1", 6)); + doc.add(new SortedDocValuesField("id_2", new BytesRef("6"))); + addParent(w, doc, new SortedSetDocValuesField("id_3", new BytesRef("60")), + new SortedSetDocValuesField("id_3", new BytesRef("61"))); + + // 7 -- no author field + doc = new Document(); + doc.add(newTextField("content", "random word stuck in alot of other text", Field.Store.NO)); + doc.add(new NumericDocValuesField("id_1", 7)); + doc.add(new SortedDocValuesField("id_2", new BytesRef("7"))); + addParent(w, doc, new SortedSetDocValuesField("id_3", new BytesRef("70")), + new SortedSetDocValuesField("id_3", new BytesRef("71"))); + + IndexReader reader = w.getReader(); + IndexSearcher indexSearcher = newSearcher(reader); + + w.close(); + int maxDoc = reader.maxDoc(); + + final QueryBitSetProducer parentFilter = new QueryBitSetProducer(new TermQuery(new Term("type","parent"))); + final QueryBitSetProducer childFilter = new QueryBitSetProducer(new TermQuery(new Term("type","child"))); + Sort sortWithinGroup2 = new Sort(new ToParentBlockJoinSortField("id_3", Type.STRING, true, + parentFilter, childFilter)); + AllGroupHeadsCollector<?> allGroupHeadsCollector = createRandomCollector(groupField, sortWithinGroup2); indexSearcher.search(new TermQuery(new Term("content", "random")), allGroupHeadsCollector); - assertTrue(arrayContains(new int[]{2, 3, 5, 7}, allGroupHeadsCollector.retrieveGroupHeads())); - assertTrue(openBitSetContains(new int[]{2, 3, 5, 7}, allGroupHeadsCollector.retrieveGroupHeads(maxDoc), maxDoc)); + assertTrue(arrayContains(new int[] {2, 3, 5, 7}, allGroupHeadsCollector.retrieveGroupHeads())); Review comment: WRONG ---------------------------------------------------------------- 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. For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org For additional commands, e-mail: issues-h...@lucene.apache.org