00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <config.h>
00026
00027 #include "api_anydb.h"
00028
00029 #include <algorithm>
00030 #include <string>
00031
00032 #include <xapian.h>
00033 #include "backendmanager_local.h"
00034 #include "testsuite.h"
00035 #include "testutils.h"
00036 #include "utils.h"
00037
00038 #include "apitest.h"
00039
00040 #include <list>
00041
00042 using namespace std;
00043
00044 static void
00045 print_mset_weights(const Xapian::MSet &mset)
00046 {
00047 Xapian::MSetIterator i = mset.begin();
00048 for ( ; i != mset.end(); ++i) {
00049 tout << " " << i.get_weight();
00050 }
00051 }
00052
00053 static void
00054 print_mset_percentages(const Xapian::MSet &mset)
00055 {
00056 Xapian::MSetIterator i = mset.begin();
00057 for ( ; i != mset.end(); ++i) {
00058 tout << " " << mset.convert_to_percent(i);
00059 }
00060 }
00061
00062 static Xapian::Query
00063 query(Xapian::Query::op op,
00064 const string & t1 = string(), const string & t2 = string(),
00065 const string & t3 = string(), const string & t4 = string(),
00066 const string & t5 = string(), const string & t6 = string(),
00067 const string & t7 = string(), const string & t8 = string(),
00068 const string & t9 = string(), const string & t10 = string())
00069 {
00070 vector<string> v;
00071 Xapian::Stem stemmer("english");
00072 if (!t1.empty()) v.push_back(stemmer(t1));
00073 if (!t2.empty()) v.push_back(stemmer(t2));
00074 if (!t3.empty()) v.push_back(stemmer(t3));
00075 if (!t4.empty()) v.push_back(stemmer(t4));
00076 if (!t5.empty()) v.push_back(stemmer(t5));
00077 if (!t6.empty()) v.push_back(stemmer(t6));
00078 if (!t7.empty()) v.push_back(stemmer(t7));
00079 if (!t8.empty()) v.push_back(stemmer(t8));
00080 if (!t9.empty()) v.push_back(stemmer(t9));
00081 if (!t10.empty()) v.push_back(stemmer(t10));
00082 return Xapian::Query(op, v.begin(), v.end());
00083 }
00084
00085 static Xapian::Query
00086 query(Xapian::Query::op op, Xapian::termcount parameter,
00087 const string & t1 = string(), const string & t2 = string(),
00088 const string & t3 = string(), const string & t4 = string(),
00089 const string & t5 = string(), const string & t6 = string(),
00090 const string & t7 = string(), const string & t8 = string(),
00091 const string & t9 = string(), const string & t10 = string())
00092 {
00093 vector<string> v;
00094 Xapian::Stem stemmer("english");
00095 if (!t1.empty()) v.push_back(stemmer(t1));
00096 if (!t2.empty()) v.push_back(stemmer(t2));
00097 if (!t3.empty()) v.push_back(stemmer(t3));
00098 if (!t4.empty()) v.push_back(stemmer(t4));
00099 if (!t5.empty()) v.push_back(stemmer(t5));
00100 if (!t6.empty()) v.push_back(stemmer(t6));
00101 if (!t7.empty()) v.push_back(stemmer(t7));
00102 if (!t8.empty()) v.push_back(stemmer(t8));
00103 if (!t9.empty()) v.push_back(stemmer(t9));
00104 if (!t10.empty()) v.push_back(stemmer(t10));
00105 return Xapian::Query(op, v.begin(), v.end(), parameter);
00106 }
00107
00108 static Xapian::Query
00109 query(const string &t)
00110 {
00111 return Xapian::Query(Xapian::Stem("english")(t));
00112 }
00113
00114
00115
00116
00117
00118 DEFINE_TESTCASE(zerodocid1, backend) {
00119
00120
00121
00122 Xapian::Database mydb(get_database("apitest_onedoc"));
00123
00124 Xapian::Enquire enquire(mydb);
00125
00126
00127 enquire.set_query(Xapian::Query("word"));
00128
00129
00130 Xapian::MSet mymset = enquire.get_mset(0, 10);
00131
00132
00133
00134 TEST_MSET_SIZE(mymset, 1);
00135
00136 TEST_AND_EXPLAIN(*(mymset.begin()) != 0,
00137 "A query on a database returned a zero docid");
00138
00139 return true;
00140 }
00141
00142
00143 DEFINE_TESTCASE(emptyquery1, backend) {
00144 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00145
00146 enquire.set_query(Xapian::Query());
00147 Xapian::MSet mymset = enquire.get_mset(0, 10);
00148 TEST_MSET_SIZE(mymset, 0);
00149 TEST_EQUAL(mymset.get_matches_lower_bound(), 0);
00150 TEST_EQUAL(mymset.get_matches_upper_bound(), 0);
00151 TEST_EQUAL(mymset.get_matches_estimated(), 0);
00152 TEST_EQUAL(mymset.get_uncollapsed_matches_lower_bound(), 0);
00153 TEST_EQUAL(mymset.get_uncollapsed_matches_upper_bound(), 0);
00154 TEST_EQUAL(mymset.get_uncollapsed_matches_estimated(), 0);
00155
00156 vector<Xapian::Query> v;
00157 enquire.set_query(Xapian::Query(Xapian::Query::OP_AND, v.begin(), v.end()));
00158 mymset = enquire.get_mset(0, 10);
00159 TEST_MSET_SIZE(mymset, 0);
00160 TEST_EQUAL(mymset.get_matches_lower_bound(), 0);
00161 TEST_EQUAL(mymset.get_matches_upper_bound(), 0);
00162 TEST_EQUAL(mymset.get_matches_estimated(), 0);
00163 TEST_EQUAL(mymset.get_uncollapsed_matches_lower_bound(), 0);
00164 TEST_EQUAL(mymset.get_uncollapsed_matches_upper_bound(), 0);
00165 TEST_EQUAL(mymset.get_uncollapsed_matches_estimated(), 0);
00166
00167 return true;
00168 }
00169
00170
00171 DEFINE_TESTCASE(simplequery1, backend) {
00172 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00173 enquire.set_query(Xapian::Query("word"));
00174 Xapian::MSet mymset = enquire.get_mset(0, 10);
00175 TEST_MSET_SIZE(mymset, 2);
00176 return true;
00177 }
00178
00179
00180 DEFINE_TESTCASE(simplequery2, backend) {
00181
00182
00183 Xapian::Database db = get_database("apitest_simpledata");
00184 Xapian::Enquire enquire(db);
00185 enquire.set_query(Xapian::Query("word"));
00186
00187
00188 Xapian::MSet mymset = enquire.get_mset(0, 10);
00189
00190
00191
00192 mset_expect_order(mymset, 2, 4);
00193
00194
00195 Xapian::MSetIterator i = mymset.begin();
00196
00197 TEST_EQUAL_DOUBLE(i.get_weight(), 1.04648168717725);
00198 i++;
00199 TEST_EQUAL_DOUBLE(i.get_weight(), 0.640987686595914);
00200
00201 return true;
00202 }
00203
00204
00205 DEFINE_TESTCASE(simplequery3, backend) {
00206 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00207 enquire.set_query(query("this"));
00208 Xapian::MSet mymset = enquire.get_mset(0, 10);
00209
00210
00211 TEST_MSET_SIZE(mymset, 6);
00212
00213 return true;
00214 }
00215
00216
00217
00218 DEFINE_TESTCASE(wildquery1, backend) {
00219 Xapian::QueryParser queryparser;
00220 unsigned flags = Xapian::QueryParser::FLAG_WILDCARD |
00221 Xapian::QueryParser::FLAG_LOVEHATE;
00222 queryparser.set_stemmer(Xapian::Stem("english"));
00223 queryparser.set_stemming_strategy(Xapian::QueryParser::STEM_ALL);
00224 Xapian::Database db = get_database("apitest_simpledata");
00225 queryparser.set_database(db);
00226 Xapian::Enquire enquire(db);
00227
00228 Xapian::Query qobj = queryparser.parse_query("th*", flags);
00229 tout << qobj.get_description() << endl;
00230 enquire.set_query(qobj);
00231 Xapian::MSet mymset = enquire.get_mset(0, 10);
00232
00233 TEST_MSET_SIZE(mymset, 6);
00234
00235 qobj = queryparser.parse_query("notindb* \"this\"", flags);
00236 tout << qobj.get_description() << endl;
00237 enquire.set_query(qobj);
00238 mymset = enquire.get_mset(0, 10);
00239
00240 TEST_MSET_SIZE(mymset, 6);
00241
00242 qobj = queryparser.parse_query("+notindb* \"this\"", flags);
00243 tout << qobj.get_description() << endl;
00244 enquire.set_query(qobj);
00245 mymset = enquire.get_mset(0, 10);
00246
00247 TEST_MSET_SIZE(mymset, 0);
00248
00249 return true;
00250 }
00251
00252
00253 DEFINE_TESTCASE(multidb1, backend) {
00254 Xapian::Database mydb1(get_database("apitest_simpledata", "apitest_simpledata2"));
00255 Xapian::Enquire enquire1(mydb1);
00256
00257 Xapian::Database mydb2(get_database("apitest_simpledata"));
00258 mydb2.add_database(get_database("apitest_simpledata2"));
00259 Xapian::Enquire enquire2(mydb2);
00260
00261
00262 Xapian::Query myquery("word");
00263 enquire1.set_query(myquery);
00264 enquire2.set_query(myquery);
00265
00266
00267
00268 Xapian::MSet mymset1 = enquire1.get_mset(0, 10);
00269 Xapian::MSet mymset2 = enquire2.get_mset(0, 10);
00270
00271 TEST_EQUAL(mymset1.size(), mymset2.size());
00272 TEST(mset_range_is_same_weights(mymset1, 0, mymset2, 0, mymset1.size()));
00273 return true;
00274 }
00275
00276
00277
00278 DEFINE_TESTCASE(multidb2, backend && !multi) {
00279 Xapian::Database mydb1(get_database("apitest_simpledata",
00280 "apitest_simpledata2"));
00281 Xapian::Enquire enquire1(mydb1);
00282
00283 Xapian::Database mydb2(get_database("apitest_simpledata"));
00284 mydb2.add_database(get_database("apitest_simpledata2"));
00285 Xapian::Enquire enquire2(mydb2);
00286
00287
00288 Xapian::Query myquery = query(Xapian::Query::OP_OR, "inmemory", "word");
00289 enquire1.set_query(myquery);
00290 enquire2.set_query(myquery);
00291
00292
00293
00294 Xapian::MSet mymset1 = enquire1.get_mset(0, 10);
00295 Xapian::MSet mymset2 = enquire2.get_mset(0, 10);
00296
00297 TEST_EQUAL(mymset1.size(), mymset2.size());
00298 TEST(mset_range_is_same_weights(mymset1, 0, mymset2, 0, mymset1.size()));
00299 return true;
00300 }
00301
00302
00303 DEFINE_TESTCASE(multidb3, backend && !multi) {
00304 Xapian::Database mydb2(get_database("apitest_simpledata"));
00305 mydb2.add_database(get_database("apitest_simpledata2"));
00306 Xapian::Enquire enquire(mydb2);
00307
00308
00309 Xapian::Query myquery = query(Xapian::Query::OP_OR, "inmemory", "word");
00310 enquire.set_weighting_scheme(Xapian::BoolWeight());
00311 enquire.set_query(myquery);
00312
00313
00314 Xapian::MSet mymset = enquire.get_mset(0, 10);
00315 mset_expect_order(mymset, 2, 3, 7);
00316
00317 return true;
00318 }
00319
00320
00321 DEFINE_TESTCASE(multidb4, backend && !multi) {
00322 Xapian::Database mydb2(get_database("apitest_simpledata"));
00323 mydb2.add_database(get_database("apitest_simpledata2"));
00324 mydb2.add_database(get_database("apitest_termorder"));
00325 Xapian::Enquire enquire(mydb2);
00326
00327
00328 Xapian::Query myquery = query(Xapian::Query::OP_OR, "inmemory", "word");
00329 enquire.set_weighting_scheme(Xapian::BoolWeight());
00330 enquire.set_query(myquery);
00331
00332
00333 Xapian::MSet mymset = enquire.get_mset(0, 10);
00334 mset_expect_order(mymset, 2, 3, 4, 10);
00335
00336 return true;
00337 }
00338
00339
00340 DEFINE_TESTCASE(multidb5, backend && !multi) {
00341 Xapian::Database mydb2(get_database("apitest_simpledata"));
00342 mydb2.add_database(get_database("apitest_simpledata2"));
00343 Xapian::Enquire enquire(mydb2);
00344
00345
00346 Xapian::Query myquery = query(Xapian::Query::OP_AND, "inmemory", "word");
00347 enquire.set_weighting_scheme(Xapian::BoolWeight());
00348 enquire.set_query(myquery);
00349
00350
00351 Xapian::MSet mymset = enquire.get_mset(0, 10);
00352 mset_expect_order(mymset, 2);
00353
00354 return true;
00355 }
00356
00357
00358
00359 DEFINE_TESTCASE(msetmaxitems1, backend) {
00360 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00361 enquire.set_query(query("this"));
00362 Xapian::MSet mymset = enquire.get_mset(0, 1);
00363 TEST_MSET_SIZE(mymset, 1);
00364
00365 mymset = enquire.get_mset(0, 5);
00366 TEST_MSET_SIZE(mymset, 5);
00367
00368 return true;
00369 }
00370
00371
00372
00373
00374 DEFINE_TESTCASE(expandweights1, backend) {
00375 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00376 enquire.set_query(Xapian::Query("this"));
00377
00378 Xapian::MSet mymset = enquire.get_mset(0, 10);
00379
00380 Xapian::RSet myrset;
00381 Xapian::MSetIterator i = mymset.begin();
00382 myrset.add_document(*i);
00383 myrset.add_document(*(++i));
00384
00385 Xapian::ESet eset = enquire.get_eset(3, myrset, enquire.USE_EXACT_TERMFREQ);
00386 TEST_EQUAL(eset.size(), 3);
00387 TEST_EQUAL_DOUBLE(eset[0].get_weight(), 6.08904001099445);
00388 TEST_EQUAL_DOUBLE(eset[1].get_weight(), 6.08904001099445);
00389 TEST_EQUAL_DOUBLE(eset[2].get_weight(), 4.73383620844021);
00390
00391 return true;
00392 }
00393
00394
00395 DEFINE_TESTCASE(expandweights2, backend) {
00396 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00397 enquire.set_query(Xapian::Query("this"));
00398
00399 Xapian::MSet mymset = enquire.get_mset(0, 10);
00400
00401 Xapian::RSet myrset;
00402 Xapian::MSetIterator i = mymset.begin();
00403 myrset.add_document(*i);
00404 myrset.add_document(*(++i));
00405
00406 Xapian::ESet eset = enquire.get_eset(3, myrset);
00407 TEST_EQUAL(eset.size(), 3);
00408 if (!startswith(get_dbtype(), "multi")) {
00409
00410
00411 TEST_EQUAL_DOUBLE(eset[0].get_weight(), 6.08904001099445);
00412 TEST_EQUAL_DOUBLE(eset[1].get_weight(), 6.08904001099445);
00413 TEST_EQUAL_DOUBLE(eset[2].get_weight(), 4.73383620844021);
00414 } else {
00415
00416
00417 TEST_NOT_EQUAL_DOUBLE(eset[0].get_weight(), 6.08904001099445);
00418 TEST_EQUAL_DOUBLE(eset[1].get_weight(), 6.08904001099445);
00419 TEST_NOT_EQUAL_DOUBLE(eset[2].get_weight(), 4.73383620844021);
00420 }
00421
00422 return true;
00423 }
00424
00425 DEFINE_TESTCASE(expandweights3, backend) {
00426 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00427 enquire.set_query(Xapian::Query("this"));
00428
00429 Xapian::MSet mymset = enquire.get_mset(0, 10);
00430
00431 Xapian::RSet myrset;
00432 Xapian::MSetIterator i = mymset.begin();
00433 myrset.add_document(*i);
00434 myrset.add_document(*(++i));
00435
00436
00437 Xapian::ESet eset = enquire.get_eset(50, myrset, 0, 1.0, 0, 0);
00438 if (!startswith(get_dbtype(), "multi")) {
00439
00440
00441 TEST_EQUAL_DOUBLE(eset[0].get_weight(), 6.08904001099445);
00442 TEST_EQUAL_DOUBLE(eset[1].get_weight(), 6.08904001099445);
00443 TEST_EQUAL_DOUBLE(eset[2].get_weight(), 4.73383620844021);
00444 } else {
00445
00446
00447 TEST_NOT_EQUAL_DOUBLE(eset[0].get_weight(), 6.08904001099445);
00448 TEST_EQUAL_DOUBLE(eset[1].get_weight(), 6.08904001099445);
00449 TEST_NOT_EQUAL_DOUBLE(eset[2].get_weight(), 4.73383620844021);
00450 }
00451 TEST_REL(eset.back().get_weight(),>=,0);
00452
00453 return true;
00454 }
00455
00456
00457
00458 DEFINE_TESTCASE(expandweights4, backend) {
00459 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00460 enquire.set_query(Xapian::Query("paragraph"));
00461
00462 Xapian::MSet mymset = enquire.get_mset(0, 10);
00463
00464 Xapian::RSet myrset;
00465 Xapian::MSetIterator i = mymset.begin();
00466 myrset.add_document(*i);
00467 myrset.add_document(*(++i));
00468
00469 Xapian::ESet eset = enquire.get_eset(37, myrset, 0, 1.0, 0, -100);
00470
00471 TEST_EQUAL(eset.size(), 37);
00472 TEST_REL(eset[36].get_weight(),<,0);
00473 TEST_REL(eset[36].get_weight(),>=,-100);
00474
00475 return true;
00476 }
00477
00478
00479
00480
00481 DEFINE_TESTCASE(expandmaxitems1, backend) {
00482 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00483 enquire.set_query(Xapian::Query("this"));
00484
00485 Xapian::MSet mymset = enquire.get_mset(0, 10);
00486 tout << "mymset.size() = " << mymset.size() << endl;
00487 TEST(mymset.size() >= 2);
00488
00489 Xapian::RSet myrset;
00490 Xapian::MSetIterator i = mymset.begin();
00491 myrset.add_document(*i);
00492 myrset.add_document(*(++i));
00493
00494 Xapian::ESet myeset = enquire.get_eset(1, myrset);
00495 TEST_EQUAL(myeset.size(), 1);
00496
00497 return true;
00498 }
00499
00500
00501 DEFINE_TESTCASE(boolquery1, backend) {
00502 Xapian::Query myboolquery(query("this"));
00503
00504
00505
00506 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00507 enquire.set_query(myboolquery);
00508 enquire.set_weighting_scheme(Xapian::BoolWeight());
00509
00510
00511 Xapian::MSet mymset = enquire.get_mset(0, 10);
00512
00513 TEST_NOT_EQUAL(mymset.size(), 0);
00514 TEST_EQUAL(mymset.get_max_possible(), 0);
00515 for (Xapian::MSetIterator i = mymset.begin(); i != mymset.end(); ++i) {
00516 TEST_EQUAL(i.get_weight(), 0);
00517 }
00518 return true;
00519 }
00520
00521
00522 DEFINE_TESTCASE(msetfirst1, backend) {
00523 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00524 enquire.set_query(query("this"));
00525 Xapian::MSet mymset1 = enquire.get_mset(0, 6);
00526 Xapian::MSet mymset2 = enquire.get_mset(3, 3);
00527 TEST(mset_range_is_same(mymset1, 3, mymset2, 0, 3));
00528
00529
00530
00531 TEST_EQUAL(mymset1[5].get_document().get_data(),
00532 mymset2[2].get_document().get_data());
00533 return true;
00534 }
00535
00536
00537 DEFINE_TESTCASE(topercent1, backend) {
00538 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00539 enquire.set_query(query("this"));
00540 Xapian::MSet mymset = enquire.get_mset(0, 20);
00541
00542 int last_pct = 100;
00543 Xapian::MSetIterator i = mymset.begin();
00544 for ( ; i != mymset.end(); ++i) {
00545 int pct = mymset.convert_to_percent(i);
00546 TEST_AND_EXPLAIN(pct == i.get_percent(),
00547 "convert_to_%(msetitor) != convert_to_%(wt)");
00548 TEST_AND_EXPLAIN(pct == mymset.convert_to_percent(i.get_weight()),
00549 "convert_to_%(msetitor) != convert_to_%(wt)");
00550 TEST_AND_EXPLAIN(pct >= 0 && pct <= 100,
00551 "percentage out of range: " << pct);
00552 TEST_AND_EXPLAIN(pct <= last_pct, "percentage increased down mset");
00553 last_pct = pct;
00554 }
00555 return true;
00556 }
00557
00558
00559 DEFINE_TESTCASE(topercent2, backend) {
00560 BackendManagerLocal local_manager;
00561 local_manager.set_datadir(test_driver::get_srcdir() + "/testdata/");
00562 Xapian::Enquire localenq(local_manager.get_database("apitest_simpledata"));
00563 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00564
00565 int pct;
00566
00567
00568 enquire.set_query(query("this"));
00569 localenq.set_query(query("this"));
00570 Xapian::MSet mymset = enquire.get_mset(0, 20);
00571 Xapian::MSet localmset = localenq.get_mset(0, 20);
00572
00573 Xapian::MSetIterator i = mymset.begin();
00574 TEST(i != mymset.end());
00575 pct = mymset.convert_to_percent(i);
00576 TEST_EQUAL(pct, 100);
00577
00578 TEST_EQUAL(mymset.get_matches_lower_bound(), localmset.get_matches_lower_bound());
00579 TEST_EQUAL(mymset.get_matches_upper_bound(), localmset.get_matches_upper_bound());
00580 TEST_EQUAL(mymset.get_matches_estimated(), localmset.get_matches_estimated());
00581 TEST_EQUAL_DOUBLE(mymset.get_max_attained(), localmset.get_max_attained());
00582 TEST_EQUAL(mymset.size(), localmset.size());
00583 TEST(mset_range_is_same(mymset, 0, localmset, 0, mymset.size()));
00584
00585
00586 Xapian::Query q = query(Xapian::Query::OP_OR,
00587 "this", "line", "paragraph", "rubbish");
00588 enquire.set_query(q);
00589 localenq.set_query(q);
00590 mymset = enquire.get_mset(0, 20);
00591 localmset = localenq.get_mset(0, 20);
00592
00593 i = mymset.begin();
00594 TEST(i != mymset.end());
00595 pct = mymset.convert_to_percent(i);
00596 TEST_REL(pct,>,60);
00597 TEST_REL(pct,<,76);
00598
00599 ++i;
00600
00601 TEST(i != mymset.end());
00602 pct = mymset.convert_to_percent(i);
00603 TEST_REL(pct,>,40);
00604 TEST_REL(pct,<,50);
00605
00606 TEST_EQUAL(mymset.get_matches_lower_bound(), localmset.get_matches_lower_bound());
00607 TEST_EQUAL(mymset.get_matches_upper_bound(), localmset.get_matches_upper_bound());
00608 TEST_EQUAL(mymset.get_matches_estimated(), localmset.get_matches_estimated());
00609 TEST_EQUAL_DOUBLE(mymset.get_max_attained(), localmset.get_max_attained());
00610 TEST_EQUAL(mymset.size(), localmset.size());
00611 TEST(mset_range_is_same(mymset, 0, localmset, 0, mymset.size()));
00612
00613 return true;
00614 }
00615
00616 class myExpandFunctor : public Xapian::ExpandDecider {
00617 public:
00618 bool operator()(const string & tname) const {
00619 unsigned long sum = 0;
00620 for (string::const_iterator i=tname.begin(); i!=tname.end(); ++i) {
00621 sum += *i;
00622 }
00623
00624
00625
00626 return (sum % 2) == 0;
00627 }
00628 };
00629
00630
00631 DEFINE_TESTCASE(expandfunctor1, backend) {
00632 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00633 enquire.set_query(Xapian::Query("this"));
00634
00635 Xapian::MSet mymset = enquire.get_mset(0, 10);
00636 TEST(mymset.size() >= 2);
00637
00638 Xapian::RSet myrset;
00639 Xapian::MSetIterator i = mymset.begin();
00640 myrset.add_document(*i);
00641 myrset.add_document(*(++i));
00642
00643 myExpandFunctor myfunctor;
00644
00645 Xapian::ESet myeset_orig = enquire.get_eset(1000, myrset);
00646 unsigned int neweset_size = 0;
00647 Xapian::ESetIterator j = myeset_orig.begin();
00648 for ( ; j != myeset_orig.end(); ++j) {
00649 if (myfunctor(*j)) neweset_size++;
00650 }
00651 Xapian::ESet myeset = enquire.get_eset(neweset_size, myrset, &myfunctor);
00652
00653 #if 0
00654
00655 if (verbose) {
00656 tout << "orig_eset: ";
00657 copy(myeset_orig.begin(), myeset_orig.end(),
00658 ostream_iterator<Xapian::ESetItem>(tout, " "));
00659 tout << "\n";
00660
00661 tout << "new_eset: ";
00662 copy(myeset.begin(), myeset.end(),
00663 ostream_iterator<Xapian::ESetItem>(tout, " "));
00664 tout << "\n";
00665 }
00666 #endif
00667 Xapian::ESetIterator orig = myeset_orig.begin();
00668 Xapian::ESetIterator filt = myeset.begin();
00669 for (; orig != myeset_orig.end() && filt != myeset.end(); ++orig, ++filt) {
00670
00671 while (orig != myeset_orig.end() && !myfunctor(*orig)) {
00672 ++orig;
00673 }
00674
00675 TEST_AND_EXPLAIN(*orig == *filt &&
00676 orig.get_weight() == filt.get_weight(),
00677 "Mismatch in items " << *orig << " vs. " << *filt
00678 << " after filtering");
00679 }
00680
00681 while (orig != myeset_orig.end() && !myfunctor(*orig)) {
00682 ++orig;
00683 }
00684
00685 TEST_EQUAL(orig, myeset_orig.end());
00686 TEST_AND_EXPLAIN(filt == myeset.end(),
00687 "Extra items in the filtered eset.");
00688 return true;
00689 }
00690
00691
00692 DEFINE_TESTCASE(pctcutoff1, backend) {
00693 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00694 enquire.set_query(query(Xapian::Query::OP_OR,
00695 "this", "line", "paragraph", "rubbish"));
00696 Xapian::MSet mymset1 = enquire.get_mset(0, 100);
00697
00698 if (verbose) {
00699 tout << "Original mset pcts:";
00700 print_mset_percentages(mymset1);
00701 tout << "\n";
00702 }
00703
00704 unsigned int num_items = 0;
00705 int my_pct = 100;
00706 int changes = 0;
00707 Xapian::MSetIterator i = mymset1.begin();
00708 int c = 0;
00709 for ( ; i != mymset1.end(); ++i, ++c) {
00710 int new_pct = mymset1.convert_to_percent(i);
00711 if (new_pct != my_pct) {
00712 changes++;
00713 if (changes > 3) break;
00714 num_items = c;
00715 my_pct = new_pct;
00716 }
00717 }
00718
00719 TEST_AND_EXPLAIN(changes > 3, "MSet not varied enough to test");
00720 if (verbose) {
00721 tout << "Cutoff percent: " << my_pct << "\n";
00722 }
00723
00724 enquire.set_cutoff(my_pct);
00725 Xapian::MSet mymset2 = enquire.get_mset(0, 100);
00726
00727 if (verbose) {
00728 tout << "Percentages after cutoff:";
00729 print_mset_percentages(mymset2);
00730 tout << "\n";
00731 }
00732
00733 TEST_AND_EXPLAIN(mymset2.size() >= num_items,
00734 "Match with % cutoff lost too many items");
00735
00736 TEST_AND_EXPLAIN(mymset2.size() == num_items ||
00737 (mymset2.convert_to_percent(mymset2[num_items]) == my_pct &&
00738 mymset2.convert_to_percent(mymset2.back()) == my_pct),
00739 "Match with % cutoff returned too many items");
00740
00741 return true;
00742 }
00743
00744
00745 DEFINE_TESTCASE(pctcutoff2, backend) {
00746 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00747 enquire.set_query(Xapian::Query("this"));
00748 enquire.set_query(Xapian::Query(Xapian::Query::OP_AND_NOT, Xapian::Query("this"), Xapian::Query("banana")));
00749 Xapian::MSet mset = enquire.get_mset(0, 100);
00750
00751 if (verbose) {
00752 tout << "Original mset pcts:";
00753 print_mset_percentages(mset);
00754 tout << "\n";
00755 }
00756
00757 TEST(mset.size() >= 2);
00758 TEST(mset[0].get_percent() - mset[1].get_percent() >= 2);
00759
00760 Xapian::percent cutoff = mset[0].get_percent() + mset[1].get_percent();
00761 cutoff /= 2;
00762
00763 enquire.set_cutoff(cutoff);
00764 enquire.set_collapse_key(1234);
00765
00766 Xapian::MSet mset2 = enquire.get_mset(0, 1);
00767 TEST_EQUAL(mset2.size(), 1);
00768 TEST_EQUAL(mset2.get_matches_lower_bound(), 1);
00769 TEST_REL(mset2.get_uncollapsed_matches_lower_bound(),>=,1);
00770 TEST_REL(mset2.get_uncollapsed_matches_lower_bound(),<=,mset.size());
00771 TEST_REL(mset2.get_uncollapsed_matches_upper_bound(),>=,mset.size());
00772 TEST_REL(mset2.get_uncollapsed_matches_lower_bound(),<=,mset2.get_uncollapsed_matches_estimated());
00773 TEST_REL(mset2.get_uncollapsed_matches_upper_bound(),>=,mset2.get_uncollapsed_matches_estimated());
00774
00775 return true;
00776 }
00777
00778
00779 DEFINE_TESTCASE(pctcutoff3, backend) {
00780 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00781 enquire.set_query(Xapian::Query("this"));
00782 Xapian::MSet mset1 = enquire.get_mset(0, 10);
00783
00784 if (verbose) {
00785 tout << "Original mset pcts:";
00786 print_mset_percentages(mset1);
00787 tout << "\n";
00788 }
00789
00790 int percent = 100;
00791 for (Xapian::MSetIterator i = mset1.begin(); i != mset1.end(); ++i) {
00792 int new_percent = mset1.convert_to_percent(i);
00793 if (new_percent != percent) {
00794 enquire.set_cutoff(percent);
00795 Xapian::MSet mset2 = enquire.get_mset(0, 10);
00796 TEST_EQUAL(mset2.size(), i.get_rank());
00797 percent = new_percent;
00798 }
00799 }
00800
00801 return true;
00802 }
00803
00804
00805 DEFINE_TESTCASE(cutoff1, backend) {
00806 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00807 enquire.set_query(query(Xapian::Query::OP_OR,
00808 "this", "line", "paragraph", "rubbish"));
00809 Xapian::MSet mymset1 = enquire.get_mset(0, 100);
00810
00811 if (verbose) {
00812 tout << "Original mset weights:";
00813 print_mset_weights(mymset1);
00814 tout << "\n";
00815 }
00816
00817 unsigned int num_items = 0;
00818 Xapian::weight my_wt = -100;
00819 int changes = 0;
00820 Xapian::MSetIterator i = mymset1.begin();
00821 int c = 0;
00822 for ( ; i != mymset1.end(); ++i, ++c) {
00823 Xapian::weight new_wt = i.get_weight();
00824 if (new_wt != my_wt) {
00825 changes++;
00826 if (changes > 3) break;
00827 num_items = c;
00828 my_wt = new_wt;
00829 }
00830 }
00831
00832 TEST_AND_EXPLAIN(changes > 3, "MSet not varied enough to test");
00833 if (verbose) {
00834 tout << "Cutoff weight: " << my_wt << "\n";
00835 }
00836
00837 enquire.set_cutoff(0, my_wt);
00838 Xapian::MSet mymset2 = enquire.get_mset(0, 100);
00839
00840 if (verbose) {
00841 tout << "Weights after cutoff:";
00842 print_mset_weights(mymset2);
00843 tout << "\n";
00844 }
00845
00846 TEST_AND_EXPLAIN(mymset2.size() >= num_items,
00847 "Match with cutoff lost too many items");
00848
00849 TEST_AND_EXPLAIN(mymset2.size() == num_items ||
00850 (mymset2[num_items].get_weight() == my_wt &&
00851 mymset2.back().get_weight() == my_wt),
00852 "Match with cutoff returned too many items");
00853
00854 return true;
00855 }
00856
00857
00858 DEFINE_TESTCASE(allowqterms1, backend) {
00859 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00860 string term = "paragraph";
00861 enquire.set_query(Xapian::Query(term));
00862
00863 Xapian::MSet mymset = enquire.get_mset(0, 10);
00864 TEST(mymset.size() >= 2);
00865
00866 Xapian::RSet myrset;
00867 Xapian::MSetIterator i = mymset.begin();
00868 myrset.add_document(*i);
00869 myrset.add_document(*(++i));
00870
00871 Xapian::ESet myeset = enquire.get_eset(1000, myrset);
00872 Xapian::ESetIterator j = myeset.begin();
00873 for ( ; j != myeset.end(); ++j) {
00874 TEST_NOT_EQUAL(*j, term);
00875 }
00876
00877 Xapian::ESet myeset2 = enquire.get_eset(1000, myrset, Xapian::Enquire::INCLUDE_QUERY_TERMS);
00878 j = myeset2.begin();
00879 for ( ; j != myeset2.end(); ++j) {
00880 if (*j == term) break;
00881 }
00882 TEST(j != myeset2.end());
00883 return true;
00884 }
00885
00886
00887 DEFINE_TESTCASE(maxattain1, backend) {
00888 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00889 enquire.set_query(query("this"));
00890 Xapian::MSet mymset = enquire.get_mset(0, 100);
00891
00892 Xapian::weight mymax = 0;
00893 Xapian::MSetIterator i = mymset.begin();
00894 for ( ; i != mymset.end(); ++i) {
00895 if (i.get_weight() > mymax) mymax = i.get_weight();
00896 }
00897 TEST_EQUAL(mymax, mymset.get_max_attained());
00898
00899 return true;
00900 }
00901
00902
00903 DEFINE_TESTCASE(reversebool1, backend) {
00904 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00905 enquire.set_query(Xapian::Query("this"));
00906 enquire.set_weighting_scheme(Xapian::BoolWeight());
00907
00908 Xapian::MSet mymset1 = enquire.get_mset(0, 100);
00909 TEST_AND_EXPLAIN(mymset1.size() > 1,
00910 "Mset was too small to test properly");
00911
00912 enquire.set_docid_order(Xapian::Enquire::ASCENDING);
00913 Xapian::MSet mymset2 = enquire.get_mset(0, 100);
00914 enquire.set_docid_order(Xapian::Enquire::DESCENDING);
00915 Xapian::MSet mymset3 = enquire.get_mset(0, 100);
00916
00917
00918 TEST_EQUAL(mymset1.size(), mymset2.size());
00919
00920 {
00921 Xapian::MSetIterator i = mymset1.begin();
00922 Xapian::MSetIterator j = mymset2.begin();
00923 for ( ; i != mymset1.end(), j != mymset2.end(); ++i, j++) {
00924
00925
00926 TEST_EQUAL(*i, *j);
00927 }
00928 }
00929
00930
00931 TEST_EQUAL(mymset1.size(), mymset3.size());
00932
00933 {
00934 Xapian::MSetIterator i = mymset1.begin();
00935 vector<Xapian::docid> rev(mymset3.begin(), mymset3.end());
00936
00937 vector<Xapian::docid>::reverse_iterator j = rev.rbegin();
00938 for ( ; i != mymset1.end(); ++i, j++) {
00939
00940
00941 TEST_EQUAL(*i, *j);
00942 }
00943 }
00944
00945 return true;
00946 }
00947
00948
00949 DEFINE_TESTCASE(reversebool2, backend) {
00950 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00951 enquire.set_query(Xapian::Query("this"));
00952 enquire.set_weighting_scheme(Xapian::BoolWeight());
00953
00954 Xapian::MSet mymset1 = enquire.get_mset(0, 100);
00955
00956 TEST_AND_EXPLAIN(mymset1.size() > 1,
00957 "Mset was too small to test properly");
00958
00959 enquire.set_docid_order(Xapian::Enquire::ASCENDING);
00960 Xapian::doccount msize = mymset1.size() / 2;
00961 Xapian::MSet mymset2 = enquire.get_mset(0, msize);
00962 enquire.set_docid_order(Xapian::Enquire::DESCENDING);
00963 Xapian::MSet mymset3 = enquire.get_mset(0, msize);
00964
00965
00966 TEST_EQUAL(msize, mymset2.size());
00967 {
00968 Xapian::MSetIterator i = mymset1.begin();
00969 Xapian::MSetIterator j = mymset2.begin();
00970 for ( ; i != mymset1.end(), j != mymset2.end(); ++i, j++) {
00971
00972
00973 TEST_EQUAL(*i, *j);
00974 }
00975 }
00976
00977
00978 TEST_EQUAL(msize, mymset3.size());
00979 {
00980 vector<Xapian::docid> rev(mymset1.begin(), mymset1.end());
00981
00982 vector<Xapian::docid>::reverse_iterator i = rev.rbegin();
00983 Xapian::MSetIterator j = mymset3.begin();
00984 for ( ; j != mymset3.end(); ++i, j++) {
00985
00986
00987 TEST_EQUAL(*i, *j);
00988 }
00989 }
00990
00991 return true;
00992 }
00993
00994
00995 DEFINE_TESTCASE(getmterms1, backend) {
00996 list<string> answers_list;
00997 answers_list.push_back("one");
00998 answers_list.push_back("two");
00999 answers_list.push_back("three");
01000 answers_list.push_back("four");
01001
01002 Xapian::Database mydb(get_database("apitest_termorder"));
01003 Xapian::Enquire enquire(mydb);
01004
01005 Xapian::Query myquery(Xapian::Query::OP_OR,
01006 Xapian::Query(Xapian::Query::OP_AND,
01007 Xapian::Query("one", 1, 1),
01008 Xapian::Query("three", 1, 3)),
01009 Xapian::Query(Xapian::Query::OP_OR,
01010 Xapian::Query("four", 1, 4),
01011 Xapian::Query("two", 1, 2)));
01012
01013 enquire.set_query(myquery);
01014
01015 Xapian::MSet mymset = enquire.get_mset(0, 10);
01016
01017 TEST_MSET_SIZE(mymset, 1);
01018 list<string> list(enquire.get_matching_terms_begin(mymset.begin()),
01019 enquire.get_matching_terms_end(mymset.begin()));
01020 TEST(list == answers_list);
01021
01022 return true;
01023 }
01024
01025
01026 DEFINE_TESTCASE(getmterms2, backend) {
01027 list<string> answers_list;
01028 answers_list.push_back("one");
01029 answers_list.push_back("two");
01030 answers_list.push_back("three");
01031
01032 Xapian::Database mydb(get_database("apitest_termorder"));
01033 Xapian::Enquire enquire(mydb);
01034
01035 Xapian::Query myquery(Xapian::Query::OP_OR,
01036 Xapian::Query(Xapian::Query::OP_AND,
01037 Xapian::Query("one", 1, 1),
01038 Xapian::Query("three", 1, 3)),
01039 Xapian::Query(Xapian::Query::OP_OR,
01040 Xapian::Query("one", 1, 4),
01041 Xapian::Query("two", 1, 2)));
01042
01043 enquire.set_query(myquery);
01044
01045 Xapian::MSet mymset = enquire.get_mset(0, 10);
01046
01047 TEST_MSET_SIZE(mymset, 1);
01048 list<string> list(enquire.get_matching_terms_begin(mymset.begin()),
01049 enquire.get_matching_terms_end(mymset.begin()));
01050 TEST(list == answers_list);
01051
01052 return true;
01053 }
01054
01055
01056 DEFINE_TESTCASE(poscollapse1, backend) {
01057 Xapian::Query myquery1(Xapian::Query::OP_OR,
01058 Xapian::Query("this", 1, 1),
01059 Xapian::Query("this", 1, 1));
01060 Xapian::Query myquery2("this", 2, 1);
01061
01062 if (verbose) {
01063 tout << myquery1.get_description() << "\n";
01064 tout << myquery2.get_description() << "\n";
01065 }
01066
01067 Xapian::Enquire enquire(get_database("apitest_simpledata"));
01068 enquire.set_query(myquery1);
01069 Xapian::MSet mymset1 = enquire.get_mset(0, 10);
01070
01071 enquire.set_query(myquery2);
01072 Xapian::MSet mymset2 = enquire.get_mset(0, 10);
01073
01074 TEST_EQUAL(mymset1, mymset2);
01075
01076 return true;
01077 }
01078
01079
01080 DEFINE_TESTCASE(repeatquery1, backend) {
01081 Xapian::Enquire enquire(get_database("apitest_simpledata"));
01082 enquire.set_query(Xapian::Query("this"));
01083
01084 enquire.set_query(query(Xapian::Query::OP_OR, "this", "word"));
01085
01086 Xapian::MSet mymset1 = enquire.get_mset(0, 10);
01087 Xapian::MSet mymset2 = enquire.get_mset(0, 10);
01088 TEST_EQUAL(mymset1, mymset2);
01089
01090 return true;
01091 }
01092
01093
01094 DEFINE_TESTCASE(fetchdocs1, backend) {
01095 Xapian::Enquire enquire(get_database("apitest_simpledata"));
01096 enquire.set_query(Xapian::Query("this"));
01097
01098 enquire.set_query(query(Xapian::Query::OP_OR, "this", "word"));
01099
01100 Xapian::MSet mymset1 = enquire.get_mset(0, 10);
01101 Xapian::MSet mymset2 = enquire.get_mset(0, 10);
01102 TEST_EQUAL(mymset1, mymset2);
01103 mymset2.fetch(mymset2[0], mymset2[mymset2.size() - 1]);
01104 mymset2.fetch(mymset2.begin(), mymset2.end());
01105 mymset2.fetch(mymset2.begin());
01106 mymset2.fetch();
01107
01108 Xapian::MSetIterator it1 = mymset1.begin();
01109 Xapian::MSetIterator it2 = mymset2.begin();
01110
01111 while (it1 != mymset1.end() && it2 != mymset2.end()) {
01112 TEST_EQUAL(it1.get_document().get_data(),
01113 it2.get_document().get_data());
01114 TEST_NOT_EQUAL(it1.get_document().get_data(), "");
01115 TEST_NOT_EQUAL(it2.get_document().get_data(), "");
01116 it1++;
01117 it2++;
01118 }
01119 TEST_EQUAL(it1, mymset1.end());
01120 TEST_EQUAL(it1, mymset2.end());
01121
01122 return true;
01123 }
01124
01125
01126 DEFINE_TESTCASE(absentterm1, backend) {
01127 Xapian::Enquire enquire(get_database("apitest_simpledata"));
01128 enquire.set_weighting_scheme(Xapian::BoolWeight());
01129 enquire.set_query(Xapian::Query("frink"));
01130
01131 Xapian::MSet mymset = enquire.get_mset(0, 10);
01132 mset_expect_order(mymset);
01133
01134 return true;
01135 }
01136
01137
01138 DEFINE_TESTCASE(absentterm2, backend) {
01139 Xapian::Enquire enquire(get_database("apitest_simpledata"));
01140 vector<string> terms;
01141 terms.push_back("frink");
01142
01143 Xapian::Query query(Xapian::Query::OP_OR, terms.begin(), terms.end());
01144 enquire.set_query(query);
01145
01146 Xapian::MSet mymset = enquire.get_mset(0, 10);
01147 mset_expect_order(mymset);
01148
01149 return true;
01150 }
01151
01152
01153 DEFINE_TESTCASE(rset1, backend) {
01154 Xapian::Database mydb(get_database("apitest_rset"));
01155 Xapian::Enquire enquire(mydb);
01156 Xapian::Query myquery = query(Xapian::Query::OP_OR, "giraffe", "tiger");
01157 enquire.set_query(myquery);
01158
01159 Xapian::MSet mymset1 = enquire.get_mset(0, 10);
01160
01161 Xapian::RSet myrset;
01162 myrset.add_document(1);
01163
01164 Xapian::MSet mymset2 = enquire.get_mset(0, 10, &myrset);
01165
01166
01167
01168 TEST_MSET_SIZE(mymset1, 3);
01169 TEST_MSET_SIZE(mymset2, 3);
01170
01171 return true;
01172 }
01173
01174
01175 DEFINE_TESTCASE(rset2, backend) {
01176 Xapian::Database mydb(get_database("apitest_rset"));
01177 Xapian::Enquire enquire(mydb);
01178 Xapian::Query myquery = query(Xapian::Query::OP_OR, "cuddly", "people");
01179 enquire.set_query(myquery);
01180
01181 Xapian::MSet mymset1 = enquire.get_mset(0, 10);
01182
01183 Xapian::RSet myrset;
01184 myrset.add_document(2);
01185
01186 Xapian::MSet mymset2 = enquire.get_mset(0, 10, &myrset);
01187
01188 mset_expect_order(mymset1, 1, 2);
01189 mset_expect_order(mymset2, 2, 1);
01190
01191 return true;
01192 }
01193
01194
01195 DEFINE_TESTCASE(rsetmultidb1, backend && !multi) {
01196 Xapian::Database mydb1(get_database("apitest_rset", "apitest_simpledata2"));
01197 Xapian::Database mydb2(get_database("apitest_rset"));
01198 mydb2.add_database(get_database("apitest_simpledata2"));
01199
01200 Xapian::Enquire enquire1(mydb1);
01201 Xapian::Enquire enquire2(mydb2);
01202
01203 Xapian::Query myquery = query(Xapian::Query::OP_OR, "cuddly", "multiple");
01204
01205 enquire1.set_query(myquery);
01206 enquire2.set_query(myquery);
01207
01208 Xapian::RSet myrset1;
01209 Xapian::RSet myrset2;
01210 myrset1.add_document(4);
01211 myrset2.add_document(2);
01212
01213 Xapian::MSet mymset1a = enquire1.get_mset(0, 10);
01214 Xapian::MSet mymset1b = enquire1.get_mset(0, 10, &myrset1);
01215 Xapian::MSet mymset2a = enquire2.get_mset(0, 10);
01216 Xapian::MSet mymset2b = enquire2.get_mset(0, 10, &myrset2);
01217
01218 mset_expect_order(mymset1a, 1, 4);
01219 mset_expect_order(mymset1b, 4, 1);
01220 mset_expect_order(mymset2a, 1, 2);
01221 mset_expect_order(mymset2b, 2, 1);
01222
01223 TEST(mset_range_is_same_weights(mymset1a, 0, mymset2a, 0, 2));
01224 TEST(mset_range_is_same_weights(mymset1b, 0, mymset2b, 0, 2));
01225 TEST_NOT_EQUAL(mymset1a, mymset1b);
01226 TEST_NOT_EQUAL(mymset2a, mymset2b);
01227
01228 return true;
01229 }
01230
01231
01232
01233 DEFINE_TESTCASE(rsetmultidb3, backend && !multi) {
01234 Xapian::Enquire enquire(get_database("apitest_simpledata2"));
01235 enquire.set_query(query(Xapian::Query::OP_OR, "cuddly", "people"));
01236 Xapian::MSet mset = enquire.get_mset(0, 10);
01237 return true;
01238 }
01239
01241 DEFINE_TESTCASE(eliteset1, backend) {
01242
01243
01244 SKIP_TEST_FOR_BACKEND("multi");
01245
01246 Xapian::Database mydb(get_database("apitest_simpledata"));
01247 Xapian::Enquire enquire(mydb);
01248
01249 Xapian::Query myquery1 = query(Xapian::Query::OP_OR, "word");
01250
01251 Xapian::Query myquery2 = query(Xapian::Query::OP_ELITE_SET, 1,
01252 "simple", "word");
01253
01254 enquire.set_query(myquery1, 2);
01255 Xapian::MSet mymset1 = enquire.get_mset(0, 10);
01256
01257 enquire.set_query(myquery2);
01258 Xapian::MSet mymset2 = enquire.get_mset(0, 10);
01259
01260 TEST_EQUAL(mymset1, mymset2);
01261 return true;
01262 }
01263
01266 DEFINE_TESTCASE(eliteset2, backend) {
01267
01268
01269 SKIP_TEST_FOR_BACKEND("multi");
01270
01271 Xapian::Database mydb(get_database("apitest_simpledata"));
01272 Xapian::Enquire enquire(mydb);
01273
01274 Xapian::Query myquery1 = query(Xapian::Query::OP_AND, "word", "search");
01275
01276 vector<Xapian::Query> qs;
01277 qs.push_back(query("this"));
01278 qs.push_back(query(Xapian::Query::OP_AND, "word", "search"));
01279 Xapian::Query myquery2(Xapian::Query::OP_ELITE_SET,
01280 qs.begin(), qs.end(), 1);
01281
01282 enquire.set_query(myquery1);
01283 Xapian::MSet mymset1 = enquire.get_mset(0, 10);
01284
01285 enquire.set_query(myquery2);
01286 Xapian::MSet mymset2 = enquire.get_mset(0, 10);
01287
01288 TEST_EQUAL(mymset1, mymset2);
01289
01290
01291
01292
01293 return true;
01294 }
01295
01298 DEFINE_TESTCASE(eliteset3, backend) {
01299 Xapian::Database mydb1(get_database("apitest_simpledata"));
01300 Xapian::Enquire enquire1(mydb1);
01301
01302 Xapian::Database mydb2(get_database("apitest_simpledata"));
01303 Xapian::Enquire enquire2(mydb2);
01304
01305
01306 Xapian::Stem stemmer("english");
01307
01308 string term1 = stemmer("word");
01309 string term2 = stemmer("rubbish");
01310 string term3 = stemmer("banana");
01311
01312 vector<string> terms;
01313 terms.push_back(term1);
01314 terms.push_back(term2);
01315 terms.push_back(term3);
01316
01317 Xapian::Query myquery1(Xapian::Query::OP_OR, terms.begin(), terms.end());
01318 enquire1.set_query(myquery1);
01319
01320 Xapian::Query myquery2(Xapian::Query::OP_ELITE_SET, terms.begin(), terms.end(), 3);
01321 enquire2.set_query(myquery2);
01322
01323
01324 Xapian::MSet mymset1 = enquire1.get_mset(0, 10);
01325 Xapian::MSet mymset2 = enquire2.get_mset(0, 10);
01326
01327 TEST_EQUAL(mymset1.get_termfreq(term1),
01328 mymset2.get_termfreq(term1));
01329 TEST_EQUAL(mymset1.get_termweight(term1),
01330 mymset2.get_termweight(term1));
01331 TEST_EQUAL(mymset1.get_termfreq(term2),
01332 mymset2.get_termfreq(term2));
01333 TEST_EQUAL(mymset1.get_termweight(term2),
01334 mymset2.get_termweight(term2));
01335 TEST_EQUAL(mymset1.get_termfreq(term3),
01336 mymset2.get_termfreq(term3));
01337 TEST_EQUAL(mymset1.get_termweight(term3),
01338 mymset2.get_termweight(term3));
01339
01340
01341 return true;
01342 }
01343
01345 DEFINE_TESTCASE(eliteset4, backend) {
01346
01347
01348 SKIP_TEST_FOR_BACKEND("multi");
01349
01350 Xapian::Database mydb1(get_database("apitest_simpledata"));
01351 Xapian::Enquire enquire1(mydb1);
01352
01353 Xapian::Database mydb2(get_database("apitest_simpledata"));
01354 Xapian::Enquire enquire2(mydb2);
01355
01356 Xapian::Query myquery1 = query("rubbish");
01357 Xapian::Query myquery2 = query(Xapian::Query::OP_ELITE_SET, 1,
01358 "word", "rubbish", "fibble");
01359 enquire1.set_query(myquery1);
01360 enquire2.set_query(myquery2);
01361
01362
01363 Xapian::MSet mymset1 = enquire1.get_mset(0, 10);
01364 Xapian::MSet mymset2 = enquire2.get_mset(0, 10);
01365
01366 TEST_NOT_EQUAL(mymset2.size(), 0);
01367 TEST_EQUAL(mymset1, mymset2);
01368
01369
01370 return true;
01371 }
01372
01374 DEFINE_TESTCASE(eliteset5, backend) {
01375 SKIP_TEST_FOR_BACKEND("multi");
01376
01377 Xapian::Database mydb1(get_database("apitest_simpledata"));
01378 Xapian::Enquire enquire1(mydb1);
01379
01380 vector<string> v;
01381 for (int i = 0; i != 3; ++i) {
01382 v.push_back("simpl");
01383 v.push_back("queri");
01384
01385 v.push_back("rubbish");
01386 v.push_back("rubbish");
01387 v.push_back("rubbish");
01388 v.push_back("word");
01389 v.push_back("word");
01390 v.push_back("word");
01391 }
01392
01393 Xapian::Query myquery1 = Xapian::Query(Xapian::Query::OP_ELITE_SET,
01394 v.begin(), v.end(), 1);
01395 myquery1 = Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT,
01396 myquery1,
01397 0.004);
01398
01399 enquire1.set_query(myquery1);
01400
01401
01402 enquire1.get_mset(0, 10);
01403
01404 return true;
01405 }
01406
01408 DEFINE_TESTCASE(termlisttermfreq1, backend) {
01409 Xapian::Database mydb(get_database("apitest_simpledata"));
01410 Xapian::Enquire enquire(mydb);
01411 Xapian::Stem stemmer("english");
01412 Xapian::RSet rset1;
01413 Xapian::RSet rset2;
01414 rset1.add_document(5);
01415 rset2.add_document(6);
01416
01417 Xapian::ESet eset1 = enquire.get_eset(1000, rset1);
01418 Xapian::ESet eset2 = enquire.get_eset(1000, rset2);
01419
01420
01421 string theterm = stemmer("another");
01422
01423 Xapian::weight wt1 = 0;
01424 Xapian::weight wt2 = 0;
01425 {
01426 Xapian::ESetIterator i = eset1.begin();
01427 for ( ; i != eset1.end(); i++) {
01428 if (*i == theterm) {
01429 wt1 = i.get_weight();
01430 break;
01431 }
01432 }
01433 }
01434 {
01435 Xapian::ESetIterator i = eset2.begin();
01436 for ( ; i != eset2.end(); i++) {
01437 if (*i == theterm) {
01438 wt2 = i.get_weight();
01439 break;
01440 }
01441 }
01442 }
01443
01444 TEST_NOT_EQUAL(wt1, 0);
01445 TEST_NOT_EQUAL(wt2, 0);
01446 TEST_EQUAL(wt1, wt2);
01447
01448 return true;
01449 }
01450
01452 DEFINE_TESTCASE(qterminfo1, backend) {
01453 Xapian::Database mydb1(get_database("apitest_simpledata", "apitest_simpledata2"));
01454 Xapian::Enquire enquire1(mydb1);
01455
01456 Xapian::Database mydb2(get_database("apitest_simpledata"));
01457 mydb2.add_database(get_database("apitest_simpledata2"));
01458 Xapian::Enquire enquire2(mydb2);
01459
01460
01461 Xapian::Stem stemmer("english");
01462
01463 string term1 = stemmer("word");
01464 string term2 = stemmer("inmemory");
01465 string term3 = stemmer("flibble");
01466
01467 Xapian::Query myquery(Xapian::Query::OP_OR,
01468 Xapian::Query(term1),
01469 Xapian::Query(Xapian::Query::OP_OR,
01470 Xapian::Query(term2),
01471 Xapian::Query(term3)));
01472 enquire1.set_query(myquery);
01473 enquire2.set_query(myquery);
01474
01475
01476 Xapian::MSet mymset1a = enquire1.get_mset(0, 0);
01477 Xapian::MSet mymset2a = enquire2.get_mset(0, 0);
01478
01479 TEST_EQUAL(mymset1a.get_termfreq(term1),
01480 mymset2a.get_termfreq(term1));
01481 TEST_EQUAL(mymset1a.get_termfreq(term2),
01482 mymset2a.get_termfreq(term2));
01483 TEST_EQUAL(mymset1a.get_termfreq(term3),
01484 mymset2a.get_termfreq(term3));
01485
01486 TEST_EQUAL(mymset1a.get_termfreq(term1), 3);
01487 TEST_EQUAL(mymset1a.get_termfreq(term2), 1);
01488 TEST_EQUAL(mymset1a.get_termfreq(term3), 0);
01489
01490 TEST_NOT_EQUAL(mymset1a.get_termweight(term1), 0);
01491 TEST_NOT_EQUAL(mymset1a.get_termweight(term2), 0);
01492
01493 TEST_EQUAL(mymset1a.get_termweight(term3), 0);
01494
01495 TEST_EQUAL(mymset1a.get_termfreq(stemmer("banana")), 1);
01496 TEST_EXCEPTION(Xapian::InvalidArgumentError,
01497 mymset1a.get_termweight(stemmer("banana")));
01498
01499 TEST_EQUAL(mymset1a.get_termfreq("sponge"), 0);
01500 TEST_EXCEPTION(Xapian::InvalidArgumentError,
01501 mymset1a.get_termweight("sponge"));
01502
01503 return true;
01504 }
01505
01507 DEFINE_TESTCASE(qterminfo2, backend) {
01508 Xapian::Database db(get_database("apitest_simpledata"));
01509 Xapian::Enquire enquire(db);
01510
01511
01512 Xapian::Stem stemmer("english");
01513
01514 string term1 = stemmer("paragraph");
01515 string term2 = stemmer("another");
01516
01517 Xapian::Query query(Xapian::Query::OP_AND_NOT, term1,
01518 Xapian::Query(Xapian::Query::OP_AND, term1, term2));
01519 enquire.set_query(query);
01520
01521
01522
01523 Xapian::MSet mset = enquire.get_mset(0, 10);
01524
01525 TEST_NOT_EQUAL(mset.get_termweight("paragraph"), 0);
01526
01527 return true;
01528 }
01529
01530
01531
01532 DEFINE_TESTCASE(msetzeroitems1, backend) {
01533 Xapian::Enquire enquire(get_database("apitest_simpledata"));
01534 enquire.set_query(query("this"));
01535 Xapian::MSet mymset1 = enquire.get_mset(0, 0);
01536
01537 Xapian::MSet mymset2 = enquire.get_mset(0, 1);
01538
01539 TEST_EQUAL(mymset1.get_max_possible(), mymset2.get_max_possible());
01540
01541 return true;
01542 }
01543
01544
01545 DEFINE_TESTCASE(matches1, backend) {
01546 Xapian::Enquire enquire(get_database("apitest_simpledata"));
01547 Xapian::Query myquery;
01548 Xapian::MSet mymset;
01549
01550 myquery = query("word");
01551 enquire.set_query(myquery);
01552 mymset = enquire.get_mset(0, 10);
01553 TEST_EQUAL(mymset.get_matches_lower_bound(), 2);
01554 TEST_EQUAL(mymset.get_matches_estimated(), 2);
01555 TEST_EQUAL(mymset.get_matches_upper_bound(), 2);
01556 TEST_EQUAL(mymset.get_uncollapsed_matches_lower_bound(), 2);
01557 TEST_EQUAL(mymset.get_uncollapsed_matches_estimated(), 2);
01558 TEST_EQUAL(mymset.get_uncollapsed_matches_upper_bound(), 2);
01559
01560 myquery = query(Xapian::Query::OP_OR, "inmemory", "word");
01561 enquire.set_query(myquery);
01562 mymset = enquire.get_mset(0, 10);
01563 TEST_EQUAL(mymset.get_matches_lower_bound(), 2);
01564 TEST_EQUAL(mymset.get_matches_estimated(), 2);
01565 TEST_EQUAL(mymset.get_matches_upper_bound(), 2);
01566 TEST_EQUAL(mymset.get_uncollapsed_matches_lower_bound(), 2);
01567 TEST_EQUAL(mymset.get_uncollapsed_matches_estimated(), 2);
01568 TEST_EQUAL(mymset.get_uncollapsed_matches_upper_bound(), 2);
01569
01570 myquery = query(Xapian::Query::OP_AND, "inmemory", "word");
01571 enquire.set_query(myquery);
01572 mymset = enquire.get_mset(0, 10);
01573 TEST_EQUAL(mymset.get_matches_lower_bound(), 0);
01574 TEST_EQUAL(mymset.get_matches_estimated(), 0);
01575 TEST_EQUAL(mymset.get_matches_upper_bound(), 0);
01576 TEST_EQUAL(mymset.get_uncollapsed_matches_lower_bound(), 0);
01577 TEST_EQUAL(mymset.get_uncollapsed_matches_estimated(), 0);
01578 TEST_EQUAL(mymset.get_uncollapsed_matches_upper_bound(), 0);
01579
01580 myquery = query(Xapian::Query::OP_AND, "simple", "word");
01581 enquire.set_query(myquery);
01582 mymset = enquire.get_mset(0, 10);
01583 TEST_EQUAL(mymset.get_matches_lower_bound(), 2);
01584 TEST_EQUAL(mymset.get_matches_estimated(), 2);
01585 TEST_EQUAL(mymset.get_matches_upper_bound(), 2);
01586 TEST_EQUAL(mymset.get_uncollapsed_matches_lower_bound(), 2);
01587 TEST_EQUAL(mymset.get_uncollapsed_matches_estimated(), 2);
01588 TEST_EQUAL(mymset.get_uncollapsed_matches_upper_bound(), 2);
01589
01590 myquery = query(Xapian::Query::OP_AND, "simple", "word");
01591 enquire.set_query(myquery);
01592 mymset = enquire.get_mset(0, 0);
01593
01594
01595
01596
01597 TEST_REL(mymset.get_matches_lower_bound(),<=,mymset.get_matches_estimated());
01598 TEST_EQUAL(mymset.get_matches_estimated(), 1);
01599 TEST_EQUAL(mymset.get_matches_upper_bound(), 2);
01600 TEST_REL(mymset.get_uncollapsed_matches_lower_bound(),<=,mymset.get_uncollapsed_matches_estimated());
01601 TEST_EQUAL(mymset.get_uncollapsed_matches_estimated(), 1);
01602 TEST_EQUAL(mymset.get_uncollapsed_matches_upper_bound(), 2);
01603
01604 mymset = enquire.get_mset(0, 1);
01605 TEST_EQUAL(mymset.get_matches_lower_bound(), 2);
01606 TEST_EQUAL(mymset.get_matches_estimated(), 2);
01607 TEST_EQUAL(mymset.get_matches_upper_bound(), 2);
01608 TEST_EQUAL(mymset.get_uncollapsed_matches_lower_bound(), 2);
01609 TEST_EQUAL(mymset.get_uncollapsed_matches_estimated(), 2);
01610 TEST_EQUAL(mymset.get_uncollapsed_matches_upper_bound(), 2);
01611
01612 mymset = enquire.get_mset(0, 2);
01613 TEST_EQUAL(mymset.get_matches_lower_bound(), 2);
01614 TEST_EQUAL(mymset.get_matches_estimated(), 2);
01615 TEST_EQUAL(mymset.get_matches_upper_bound(), 2);
01616 TEST_EQUAL(mymset.get_uncollapsed_matches_lower_bound(), 2);
01617 TEST_EQUAL(mymset.get_uncollapsed_matches_estimated(), 2);
01618 TEST_EQUAL(mymset.get_uncollapsed_matches_upper_bound(), 2);
01619
01620 myquery = query(Xapian::Query::OP_AND, "paragraph", "another");
01621 enquire.set_query(myquery);
01622 mymset = enquire.get_mset(0, 0);
01623 TEST_EQUAL(mymset.get_matches_lower_bound(), 1);
01624 TEST_EQUAL(mymset.get_matches_estimated(), 2);
01625 TEST_EQUAL(mymset.get_matches_upper_bound(), 2);
01626 TEST_EQUAL(mymset.get_uncollapsed_matches_lower_bound(), 1);
01627 TEST_EQUAL(mymset.get_uncollapsed_matches_estimated(), 2);
01628 TEST_EQUAL(mymset.get_uncollapsed_matches_upper_bound(), 2);
01629
01630 mymset = enquire.get_mset(0, 1);
01631 TEST_EQUAL(mymset.get_matches_lower_bound(), 1);
01632 TEST_EQUAL(mymset.get_matches_estimated(), 2);
01633 TEST_EQUAL(mymset.get_matches_upper_bound(), 2);
01634 TEST_EQUAL(mymset.get_uncollapsed_matches_lower_bound(), 1);
01635 TEST_EQUAL(mymset.get_uncollapsed_matches_estimated(), 2);
01636 TEST_EQUAL(mymset.get_uncollapsed_matches_upper_bound(), 2);
01637
01638 mymset = enquire.get_mset(0, 2);
01639 TEST_EQUAL(mymset.get_matches_lower_bound(), 1);
01640 TEST_EQUAL(mymset.get_matches_estimated(), 1);
01641 TEST_EQUAL(mymset.get_matches_upper_bound(), 1);
01642 TEST_EQUAL(mymset.get_uncollapsed_matches_lower_bound(), 1);
01643 TEST_EQUAL(mymset.get_uncollapsed_matches_estimated(), 1);
01644 TEST_EQUAL(mymset.get_uncollapsed_matches_upper_bound(), 1);
01645
01646 mymset = enquire.get_mset(1, 20);
01647 TEST_EQUAL(mymset.get_matches_lower_bound(), 1);
01648 TEST_EQUAL(mymset.get_matches_estimated(), 1);
01649 TEST_EQUAL(mymset.get_matches_upper_bound(), 1);
01650 TEST_EQUAL(mymset.get_uncollapsed_matches_lower_bound(), 1);
01651 TEST_EQUAL(mymset.get_uncollapsed_matches_estimated(), 1);
01652 TEST_EQUAL(mymset.get_uncollapsed_matches_upper_bound(), 1);
01653
01654 return true;
01655 }
01656
01657
01658 DEFINE_TESTCASE(wqf1, backend) {
01659
01660 Xapian::Query q1("word", 2);
01661 Xapian::Query q2("word");
01662 Xapian::Enquire enquire(get_database("apitest_simpledata"));
01663 enquire.set_query(q1);
01664 Xapian::MSet mset1 = enquire.get_mset(0, 10);
01665 enquire.set_query(q2);
01666 Xapian::MSet mset2 = enquire.get_mset(0, 2);
01667
01668 TEST(mset1.begin().get_weight() > mset2.begin().get_weight());
01669 return true;
01670 }
01671
01672
01673 DEFINE_TESTCASE(qlen1, backend) {
01674 Xapian::Query q1("word");
01675 Xapian::Query q2("word");
01676 Xapian::Enquire enquire(get_database("apitest_simpledata"));
01677 enquire.set_query(q1);
01678 Xapian::MSet mset1 = enquire.get_mset(0, 10);
01679 enquire.set_query(q2);
01680 Xapian::MSet mset2 = enquire.get_mset(0, 2);
01681
01682
01683 TEST(mset1.begin().get_weight() == mset2.begin().get_weight());
01684 return true;
01685 }
01686
01687
01688 DEFINE_TESTCASE(termlist1, backend) {
01689 Xapian::Database db(get_database("apitest_onedoc"));
01690 TEST_EXCEPTION(Xapian::InvalidArgumentError,
01691 Xapian::TermIterator t = db.termlist_begin(0));
01692 TEST_EXCEPTION(Xapian::DocNotFoundError,
01693 Xapian::TermIterator t = db.termlist_begin(2));
01694
01695
01696 Xapian::TermIterator temp = db.termlist_begin(1);
01697 TEST_EXCEPTION(Xapian::DocNotFoundError,
01698 Xapian::TermIterator t = db.termlist_begin(999999999));
01699 return true;
01700 }
01701
01702
01703 DEFINE_TESTCASE(termlist2, backend) {
01704 Xapian::Database db(get_database("apitest_onedoc"));
01705 Xapian::TermIterator t = db.termlist_begin(1);
01706 Xapian::TermIterator tend = db.termlist_end(1);
01707
01708
01709 Xapian::TermIterator t_copy = t;
01710 TEST_EQUAL(t, t_copy);
01711
01712
01713 Xapian::TermIterator t_clone(t);
01714 TEST_EQUAL(t, t_clone);
01715
01716 vector<string> v(t, tend);
01717
01718 t = db.termlist_begin(1);
01719 tend = db.termlist_end(1);
01720 vector<string>::const_iterator i;
01721 for (i = v.begin(); i != v.end(); i++) {
01722 TEST_NOT_EQUAL(t, tend);
01723 TEST_EQUAL(*i, *t);
01724 t++;
01725 }
01726 TEST_EQUAL(t, tend);
01727 return true;
01728 }
01729
01730 static Xapian::TermIterator
01731 test_termlist3_helper()
01732 {
01733 Xapian::Database db(get_database("apitest_onedoc"));
01734 return db.termlist_begin(1);
01735 }
01736
01737
01738 DEFINE_TESTCASE(termlist3, backend) {
01739 Xapian::TermIterator u = test_termlist3_helper();
01740 Xapian::Database db(get_database("apitest_onedoc"));
01741 Xapian::TermIterator t = db.termlist_begin(1);
01742 Xapian::TermIterator tend = db.termlist_end(1);
01743
01744 while (t != tend) {
01745 TEST_EQUAL(*t, *u);
01746 t++;
01747 u++;
01748 }
01749 return true;
01750 }
01751
01752
01753 DEFINE_TESTCASE(termlist4, backend) {
01754 Xapian::Database db(get_database("apitest_onedoc"));
01755 Xapian::TermIterator i = db.termlist_begin(1);
01756 i.skip_to("");
01757 i.skip_to("\xff");
01758 return true;
01759 }
01760
01761
01762 DEFINE_TESTCASE(puncterms1, backend) {
01763 Xapian::Database db(get_database("apitest_punc"));
01764 Xapian::Enquire enquire(db);
01765
01766 Xapian::Query q1("semi;colon");
01767 enquire.set_query(q1);
01768 Xapian::MSet m1 = enquire.get_mset(0, 10);
01769
01770 Xapian::Query q2("col:on");
01771 enquire.set_query(q2);
01772 Xapian::MSet m2 = enquire.get_mset(0, 10);
01773
01774 Xapian::Query q3("com,ma");
01775 enquire.set_query(q3);
01776 Xapian::MSet m3 = enquire.get_mset(0, 10);
01777
01778 return true;
01779 }
01780
01781
01782 DEFINE_TESTCASE(spaceterms1, backend) {
01783 Xapian::Enquire enquire(get_database("apitest_space"));
01784 Xapian::MSet mymset;
01785 Xapian::doccount count;
01786 Xapian::MSetIterator m;
01787 Xapian::Stem stemmer("english");
01788
01789 enquire.set_query(stemmer("space man"));
01790 mymset = enquire.get_mset(0, 10);
01791 TEST_MSET_SIZE(mymset, 1);
01792 count = 0;
01793 for (m = mymset.begin(); m != mymset.end(); ++m) ++count;
01794 TEST_EQUAL(count, 1);
01795
01796 for (Xapian::valueno value_no = 1; value_no < 7; ++value_no) {
01797 TEST_NOT_EQUAL(mymset.begin().get_document().get_data(), "");
01798 TEST_NOT_EQUAL(mymset.begin().get_document().get_value(value_no), "");
01799 }
01800
01801 enquire.set_query(stemmer("tab\tby"));
01802 mymset = enquire.get_mset(0, 10);
01803 TEST_MSET_SIZE(mymset, 1);
01804 count = 0;
01805 for (m = mymset.begin(); m != mymset.end(); ++m) ++count;
01806 TEST_EQUAL(count, 1);
01807
01808 for (Xapian::valueno value_no = 0; value_no < 7; ++value_no) {
01809 string value = mymset.begin().get_document().get_value(value_no);
01810 TEST_NOT_EQUAL(value, "");
01811 if (value_no == 0) {
01812 TEST(value.size() > 262);
01813 TEST_EQUAL(static_cast<unsigned char>(value[262]), 255);
01814 }
01815 }
01816
01817 enquire.set_query(stemmer("back\\slash"));
01818 mymset = enquire.get_mset(0, 10);
01819 TEST_MSET_SIZE(mymset, 1);
01820 count = 0;
01821 for (m = mymset.begin(); m != mymset.end(); ++m) ++count;
01822 TEST_EQUAL(count, 1);
01823
01824 return true;
01825 }
01826
01827
01828 DEFINE_TESTCASE(xor1, backend) {
01829 Xapian::Enquire enquire(get_database("apitest_simpledata"));
01830 Xapian::Stem stemmer("english");
01831
01832 vector<string> terms;
01833 terms.push_back(stemmer("this"));
01834 terms.push_back(stemmer("word"));
01835 terms.push_back(stemmer("of"));
01836
01837 Xapian::Query query(Xapian::Query::OP_XOR, terms.begin(), terms.end());
01838 enquire.set_weighting_scheme(Xapian::BoolWeight());
01839 enquire.set_query(query);
01840
01841 Xapian::MSet mymset = enquire.get_mset(0, 10);
01842
01843
01844
01845
01846
01847
01848
01849 mset_expect_order(mymset, 1, 2, 5, 6);
01850
01851 return true;
01852 }
01853
01855 DEFINE_TESTCASE(xor2, backend) {
01856 Xapian::Enquire enquire(get_database("apitest_simpledata"));
01857 Xapian::Stem stemmer("english");
01858
01859 vector<string> terms;
01860 terms.push_back(stemmer("this"));
01861 terms.push_back(stemmer("word"));
01862 terms.push_back(stemmer("of"));
01863
01864 Xapian::Query query(Xapian::Query::OP_XOR, terms.begin(), terms.end());
01865 enquire.set_query(query);
01866
01867 Xapian::MSet mymset = enquire.get_mset(0, 10);
01868
01869
01870
01871
01872
01873
01874
01875 mset_expect_order(mymset, 2, 1, 5, 6);
01876
01877 return true;
01878 }
01879
01880
01881 DEFINE_TESTCASE(getdoc1, backend) {
01882 Xapian::Database db(get_database("apitest_onedoc"));
01883 Xapian::Document doc(db.get_document(1));
01884 TEST_EXCEPTION(Xapian::InvalidArgumentError, db.get_document(0));
01885 TEST_EXCEPTION(Xapian::DocNotFoundError, db.get_document(999999999));
01886 TEST_EXCEPTION(Xapian::DocNotFoundError, db.get_document(123456789));
01887 TEST_EXCEPTION(Xapian::DocNotFoundError, db.get_document(3));
01888 TEST_EXCEPTION(Xapian::DocNotFoundError, db.get_document(2));
01889
01890
01891 Xapian::Document doc2 = doc;
01892 doc.set_data("modified!");
01893 TEST_EQUAL(doc.get_data(), "modified!");
01894 TEST_EQUAL(doc.get_data(), doc2.get_data());
01895 return true;
01896 }
01897
01898
01899 DEFINE_TESTCASE(emptyop1, backend) {
01900 Xapian::Enquire enquire(get_database("apitest_simpledata"));
01901 vector<Xapian::Query> nullvec;
01902
01903 Xapian::Query query1(Xapian::Query::OP_XOR, nullvec.begin(), nullvec.end());
01904
01905 enquire.set_query(query1);
01906 Xapian::MSet mymset = enquire.get_mset(0, 10);
01907 TEST_MSET_SIZE(mymset, 0);
01908 TEST_EXCEPTION(Xapian::InvalidArgumentError, enquire.get_matching_terms_begin(1));
01909
01910 return true;
01911 }
01912
01913
01914 DEFINE_TESTCASE(checkatleast1, backend) {
01915 Xapian::Enquire enquire(get_database("apitest_simpledata"));
01916 enquire.set_query(Xapian::Query("thom"));
01917 Xapian::MSet mymset = enquire.get_mset(0, 10, 11);
01918 TEST_EQUAL(0, mymset.size());
01919
01920 return true;
01921 }
01922
01923
01924
01925 DEFINE_TESTCASE(checkatleast2, backend) {
01926 Xapian::Enquire enquire(get_database("apitest_simpledata"));
01927 enquire.set_query(Xapian::Query("paragraph"));
01928
01929 Xapian::MSet mymset = enquire.get_mset(0, 3, 10);
01930 TEST_MSET_SIZE(mymset, 3);
01931 TEST_EQUAL(mymset.get_matches_lower_bound(), 5);
01932 TEST_EQUAL(mymset.get_uncollapsed_matches_lower_bound(), 5);
01933
01934 mymset = enquire.get_mset(0, 2, 4);
01935 TEST_MSET_SIZE(mymset, 2);
01936 TEST_REL(mymset.get_matches_lower_bound(),>=,4);
01937 TEST_REL(mymset.get_matches_lower_bound(),>=,4);
01938 TEST_REL(mymset.get_uncollapsed_matches_lower_bound(),>=,4);
01939 TEST_REL(mymset.get_uncollapsed_matches_lower_bound(),>=,4);
01940
01941 return true;
01942 }
01943
01944
01945 DEFINE_TESTCASE(checkatleast3, backend) {
01946 Xapian::Enquire enquire(get_database("etext"));
01947 enquire.set_query(Xapian::Query("prussian"));
01948
01949 for (int order = 0; order < 3; ++order) {
01950 switch (order) {
01951 case 0:
01952 enquire.set_docid_order(Xapian::Enquire::ASCENDING);
01953 break;
01954 case 1:
01955 enquire.set_docid_order(Xapian::Enquire::DESCENDING);
01956 break;
01957 case 2:
01958 enquire.set_docid_order(Xapian::Enquire::DONT_CARE);
01959 break;
01960 }
01961
01962 for (int sort = 0; sort < 7; ++sort) {
01963 bool reverse = (sort & 1);
01964 switch (sort) {
01965 case 0:
01966 enquire.set_sort_by_relevance();
01967 break;
01968 case 1: case 2:
01969 enquire.set_sort_by_value(0, reverse);
01970 break;
01971 case 3: case 4:
01972 enquire.set_sort_by_value_then_relevance(0, reverse);
01973 break;
01974 case 5: case 6:
01975 enquire.set_sort_by_relevance_then_value(0, reverse);
01976 break;
01977 }
01978
01979 Xapian::MSet mset = enquire.get_mset(0, 100, 500);
01980 TEST_MSET_SIZE(mset, 60);
01981 TEST_EQUAL(mset.get_matches_lower_bound(), 60);
01982 TEST_EQUAL(mset.get_matches_estimated(), 60);
01983 TEST_EQUAL(mset.get_matches_upper_bound(), 60);
01984 TEST_EQUAL(mset.get_uncollapsed_matches_lower_bound(), 60);
01985 TEST_EQUAL(mset.get_uncollapsed_matches_estimated(), 60);
01986 TEST_EQUAL(mset.get_uncollapsed_matches_upper_bound(), 60);
01987
01988 mset = enquire.get_mset(0, 50, 100);
01989 TEST_MSET_SIZE(mset, 50);
01990 TEST_EQUAL(mset.get_matches_lower_bound(), 60);
01991 TEST_EQUAL(mset.get_matches_estimated(), 60);
01992 TEST_EQUAL(mset.get_matches_upper_bound(), 60);
01993 TEST_EQUAL(mset.get_uncollapsed_matches_lower_bound(), 60);
01994 TEST_EQUAL(mset.get_uncollapsed_matches_estimated(), 60);
01995 TEST_EQUAL(mset.get_uncollapsed_matches_upper_bound(), 60);
01996
01997 mset = enquire.get_mset(0, 10, 50);
01998 TEST_MSET_SIZE(mset, 10);
01999 TEST_REL(mset.get_matches_lower_bound(),>=,50);
02000 TEST_REL(mset.get_uncollapsed_matches_lower_bound(),>=,50);
02001 }
02002 }
02003
02004 return true;
02005 }
02006
02007
02008 DEFINE_TESTCASE(allpostlist1, backend) {
02009 Xapian::Database db(get_database("apitest_manydocs"));
02010 Xapian::PostingIterator i = db.postlist_begin("");
02011 unsigned int j = 1;
02012 while (i != db.postlist_end("")) {
02013 TEST_EQUAL(*i, j);
02014 i++;
02015 j++;
02016 }
02017 TEST_EQUAL(j, 513);
02018
02019 i = db.postlist_begin("");
02020 j = 1;
02021 while (i != db.postlist_end("")) {
02022 TEST_EQUAL(*i, j);
02023 i++;
02024 j++;
02025 if (j == 50) {
02026 j += 10;
02027 i.skip_to(j);
02028 }
02029 }
02030 TEST_EQUAL(j, 513);
02031
02032 return true;
02033 }
02034
02035 static void test_emptyterm1_helper(Xapian::Database & db)
02036 {
02037
02038 TEST_EXCEPTION(Xapian::InvalidArgumentError, db.positionlist_begin(1, ""));
02039 TEST_EQUAL(db.get_doccount(), db.get_termfreq(""));
02040 TEST_EQUAL(db.get_doccount() != 0, db.term_exists(""));
02041 TEST_EQUAL(db.get_doccount(), db.get_collection_freq(""));
02042 }
02043
02044
02045 DEFINE_TESTCASE(emptyterm1, backend) {
02046 Xapian::Database db(get_database("apitest_manydocs"));
02047 TEST_EQUAL(db.get_doccount(), 512);
02048 test_emptyterm1_helper(db);
02049
02050 db = get_database("apitest_onedoc");
02051 TEST_EQUAL(db.get_doccount(), 1);
02052 test_emptyterm1_helper(db);
02053
02054 db = get_database("");
02055 TEST_EQUAL(db.get_doccount(), 0);
02056 test_emptyterm1_helper(db);
02057
02058 return true;
02059 }
02060
02061
02062 DEFINE_TESTCASE(alldocspl1, writable) {
02063 Xapian::WritableDatabase db = get_writable_database();
02064 Xapian::Document doc;
02065 doc.set_data("5");
02066 doc.add_value(0, "5");
02067 db.replace_document(5, doc);
02068
02069 Xapian::PostingIterator i = db.postlist_begin("");
02070 TEST(i != db.postlist_end(""));
02071 TEST_EQUAL(*i, 5);
02072 TEST_EQUAL(i.get_doclength(), 0);
02073 TEST_EQUAL(i.get_wdf(), 1);
02074 ++i;
02075 TEST(i == db.postlist_end(""));
02076
02077 return true;
02078 }
02079
02080
02081 DEFINE_TESTCASE(alldocspl2, writable) {
02082 Xapian::PostingIterator i, end;
02083 {
02084 Xapian::WritableDatabase db = get_writable_database();
02085 Xapian::Document doc;
02086 doc.set_data("5");
02087 doc.add_value(0, "5");
02088 db.replace_document(5, doc);
02089
02090
02091 i = db.postlist_begin("");
02092 end = db.postlist_end("");
02093 TEST(i != end);
02094 TEST_EQUAL(*i, 5);
02095 TEST_EQUAL(i.get_doclength(), 0);
02096 TEST_EQUAL(i.get_wdf(), 1);
02097 ++i;
02098 TEST(i == end);
02099
02100 db.commit();
02101
02102
02103 i = db.postlist_begin("");
02104 end = db.postlist_end("");
02105 TEST(i != end);
02106 TEST_EQUAL(*i, 5);
02107 TEST_EQUAL(i.get_doclength(), 0);
02108 TEST_EQUAL(i.get_wdf(), 1);
02109 ++i;
02110 TEST(i == end);
02111
02112
02113 doc = Xapian::Document();
02114 doc.set_data("5");
02115 doc.add_value(0, "7");
02116 db.replace_document(7, doc);
02117
02118
02119 i = db.postlist_begin("");
02120 end = db.postlist_end("");
02121 TEST(i != end);
02122 TEST_EQUAL(*i, 5);
02123 TEST_EQUAL(i.get_doclength(), 0);
02124 TEST_EQUAL(i.get_wdf(), 1);
02125 ++i;
02126 TEST(i != end);
02127 TEST_EQUAL(*i, 7);
02128 TEST_EQUAL(i.get_doclength(), 0);
02129 TEST_EQUAL(i.get_wdf(), 1);
02130 ++i;
02131 TEST(i == end);
02132
02133
02134 db.delete_document(5);
02135
02136
02137 i = db.postlist_begin("");
02138 end = db.postlist_end("");
02139 TEST(i != end);
02140 TEST_EQUAL(*i, 7);
02141 TEST_EQUAL(i.get_doclength(), 0);
02142 TEST_EQUAL(i.get_wdf(), 1);
02143 ++i;
02144 TEST(i == end);
02145
02146
02147
02148 db.commit();
02149 i = db.postlist_begin("");
02150 end = db.postlist_end("");
02151 }
02152
02153 TEST(i != end);
02154 TEST_EQUAL(*i, 7);
02155 TEST_EQUAL(i.get_doclength(), 0);
02156 TEST_EQUAL(i.get_wdf(), 1);
02157 ++i;
02158 TEST(i == end);
02159
02160 return true;
02161 }
02162
02163
02164 DEFINE_TESTCASE(scaleweight1, backend) {
02165 Xapian::Database db(get_database("apitest_phrase"));
02166 Xapian::Enquire enq(db);
02167 Xapian::QueryParser qp;
02168
02169 static const char * queries[] = {
02170 "pad",
02171 "milk fridge",
02172 "leave milk on fridge",
02173 "ordered milk operator",
02174 "ordered phrase operator",
02175 "leave \"milk on fridge\"",
02176 "notpresent",
02177 "leave \"milk notpresent\"",
02178 NULL
02179 };
02180 static const double multipliers[] = {
02181 -1000000, -2.5, -1, -0.5, 0, 0.5, 1, 2.5, 1000000,
02182 0, 0
02183 };
02184
02185 for (const char **qstr = queries; *qstr; ++qstr) {
02186 tout.str(string());
02187 Xapian::Query query1 = qp.parse_query(*qstr);
02188 tout << "query1: " << query1.get_description() << endl;
02189 for (const double *multp = multipliers; multp[0] != multp[1]; ++multp) {
02190 double mult = *multp;
02191 if (mult < 0) {
02192 TEST_EXCEPTION(Xapian::InvalidArgumentError,
02193 Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT,
02194 query1, mult));
02195 continue;
02196 }
02197 Xapian::Query query2(Xapian::Query::OP_SCALE_WEIGHT, query1, mult);
02198 tout << "query2: " << query2.get_description() << endl;
02199
02200 enq.set_query(query1);
02201 Xapian::MSet mset1 = enq.get_mset(0, 20);
02202 enq.set_query(query2);
02203 Xapian::MSet mset2 = enq.get_mset(0, 20);
02204
02205 TEST_EQUAL(mset1.size(), mset2.size());
02206
02207 Xapian::MSetIterator i1, i2;
02208 if (mult > 0) {
02209 for (i1 = mset1.begin(), i2 = mset2.begin();
02210 i1 != mset1.end() && i2 != mset2.end(); ++i1, ++i2) {
02211 TEST_EQUAL_DOUBLE(i1.get_weight() * mult, i2.get_weight());
02212 TEST_EQUAL(*i1, *i2);
02213 }
02214 } else {
02215
02216 vector<Xapian::docid> ids1;
02217 vector<Xapian::docid> ids2;
02218 for (i1 = mset1.begin(), i2 = mset2.begin();
02219 i1 != mset1.end() && i2 != mset2.end(); ++i1, ++i2) {
02220 TEST_NOT_EQUAL_DOUBLE(i1.get_weight(), 0);
02221 TEST_EQUAL_DOUBLE(i2.get_weight(), 0);
02222 ids1.push_back(*i1);
02223 ids2.push_back(*i2);
02224 }
02225 sort(ids1.begin(), ids1.end());
02226 TEST_EQUAL(ids1, ids2);
02227 }
02228 }
02229 }
02230 return true;
02231 }
02232
02233
02234
02235 DEFINE_TESTCASE(scaleweight2, backend) {
02236 Xapian::Database db(get_database("apitest_phrase"));
02237 Xapian::Enquire enq(db);
02238 Xapian::MSetIterator i;
02239
02240 Xapian::Query query1("fridg");
02241 Xapian::Query query2(Xapian::Query::OP_SCALE_WEIGHT, query1, 2.5);
02242 Xapian::Query query3("milk");
02243 Xapian::Query query4(Xapian::Query::OP_SCALE_WEIGHT, query3, 0);
02244 Xapian::Query query5(Xapian::Query::OP_OR, query2, query4);
02245
02246
02247
02248
02249
02250
02251
02252
02253 vector<Xapian::docid> ids1;
02254 set<Xapian::docid> idsin1;
02255 vector<Xapian::docid> ids3;
02256
02257 enq.set_query(query1);
02258 Xapian::MSet mset1 = enq.get_mset(0, 20);
02259 enq.set_query(query3);
02260 Xapian::MSet mset3 = enq.get_mset(0, 20);
02261 TEST_NOT_EQUAL(mset1.size(), 0);
02262 for (i = mset1.begin(); i != mset1.end(); ++i) {
02263 ids1.push_back(*i);
02264 idsin1.insert(*i);
02265 }
02266 TEST_NOT_EQUAL(mset3.size(), 0);
02267 for (i = mset3.begin(); i != mset3.end(); ++i) {
02268 if (idsin1.find(*i) != idsin1.end())
02269 continue;
02270 ids3.push_back(*i);
02271 }
02272 sort(ids3.begin(), ids3.end());
02273 ids1.insert(ids1.end(), ids3.begin(), ids3.end());
02274
02275
02276 vector<Xapian::docid> ids5;
02277 enq.set_query(query5);
02278 Xapian::MSet mset5 = enq.get_mset(0, 20);
02279 for (i = mset5.begin(); i != mset5.end(); ++i) {
02280 ids5.push_back(*i);
02281 }
02282
02283 TEST_EQUAL(ids1, ids5);
02284 return true;
02285 }
02286
02287
02288
02289 DEFINE_TESTCASE(bm25weight1, backend) {
02290 Xapian::Enquire enquire(get_database("apitest_simpledata"));
02291 enquire.set_weighting_scheme(Xapian::BM25Weight(1, 25, 1, 0.01, 0.5));
02292 enquire.set_query(Xapian::Query("word") );
02293
02294 Xapian::MSet mset = enquire.get_mset(0, 25);
02295
02296 return true;
02297 }
02298
02299
02300 DEFINE_TESTCASE(tradweight1, backend) {
02301 Xapian::Enquire enquire(get_database("apitest_simpledata"));
02302 enquire.set_weighting_scheme(Xapian::TradWeight());
02303 enquire.set_query(Xapian::Query("word") );
02304
02305 Xapian::MSet mset = enquire.get_mset(0, 25);
02306
02307 enquire.set_weighting_scheme(Xapian::TradWeight(0));
02308 enquire.set_query(Xapian::Query("word") );
02309
02310 mset = enquire.get_mset(0, 25);
02311
02312
02313
02314 return true;
02315 }
02316
02317
02318 DEFINE_TESTCASE(uuid1, backend && !multi) {
02319 SKIP_TEST_FOR_BACKEND("inmemory");
02320 Xapian::Database db = get_database("apitest_simpledata");
02321 string uuid1 = db.get_uuid();
02322 TEST_EQUAL(uuid1.size(), 36);
02323
02324
02325 Xapian::Database db2;
02326 TEST(db2.get_uuid().empty());
02327
02328 db2.add_database(db);
02329 TEST_EQUAL(uuid1, db2.get_uuid());
02330
02331
02332
02333 db2.add_database(db);
02334 TEST_EQUAL(uuid1 + ":" + uuid1, db2.get_uuid());
02335
02336 #ifdef XAPIAN_HAS_INMEMORY_BACKEND
02337
02338
02339 db2.add_database(Xapian::InMemory::open());
02340 TEST(db2.get_uuid().empty());
02341 #endif
02342
02343 return true;
02344 }