summaryrefslogtreecommitdiffstats
path: root/container-search/src/test/java/com/yahoo/prelude/searcher/test/MultipleResultsTestCase.java
blob: 8d427dfffa88508a46524738183e9389aa16785c (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
// Copyright 2017 Yahoo Holdings. 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;

/**
 * Test of MultipleResultsSearcher
 *
 * @author tonytv
 */
@SuppressWarnings("deprecation")
public class MultipleResultsTestCase extends junit.framework.TestCase {

    private DocumentSourceSearcher docSource;

    private MultipleResultsSearcher searcher;

    private Chain<Searcher> chain;

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


    public 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() );
    }

    public 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());
    }

    public 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;
    }
}