diff options
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.java | 219 |
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; + } + } +} |