use of com.yahoo.search.grouping.result.Group in project vespa by vespa-engine.
the class UniqueGroupingSearcher method dedupe.
/**
* Until we can use the grouping pagination features in 5.1, we'll have to support offset
* by simply requesting and discarding hit #0 up to hit #offset.
*/
private static Result dedupe(Query query, Execution execution, String dedupField) {
Sorting sorting = query.getRanking().getSorting();
if (sorting != null && sorting.fieldOrders().size() > 1) {
query.trace("Can not use grouping for deduping with multi-level sorting.", 3);
// we'd ever want to actually use it (and a bit harder to implement as well).
return execution.search(query);
}
int hits = query.getHits();
int offset = query.getOffset();
int groupingHits = hits + offset;
GroupingRequest groupingRequest = GroupingRequest.newInstance(query);
groupingRequest.setRootOperation(buildGroupingExpression(dedupField, groupingHits, query.getPresentation().getSummary(), sorting));
query.setHits(0);
query.setOffset(0);
Result result = execution.search(query);
// query could have changed further down in the chain
query = result.getQuery();
query.setHits(hits);
query.setOffset(offset);
Group root = groupingRequest.getResultGroup(result);
if (null == root) {
String msg = "Result group not found for deduping grouping request, returning empty result.";
query.trace(msg, 3);
log.log(LogLevel.WARNING, msg);
throw new IllegalStateException("Failed to produce deduped result set.");
}
// hide our tracks
result.hits().remove(root.getId().toString());
GroupList resultGroups = root.getGroupList(dedupField);
if (resultGroups == null) {
query.trace("Deduping grouping request returned no hits, returning empty result.", 3);
return result;
}
// Make sure that .addAll() doesn't re-order the hits we copy from the grouping
// framework. The groups are already in the order they should be.
result.hits().setOrderer(NOP_ORDERER);
result.hits().addAll(getRequestedHits(resultGroups, offset, hits));
Long countField = (Long) root.getField(LABEL_COUNT);
long count = countField != null ? countField : 0;
result.setTotalHitCount(count);
return result;
}
use of com.yahoo.search.grouping.result.Group in project vespa by vespa-engine.
the class GroupingRequestTestCase method requireThatResultIsFound.
@Test
public void requireThatResultIsFound() {
Query query = new Query();
GroupingRequest req = GroupingRequest.newInstance(query);
Result res = new Result(query);
res.hits().add(new Hit("foo"));
RootGroup bar = newRootGroup(0);
req.setResultGroup(bar);
res.hits().add(bar);
res.hits().add(new Hit("baz"));
Group grp = req.getResultGroup(res);
assertNotNull(grp);
assertSame(bar, grp);
}
use of com.yahoo.search.grouping.result.Group in project vespa by vespa-engine.
the class GroupingRequestTestCase method requireThatParallelRequestsAreSupported.
@Test
public void requireThatParallelRequestsAreSupported() {
Query query = new Query();
Result res = new Result(query);
GroupingRequest reqA = GroupingRequest.newInstance(query);
RootGroup grpA = newRootGroup(0);
reqA.setResultGroup(grpA);
res.hits().add(grpA);
GroupingRequest reqB = GroupingRequest.newInstance(query);
RootGroup grpB = newRootGroup(1);
reqB.setResultGroup(grpB);
res.hits().add(grpB);
Group grp = reqA.getResultGroup(res);
assertNotNull(grp);
assertSame(grpA, grp);
assertNotNull(grp = reqB.getResultGroup(res));
assertSame(grpB, grp);
}
use of com.yahoo.search.grouping.result.Group in project vespa by vespa-engine.
the class GroupingExecutorTestCase method requireThatHitsAreFilledWithCorrectSummary.
@Test
public void requireThatHitsAreFilledWithCorrectSummary() {
Query query = newQuery();
GroupingRequest req = GroupingRequest.newInstance(query);
req.setRootOperation(GroupingOperation.fromString("all(group(foo) each(each(output(summary(bar))) as(bar) " + " each(output(summary(baz))) as(baz)))"));
Grouping pass0A = new Grouping(0);
pass0A.setRoot(new com.yahoo.searchlib.aggregation.Group().addChild(new com.yahoo.searchlib.aggregation.Group().setId(new StringResultNode("foo")).addAggregationResult(new HitsAggregationResult(1, "bar"))));
Grouping pass0B = new Grouping(1);
pass0B.setRoot(new com.yahoo.searchlib.aggregation.Group().addChild(new com.yahoo.searchlib.aggregation.Group().setId(new StringResultNode("foo")).addAggregationResult(new HitsAggregationResult(1, "baz"))));
GlobalId gid1 = new GlobalId((new DocumentId("doc:test:1")).getGlobalId());
GlobalId gid2 = new GlobalId((new DocumentId("doc:test:2")).getGlobalId());
Grouping pass1A = new Grouping(0);
pass1A.setRoot(new com.yahoo.searchlib.aggregation.Group().addChild(new com.yahoo.searchlib.aggregation.Group().setId(new StringResultNode("foo")).addAggregationResult(new HitsAggregationResult(1, "bar").addHit(new com.yahoo.searchlib.aggregation.FS4Hit(1, gid1, 3)))));
Grouping pass1B = new Grouping(1);
pass1B.setRoot(new com.yahoo.searchlib.aggregation.Group().addChild(new com.yahoo.searchlib.aggregation.Group().setId(new StringResultNode("foo")).addAggregationResult(new HitsAggregationResult(1, "baz").addHit(new com.yahoo.searchlib.aggregation.FS4Hit(4, gid2, 6)))));
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))), sm);
exec.fill(exec.search(query), "default");
assertEquals(2, sm.hitsBySummary.size());
List<Hit> lst = sm.hitsBySummary.get("bar");
assertNotNull(lst);
assertEquals(1, lst.size());
Hit hit = lst.get(0);
assertTrue(hit instanceof FastHit);
assertEquals(1, ((FastHit) hit).getPartId());
assertEquals(gid1, ((FastHit) hit).getGlobalId());
assertNotNull(lst = sm.hitsBySummary.get("baz"));
assertNotNull(lst);
assertEquals(1, lst.size());
hit = lst.get(0);
assertTrue(hit instanceof FastHit);
assertEquals(4, ((FastHit) hit).getPartId());
assertEquals(gid2, ((FastHit) hit).getGlobalId());
}
use of com.yahoo.search.grouping.result.Group in project vespa by vespa-engine.
the class GroupingExecutorTestCase method requireThatHitsAreAttachedToCorrectQuery.
@Test
public void requireThatHitsAreAttachedToCorrectQuery() {
Query queryA = newQuery();
GroupingRequest req = GroupingRequest.newInstance(queryA);
req.setRootOperation(GroupingOperation.fromString("all(group(foo) each(each(output(summary(bar)))))"));
Grouping grp = new Grouping(0);
grp.setRoot(new com.yahoo.searchlib.aggregation.Group().addChild(new com.yahoo.searchlib.aggregation.Group().setId(new StringResultNode("foo")).addAggregationResult(new HitsAggregationResult(1, "bar"))));
GroupingListHit pass0 = new GroupingListHit(Arrays.asList(grp), null);
GlobalId gid = new GlobalId((new DocumentId("doc:test:1")).getGlobalId());
grp = new Grouping(0);
grp.setRoot(new com.yahoo.searchlib.aggregation.Group().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(Arrays.asList(grp), null);
Query queryB = newQuery();
/**
* required by {@link GroupingListHit#getSearchQuery()}
*/
pass1.setQuery(queryB);
QueryMapper qm = new QueryMapper();
Execution exec = newExecution(new GroupingExecutor(), new ResultProvider(Arrays.asList(pass0, pass1)), qm);
exec.fill(exec.search(queryA));
assertEquals(1, qm.hitsByQuery.size());
assertTrue(qm.hitsByQuery.containsKey(queryB));
}
Aggregations