aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/attribute/changevector/changevector_test.cpp
blob: ff0b358ea2e05c878aa02042d6c04212e4fdc656 (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
// 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/attribute/changevector.hpp>
#include <vespa/vespalib/stllike/hash_set.h>
using namespace search;

using Change = ChangeTemplate<NumericChangeData<long>>;
using CV = ChangeVectorT<Change>;

template <typename T>
void verifyStrictOrdering(const T & v) {
    vespalib::hash_set<uint32_t> complete;
    uint32_t prev_doc(0);
    uint32_t prev_value(0);
    for (const auto & c : v.getDocIdInsertOrder()) {
        if (prev_doc != c._doc) {
            complete.insert(prev_doc);
            EXPECT_FALSE(complete.contains(c._doc));
            prev_doc = c._doc;
        } else {
            EXPECT_GREATER(c._data, prev_value);
        }
        prev_value = c._data;
    }
}

class Accessor {
public:
    Accessor(const std::vector<long> & v) : _size(v.size()), _current(v.begin()), _end(v.end()) { }
    size_t size() const { return _size; }
    void next() { _current++; }
    long value() const { return *_current; }
    int weight() const { return *_current; }
private:
    size_t _size;
    std::vector<long>::const_iterator _current;
    std::vector<long>::const_iterator _end;
};

TEST("require insert ordering is preserved for same doc")
{
    CV a;
    a.push_back(Change(Change::NOOP, 7, 1));
    EXPECT_EQUAL(1u, a.size());
    a.push_back(Change(Change::NOOP, 7, 2));
    EXPECT_EQUAL(2u, a.size());
    verifyStrictOrdering(a);
}

TEST("require insert ordering is preserved ")
{
    CV a;
    a.push_back(Change(Change::NOOP, 7, 1));
    EXPECT_EQUAL(1u, a.size());
    a.push_back(Change(Change::NOOP, 5, 2));
    EXPECT_EQUAL(2u, a.size());
    a.push_back(Change(Change::NOOP, 6, 3));
    EXPECT_EQUAL(3u, a.size());
    verifyStrictOrdering(a);
}

TEST("require insert ordering is preserved with mix")
{
    CV a;
    a.push_back(Change(Change::NOOP, 7, 1));
    EXPECT_EQUAL(1u, a.size());
    a.push_back(Change(Change::NOOP, 5, 2));
    EXPECT_EQUAL(2u, a.size());
    a.push_back(Change(Change::NOOP, 5, 3));
    EXPECT_EQUAL(3u, a.size());
    a.push_back(Change(Change::NOOP, 6, 10));
    EXPECT_EQUAL(4u, a.size());
    std::vector<long> v({4,5,6,7,8});
    Accessor ac(v);
    a.push_back(5, ac);
    EXPECT_EQUAL(9u, a.size());
    a.push_back(Change(Change::NOOP, 5, 9));
    EXPECT_EQUAL(10u, a.size());
    verifyStrictOrdering(a);
}

TEST("require that inserting empty vector does not affect the vector.") {
    CV a;
    std::vector<long> v;
    Accessor ac(v);
    a.push_back(1, ac);
    EXPECT_EQUAL(0u, a.size());
}

TEST("require that we have control over buffer construction size") {
    CV a;
    EXPECT_EQUAL(0u, a.size());
    EXPECT_EQUAL(4u, a.capacity());
    a.clear();
    EXPECT_EQUAL(0u, a.size());
    EXPECT_EQUAL(4u, a.capacity());
}

TEST("require that buffer can grow some") {
    CV a;
    for (size_t i(0); i < 1024; i++) {
        a.push_back(Change(Change::NOOP, i, i));
    }
    EXPECT_EQUAL(1024u, a.size());
    EXPECT_EQUAL(1024u, a.capacity());
    a.clear();
    EXPECT_EQUAL(0u, a.size());
    EXPECT_EQUAL(1024u, a.capacity());
}

TEST("require that buffer can grow some, but not unbound") {
    CV a;
    for (size_t i(0); i < 1025; i++) {
        a.push_back(Change(Change::NOOP, i, i));
    }
    EXPECT_EQUAL(1025u, a.size());
    EXPECT_EQUAL(2048u, a.capacity());
    a.clear();
    EXPECT_EQUAL(0u, a.size());
    EXPECT_EQUAL(256u, a.capacity());
}

TEST("Control Change size") {
    EXPECT_EQUAL(32u, sizeof(ChangeTemplate<NumericChangeData<long>>));
    EXPECT_EQUAL(80u, sizeof(ChangeTemplate<StringChangeData>));
}

TEST_MAIN() { TEST_RUN_ALL(); }