summaryrefslogtreecommitdiffstats
path: root/container-search/src/test/java/com/yahoo/search/grouping/UniqueGroupingSearcherTestCase.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/test/java/com/yahoo/search/grouping/UniqueGroupingSearcherTestCase.java')
-rw-r--r--container-search/src/test/java/com/yahoo/search/grouping/UniqueGroupingSearcherTestCase.java219
1 files changed, 219 insertions, 0 deletions
diff --git a/container-search/src/test/java/com/yahoo/search/grouping/UniqueGroupingSearcherTestCase.java b/container-search/src/test/java/com/yahoo/search/grouping/UniqueGroupingSearcherTestCase.java
new file mode 100644
index 00000000000..c674a8a0755
--- /dev/null
+++ b/container-search/src/test/java/com/yahoo/search/grouping/UniqueGroupingSearcherTestCase.java
@@ -0,0 +1,219 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.search.grouping;
+
+import com.yahoo.component.chain.Chain;
+import com.yahoo.prelude.query.QueryException;
+import com.yahoo.search.Query;
+import com.yahoo.search.Result;
+import com.yahoo.search.Searcher;
+import com.yahoo.search.grouping.result.Group;
+import com.yahoo.search.grouping.result.GroupList;
+import com.yahoo.search.grouping.result.HitList;
+import com.yahoo.search.grouping.result.RootGroup;
+import com.yahoo.search.grouping.result.StringId;
+import com.yahoo.search.query.Sorting;
+import com.yahoo.search.result.Hit;
+import com.yahoo.search.result.Relevance;
+import com.yahoo.search.searchchain.Execution;
+import com.yahoo.yolean.Exceptions;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+
+/**
+ * @author <a href="http://techyard.corp.yahoo-inc.com/en/user/andreer">Andreas Eriksen</a>
+ */
+public class UniqueGroupingSearcherTestCase {
+
+ @Test
+ public void testSkipGroupingBasedDedup() throws Exception {
+ Result result = search("?query=foo",
+ new MockResultProvider(0, false));
+ assertEquals(0, result.hits().size());
+ }
+
+ @Test
+ public void testSkipGroupingBasedDedupIfMultiLevelSorting() throws Exception {
+ Result result = search("?query=foo&unique=fingerprint&sorting=-pubdate%20-[rank]",
+ new MockResultProvider(0, false));
+ assertEquals(0, result.hits().size());
+ }
+ @Test
+ public void testIllegalSortingSpec() {
+ try {
+ search("?query=foo&unique=fingerprint&sorting=-1",
+ new MockResultProvider(0, true).addGroupList(new GroupList("fingerprint")));
+ fail("Above statement should throw");
+ } catch (QueryException e) {
+ // As expected.
+ assertThat(
+ Exceptions.toMessageString(e),
+ containsString(
+ "Invalid request parameter: Could not set 'ranking.sorting' to '-1': " +
+ "Illegal attribute name '1' for sorting. Requires '[\\[]*[a-zA-Z_][\\.a-zA-Z0-9_-]*[\\]]*'"));
+ }
+ }
+
+ @Test
+ public void testGroupingBasedDedupNoGroupingHits() throws Exception {
+ Result result = search("?query=foo&unique=fingerprint",
+ new MockResultProvider(0, true));
+ assertEquals(0, result.hits().size());
+ }
+
+ @Test
+ public void testGroupingBasedDedupWithEmptyGroupingHitsList() throws Exception {
+ Result result = search("?query=foo&unique=fingerprint",
+ new MockResultProvider(0, true).addGroupList(new GroupList("fingerprint")));
+ assertEquals(0, result.hits().size());
+ assertEquals(0, result.getTotalHitCount());
+ }
+
+ @Test
+ public void testGroupingBasedDedupWithNullGroupingResult() throws Exception {
+ try {
+ search("?query=foo&unique=fingerprint",
+ new MockResultProvider(0, false));
+ fail();
+ } catch (IllegalStateException e) {
+ assertEquals("Failed to produce deduped result set.", e.getMessage());
+ }
+ }
+
+ @Test
+ public void testGroupingBasedDedupWithGroupingHits() throws Exception {
+ GroupList fingerprint = new GroupList("fingerprint");
+ fingerprint.add(makeHitGroup("1"));
+ fingerprint.add(makeHitGroup("2"));
+ fingerprint.add(makeHitGroup("3"));
+ fingerprint.add(makeHitGroup("4"));
+ fingerprint.add(makeHitGroup("5"));
+ fingerprint.add(makeHitGroup("6"));
+ fingerprint.add(makeHitGroup("7"));
+
+ MockResultProvider mockResultProvider = new MockResultProvider(15, true);
+ mockResultProvider.addGroupList(fingerprint);
+ mockResultProvider.resultGroup.setField(UniqueGroupingSearcher.LABEL_COUNT, 42l);
+ Result result = search("?query=foo&unique=fingerprint&hits=5&offset=1", mockResultProvider);
+ assertEquals(5, result.hits().size());
+ assertEquals("2", result.hits().get(0).getId().toString());
+ assertEquals("3", result.hits().get(1).getId().toString());
+ assertEquals("4", result.hits().get(2).getId().toString());
+ assertEquals("5", result.hits().get(3).getId().toString());
+ assertEquals("6", result.hits().get(4).getId().toString());
+ assertEquals(42, result.getTotalHitCount());
+ }
+
+ @Test
+ public void testGroupingBasedDedupWithGroupingHitsAndSorting() throws Exception {
+ GroupList fingerprint = new GroupList("fingerprint");
+ fingerprint.add(makeSortingHitGroup("1"));
+ fingerprint.add(makeSortingHitGroup("2"));
+ fingerprint.add(makeSortingHitGroup("3"));
+ fingerprint.add(makeSortingHitGroup("4"));
+ fingerprint.add(makeSortingHitGroup("5"));
+ fingerprint.add(makeSortingHitGroup("6"));
+ fingerprint.add(makeSortingHitGroup("7"));
+
+ MockResultProvider mockResultProvider = new MockResultProvider(100, true);
+ mockResultProvider.addGroupList(fingerprint);
+ mockResultProvider.resultGroup.setField(UniqueGroupingSearcher.LABEL_COUNT, 1337l);
+
+ Result result = search("?query=foo&unique=fingerprint&hits=5&offset=1&sorting=-expdate", mockResultProvider);
+ assertEquals(5, result.hits().size());
+ assertEquals("2", result.hits().get(0).getId().toString());
+ assertEquals("3", result.hits().get(1).getId().toString());
+ assertEquals("4", result.hits().get(2).getId().toString());
+ assertEquals("5", result.hits().get(3).getId().toString());
+ assertEquals("6", result.hits().get(4).getId().toString());
+ assertEquals(1337, result.getTotalHitCount());
+ }
+
+ @Test
+ public void testBuildGroupingExpression() throws Exception {
+ assertEquals("all(group(title) max(11) output(count() as(uniqueCount)) each(max(1) each(output(summary())) " +
+ "as(uniqueHits)))",
+ UniqueGroupingSearcher
+ .buildGroupingExpression("title", 11, null, null)
+ .toString());
+ assertEquals("all(group(fingerprint) max(5) output(count() as(uniqueCount)) each(max(1) " +
+ "each(output(summary(attributeprefetch))) as(uniqueHits)))",
+ UniqueGroupingSearcher
+ .buildGroupingExpression("fingerprint", 5, "attributeprefetch", null)
+ .toString());
+ assertEquals("all(group(fingerprint) max(5) order(neg(max(pubdate))) output(count() as(uniqueCount)) each(" +
+ "all(group(neg(pubdate)) max(1) order(neg(max(pubdate))) each(each(output(summary())) " +
+ "as(uniqueHits)) as(uniqueGroups))))",
+ UniqueGroupingSearcher
+ .buildGroupingExpression("fingerprint", 5, null, new Sorting("-pubdate"))
+ .toString());
+ assertEquals("all(group(fingerprint) max(5) order(min(pubdate)) output(count() as(uniqueCount)) each(" +
+ "all(group(pubdate) max(1) order(min(pubdate)) each(each(output(summary(attributeprefetch))) " +
+ "as(uniqueHits)) as(uniqueGroups))))",
+ UniqueGroupingSearcher
+ .buildGroupingExpression("fingerprint", 5, "attributeprefetch", new Sorting("+pubdate"))
+ .toString());
+ }
+
+ private static Group makeHitGroup(String name) {
+ Group ein = new Group(new StringId(name), new Relevance(0));
+ HitList hits = new HitList(UniqueGroupingSearcher.LABEL_HITS);
+ hits.add(new Hit(name));
+ ein.add(hits);
+ return ein;
+ }
+
+ private static Group makeSortingHitGroup(String name) {
+ Hit hit = new Hit(name);
+
+ HitList hits = new HitList(UniqueGroupingSearcher.LABEL_HITS);
+ hits.add(hit);
+
+ Group dedupGroup = new Group(new StringId(name), new Relevance(0));
+ dedupGroup.add(hits);
+
+ GroupList dedupedHits = new GroupList(UniqueGroupingSearcher.LABEL_GROUPS);
+ dedupedHits.add(dedupGroup);
+
+ Group ein = new Group(new StringId(name), new Relevance(0));
+ ein.add(dedupedHits);
+ return ein;
+ }
+
+ private static Result search(String query, MockResultProvider result) {
+ return new Execution(new Chain<>(new UniqueGroupingSearcher(), result),
+ Execution.Context.createContextStub()).search(new Query(query));
+ }
+
+ private static class MockResultProvider extends Searcher {
+
+ final RootGroup resultGroup;
+ final long totalHitCount;
+ final boolean addGroupingData;
+
+ MockResultProvider(long totalHitCount, boolean addGroupingData) {
+ this.addGroupingData = addGroupingData;
+ this.resultGroup = new RootGroup(0, null);
+ this.totalHitCount = totalHitCount;
+ }
+
+ MockResultProvider addGroupList(GroupList groupList) {
+ resultGroup.add(groupList);
+ return this;
+ }
+
+ @Override
+ public Result search(Query query, Execution execution) {
+ Result result = new Result(query);
+ if (addGroupingData) {
+ result.hits().add(resultGroup);
+ GroupingRequest.getRequests(query).get(0).setResultGroup(resultGroup);
+ result.setTotalHitCount(totalHitCount);
+ }
+ return result;
+ }
+ }
+}