aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/test/java/com/yahoo/prelude/searcher/test/MultipleResultsTestCase.java
blob: 0024bf9cd662b60ba164e7de9be1da7ee48a5015 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.prelude.searcher.test;

import com.yahoo.component.chain.Chain;
import com.yahoo.prelude.fastsearch.FastHit;
import com.yahoo.prelude.searcher.MultipleResultsSearcher;
import com.yahoo.search.Query;
import com.yahoo.search.Result;
import com.yahoo.search.Searcher;
import com.yahoo.search.result.Hit;
import com.yahoo.search.result.HitGroup;
import com.yahoo.search.searchchain.Execution;
import com.yahoo.search.searchchain.testutil.DocumentSourceSearcher;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

/**
 * Test of MultipleResultsSearcher
 *
 * @author Tony Vaagenes
 */
@SuppressWarnings("deprecation")
public class MultipleResultsTestCase {

    private DocumentSourceSearcher docSource;

    private MultipleResultsSearcher searcher;

    private Chain<Searcher> chain;

    @BeforeEach
    public void setUp() {
        docSource=new DocumentSourceSearcher();
        searcher=new MultipleResultsSearcher();
        chain=new Chain<>("multipleresultschain",searcher,docSource);
    }

    @Test
    void testRetrieveHeterogenousHits() {
        Query query = createQuery();

        Result originalResult = new Result(query);
        int n1 = 15, n2 = 25, n3 = 25, n4 = 25;
        addHits(originalResult, "others", n1);
        addHits(originalResult, "music", n2);
        addHits(originalResult, "movies", n3);
        addHits(originalResult, "others", n4);
        originalResult.setTotalHitCount(n1 + n2 + n3 + n4);

        docSource.addResult(query, originalResult);

        query.setWindow(0, 30);
        Result result = new Execution(chain, Execution.Context.createContextStub()).search(query);

        HitGroup musicGroup = (HitGroup) result.hits().get("music");
        HitGroup moviesGroup = (HitGroup) result.hits().get("movies");

        assertEquals(15, musicGroup.size());
        assertEquals(15, moviesGroup.size());
        assertEquals(3, docSource.getQueryCount());
    }

    @Test
    void testRetrieveHitsForGroup() {
        Query query = createQuery();

        Result originalResult = new Result(query);
        int n1 = 200, n2 = 30;
        addHits(originalResult, "music", n1, 1000);
        addHits(originalResult, "movies", n2, 100);
        originalResult.setTotalHitCount(n1 + n2);

        docSource.addResult(query, originalResult);

        Query restrictedQuery = createQuery("movies");
        Result restrictedResult = new Result(restrictedQuery);
        addHits(restrictedResult, "movies", n2, 100);
        restrictedResult.setTotalHitCount(n2);

        docSource.addResult(restrictedQuery, restrictedResult);

        query.setWindow(0, 30);
        Result result = new Execution(chain, Execution.Context.createContextStub()).search(query);

        HitGroup musicGroup = (HitGroup) result.hits().get("music");
        HitGroup moviesGroup = (HitGroup) result.hits().get("movies");

        assertEquals(15, musicGroup.size());
        assertEquals(15, moviesGroup.size());
    }

    @Test
    void testNoHitsForResultSet() {
        Query query = createQuery();

        Result originalResult = new Result(query);
        int n1 = 20;
        int n2 = 100;
        addHits(originalResult, "music", n1);
        addHits(originalResult, "other", n2);
        originalResult.setTotalHitCount(n1 + n2);

        docSource.addResult(query, originalResult);

        query.setWindow(0, 30);
        Result result = new Execution(chain, Execution.Context.createContextStub()).search(query);

        HitGroup musicGroup = (HitGroup) result.hits().get("music");
        HitGroup moviesGroup = (HitGroup) result.hits().get("movies");

        assertEquals(15, musicGroup.size());
        assertEquals(0, moviesGroup.size());
    }

    private void addHits(Result result, String docName, int numHits,
                         int baseRelevancy) {
        for (int i=0; i<numHits; ++i) {
            result.hits().add(createHit("foo" + i,
                                    baseRelevancy - i,
                                    docName));
        }
    }

    private void addHits(Result result, String docName, int numHits) {
        addHits(result, docName, numHits, 1000);
    }


    private FastHit createHit(String uri, int relevancy, String docName) {
        FastHit hit = new FastHit(uri,relevancy);
        hit.setField(Hit.SDDOCNAME_FIELD, docName);
        return hit;
    }

    private Query createQuery() {
        return new Query("?query=foo&" +
            "multipleresultsets.numHits=music:15,movies:15&" +
            "multipleresultsets.additionalHitsFactor=0.8&" +
            "multipleresultsets.maxTimesRetrieveHeterogeneousHits=3");
    }

    private Query createQuery(String restrictList) {
        Query query = createQuery();
        query.getModel().setRestrict(restrictList);
        return query;
    }

}