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