Branch data Line data Source code
1 : : /* api_posdb.cc: tests which need a backend with positional information
2 : : *
3 : : * Copyright 1999,2000,2001 BrightStation PLC
4 : : * Copyright 2002 Ananova Ltd
5 : : * Copyright 2002,2003,2004,2005,2006,2007,2009 Olly Betts
6 : : *
7 : : * This program is free software; you can redistribute it and/or
8 : : * modify it under the terms of the GNU General Public License as
9 : : * published by the Free Software Foundation; either version 2 of the
10 : : * License, or (at your option) any later version.
11 : : *
12 : : * This program is distributed in the hope that it will be useful,
13 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 : : * GNU General Public License for more details.
16 : : *
17 : : * You should have received a copy of the GNU General Public License
18 : : * along with this program; if not, write to the Free Software
19 : : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
20 : : * USA
21 : : */
22 : :
23 : : #include <config.h>
24 : :
25 : : #include "api_posdb.h"
26 : :
27 : : #include <string>
28 : : #include <vector>
29 : :
30 : : using namespace std;
31 : :
32 : : #include <xapian.h>
33 : : #include "testsuite.h"
34 : : #include "testutils.h"
35 : :
36 : : #include "apitest.h"
37 : :
38 : : /// Simple test of NEAR
39 : 13 : DEFINE_TESTCASE(near1, positional) {
40 : 13 : Xapian::Database mydb(get_database("apitest_phrase"));
41 : 13 : Xapian::Enquire enquire(mydb);
42 : 13 : Xapian::Stem stemmer("english");
43 : 13 : enquire.set_weighting_scheme(Xapian::BoolWeight());
44 : :
45 : : // make a query
46 : 13 : vector<Xapian::Query> subqs;
47 : 13 : Xapian::Query q;
48 : 13 : subqs.push_back(Xapian::Query(stemmer("phrase")));
49 : 13 : subqs.push_back(Xapian::Query(stemmer("fridge")));
50 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 2);
51 : 13 : enquire.set_query(q);
52 : :
53 : : // retrieve the top ten results
54 : 13 : Xapian::MSet mymset = enquire.get_mset(0, 10);
55 : 13 : mset_expect_order(mymset);
56 : :
57 : 13 : subqs.clear();
58 : 13 : subqs.push_back(Xapian::Query(stemmer("phrase")));
59 : 13 : subqs.push_back(Xapian::Query(stemmer("near")));
60 : 13 : q = Xapian::Query(Xapian::Query::OP_NEAR, subqs.begin(), subqs.end(), 2);
61 : 13 : enquire.set_query(q);
62 : :
63 : : // retrieve the top ten results
64 : 13 : mymset = enquire.get_mset(0, 10);
65 : 13 : mset_expect_order(mymset, 3);
66 : :
67 : 13 : subqs.clear();
68 : 13 : subqs.push_back(Xapian::Query(stemmer("phrase")));
69 : 13 : subqs.push_back(Xapian::Query(stemmer("near")));
70 : 13 : q = Xapian::Query(Xapian::Query::OP_NEAR, subqs.begin(), subqs.end(), 3);
71 : 13 : enquire.set_query(q);
72 : :
73 : : // retrieve the top ten results
74 : 13 : mymset = enquire.get_mset(0, 10);
75 : 13 : mset_expect_order(mymset, 1, 3);
76 : :
77 : 13 : subqs.clear();
78 : 13 : subqs.push_back(Xapian::Query(stemmer("phrase")));
79 : 13 : subqs.push_back(Xapian::Query(stemmer("near")));
80 : 13 : q = Xapian::Query(Xapian::Query::OP_NEAR, subqs.begin(), subqs.end(), 5);
81 : 13 : enquire.set_query(q);
82 : :
83 : : // retrieve the top ten results
84 : 13 : mymset = enquire.get_mset(0, 10);
85 : 13 : mset_expect_order(mymset, 1, 3);
86 : :
87 : 13 : subqs.clear();
88 : 13 : subqs.push_back(Xapian::Query(stemmer("phrase")));
89 : 13 : subqs.push_back(Xapian::Query(stemmer("near")));
90 : 13 : q = Xapian::Query(Xapian::Query::OP_NEAR, subqs.begin(), subqs.end(), 6);
91 : 13 : enquire.set_query(q);
92 : :
93 : : // retrieve the top ten results
94 : 13 : mymset = enquire.get_mset(0, 10);
95 : 13 : mset_expect_order(mymset, 1, 2, 3);
96 : :
97 : 13 : subqs.clear();
98 : 13 : subqs.push_back(Xapian::Query(stemmer("leave")));
99 : 13 : subqs.push_back(Xapian::Query(stemmer("fridge")));
100 : 13 : subqs.push_back(Xapian::Query(stemmer("on")));
101 : 13 : q = Xapian::Query(Xapian::Query::OP_NEAR, subqs.begin(), subqs.end(), 3);
102 : 13 : enquire.set_query(q);
103 : :
104 : : // retrieve the top ten results
105 : 13 : mymset = enquire.get_mset(0, 10);
106 : 13 : mset_expect_order(mymset, 4, 5, 6, 7, 8, 9);
107 : :
108 : 13 : subqs.clear();
109 : 13 : subqs.push_back(Xapian::Query(stemmer("leave")));
110 : 13 : subqs.push_back(Xapian::Query(stemmer("fridge")));
111 : 13 : subqs.push_back(Xapian::Query(stemmer("on")));
112 : 13 : q = Xapian::Query(Xapian::Query::OP_NEAR, subqs.begin(), subqs.end(), 4);
113 : 13 : enquire.set_query(q);
114 : :
115 : : // retrieve the top ten results
116 : 13 : mymset = enquire.get_mset(0, 10);
117 : 13 : mset_expect_order(mymset, 4, 5, 6, 7, 8, 9, 10);
118 : :
119 : 13 : subqs.clear();
120 : 13 : subqs.push_back(Xapian::Query(stemmer("leave")));
121 : 13 : subqs.push_back(Xapian::Query(stemmer("fridge")));
122 : 13 : subqs.push_back(Xapian::Query(stemmer("on")));
123 : 13 : q = Xapian::Query(Xapian::Query::OP_NEAR, subqs.begin(), subqs.end(), 5);
124 : 13 : enquire.set_query(q);
125 : :
126 : : // retrieve the top ten results
127 : 13 : mymset = enquire.get_mset(0, 10);
128 : 13 : mset_expect_order(mymset, 4, 5, 6, 7, 8, 9, 10, 11);
129 : :
130 : 13 : subqs.clear();
131 : 13 : subqs.push_back(Xapian::Query(stemmer("leave")));
132 : 13 : subqs.push_back(Xapian::Query(stemmer("fridge")));
133 : 13 : subqs.push_back(Xapian::Query(stemmer("on")));
134 : 13 : q = Xapian::Query(Xapian::Query::OP_NEAR, subqs.begin(), subqs.end(), 6);
135 : 13 : enquire.set_query(q);
136 : :
137 : : // retrieve the top ten results
138 : 13 : mymset = enquire.get_mset(0, 10);
139 : 13 : mset_expect_order(mymset, 4, 5, 6, 7, 8, 9, 10, 11, 12);
140 : :
141 : 13 : subqs.clear();
142 : 13 : subqs.push_back(Xapian::Query(stemmer("leave")));
143 : 13 : subqs.push_back(Xapian::Query(stemmer("fridge")));
144 : 13 : subqs.push_back(Xapian::Query(stemmer("on")));
145 : 13 : q = Xapian::Query(Xapian::Query::OP_NEAR, subqs.begin(), subqs.end(), 7);
146 : 13 : enquire.set_query(q);
147 : :
148 : : // retrieve the top twenty results
149 : 13 : mymset = enquire.get_mset(0, 20);
150 : 13 : mset_expect_order(mymset, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
151 : :
152 : 13 : subqs.clear();
153 : 13 : subqs.push_back(Xapian::Query(stemmer("leave")));
154 : 13 : subqs.push_back(Xapian::Query(stemmer("fridge")));
155 : 13 : subqs.push_back(Xapian::Query(stemmer("on")));
156 : 13 : q = Xapian::Query(Xapian::Query::OP_NEAR, subqs.begin(), subqs.end(), 8);
157 : 13 : enquire.set_query(q);
158 : :
159 : : // retrieve the top ten results
160 : 13 : mymset = enquire.get_mset(0, 20);
161 : 13 : mset_expect_order(mymset, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
162 : :
163 : 13 : subqs.clear();
164 : 13 : subqs.push_back(Xapian::Query(stemmer("leave")));
165 : 13 : subqs.push_back(Xapian::Query(stemmer("fridge")));
166 : 13 : subqs.push_back(Xapian::Query(stemmer("on")));
167 : : // test really large window size
168 : 13 : q = Xapian::Query(Xapian::Query::OP_NEAR, subqs.begin(), subqs.end(), 999999999);
169 : 13 : enquire.set_query(q);
170 : :
171 : : // retrieve the top ten results
172 : 13 : mymset = enquire.get_mset(0, 20);
173 : 13 : mset_expect_order(mymset, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
174 : :
175 : 13 : return true;
176 : : }
177 : :
178 : : /// Test NEAR over operators
179 : 13 : DEFINE_TESTCASE(near2, positional) {
180 : 13 : Xapian::Database mydb(get_database("apitest_phrase"));
181 : 13 : Xapian::Enquire enquire(mydb);
182 : 13 : Xapian::Stem stemmer("english");
183 : 13 : enquire.set_weighting_scheme(Xapian::BoolWeight());
184 : :
185 : : // make a query
186 : 13 : vector<Xapian::Query> subqs;
187 : 13 : Xapian::Query q;
188 : : subqs.push_back(Xapian::Query(Xapian::Query::OP_AND,
189 : : Xapian::Query(stemmer("phrase")),
190 : 13 : Xapian::Query(stemmer("near"))));
191 : 13 : subqs.push_back(Xapian::Query(stemmer("and")));
192 : 13 : q = Xapian::Query(Xapian::Query::OP_NEAR, subqs.begin(), subqs.end(), 2);
193 : 13 : enquire.set_query(q);
194 : :
195 : : // retrieve the top ten results
196 : 13 : Xapian::MSet mymset = enquire.get_mset(0, 10);
197 : 13 : mset_expect_order(mymset, 1);
198 : :
199 : 13 : subqs.clear();
200 : : subqs.push_back(Xapian::Query(Xapian::Query::OP_AND,
201 : : Xapian::Query(stemmer("phrase")),
202 : 13 : Xapian::Query(stemmer("near"))));
203 : 13 : subqs.push_back(Xapian::Query(stemmer("operator")));
204 : 13 : q = Xapian::Query(Xapian::Query::OP_NEAR, subqs.begin(), subqs.end(), 2);
205 : 13 : enquire.set_query(q);
206 : :
207 : : // retrieve the top ten results
208 : 13 : mymset = enquire.get_mset(0, 10);
209 : 13 : mset_expect_order(mymset, 2);
210 : :
211 : 13 : subqs.clear();
212 : 13 : subqs.push_back(Xapian::Query(stemmer("operator")));
213 : : subqs.push_back(Xapian::Query(Xapian::Query::OP_AND,
214 : : Xapian::Query(stemmer("phrase")),
215 : 13 : Xapian::Query(stemmer("near"))));
216 : 13 : q = Xapian::Query(Xapian::Query::OP_NEAR, subqs.begin(), subqs.end(), 2);
217 : 13 : enquire.set_query(q);
218 : :
219 : : // retrieve the top ten results
220 : 13 : mymset = enquire.get_mset(0, 10);
221 : 13 : mset_expect_order(mymset, 2);
222 : :
223 : 13 : return true;
224 : : }
225 : :
226 : : /// Simple test of PHRASE
227 : 13 : DEFINE_TESTCASE(phrase1, positional) {
228 : 13 : Xapian::Database mydb(get_database("apitest_phrase"));
229 : 13 : Xapian::Enquire enquire(mydb);
230 : 13 : Xapian::Stem stemmer("english");
231 : 13 : enquire.set_weighting_scheme(Xapian::BoolWeight());
232 : :
233 : : // make a query
234 : 13 : vector<Xapian::Query> subqs;
235 : 13 : Xapian::Query q;
236 : 13 : subqs.push_back(Xapian::Query(stemmer("phrase")));
237 : 13 : subqs.push_back(Xapian::Query(stemmer("fridge")));
238 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 2);
239 : 13 : enquire.set_query(q);
240 : :
241 : : // retrieve the top ten results
242 : 13 : Xapian::MSet mymset = enquire.get_mset(0, 10);
243 : 13 : mset_expect_order(mymset);
244 : :
245 : 13 : subqs.clear();
246 : 13 : subqs.push_back(Xapian::Query(stemmer("phrase")));
247 : 13 : subqs.push_back(Xapian::Query(stemmer("near")));
248 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 2);
249 : 13 : enquire.set_query(q);
250 : :
251 : : // retrieve the top ten results
252 : 13 : mymset = enquire.get_mset(0, 10);
253 : 13 : mset_expect_order(mymset);
254 : :
255 : 13 : subqs.clear();
256 : 13 : subqs.push_back(Xapian::Query(stemmer("phrase")));
257 : 13 : subqs.push_back(Xapian::Query(stemmer("near")));
258 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 3);
259 : 13 : enquire.set_query(q);
260 : :
261 : : // retrieve the top ten results
262 : 13 : mymset = enquire.get_mset(0, 10);
263 : 13 : mset_expect_order(mymset, 1);
264 : :
265 : 13 : subqs.clear();
266 : 13 : subqs.push_back(Xapian::Query(stemmer("phrase")));
267 : 13 : subqs.push_back(Xapian::Query(stemmer("near")));
268 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 5);
269 : 13 : enquire.set_query(q);
270 : :
271 : : // retrieve the top ten results
272 : 13 : mymset = enquire.get_mset(0, 10);
273 : 13 : mset_expect_order(mymset, 1);
274 : :
275 : 13 : subqs.clear();
276 : 13 : subqs.push_back(Xapian::Query(stemmer("phrase")));
277 : 13 : subqs.push_back(Xapian::Query(stemmer("near")));
278 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 6);
279 : 13 : enquire.set_query(q);
280 : :
281 : : // retrieve the top ten results
282 : 13 : mymset = enquire.get_mset(0, 10);
283 : 13 : mset_expect_order(mymset, 1, 2);
284 : :
285 : 13 : subqs.clear();
286 : 13 : subqs.push_back(Xapian::Query(stemmer("leave")));
287 : 13 : subqs.push_back(Xapian::Query(stemmer("fridge")));
288 : 13 : subqs.push_back(Xapian::Query(stemmer("on")));
289 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 3);
290 : 13 : enquire.set_query(q);
291 : :
292 : : // retrieve the top ten results
293 : 13 : mymset = enquire.get_mset(0, 10);
294 : 13 : mset_expect_order(mymset, 4);
295 : :
296 : 13 : subqs.clear();
297 : 13 : subqs.push_back(Xapian::Query(stemmer("leave")));
298 : 13 : subqs.push_back(Xapian::Query(stemmer("fridge")));
299 : 13 : subqs.push_back(Xapian::Query(stemmer("on")));
300 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 4);
301 : 13 : enquire.set_query(q);
302 : :
303 : : // retrieve the top ten results
304 : 13 : mymset = enquire.get_mset(0, 10);
305 : 13 : mset_expect_order(mymset, 4);
306 : :
307 : 13 : subqs.clear();
308 : 13 : subqs.push_back(Xapian::Query(stemmer("leave")));
309 : 13 : subqs.push_back(Xapian::Query(stemmer("fridge")));
310 : 13 : subqs.push_back(Xapian::Query(stemmer("on")));
311 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 5);
312 : 13 : enquire.set_query(q);
313 : :
314 : : // retrieve the top ten results
315 : 13 : mymset = enquire.get_mset(0, 10);
316 : 13 : mset_expect_order(mymset, 4);
317 : :
318 : 13 : subqs.clear();
319 : 13 : subqs.push_back(Xapian::Query(stemmer("leave")));
320 : 13 : subqs.push_back(Xapian::Query(stemmer("fridge")));
321 : 13 : subqs.push_back(Xapian::Query(stemmer("on")));
322 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 6);
323 : 13 : enquire.set_query(q);
324 : :
325 : : // retrieve the top ten results
326 : 13 : mymset = enquire.get_mset(0, 10);
327 : 13 : mset_expect_order(mymset, 4);
328 : :
329 : 13 : subqs.clear();
330 : 13 : subqs.push_back(Xapian::Query(stemmer("leave")));
331 : 13 : subqs.push_back(Xapian::Query(stemmer("fridge")));
332 : 13 : subqs.push_back(Xapian::Query(stemmer("on")));
333 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 7);
334 : 13 : enquire.set_query(q);
335 : :
336 : : // retrieve the top twenty results
337 : 13 : mymset = enquire.get_mset(0, 20);
338 : 13 : mset_expect_order(mymset, 4);
339 : :
340 : 13 : subqs.clear();
341 : 13 : subqs.push_back(Xapian::Query(stemmer("leave")));
342 : 13 : subqs.push_back(Xapian::Query(stemmer("fridge")));
343 : 13 : subqs.push_back(Xapian::Query(stemmer("on")));
344 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 8);
345 : 13 : enquire.set_query(q);
346 : :
347 : : // retrieve the top 20 results
348 : 13 : mymset = enquire.get_mset(0, 20);
349 : 13 : mset_expect_order(mymset, 4);
350 : :
351 : : // test really large window size
352 : 13 : subqs.clear();
353 : 13 : subqs.push_back(Xapian::Query(stemmer("leave")));
354 : 13 : subqs.push_back(Xapian::Query(stemmer("fridge")));
355 : 13 : subqs.push_back(Xapian::Query(stemmer("on")));
356 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 999999999);
357 : 13 : enquire.set_query(q);
358 : :
359 : : // retrieve the top 20 results
360 : 13 : mymset = enquire.get_mset(0, 20);
361 : 13 : mset_expect_order(mymset, 4);
362 : :
363 : : // regression test (was matching doc 15, should fail)
364 : 13 : subqs.clear();
365 : 13 : subqs.push_back(Xapian::Query(stemmer("first")));
366 : 13 : subqs.push_back(Xapian::Query(stemmer("second")));
367 : 13 : subqs.push_back(Xapian::Query(stemmer("third")));
368 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 9);
369 : 13 : enquire.set_query(q);
370 : :
371 : : // retrieve the top ten results
372 : 13 : mymset = enquire.get_mset(0, 10);
373 : 13 : mset_expect_order(mymset);
374 : :
375 : : // regression test (should match doc 15, make sure still does with fix)
376 : 13 : subqs.clear();
377 : 13 : subqs.push_back(Xapian::Query(stemmer("first")));
378 : 13 : subqs.push_back(Xapian::Query(stemmer("second")));
379 : 13 : subqs.push_back(Xapian::Query(stemmer("third")));
380 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 10);
381 : 13 : enquire.set_query(q);
382 : :
383 : : // retrieve the top ten results
384 : 13 : mymset = enquire.get_mset(0, 10);
385 : 13 : mset_expect_order(mymset, 15);
386 : :
387 : : // regression test (phrase matching was getting order wrong when
388 : : // build_and_tree reordered vector of PostLists)
389 : 13 : subqs.clear();
390 : 13 : subqs.push_back(Xapian::Query(stemmer("milk")));
391 : 13 : subqs.push_back(Xapian::Query(stemmer("rare")));
392 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 2);
393 : 13 : enquire.set_query(q);
394 : :
395 : : // retrieve the top ten results
396 : 13 : mymset = enquire.get_mset(0, 10);
397 : 13 : mset_expect_order(mymset, 16);
398 : :
399 : : // regression test (phrase matching was getting order wrong when
400 : : // build_and_tree reordered vector of PostLists)
401 : 13 : subqs.clear();
402 : 13 : subqs.push_back(Xapian::Query(stemmer("rare")));
403 : 13 : subqs.push_back(Xapian::Query(stemmer("milk")));
404 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 2);
405 : 13 : enquire.set_query(q);
406 : :
407 : : // retrieve the top ten results
408 : 13 : mymset = enquire.get_mset(0, 10);
409 : 13 : mset_expect_order(mymset, 17);
410 : :
411 : 13 : return true;
412 : : }
413 : :
414 : : /// Test PHRASE over operators
415 : 13 : DEFINE_TESTCASE(phrase2, positional) {
416 : 13 : Xapian::Database mydb(get_database("apitest_phrase"));
417 : 13 : Xapian::Enquire enquire(mydb);
418 : 13 : Xapian::Stem stemmer("english");
419 : 13 : enquire.set_weighting_scheme(Xapian::BoolWeight());
420 : :
421 : : // make a query
422 : 13 : vector<Xapian::Query> subqs;
423 : 13 : Xapian::Query q;
424 : : subqs.push_back(Xapian::Query(Xapian::Query::OP_AND,
425 : : Xapian::Query(stemmer("phrase")),
426 : 13 : Xapian::Query(stemmer("near"))));
427 : 13 : subqs.push_back(Xapian::Query(stemmer("and")));
428 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 2);
429 : 13 : enquire.set_query(q);
430 : :
431 : : // retrieve the top ten results
432 : 13 : Xapian::MSet mymset = enquire.get_mset(0, 10);
433 : 13 : mset_expect_order(mymset);
434 : :
435 : 13 : subqs.clear();
436 : : subqs.push_back(Xapian::Query(Xapian::Query::OP_AND,
437 : : Xapian::Query(stemmer("phrase")),
438 : 13 : Xapian::Query(stemmer("near"))));
439 : 13 : subqs.push_back(Xapian::Query(stemmer("operator")));
440 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 2);
441 : 13 : enquire.set_query(q);
442 : :
443 : : // retrieve the top ten results
444 : 13 : mymset = enquire.get_mset(0, 10);
445 : 13 : mset_expect_order(mymset, 2);
446 : :
447 : 13 : subqs.clear();
448 : 13 : subqs.push_back(Xapian::Query(stemmer("operator")));
449 : : subqs.push_back(Xapian::Query(Xapian::Query::OP_AND,
450 : : Xapian::Query(stemmer("phrase")),
451 : 13 : Xapian::Query(stemmer("near"))));
452 : 13 : q = Xapian::Query(Xapian::Query::OP_PHRASE, subqs.begin(), subqs.end(), 2);
453 : 13 : enquire.set_query(q);
454 : :
455 : : // retrieve the top ten results
456 : 13 : mymset = enquire.get_mset(0, 10);
457 : 13 : mset_expect_order(mymset);
458 : :
459 : 13 : return true;
460 : : }
461 : :
462 : : /// Test getting position lists from databases
463 : 13 : DEFINE_TESTCASE(poslist1, positional) {
464 : 13 : Xapian::Database mydb(get_database("apitest_poslist"));
465 : :
466 : 13 : Xapian::Stem stemmer("english");
467 : 13 : string term = stemmer("sponge");
468 : :
469 : 13 : Xapian::PositionIterator pli = mydb.positionlist_begin(2, term);
470 : :
471 [ - + ][ # # ]: 13 : TEST(pli != mydb.positionlist_end(2, term));
472 [ - + ][ # # ]: 13 : TEST(*pli == 1);
473 : 13 : pli++;
474 [ - + ][ # # ]: 13 : TEST(pli != mydb.positionlist_end(2, term));
475 [ - + ][ # # ]: 13 : TEST(*pli == 2);
476 : 13 : pli++;
477 [ - + ][ # # ]: 13 : TEST(pli != mydb.positionlist_end(2, term));
478 [ - + ][ # # ]: 13 : TEST(*pli == 3);
479 : 13 : pli++;
480 [ - + ][ # # ]: 13 : TEST(pli != mydb.positionlist_end(2, term));
481 [ - + ][ # # ]: 13 : TEST(*pli == 5);
482 : 13 : pli++;
483 [ - + ][ # # ]: 13 : TEST(pli != mydb.positionlist_end(2, term));
484 [ - + ][ # # ]: 13 : TEST(*pli == 8);
485 : 13 : pli++;
486 [ - + ][ # # ]: 13 : TEST(pli != mydb.positionlist_end(2, term));
487 [ - + ][ # # ]: 13 : TEST(*pli == 13);
488 : 13 : pli++;
489 [ - + ][ # # ]: 13 : TEST(pli != mydb.positionlist_end(2, term));
490 [ - + ][ # # ]: 13 : TEST(*pli == 21);
491 : 13 : pli++;
492 [ - + ][ # # ]: 13 : TEST(pli != mydb.positionlist_end(2, term));
493 [ - + ][ # # ]: 13 : TEST(*pli == 34);
494 : 13 : pli++;
495 [ - + ][ # # ]: 13 : TEST(pli == mydb.positionlist_end(2, term));
496 : :
497 : 13 : return true;
498 : : }
499 : :
500 : 10 : DEFINE_TESTCASE(poslist2, positional && writable) {
501 : 10 : Xapian::WritableDatabase db = get_writable_database();
502 : :
503 : 10 : Xapian::Document doc;
504 : 10 : doc.add_term("nopos");
505 : 10 : Xapian::docid did = db.add_document(doc);
506 : :
507 : : // Check what happens when term doesn't exist - should give an empty list.
508 : : // Threw RangeError in Xapian < 1.1.0,
509 [ - + ][ # # ]: 10 : TEST_EQUAL(db.positionlist_begin(did, "nosuchterm"),
510 : : db.positionlist_end(did, "nosuchterm"));
511 : :
512 : : // Check what happens when the document doesn't even exist - should give
513 : : // an empty list. Threw DocNotFoundError in Xapian < 1.1.0.
514 [ - + ][ # # ]: 10 : TEST_EQUAL(db.positionlist_begin(123, "nosuchterm"),
515 : : db.positionlist_end(123, "nosuchterm"));
516 : :
517 [ - + ][ # # ]: 10 : TEST_EQUAL(db.positionlist_begin(did, "nopos"),
518 : : db.positionlist_end(did, "nopos"));
519 : :
520 : 10 : Xapian::Document doc2 = db.get_document(did);
521 : :
522 : 10 : Xapian::TermIterator term = doc2.termlist_begin();
523 : :
524 : : {
525 : 10 : Xapian::PositionIterator i = term.positionlist_begin();
526 [ - + ][ # # ]: 10 : TEST_EQUAL(i, term.positionlist_end());
527 : : }
528 : :
529 : 10 : Xapian::Document doc3;
530 : 10 : doc3.add_posting("hadpos", 1);
531 : 10 : Xapian::docid did2 = db.add_document(doc3);
532 : :
533 : 10 : Xapian::Document doc4 = db.get_document(did2);
534 : 10 : doc4.remove_posting("hadpos", 1);
535 : 10 : db.replace_document(did2, doc4);
536 : :
537 : : {
538 : 10 : Xapian::PositionIterator i = db.positionlist_begin(did2, "hadpos");
539 [ - + ][ # # ]: 10 : TEST_EQUAL(i, db.positionlist_end(did2, "hadpos"));
540 : : }
541 : :
542 : 10 : db.delete_document(did);
543 : : // Check what happens when the document doesn't exist (but once did).
544 [ - + ][ # # ]: 10 : TEST_EQUAL(db.positionlist_begin(did, "nosuchterm"),
545 : : db.positionlist_end(did, "nosuchterm"));
546 : :
547 : 10 : return true;
548 : : }
549 : :
550 : : /// Test playing with a positionlist, testing skip_to in particular.
551 : : /// (used to be quartztest's test_positionlist1).
552 : 10 : DEFINE_TESTCASE(poslist3, positional && writable) {
553 : 10 : Xapian::WritableDatabase db = get_writable_database();
554 : :
555 : 10 : vector<Xapian::termpos> positions;
556 : :
557 : 10 : Xapian::Document document;
558 : 10 : document.add_posting("foo", 5);
559 : 10 : document.add_posting("foo", 8);
560 : 10 : document.add_posting("foo", 10);
561 : 10 : document.add_posting("foo", 12);
562 : 10 : db.add_document(document);
563 : :
564 : 10 : Xapian::PositionIterator pl = db.positionlist_begin(1, "foo");
565 : 10 : Xapian::PositionIterator pl_end = db.positionlist_end(1, "foo");
566 : :
567 [ - + # # ]: 10 : TEST(pl != pl_end);
568 [ - + ][ # # ]: 10 : TEST_EQUAL(*pl, 5);
569 : 10 : ++pl;
570 [ - + # # ]: 10 : TEST(pl != pl_end);
571 [ - + ][ # # ]: 10 : TEST_EQUAL(*pl, 8);
572 : 10 : ++pl;
573 [ - + # # ]: 10 : TEST(pl != pl_end);
574 [ - + ][ # # ]: 10 : TEST_EQUAL(*pl, 10);
575 : 10 : ++pl;
576 [ - + # # ]: 10 : TEST(pl != pl_end);
577 [ - + ][ # # ]: 10 : TEST_EQUAL(*pl, 12);
578 : 10 : ++pl;
579 [ - + # # ]: 10 : TEST(pl == pl_end);
580 : :
581 : 10 : pl = db.positionlist_begin(1, "foo");
582 : 10 : pl.skip_to(5);
583 [ - + # # ]: 10 : TEST(pl != pl_end);
584 [ - + ][ # # ]: 10 : TEST_EQUAL(*pl, 5);
585 : :
586 : 10 : pl.skip_to(9);
587 [ - + # # ]: 10 : TEST(pl != pl_end);
588 [ - + ][ # # ]: 10 : TEST_EQUAL(*pl, 10);
589 : :
590 : 10 : ++pl;
591 [ - + # # ]: 10 : TEST(pl != pl_end);
592 [ - + ][ # # ]: 10 : TEST_EQUAL(*pl, 12);
593 : :
594 : 10 : pl.skip_to(12);
595 [ - + # # ]: 10 : TEST(pl != pl_end);
596 [ - + ][ # # ]: 10 : TEST_EQUAL(*pl, 12);
597 : :
598 : 10 : pl.skip_to(13);
599 [ - + # # ]: 10 : TEST(pl == pl_end);
600 : :
601 : 10 : return true;
602 : : }
603 : :
604 : : // Regression test - in 0.9.4 (and many previous versions) you couldn't get a
605 : : // PositionIterator from a TermIterator from Database::termlist_begin().
606 : : //
607 : : // Also test that positionlist_count() is implemented for this case, which it
608 : : // wasn't in 1.0.2 and earlier.
609 : 13 : DEFINE_TESTCASE(positfromtermit1, positional) {
610 : 13 : Xapian::Database db(get_database("apitest_phrase"));
611 : 13 : Xapian::TermIterator t(db.termlist_begin(7));
612 [ - + ][ # # ]: 13 : TEST_NOT_EQUAL(t, db.termlist_end(7));
613 : 13 : Xapian::PositionIterator p = t.positionlist_begin();
614 [ - + ][ # # ]: 13 : TEST_NOT_EQUAL(p, t.positionlist_end());
615 : :
616 : : try {
617 [ - + ][ # # ]: 13 : TEST_EQUAL(t.positionlist_count(), 1);
618 : 7 : t.skip_to("on");
619 [ - + ][ # # ]: 7 : TEST_NOT_EQUAL(t, db.termlist_end(7));
620 [ - + ][ # # ]: 7 : TEST_EQUAL(t.positionlist_count(), 2);
621 : 12 : } catch (const Xapian::UnimplementedError &) {
622 [ - + ]: 6 : SKIP_TEST("TermList::positionlist_count() not yet implemented for this backend");
623 : : }
624 : :
625 : 25 : return true;
626 : : }
|