Branch data Line data Source code
1 : : /** @file api_sorting.cc
2 : : * @brief tests of MSet sorting
3 : : */
4 : : /* Copyright (C) 2007,2008,2009 Olly Betts
5 : : *
6 : : * This program is free software; you can redistribute it and/or modify
7 : : * it under the terms of the GNU General Public License as published by
8 : : * the Free Software Foundation; either version 2 of the License, or
9 : : * (at your option) any later version.
10 : : *
11 : : * This program is distributed in the hope that it will be useful,
12 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : : * GNU General Public License for more details.
15 : : *
16 : : * You should have received a copy of the GNU General Public License
17 : : * along with this program; if not, write to the Free Software
18 : : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 : : */
20 : :
21 : : #include <config.h>
22 : :
23 : : #include "api_sorting.h"
24 : :
25 : : #include <xapian.h>
26 : :
27 : : #include "apitest.h"
28 : : #include "testutils.h"
29 : :
30 : : using namespace std;
31 : :
32 : 7 : DEFINE_TESTCASE(sortfunctor1,backend && !remote) {
33 : 7 : Xapian::Enquire enquire(get_database("apitest_sortrel"));
34 : 7 : enquire.set_query(Xapian::Query("woman"));
35 : :
36 : : {
37 : 7 : const int keys[] = { 3, 1 };
38 : 7 : Xapian::MultiValueKeyMaker sorter(keys, keys + 2);
39 : :
40 : 7 : enquire.set_sort_by_key(&sorter, true);
41 : 7 : Xapian::MSet mset = enquire.get_mset(0, 10);
42 : 7 : mset_expect_order(mset, 2, 6, 7, 1, 3, 4, 5, 8, 9);
43 : : }
44 : :
45 : : {
46 : 7 : Xapian::MultiValueKeyMaker sorter;
47 : 7 : sorter.add_value(3);
48 : 7 : sorter.add_value(1, true);
49 : :
50 : 7 : enquire.set_sort_by_key(&sorter, true);
51 : 7 : Xapian::MSet mset = enquire.get_mset(0, 10);
52 : 7 : mset_expect_order(mset, 7, 6, 2, 8, 9, 4, 5, 1, 3);
53 : : }
54 : :
55 : : {
56 : 7 : Xapian::MultiValueKeyMaker sorter;
57 : 7 : sorter.add_value(100); // Value 100 isn't set.
58 : 7 : sorter.add_value(3);
59 : 7 : sorter.add_value(1, true);
60 : :
61 : 7 : enquire.set_sort_by_key(&sorter, true);
62 : 7 : Xapian::MSet mset = enquire.get_mset(0, 10);
63 : 7 : mset_expect_order(mset, 7, 6, 2, 8, 9, 4, 5, 1, 3);
64 : : }
65 : :
66 : : {
67 : 7 : Xapian::MultiValueKeyMaker sorter;
68 : 7 : sorter.add_value(10); // Value 10 isn't always set.
69 : 7 : sorter.add_value(1, true);
70 : :
71 : 7 : enquire.set_sort_by_key(&sorter, true);
72 : 7 : Xapian::MSet mset = enquire.get_mset(0, 10);
73 : 7 : mset_expect_order(mset, 8, 9, 4, 5, 1, 3, 7, 6, 2);
74 : : }
75 : :
76 : 7 : return true;
77 : : }
78 : :
79 : : /// Test reverse sort functor.
80 : 4 : DEFINE_TESTCASE(sortfunctor2,writable && !remote) {
81 : 4 : Xapian::WritableDatabase db = get_writable_database();
82 : 4 : Xapian::Document doc;
83 : 4 : doc.add_term("foo");
84 : 4 : doc.add_value(0, "ABB");
85 : 4 : db.add_document(doc);
86 : 4 : doc.add_value(0, "ABC");
87 : 4 : db.add_document(doc);
88 : 4 : doc.add_value(0, string("ABC", 4));
89 : 4 : db.add_document(doc);
90 : 4 : doc.add_value(0, "ABCD");
91 : 4 : db.add_document(doc);
92 : 4 : doc.add_value(0, "ABC\xff");
93 : 4 : db.add_document(doc);
94 : :
95 : 4 : Xapian::Enquire enquire(db);
96 : 4 : enquire.set_query(Xapian::Query("foo"));
97 : :
98 : : {
99 : 4 : Xapian::MultiValueKeyMaker sorter;
100 : 4 : sorter.add_value(0);
101 : 4 : enquire.set_sort_by_key(&sorter, true);
102 : 4 : Xapian::MSet mset = enquire.get_mset(0, 10);
103 : 4 : mset_expect_order(mset, 5, 4, 3, 2, 1);
104 : : }
105 : :
106 : : {
107 : 4 : Xapian::MultiValueKeyMaker sorter;
108 : 4 : sorter.add_value(0, true);
109 : 4 : enquire.set_sort_by_key(&sorter, true);
110 : 4 : Xapian::MSet mset = enquire.get_mset(0, 10);
111 : 4 : mset_expect_order(mset, 1, 2, 3, 4, 5);
112 : : }
113 : :
114 : : {
115 : 4 : Xapian::MultiValueKeyMaker sorter;
116 : 4 : sorter.add_value(0);
117 : 4 : sorter.add_value(1);
118 : 4 : enquire.set_sort_by_key(&sorter, true);
119 : 4 : Xapian::MSet mset = enquire.get_mset(0, 10);
120 : 4 : mset_expect_order(mset, 5, 4, 3, 2, 1);
121 : : }
122 : :
123 : : {
124 : 4 : Xapian::MultiValueKeyMaker sorter;
125 : 4 : sorter.add_value(0, true);
126 : 4 : sorter.add_value(1);
127 : 4 : enquire.set_sort_by_key(&sorter, true);
128 : 4 : Xapian::MSet mset = enquire.get_mset(0, 10);
129 : 4 : mset_expect_order(mset, 1, 2, 3, 4, 5);
130 : : }
131 : :
132 : : {
133 : 4 : Xapian::MultiValueKeyMaker sorter;
134 : 4 : sorter.add_value(0);
135 : 4 : sorter.add_value(1, true);
136 : 4 : enquire.set_sort_by_key(&sorter, true);
137 : 4 : Xapian::MSet mset = enquire.get_mset(0, 10);
138 : 4 : mset_expect_order(mset, 5, 4, 3, 2, 1);
139 : : }
140 : :
141 : : {
142 : 4 : Xapian::MultiValueKeyMaker sorter;
143 : 4 : sorter.add_value(0, true);
144 : 4 : sorter.add_value(1, true);
145 : 4 : enquire.set_sort_by_key(&sorter, true);
146 : 4 : Xapian::MSet mset = enquire.get_mset(0, 10);
147 : 4 : mset_expect_order(mset, 1, 2, 3, 4, 5);
148 : : }
149 : :
150 : 4 : return true;
151 : : }
152 : :
153 [ # # ][ - + ]: 26 : class NeverUseMeKeyMaker : public Xapian::KeyMaker {
154 : : public:
155 : 0 : std::string operator() (const Xapian::Document &) const
156 : : {
157 [ # # ]: 0 : FAIL_TEST("NeverUseMeKeyMaker was called");
158 : : }
159 : : };
160 : :
161 : : /// Regression test for changing away from a sorter.
162 : 7 : DEFINE_TESTCASE(changesorter1, backend && !remote) {
163 : 7 : Xapian::Enquire enquire(get_database("apitest_simpledata"));
164 : 7 : enquire.set_query(Xapian::Query("word"));
165 : 7 : NeverUseMeKeyMaker sorter;
166 : :
167 : 7 : enquire.set_sort_by_key(&sorter, true);
168 : 7 : enquire.set_sort_by_value(0, true);
169 : 7 : Xapian::MSet mset = enquire.get_mset(0, 25);
170 [ - + # # ]: 7 : TEST_EQUAL(mset.size(), 2); // Check that search is still doing something.
171 : :
172 : 7 : enquire.set_sort_by_key(&sorter, true);
173 : 7 : enquire.set_sort_by_value_then_relevance(0, true);
174 : 7 : mset = enquire.get_mset(0, 25);
175 [ - + # # ]: 7 : TEST_EQUAL(mset.size(), 2); // Check that search is still doing something.
176 : :
177 : 7 : enquire.set_sort_by_key(&sorter, true);
178 : 7 : enquire.set_sort_by_relevance_then_value(0, true);
179 : 7 : mset = enquire.get_mset(0, 25);
180 [ - + # # ]: 7 : TEST_EQUAL(mset.size(), 2); // Check that search is still doing something.
181 : :
182 : 7 : enquire.set_sort_by_key(&sorter, true);
183 : 7 : enquire.set_sort_by_relevance();
184 : 7 : mset = enquire.get_mset(0, 25);
185 [ - + # # ]: 7 : TEST_EQUAL(mset.size(), 2); // Check that search is still doing something.
186 : :
187 : 7 : return true;
188 : : }
189 : :
190 : : /// Regression test - an empty MultiValueSorter hung in 1.0.9 and earlier.
191 : 7 : DEFINE_TESTCASE(sortfunctorempty1,backend && !remote) {
192 : 7 : Xapian::Enquire enquire(get_database("apitest_sortrel"));
193 : 7 : enquire.set_query(Xapian::Query("woman"));
194 : :
195 : : {
196 : : int i;
197 : 7 : Xapian::MultiValueKeyMaker sorter(&i, &i);
198 : :
199 : 7 : enquire.set_sort_by_key(&sorter, true);
200 : 7 : Xapian::MSet mset = enquire.get_mset(0, 10);
201 : 7 : mset_expect_order(mset, 1, 2, 3, 4, 5, 6, 7, 8, 9);
202 : : }
203 : :
204 : 7 : return true;
205 : : }
206 : :
207 : 1 : DEFINE_TESTCASE(multivaluekeymaker1,!backend) {
208 : 1 : const int keys[] = { 0, 1, 2, 3 };
209 : 1 : Xapian::MultiValueKeyMaker sorter(keys, keys + 4);
210 : :
211 : 1 : Xapian::Document doc;
212 [ - + ][ # # ]: 1 : TEST(sorter(doc).empty());
213 : :
214 : 1 : doc.add_value(1, "foo");
215 [ - + ][ # # ]: 1 : TEST_EQUAL(sorter(doc), string("\0\0foo", 5));
216 : 1 : doc.add_value(1, string("f\0o", 3));
217 [ - + ][ # # ]: 1 : TEST_EQUAL(sorter(doc), string("\0\0f\0\xffo", 6));
218 : 1 : doc.add_value(3, "xyz");
219 [ - + ][ # # ]: 1 : TEST_EQUAL(sorter(doc), string("\0\0f\0\xffo\0\0\0\0xyz", 13));
220 : :
221 : 1 : sorter.add_value(4, true);
222 [ - + ][ # # ]: 1 : TEST_EQUAL(sorter(doc), string("\0\0f\0\xffo\0\0\0\0xyz\0\0\xff\xff", 17));
223 : :
224 : 1 : return true;
225 : : }
226 : :
227 : 6 : DEFINE_TESTCASE(sortfunctorremote1,remote) {
228 : 6 : Xapian::Enquire enquire(get_database(string()));
229 : 6 : NeverUseMeKeyMaker sorter;
230 : 6 : enquire.set_query(Xapian::Query("word"));
231 : 6 : enquire.set_sort_by_key(&sorter, true);
232 [ + - ][ - + ]: 12 : TEST_EXCEPTION(Xapian::UnimplementedError,
[ # # ][ - + ]
233 : : Xapian::MSet mset = enquire.get_mset(0, 10);
234 : : );
235 : 6 : return true;
236 : : }
|