aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/queryeval/blueprint/leaf_blueprints_test.cpp
blob: 44be9fb0fca5a1f9efa030a873261c9e45ee6484 (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
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#include <vespa/vespalib/testkit/testapp.h>
#include <vespa/searchlib/queryeval/blueprint.h>
#include <vespa/searchlib/queryeval/leaf_blueprints.h>
#include <vespa/searchlib/fef/matchdata.h>

#include <vespa/log/log.h>
LOG_SETUP("blueprint_test");

using namespace search::queryeval;
using namespace search::fef;

class Test : public vespalib::TestApp
{
public:
    void testEmptyBlueprint();
    void testSimpleBlueprint();
    void testFakeBlueprint();
    int Main() override;
};

void
Test::testEmptyBlueprint()
{
    MatchData::UP md(MatchData::makeTestInstance(100, 10));
    EmptyBlueprint empty(FieldSpecBase(1, 11));
    ASSERT_TRUE(empty.getState().numFields() == 1u);
    EXPECT_EQUAL(1u, empty.getState().field(0).getFieldId());
    EXPECT_EQUAL(11u, empty.getState().field(0).getHandle());

    empty.fetchPostings(ExecuteInfo::TRUE);
    SearchIterator::UP search = empty.createSearch(*md, true);

    SimpleResult res;
    res.search(*search);
    SimpleResult expect; // empty
    EXPECT_EQUAL(res, expect);
}

void
Test::testSimpleBlueprint()
{
    MatchData::UP md(MatchData::makeTestInstance(100, 10));
    SimpleResult a;
    a.addHit(3).addHit(5).addHit(7);
    SimpleBlueprint simple(a);
    simple.tag("tag");
    EXPECT_EQUAL("tag", simple.tag());
    simple.fetchPostings(ExecuteInfo::TRUE);
    SearchIterator::UP search = simple.createSearch(*md, true);

    SimpleResult res;
    res.search(*search);
    SimpleResult expect;
    expect.addHit(3).addHit(5).addHit(7);
    EXPECT_EQUAL(res, expect);
}

void
Test::testFakeBlueprint()
{
    MatchData::UP md(MatchData::makeTestInstance(100, 10));
    FakeResult fake;
    fake.doc(10).len(50).pos(2).pos(3)
        .doc(25).len(10).pos(5);

    uint32_t fieldId = 0;
    TermFieldHandle handle = 0;
    FakeBlueprint orig(FieldSpec("<field>", fieldId, handle), fake);

    orig.fetchPostings(ExecuteInfo::TRUE);
    SearchIterator::UP search = orig.createSearch(*md, true);
    search->initFullRange();
    EXPECT_TRUE(!search->seek(1u));
    EXPECT_EQUAL(10u, search->getDocId());
    {
        search->unpack(10u);
        TermFieldMatchData &data = *md->resolveTermField(handle);
        EXPECT_EQUAL(fieldId, data.getFieldId());
        EXPECT_EQUAL(10u, data.getDocId());
        EXPECT_EQUAL(10u, data.getDocId());
        FieldPositionsIterator itr = data.getIterator();
        EXPECT_EQUAL(50u, itr.getFieldLength());
        EXPECT_EQUAL(2u, itr.size());
        ASSERT_TRUE(itr.valid());
        EXPECT_EQUAL(2u, itr.getPosition());
        itr.next();
        ASSERT_TRUE(itr.valid());
        EXPECT_EQUAL(3u, itr.getPosition());
        itr.next();
        EXPECT_TRUE(!itr.valid());
    }
    EXPECT_TRUE(search->seek(25));
    EXPECT_EQUAL(25u, search->getDocId());
    {
        search->unpack(25u);
        TermFieldMatchData &data = *md->resolveTermField(handle);
        EXPECT_EQUAL(fieldId, data.getFieldId());
        EXPECT_EQUAL(25u, data.getDocId());
        FieldPositionsIterator itr = data.getIterator();
        EXPECT_EQUAL(10u, itr.getFieldLength());
        EXPECT_EQUAL(1u, itr.size());
        ASSERT_TRUE(itr.valid());
        EXPECT_EQUAL(5u, itr.getPosition());
        itr.next();
        EXPECT_TRUE(!itr.valid());
    }
    EXPECT_TRUE(!search->seek(50));
    EXPECT_TRUE(search->isAtEnd());
}

int
Test::Main()
{
    TEST_INIT("leaf_blueprints_test");
    testEmptyBlueprint();
    testSimpleBlueprint();
    testFakeBlueprint();
    TEST_DONE();
}

TEST_APPHOOK(Test);