From 5abaceb7f7ae65aa0060c3141610aa82498a19d9 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Fri, 9 Feb 2024 10:41:23 +0100 Subject: - Let there only be one way to wire query to the grouping hits. Enforce that by requiring it in the constructor. - Carry the DocumentDatabase along, not only the DocusumDefinitionSet. --- .../prelude/fastsearch/DocsumDefinitionSet.java | 6 +-- .../yahoo/prelude/fastsearch/DocumentDatabase.java | 10 +--- .../yahoo/prelude/fastsearch/GroupingListHit.java | 16 +++--- .../yahoo/prelude/searcher/JuniperSearcher.java | 21 ++++---- .../search/dispatch/GroupingResultAggregator.java | 10 ++-- .../search/dispatch/rpc/ProtobufSerialization.java | 3 +- .../search/grouping/vespa/GroupingExecutor.java | 2 +- .../yahoo/search/grouping/vespa/HitConverter.java | 25 ++++----- .../vespa/streamingvisitors/StreamingSearcher.java | 2 +- .../result/FlatteningSearcherTestCase.java | 4 +- .../grouping/vespa/GroupingExecutorTestCase.java | 63 +++++++++------------- .../grouping/vespa/HitConverterTestCase.java | 40 +++++++------- 12 files changed, 91 insertions(+), 111 deletions(-) (limited to 'container-search/src') diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/DocsumDefinitionSet.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/DocsumDefinitionSet.java index 55601059901..adfb1d06ae3 100644 --- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/DocsumDefinitionSet.java +++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/DocsumDefinitionSet.java @@ -35,8 +35,8 @@ public final class DocsumDefinitionSet { public DocsumDefinitionSet(Collection docsumDefinitions) { this.definitionsByName = docsumDefinitions.stream() - .map(summary -> new DocsumDefinition(summary)) - .collect(Collectors.toUnmodifiableMap(summary -> summary.name(), + .map(DocsumDefinition::new) + .collect(Collectors.toUnmodifiableMap(DocsumDefinition::name, summary -> summary)); } @@ -95,7 +95,7 @@ public final class DocsumDefinitionSet { public String toString() { StringBuilder sb = new StringBuilder(); for (Map.Entry e : definitionsByName.entrySet() ) { - if (sb.length() != 0) { + if (!sb.isEmpty()) { sb.append(","); } sb.append("[").append(e.getKey()).append(",").append(e.getValue().name()).append("]"); diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/DocumentDatabase.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/DocumentDatabase.java index 8d1c3bcd678..ea6b6a8ee38 100644 --- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/DocumentDatabase.java +++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/DocumentDatabase.java @@ -1,16 +1,8 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.prelude.fastsearch; -import com.yahoo.search.schema.RankProfile; import com.yahoo.search.schema.Schema; -import com.yahoo.search.schema.SchemaInfo; -import com.yahoo.tensor.TensorType; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; + /** * Representation of a document database realizing a schema in a content cluster. diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/GroupingListHit.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/GroupingListHit.java index 11fbedfc0dd..7e60f8a41b6 100644 --- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/GroupingListHit.java +++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/GroupingListHit.java @@ -3,28 +3,32 @@ package com.yahoo.prelude.fastsearch; import java.util.List; +import com.yahoo.search.Query; import com.yahoo.search.result.Hit; +import com.yahoo.search.schema.Schema; import com.yahoo.searchlib.aggregation.Grouping; public class GroupingListHit extends Hit { /** for unit tests only, may give problems if grouping contains docsums */ public GroupingListHit(List groupingList) { - this(groupingList, null); + this(groupingList, null, null); } - public GroupingListHit(List groupingList, DocsumDefinitionSet defs) { - super("meta:grouping", 0); + public GroupingListHit(List groupingList, DocumentDatabase documentDatabase, Query query) { + super("meta:grouping", 0, query); this.groupingList = groupingList; - this.defs = defs; + this.documentDatabase = documentDatabase; } public boolean isMeta() { return true; } public List getGroupingList() { return groupingList; } - public DocsumDefinitionSet getDocsumDefinitionSet() { return defs; } + public DocsumDefinitionSet getDocsumDefinitionSet() { return documentDatabase.getDocsumDefinitionSet(); } + public Schema getSchema() { return documentDatabase.schema(); } + public DocumentDatabase getDocumentDatBase() { return documentDatabase; } private final List groupingList; - private final DocsumDefinitionSet defs; + private final DocumentDatabase documentDatabase; } diff --git a/container-search/src/main/java/com/yahoo/prelude/searcher/JuniperSearcher.java b/container-search/src/main/java/com/yahoo/prelude/searcher/JuniperSearcher.java index 927fa37cc77..3c4e8107df5 100644 --- a/container-search/src/main/java/com/yahoo/prelude/searcher/JuniperSearcher.java +++ b/container-search/src/main/java/com/yahoo/prelude/searcher/JuniperSearcher.java @@ -83,9 +83,7 @@ public class JuniperSearcher extends Searcher { List hits = new ArrayList<>(worstCase); for (Iterator i = result.hits().deepIterator(); i.hasNext();) { Hit hit = i.next(); - if ( ! (hit instanceof FastHit)) continue; - - FastHit fastHit = (FastHit)hit; + if ( ! (hit instanceof FastHit fastHit)) continue; if (fastHit.isFilled(summaryClass)) continue; hits.add(fastHit); @@ -99,9 +97,8 @@ public class JuniperSearcher extends Searcher { String summaryClass, IndexFacts.Session indexFacts) { while (hitsToHighlight.hasNext()) { Hit hit = hitsToHighlight.next(); - if ( ! (hit instanceof FastHit)) continue; + if ( ! (hit instanceof FastHit fastHit)) continue; - FastHit fastHit = (FastHit) hit; if (summaryClass != null && ! fastHit.isFilled(summaryClass)) continue; Object searchDefinitionField = fastHit.getField(Hit.SDDOCNAME_FIELD); @@ -125,9 +122,9 @@ public class JuniperSearcher extends Searcher { private class StringArrayConverter implements ArrayTraverser { - private Index index; - private boolean bolding; - private Value.ArrayValue convertedField = new Value.ArrayValue(); + private final Index index; + private final boolean bolding; + private final Value.ArrayValue convertedField = new Value.ArrayValue(); /** * This converts the backend binary highlighting of each item in an array of string field, @@ -189,8 +186,8 @@ public class JuniperSearcher extends Searcher { } if (newFieldParts != null) { i.remove(); - for (Iterator j = newFieldParts.iterator(); j.hasNext();) { - i.add(j.next()); + for (FieldPart newFieldPart : newFieldParts) { + i.add(newFieldPart); } } } @@ -220,7 +217,7 @@ public class JuniperSearcher extends Searcher { if (insideHighlight) { newFieldParts.add(new BoldCloseFieldPart(boldCloseTag)); } else { - if (newFieldParts.size() > 0 + if (!newFieldParts.isEmpty() && newFieldParts.get(newFieldParts.size() - 1) instanceof BoldCloseFieldPart) { newFieldParts.remove(newFieldParts.size() - 1); } else { @@ -230,7 +227,7 @@ public class JuniperSearcher extends Searcher { } } - private List initFieldParts(List newFieldParts) { + private static List initFieldParts(List newFieldParts) { if (newFieldParts == null) newFieldParts = new ArrayList<>(); return newFieldParts; diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/GroupingResultAggregator.java b/container-search/src/main/java/com/yahoo/search/dispatch/GroupingResultAggregator.java index 8db0ec46f95..8311c84930e 100644 --- a/container-search/src/main/java/com/yahoo/search/dispatch/GroupingResultAggregator.java +++ b/container-search/src/main/java/com/yahoo/search/dispatch/GroupingResultAggregator.java @@ -1,7 +1,7 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.search.dispatch; -import com.yahoo.prelude.fastsearch.DocsumDefinitionSet; +import com.yahoo.prelude.fastsearch.DocumentDatabase; import com.yahoo.prelude.fastsearch.GroupingListHit; import com.yahoo.search.Query; import com.yahoo.searchlib.aggregation.Grouping; @@ -23,13 +23,13 @@ class GroupingResultAggregator { private static final Logger log = Logger.getLogger(GroupingResultAggregator.class.getName()); private final Map groupings = new LinkedHashMap<>(); - private DocsumDefinitionSet docsumDefinitions = null; + private DocumentDatabase documentDatabase = null; private Query query = null; private int groupingHitsMerged = 0; void mergeWith(GroupingListHit result) { ++groupingHitsMerged; - if (docsumDefinitions == null) docsumDefinitions = result.getDocsumDefinitionSet(); + if (documentDatabase == null) documentDatabase = result.getDocumentDatBase(); if (query == null) query = result.getQuery(); log.log(Level.FINE, () -> String.format("Merging hit #%d having %d groupings", @@ -46,8 +46,8 @@ class GroupingResultAggregator { if (groupingHitsMerged == 0) return Optional.empty(); log.log(Level.FINE, () -> String.format("Creating aggregated hit containing %d groupings from %d hits with docsums '%s' and %s", - groupings.size(), groupingHitsMerged, docsumDefinitions, query)); - GroupingListHit groupingHit = new GroupingListHit(List.copyOf(groupings.values()), docsumDefinitions); + groupings.size(), groupingHitsMerged, documentDatabase.getDocsumDefinitionSet(), query)); + GroupingListHit groupingHit = new GroupingListHit(List.copyOf(groupings.values()), documentDatabase, query); groupingHit.setQuery(query); groupingHit.getGroupingList().forEach(g -> { g.select(o -> o instanceof Hit, o -> ((Hit)o).setContext(groupingHit)); diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java index 9cad9d19f4c..9da4c91cd16 100644 --- a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java +++ b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/ProtobufSerialization.java @@ -255,8 +255,7 @@ public class ProtobufSerialization { g.deserialize(buf); list.add(g); } - GroupingListHit hit = new GroupingListHit(list, documentDatabase.getDocsumDefinitionSet()); - hit.setQuery(query); + GroupingListHit hit = new GroupingListHit(list, documentDatabase, query); result.getResult().hits().add(hit); } for (var replyHit : protobuf.getHitsList()) { diff --git a/container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java b/container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java index 3b5399fccc9..be4f2f786e5 100644 --- a/container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java +++ b/container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java @@ -91,7 +91,7 @@ public class GroupingExecutor extends Searcher { Result result = performSearch(query, execution, groupingMap); // Convert Vespa style results to hits. - HitConverter hitConverter = new HitConverter(this, query); + HitConverter hitConverter = new HitConverter(this); for (RequestContext context : requestContextList) { RootGroup group = convertResult(context, groupingMap, hitConverter); result.hits().add(group); diff --git a/container-search/src/main/java/com/yahoo/search/grouping/vespa/HitConverter.java b/container-search/src/main/java/com/yahoo/search/grouping/vespa/HitConverter.java index 13d635b5772..94e0b5913d3 100644 --- a/container-search/src/main/java/com/yahoo/search/grouping/vespa/HitConverter.java +++ b/container-search/src/main/java/com/yahoo/search/grouping/vespa/HitConverter.java @@ -4,7 +4,6 @@ package com.yahoo.search.grouping.vespa; import com.yahoo.prelude.fastsearch.DocsumDefinitionSet; import com.yahoo.prelude.fastsearch.FastHit; import com.yahoo.prelude.fastsearch.GroupingListHit; -import com.yahoo.search.Query; import com.yahoo.search.Searcher; import com.yahoo.search.result.Hit; import com.yahoo.search.result.Relevance; @@ -19,17 +18,14 @@ import com.yahoo.searchlib.aggregation.VdsHit; class HitConverter implements ResultBuilder.HitConverter { private final Searcher searcher; - private final Query query; /** * Creates a new instance of this class. * * @param searcher The searcher that owns this converter. - * @param query The query that returned the hits. */ - public HitConverter(Searcher searcher, Query query) { + public HitConverter(Searcher searcher) { this.searcher = searcher; - this.query = query; } @Override @@ -59,19 +55,20 @@ class HitConverter implements ResultBuilder.HitConverter { } private Hit convertVdsHit(String summaryClass, VdsHit grpHit) { - FastHit ret = new FastHit(); - ret.setRelevance(grpHit.getRank()); + FastHit hit = new FastHit(); + hit.setRelevance(grpHit.getRank()); if (grpHit.getSummary().getData().length > 0) { - GroupingListHit ctxHit = (GroupingListHit)grpHit.getContext(); - if (ctxHit == null) { + GroupingListHit hitContext = (GroupingListHit)grpHit.getContext(); + if (hitContext == null) { throw new NullPointerException("Hit has no context."); } - DocsumDefinitionSet defs = ctxHit.getDocsumDefinitionSet(); - defs.lazyDecode(summaryClass, grpHit.getSummary().getData(), ret); - ret.setFilled(summaryClass); - ret.setFilled(query.getPresentation().getSummary()); + DocsumDefinitionSet defs = hitContext.getDocsumDefinitionSet(); + defs.lazyDecode(summaryClass, grpHit.getSummary().getData(), hit); + hit.setFilled(summaryClass); + hit.setFilled(hitContext.getQuery().getPresentation().getSummary()); + hit.setQuery(hitContext.getQuery()); } - return ret; + return hit; } } diff --git a/container-search/src/main/java/com/yahoo/vespa/streamingvisitors/StreamingSearcher.java b/container-search/src/main/java/com/yahoo/vespa/streamingvisitors/StreamingSearcher.java index f7f3f97f3ac..e5674a80eac 100644 --- a/container-search/src/main/java/com/yahoo/vespa/streamingvisitors/StreamingSearcher.java +++ b/container-search/src/main/java/com/yahoo/vespa/streamingvisitors/StreamingSearcher.java @@ -245,7 +245,7 @@ public class StreamingSearcher extends VespaBackEndSearcher { List groupingList = visitor.getGroupings(); lazyTrace(query, 8, "Grouping list=", groupingList); if ( ! groupingList.isEmpty() ) { - GroupingListHit groupHit = new GroupingListHit(groupingList, getDocsumDefinitionSet(query)); + GroupingListHit groupHit = new GroupingListHit(groupingList, getDocumentDatabase(query), query); result.hits().add(groupHit); } diff --git a/container-search/src/test/java/com/yahoo/search/grouping/result/FlatteningSearcherTestCase.java b/container-search/src/test/java/com/yahoo/search/grouping/result/FlatteningSearcherTestCase.java index 7ec35151eab..9e8fcb0ea21 100644 --- a/container-search/src/test/java/com/yahoo/search/grouping/result/FlatteningSearcherTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/grouping/result/FlatteningSearcherTestCase.java @@ -76,8 +76,8 @@ public class FlatteningSearcherTestCase { Execution execution = newExecution(new FlatteningSearcher(), new GroupingExecutor(ComponentId.fromString("grouping")), new ResultProvider(List.of( - new GroupingListHit(List.of(group0), null), - new GroupingListHit(List.of(group1), null))), + new GroupingListHit(List.of(group0), null, query), + new GroupingListHit(List.of(group1), null, query))), new HitsProvider(List.of( new DefaultErrorHit("source 1", ErrorMessage.createBackendCommunicationError("backend communication error 1")), new DefaultErrorHit("source 2", ErrorMessage.createBackendCommunicationError("backend communication error 1"))))); diff --git a/container-search/src/test/java/com/yahoo/search/grouping/vespa/GroupingExecutorTestCase.java b/container-search/src/test/java/com/yahoo/search/grouping/vespa/GroupingExecutorTestCase.java index 17ab3823d57..ef2ef9724a9 100644 --- a/container-search/src/test/java/com/yahoo/search/grouping/vespa/GroupingExecutorTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/grouping/vespa/GroupingExecutorTestCase.java @@ -8,9 +8,7 @@ import com.yahoo.document.DocumentId; import com.yahoo.document.GlobalId; import com.yahoo.prelude.fastsearch.FastHit; import com.yahoo.prelude.fastsearch.GroupingListHit; -import com.yahoo.prelude.query.NotItem; import com.yahoo.prelude.query.NullItem; -import com.yahoo.prelude.query.WordItem; import com.yahoo.search.Query; import com.yahoo.search.Result; import com.yahoo.search.Searcher; @@ -183,8 +181,8 @@ public class GroupingExecutorTestCase { ); Execution exec = newExecution(new GroupingExecutor(), new ResultProvider(Arrays.asList( - new GroupingListHit(List.of(grpA), null), - new GroupingListHit(List.of(grpB), null)))); + new GroupingListHit(List.of(grpA), null, query), + new GroupingListHit(List.of(grpB), null, query)))); Group grp = req.getResultGroup(exec.search(query)); assertEquals(1, grp.size()); Hit hit = grp.get(0); @@ -216,8 +214,8 @@ public class GroupingExecutorTestCase { ); Execution exec = newExecution(new GroupingExecutor(), new ResultProvider(Arrays.asList( - new GroupingListHit(List.of(grpExpected), null), - new GroupingListHit(List.of(grpUnexpected), null)))); + new GroupingListHit(List.of(grpExpected), null, query), + new GroupingListHit(List.of(grpUnexpected), null, query)))); Group grp = req.getResultGroup(exec.search(query)); assertEquals(1, grp.size()); Hit hit = grp.get(0); @@ -247,8 +245,8 @@ public class GroupingExecutorTestCase { )); Execution exec = newExecution(new GroupingExecutor(), new ResultProvider(Arrays.asList( - new GroupingListHit(List.of(grp0), null), - new GroupingListHit(List.of(grp1), null))), + new GroupingListHit(List.of(grp0), null, query), + new GroupingListHit(List.of(grp1), null, query))), new FillRequestThrower()); Result res = exec.search(query); @@ -287,8 +285,8 @@ public class GroupingExecutorTestCase { .addHit(new com.yahoo.searchlib.aggregation.FS4Hit())))); Execution exec = newExecution(new GroupingExecutor(), new ResultProvider(Arrays.asList( - new GroupingListHit(List.of(grp0), null), - new GroupingListHit(List.of(grp1), null))), + new GroupingListHit(List.of(grp0), null, query), + new GroupingListHit(List.of(grp1), null, query))), new FillErrorProvider()); Result res = exec.search(query); exec.fill(res); @@ -313,8 +311,8 @@ public class GroupingExecutorTestCase { .addOrderBy(new AggregationRefNode(0), true))); Result res = newExecution(new GroupingExecutor(), new ResultProvider(Arrays.asList( - new GroupingListHit(List.of(grp), null), - new GroupingListHit(List.of(grp), null)))).search(query); + new GroupingListHit(List.of(grp), null, query), + new GroupingListHit(List.of(grp), null, query)))).search(query); GroupList groupList = (GroupList) req.getResultGroup(res).get(0); assertEquals(1.0, groupList.get(0).getRelevance().getScore(), 1E-6); @@ -342,8 +340,8 @@ public class GroupingExecutorTestCase { Execution exec = newExecution(new GroupingExecutor(), err, new ResultProvider(Arrays.asList( - new GroupingListHit(List.of(grp0), null), - new GroupingListHit(List.of(grp1), null)))); + new GroupingListHit(List.of(grp0), null, query), + new GroupingListHit(List.of(grp1), null, query)))); Result res = exec.search(query); assertNotNull(res.hits().getError()); assertEquals(Error.TIMEOUT.code, res.hits().getError().getCode()); @@ -353,8 +351,8 @@ public class GroupingExecutorTestCase { exec = newExecution(new GroupingExecutor(), err, new ResultProvider(Arrays.asList( - new GroupingListHit(List.of(grp0), null), - new GroupingListHit(List.of(grp1), null)))); + new GroupingListHit(List.of(grp0), null, query), + new GroupingListHit(List.of(grp1), null, query)))); res = exec.search(query); assertNotNull(res.hits().getError()); assertEquals(Error.TIMEOUT.code, res.hits().getError().getCode()); @@ -392,8 +390,8 @@ public class GroupingExecutorTestCase { SummaryMapper sm = new SummaryMapper(); Execution exec = newExecution(new GroupingExecutor(), new ResultProvider(Arrays.asList( - new GroupingListHit(Arrays.asList(pass0A, pass0B), null), - new GroupingListHit(Arrays.asList(pass1A, pass1B), null))), + new GroupingListHit(Arrays.asList(pass0A, pass0B), null, query), + new GroupingListHit(Arrays.asList(pass1A, pass1B), null, query))), sm); exec.fill(exec.search(query), "default"); assertEquals(2, sm.hitsBySummary.size()); @@ -436,8 +434,8 @@ public class GroupingExecutorTestCase { .addHit(new com.yahoo.searchlib.aggregation.FS4Hit())))); Execution exec = newExecution(new GroupingExecutor(), new ResultProvider(Arrays.asList( - new GroupingListHit(List.of(pass0), null), - new GroupingListHit(List.of(pass1), null)))); + new GroupingListHit(List.of(pass0), null, query), + new GroupingListHit(List.of(pass1), null, query)))); Result res = exec.search(query); exec.fill(res); @@ -457,7 +455,7 @@ public class GroupingExecutorTestCase { .addChild(new com.yahoo.searchlib.aggregation.Group().setId(new StringResultNode("foo")) .addAggregationResult(new HitsAggregationResult(1, "bar")) )); - GroupingListHit pass0 = new GroupingListHit(List.of(grp), null); + GroupingListHit pass0 = new GroupingListHit(List.of(grp), null, queryA); GlobalId gid = new GlobalId((new DocumentId("id:ns:type::1")).getGlobalId()); grp = new Grouping(0); @@ -465,9 +463,8 @@ public class GroupingExecutorTestCase { .addChild(new com.yahoo.searchlib.aggregation.Group().setId(new StringResultNode("foo")) .addAggregationResult(new HitsAggregationResult(1, "bar").addHit(new com.yahoo.searchlib.aggregation.FS4Hit(4, gid, 6))) )); - GroupingListHit pass1 = new GroupingListHit(List.of(grp), null); Query queryB = newQuery(); // required by GroupingListHit.getSearchQuery() - pass1.setQuery(queryB); + GroupingListHit pass1 = new GroupingListHit(List.of(grp), null, queryB); QueryMapper qm = new QueryMapper(); Execution exec = newExecution(new GroupingExecutor(), @@ -569,10 +566,10 @@ public class GroupingExecutorTestCase { .addChild(new com.yahoo.searchlib.aggregation.Group().setId(new StringResultNode("uniqueC")).addAggregationResult(new MaxAggregationResult().setMax(new IntegerResultNode(7)).setTag(4))) .addChild(new com.yahoo.searchlib.aggregation.Group().setId(new StringResultNode("common")).addAggregationResult(new MaxAggregationResult().setMax(new IntegerResultNode(11)).setTag(4))) ); - resultsByDocumentType.put("typeA", List.of(new GroupingListHit(List.of(groupA1), null), - new GroupingListHit(List.of(groupA2), null))); - resultsByDocumentType.put("typeB", List.of(new GroupingListHit(List.of(groupB1), null), - new GroupingListHit(List.of(groupB2), null))); + resultsByDocumentType.put("typeA", List.of(new GroupingListHit(List.of(groupA1), null, query), + new GroupingListHit(List.of(groupA2), null, query))); + resultsByDocumentType.put("typeB", List.of(new GroupingListHit(List.of(groupB1), null, query), + new GroupingListHit(List.of(groupB2), null, query))); Execution execution = newExecution(new GroupingExecutor(), new MockClusterSearcher(), new MultiDocumentTypeResultProvider(resultsByDocumentType)); @@ -742,11 +739,7 @@ public class GroupingExecutorTestCase { for (Iterator it = result.hits().deepIterator(); it.hasNext();) { Hit hit = it.next(); Query query = hit.getQuery(); - List lst = hitsByQuery.get(query); - if (lst == null) { - lst = new LinkedList<>(); - hitsByQuery.put(query, lst); - } + List lst = hitsByQuery.computeIfAbsent(query, k -> new LinkedList<>()); lst.add(hit); } } @@ -767,11 +760,7 @@ public class GroupingExecutorTestCase { public void fill(Result result, String summaryClass, Execution exec) { for (Iterator it = result.hits().deepIterator(); it.hasNext();) { Hit hit = it.next(); - List lst = hitsBySummary.get(summaryClass); - if (lst == null) { - lst = new LinkedList<>(); - hitsBySummary.put(summaryClass, lst); - } + List lst = hitsBySummary.computeIfAbsent(summaryClass, k -> new LinkedList<>()); lst.add(hit); } } diff --git a/container-search/src/test/java/com/yahoo/search/grouping/vespa/HitConverterTestCase.java b/container-search/src/test/java/com/yahoo/search/grouping/vespa/HitConverterTestCase.java index 8f775e9923a..57f6ee7d65f 100644 --- a/container-search/src/test/java/com/yahoo/search/grouping/vespa/HitConverterTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/grouping/vespa/HitConverterTestCase.java @@ -4,8 +4,8 @@ package com.yahoo.search.grouping.vespa; import com.yahoo.document.DocumentId; import com.yahoo.document.GlobalId; import com.yahoo.net.URI; +import com.yahoo.prelude.fastsearch.DocumentDatabase; import com.yahoo.prelude.fastsearch.GroupingListHit; -import com.yahoo.prelude.fastsearch.DocsumDefinitionSet; import com.yahoo.prelude.fastsearch.FastHit; import com.yahoo.search.Query; import com.yahoo.search.Result; @@ -19,7 +19,7 @@ import com.yahoo.searchlib.aggregation.FS4Hit; import com.yahoo.searchlib.aggregation.VdsHit; import org.junit.jupiter.api.Test; -import java.util.Collections; +import java.util.List; import static org.junit.jupiter.api.Assertions.*; @@ -34,24 +34,24 @@ public class HitConverterTestCase { @Test void requireThatHitsAreConverted() { - HitConverter converter = new HitConverter(new MySearcher(), new Query()); - Hit hit = converter.toSearchHit("default", new FS4Hit(1, createGlobalId(2), 3).setContext(context())); + Query query = new Query(); + HitConverter converter = new HitConverter(new MySearcher()); + Hit hit = converter.toSearchHit("default", new FS4Hit(1, createGlobalId(2), 3).setContext(context(query))); assertNotNull(hit); assertEquals(new URI("index:null/1/" + asHexString(createGlobalId(2))), hit.getId()); - hit = converter.toSearchHit("default", new FS4Hit(4, createGlobalId(5), 6).setContext(context())); + hit = converter.toSearchHit("default", new FS4Hit(4, createGlobalId(5), 6).setContext(context(query))); assertNotNull(hit); assertEquals(new URI("index:null/4/" + asHexString(createGlobalId(5))), hit.getId()); } @Test void requireThatContextDataIsCopied() { - Hit ctxHit = context(); - ctxHit.setSource("69"); Query ctxQuery = new Query(); - ctxHit.setQuery(ctxQuery); + Hit ctxHit = context(ctxQuery); + ctxHit.setSource("69"); - HitConverter converter = new HitConverter(new MySearcher(), new Query()); + HitConverter converter = new HitConverter(new MySearcher()); Hit hit = converter.toSearchHit("default", new FS4Hit(1, createGlobalId(2), 3).setContext(ctxHit)); assertNotNull(hit); assertTrue(hit instanceof FastHit); @@ -63,9 +63,10 @@ public class HitConverterTestCase { @Test void requireThatSummaryClassIsSet() { + Query query = new Query(); Searcher searcher = new MySearcher(); - HitConverter converter = new HitConverter(searcher, new Query()); - Hit hit = converter.toSearchHit("69", new FS4Hit(1, createGlobalId(2), 3).setContext(context())); + HitConverter converter = new HitConverter(searcher); + Hit hit = converter.toSearchHit("69", new FS4Hit(1, createGlobalId(2), 3).setContext(context(query))); assertNotNull(hit); assertTrue(hit instanceof FastHit); assertEquals("69", hit.getSearcherSpecificMetaData(searcher)); @@ -73,7 +74,7 @@ public class HitConverterTestCase { @Test void requireThatHitHasContext() { - HitConverter converter = new HitConverter(new MySearcher(), new Query()); + HitConverter converter = new HitConverter(new MySearcher()); try { converter.toSearchHit("69", new FS4Hit(1, createGlobalId(2), 3)); fail(); @@ -84,7 +85,7 @@ public class HitConverterTestCase { @Test void requireThatUnsupportedHitClassThrows() { - HitConverter converter = new HitConverter(new MySearcher(), new Query()); + HitConverter converter = new HitConverter(new MySearcher()); try { converter.toSearchHit("69", new com.yahoo.searchlib.aggregation.Hit() { @@ -95,21 +96,22 @@ public class HitConverterTestCase { } } - private static GroupingListHit context() { - return new GroupingListHit(Collections.emptyList(), null); + private static GroupingListHit context(Query query) { + return new GroupingListHit(List.of(), null, query); } - private static DocsumDefinitionSet sixtynine() { + private static DocumentDatabase sixtynine() { var schema = new Schema.Builder("none"); var summary = new DocumentSummary.Builder("69"); schema.add(summary.build()); - return new DocsumDefinitionSet(schema.build()); + return new DocumentDatabase(schema.build()); } @Test void requireThatVdsHitCanBeConverted() { - HitConverter converter = new HitConverter(new MySearcher(), new Query()); - GroupingListHit context = new GroupingListHit(null, sixtynine()); + Query query = new Query(); + HitConverter converter = new HitConverter(new MySearcher()); + GroupingListHit context = new GroupingListHit(null, sixtynine(), query); VdsHit lowHit = new VdsHit("id:ns:type::", new byte[]{0x55, 0x55, 0x55, 0x55}, 1); lowHit.setContext(context); Hit hit = converter.toSearchHit("69", lowHit); -- cgit v1.2.3