summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/grouping
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2017-05-18 16:56:12 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2017-05-18 16:56:12 +0200
commit3e62f621164344afc9b7ccc59a88f30169a79800 (patch)
tree0b1f2c0833c1e3a374347a2a41c266faad4c3298 /container-search/src/main/java/com/yahoo/search/grouping
parente098893cb83228997b4ebe71a734e3a916cdb92e (diff)
Try to avoid ignoring users fill argument
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/grouping')
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java40
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/vespa/HitConverter.java30
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/vespa/ResultBuilder.java4
3 files changed, 42 insertions, 32 deletions
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 70942fa2553..0f1322c08d0 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
@@ -38,7 +38,7 @@ import com.yahoo.vespa.objects.ObjectPredicate;
* transformation from the abstract request to Vespa grouping expressions (using {@link RequestBuilder}), and the
* corresponding transformation of results (using {@link ResultBuilder}).
*
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
+ * @author Simon Thoresen
*/
@After({ GroupingValidator.GROUPING_VALIDATED,
"com.yahoo.search.querytransform.WandSearcher",
@@ -83,9 +83,9 @@ public class GroupingExecutor extends Searcher {
// Convert requests to Vespa style grouping.
Map<Integer, Grouping> groupingMap = new HashMap<>();
- List<RequestContext> ctxList = new LinkedList<>();
+ List<RequestContext> requestContextList = new LinkedList<>();
for (GroupingRequest grpRequest : reqList) {
- ctxList.add(convertRequest(query, grpRequest, groupingMap));
+ requestContextList.add(convertRequest(query, grpRequest, groupingMap));
}
if (groupingMap.isEmpty()) {
return execution.search(query);
@@ -96,10 +96,10 @@ public class GroupingExecutor extends Searcher {
// Convert Vespa style results to hits.
HitConverter hitConverter = new HitConverter(this, query);
- for (RequestContext ctx : ctxList) {
- RootGroup grp = convertResult(ctx, groupingMap, hitConverter);
- ctx.request.setResultGroup(grp);
- result.hits().add(grp);
+ for (RequestContext context : requestContextList) {
+ RootGroup group = convertResult(context, groupingMap, hitConverter);
+ context.request.setResultGroup(group);
+ result.hits().add(group);
}
return result;
}
@@ -110,11 +110,21 @@ public class GroupingExecutor extends Searcher {
for (Iterator<Hit> it = result.hits().unorderedDeepIterator(); it.hasNext(); ) {
Hit hit = it.next();
Object metaData = hit.getSearcherSpecificMetaData(this);
- String hitSummary = (metaData instanceof String) ? (String)metaData : summaryClass;
- Result summaryResult = summaryMap.get(hitSummary);
+ if (metaData != null && metaData instanceof String) {
+ // Use the summary class specified by grouping, set in HitConverter, for the first fill request
+ // after grouping. This assumes the first fill request is using the default summary class,
+ // which may be a fragile assumption. But currently we cannot do better because the difference
+ // between explicit and implicit summary class in fill is erased by the Execution.
+ //
+ // We reset the summary class here such that following fill calls will execute with the
+ // summary class they specify
+ summaryClass = (String) metaData;
+ hit.setSearcherSpecificMetaData(this, null);
+ }
+ Result summaryResult = summaryMap.get(summaryClass);
if (summaryResult == null) {
summaryResult = new Result(result.getQuery());
- summaryMap.put(hitSummary, summaryResult);
+ summaryMap.put(summaryClass, summaryResult);
}
summaryResult.hits().add(hit);
}
@@ -169,18 +179,18 @@ public class GroupingExecutor extends Searcher {
/**
* Converts the results of the given request context into a single {@link Group}.
*
- * @param requestCtx The context that identifies the results to convert.
+ * @param requestContext The context that identifies the results to convert.
* @param groupingMap The map of all {@link Grouping} objects available.
* @param hitConverter The converter to use for {@link Hit} conversion.
* @return The corresponding root RootGroup.
*/
- private RootGroup convertResult(RequestContext requestCtx, Map<Integer, Grouping> groupingMap,
+ private RootGroup convertResult(RequestContext requestContext, Map<Integer, Grouping> groupingMap,
HitConverter hitConverter) {
ResultBuilder builder = new ResultBuilder();
builder.setHitConverter(hitConverter);
- builder.setTransform(requestCtx.transform);
- builder.setRequestId(requestCtx.request.getRequestId());
- for (Integer grpId : requestCtx.idList) {
+ builder.setTransform(requestContext.transform);
+ builder.setRequestId(requestContext.request.getRequestId());
+ for (Integer grpId : requestContext.idList) {
builder.addGroupingResult(groupingMap.get(grpId));
}
builder.build();
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 81ae100b84f..388f528b535 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
@@ -14,7 +14,7 @@ import com.yahoo.searchlib.aggregation.VdsHit;
/**
* Implementation of the {@link ResultBuilder.HitConverter} interface for {@link GroupingExecutor}.
*
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
+ * @author Simon Thoresen
*/
class HitConverter implements ResultBuilder.HitConverter {
@@ -43,32 +43,32 @@ class HitConverter implements ResultBuilder.HitConverter {
}
}
- private Hit convertFs4Hit(String summaryClass, FS4Hit grpHit) {
- FastHit ret = new FastHit();
- ret.setRelevance(grpHit.getRank());
- ret.setGlobalId(grpHit.getGlobalId());
- ret.setPartId(grpHit.getPath(), 0);
- ret.setDistributionKey(grpHit.getDistributionKey());
- ret.setFillable();
- ret.setSearcherSpecificMetaData(searcher, summaryClass);
+ private Hit convertFs4Hit(String summaryClass, FS4Hit groupHit) {
+ FastHit hit = new FastHit();
+ hit.setRelevance(groupHit.getRank());
+ hit.setGlobalId(groupHit.getGlobalId());
+ hit.setPartId(groupHit.getPath(), 0);
+ hit.setDistributionKey(groupHit.getDistributionKey());
+ hit.setFillable();
+ hit.setSearcherSpecificMetaData(searcher, summaryClass);
- Hit ctxHit = (Hit)grpHit.getContext();
+ Hit ctxHit = (Hit)groupHit.getContext();
if (ctxHit == null) {
throw new NullPointerException("Hit has no context.");
}
- ret.setSource(ctxHit.getSource());
- ret.setSourceNumber(ctxHit.getSourceNumber());
- ret.setQuery(ctxHit.getQuery());
+ hit.setSource(ctxHit.getSource());
+ hit.setSourceNumber(ctxHit.getSourceNumber());
+ hit.setQuery(ctxHit.getQuery());
if (ctxHit instanceof GroupingListHit) {
// in a live system the ctxHit can only by GroupingListHit, but because the code used Hit prior to version
// 5.10 we need to check to avoid breaking existing unit tests -- both internally and with customers
QueryPacketData queryPacketData = ((GroupingListHit)ctxHit).getQueryPacketData();
if (queryPacketData != null) {
- ret.setQueryPacketData(queryPacketData);
+ hit.setQueryPacketData(queryPacketData);
}
}
- return ret;
+ return hit;
}
private Hit convertVdsHit(String summaryClass, VdsHit grpHit) {
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/vespa/ResultBuilder.java b/container-search/src/main/java/com/yahoo/search/grouping/vespa/ResultBuilder.java
index 6caffc0d043..9b3601d35cb 100644
--- a/container-search/src/main/java/com/yahoo/search/grouping/vespa/ResultBuilder.java
+++ b/container-search/src/main/java/com/yahoo/search/grouping/vespa/ResultBuilder.java
@@ -52,7 +52,7 @@ import java.util.Map;
* This class implements the necessary logic to build a {@link RootGroup} from a list of {@link Grouping} objects. It is
* used by the {@link GroupingExecutor}.
*
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
+ * @author Simon Thoresen
*/
class ResultBuilder {
@@ -383,7 +383,7 @@ class ResultBuilder {
* Defines a helper interface to convert Vespa style grouping hits into corresponding instances of {@link Hit}. It
* is an interface to simplify testing.
*
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
+ * @author Simon Thoresen
*/
public interface HitConverter {