00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <config.h>
00024
00025 #include "api_backend.h"
00026
00027 #define XAPIAN_DEPRECATED(X) X
00028 #include <xapian.h>
00029
00030 #include "str.h"
00031 #include "testsuite.h"
00032 #include "testutils.h"
00033 #include "utils.h"
00034
00035 #include "apitest.h"
00036
00037 #include "safeunistd.h"
00038
00039 using namespace std;
00040
00042 DEFINE_TESTCASE(lockfileumask1, brass || chert || flint) {
00043 #if !defined __WIN32__ && !defined __CYGWIN__ && !defined __EMX__
00044 mode_t old_umask = umask(022);
00045 try {
00046 Xapian::WritableDatabase db = get_named_writable_database("lockfileumask1");
00047
00048 string path = get_named_writable_database_path("lockfileumask1");
00049 path += "/flintlock";
00050
00051 struct stat statbuf;
00052 TEST(stat(path, &statbuf) == 0);
00053 TEST_EQUAL(statbuf.st_mode & 0777, 0644);
00054 } catch (...) {
00055 umask(old_umask);
00056 throw;
00057 }
00058
00059 umask(old_umask);
00060 #endif
00061
00062 return true;
00063 }
00064
00066 DEFINE_TESTCASE(totaldoclen1, writable) {
00067 Xapian::WritableDatabase db = get_writable_database();
00068 Xapian::Document doc;
00069 doc.add_posting("foo", 1, 2000000000);
00070 db.add_document(doc);
00071 db.add_document(doc);
00072 TEST_EQUAL(db.get_avlength(), 2000000000);
00073 db.commit();
00074 TEST_EQUAL(db.get_avlength(), 2000000000);
00075 if (get_dbtype() != "inmemory") {
00076
00077 Xapian::Database dbr = get_writable_database_as_database();
00078 TEST_EQUAL(dbr.get_avlength(), 2000000000);
00079 }
00080 return true;
00081 }
00082
00083 DEFINE_TESTCASE(dbstats1, backend) {
00084 Xapian::Database db = get_database("etext");
00085
00086
00087
00088 const Xapian::termcount min_len = 2;
00089 const Xapian::termcount max_len = 532;
00090 const Xapian::termcount max_wdf = 22;
00091
00092 if (get_dbtype().find("chert") != string::npos ||
00093 get_dbtype().find("brass") != string::npos) {
00094
00095 TEST_EQUAL(db.get_doclength_upper_bound(), max_len);
00096 TEST_EQUAL(db.get_doclength_lower_bound(), min_len);
00097 } else {
00098
00099 TEST_REL(db.get_doclength_upper_bound(),>=,max_len);
00100 TEST_REL(db.get_doclength_lower_bound(),<=,min_len);
00101 }
00102
00103 TEST_REL(db.get_wdf_upper_bound("the"),>=,max_wdf);
00104
00105 return true;
00106 }
00107
00109 DEFINE_TESTCASE(alldocspl3, backend) {
00110 Xapian::Database db = get_database(string());
00111
00112 TEST_EQUAL(db.get_termfreq(string()), 0);
00113 TEST_EQUAL(db.get_collection_freq(string()), 0);
00114 TEST(db.postlist_begin(string()) == db.postlist_end(string()));
00115
00116 return true;
00117 }
00118
00120 DEFINE_TESTCASE(modifiedpostlist1, writable) {
00121 Xapian::WritableDatabase db = get_writable_database();
00122 Xapian::Document a, b;
00123 Xapian::Enquire enq(db);
00124
00125 a.add_term("T");
00126 enq.set_query(Xapian::Query("T"));
00127
00128 db.replace_document(2, a);
00129 db.commit();
00130 db.replace_document(1, a);
00131 db.replace_document(1, b);
00132
00133 mset_expect_order(enq.get_mset(0, 2), 2);
00134
00135 return true;
00136 }
00137
00139 DEFINE_TESTCASE(doclenaftercommit1, writable) {
00140 Xapian::WritableDatabase db = get_writable_database();
00141 TEST_EXCEPTION(Xapian::DocNotFoundError, db.get_doclength(1));
00142 db.replace_document(1, Xapian::Document());
00143 db.commit();
00144 TEST_EQUAL(db.get_doclength(1), 0);;
00145 return true;
00146 }
00147
00148 DEFINE_TESTCASE(valuesaftercommit1, writable) {
00149 Xapian::WritableDatabase db = get_writable_database();
00150 Xapian::Document doc;
00151 doc.add_value(0, "value");
00152 db.replace_document(2, doc);
00153 db.commit();
00154 db.replace_document(1, doc);
00155 db.replace_document(3, doc);
00156 TEST_EQUAL(db.get_document(3).get_value(0), "value");
00157 db.commit();
00158 TEST_EQUAL(db.get_document(3).get_value(0), "value");
00159 return true;
00160 }
00161
00162 DEFINE_TESTCASE(lockfilefd0or1, brass || chert || flint) {
00163 #if !defined __WIN32__ && !defined __CYGWIN__ && !defined __EMX__
00164 int old_stdin = dup(0);
00165 int old_stdout = dup(1);
00166 try {
00167
00168 close(0);
00169 {
00170 Xapian::WritableDatabase db = get_writable_database();
00171 TEST_EXCEPTION(Xapian::DatabaseLockError,
00172 (void)get_writable_database_again());
00173 }
00174
00175 close(1);
00176 {
00177 Xapian::WritableDatabase db = get_writable_database();
00178 TEST_EXCEPTION(Xapian::DatabaseLockError,
00179 (void)get_writable_database_again());
00180 }
00181
00182 dup2(old_stdin, 0);
00183 {
00184 Xapian::WritableDatabase db = get_writable_database();
00185 TEST_EXCEPTION(Xapian::DatabaseLockError,
00186 (void)get_writable_database_again());
00187 }
00188 } catch (...) {
00189 dup2(old_stdin, 0);
00190 dup2(old_stdout, 1);
00191 close(old_stdin);
00192 close(old_stdout);
00193 throw;
00194 }
00195
00196 dup2(old_stdout, 1);
00197 close(old_stdin);
00198 close(old_stdout);
00199 #endif
00200
00201 return true;
00202 }
00203
00204 struct MyMatchDecider : public Xapian::MatchDecider {
00205 mutable bool called;
00206
00207 MyMatchDecider() : called(false) { }
00208
00209 bool operator()(const Xapian::Document &) const {
00210 called = true;
00211 return true;
00212 }
00213 };
00214
00216 DEFINE_TESTCASE(matchdecider4, remote) {
00217 Xapian::Database db(get_database("apitest_simpledata"));
00218 Xapian::Enquire enquire(db);
00219 enquire.set_query(Xapian::Query("paragraph"));
00220
00221 MyMatchDecider mdecider, mspyold;
00222 Xapian::MSet mset;
00223
00224 TEST_EXCEPTION(Xapian::UnimplementedError,
00225 mset = enquire.get_mset(0, 10, NULL, &mdecider));
00226 TEST(!mdecider.called);
00227
00228 TEST_EXCEPTION(Xapian::UnimplementedError,
00229 mset = enquire.get_mset(0, 10, 0, NULL, NULL, &mspyold));
00230 TEST(!mspyold.called);
00231
00232 TEST_EXCEPTION(Xapian::UnimplementedError,
00233 mset = enquire.get_mset(0, 10, 0, NULL, &mdecider, &mspyold));
00234 TEST(!mdecider.called);
00235 TEST(!mspyold.called);
00236
00237 return true;
00238 }
00239
00243 DEFINE_TESTCASE(replacedoc7, writable && !inmemory && !remote) {
00244
00245
00246
00247
00248
00249 Xapian::WritableDatabase db(get_writable_database());
00250 Xapian::Document doc;
00251 doc.set_data("fish");
00252 doc.add_term("Hlocalhost");
00253 doc.add_posting("hello", 1);
00254 doc.add_posting("world", 2);
00255 doc.add_value(1, "myvalue");
00256 db.add_document(doc);
00257 db.commit();
00258
00259
00260
00261
00262
00263 doc.add_term("XREV2");
00264 db.add_document(doc);
00265
00266 for (int i = 0; i < 10000; ++i) {
00267 doc = db.get_document(1);
00268 db.replace_document(1, doc);
00269 }
00270
00271 Xapian::Database rodb(get_writable_database_as_database());
00272 TEST_EQUAL(rodb.get_doccount(), 1);
00273
00274 db.flush();
00275 rodb.reopen();
00276
00277 TEST_EQUAL(rodb.get_doccount(), 2);
00278 return true;
00279 }
00280
00285 DEFINE_TESTCASE(replacedoc8, writable) {
00286 Xapian::WritableDatabase db(get_writable_database());
00287 {
00288 Xapian::Document doc;
00289 doc.set_data("fish");
00290 doc.add_term("takeaway");
00291 db.add_document(doc);
00292 }
00293 db.delete_document(1);
00294 {
00295 Xapian::Document doc;
00296 doc.set_data("chips");
00297 doc.add_term("takeaway", 2);
00298 db.replace_document(1, doc);
00299 }
00300 db.flush();
00301 TEST_EQUAL(db.get_collection_freq("takeaway"), 2);
00302 Xapian::PostingIterator p = db.postlist_begin("takeaway");
00303 TEST(p != db.postlist_end("takeaway"));
00304 TEST_EQUAL(p.get_wdf(), 2);
00305 return true;
00306 }
00307
00309 DEFINE_TESTCASE(databasemodified1, writable && !inmemory && !remote) {
00310
00311
00312
00313
00314 Xapian::WritableDatabase db(get_writable_database());
00315 Xapian::Document doc;
00316 doc.set_data("cargo");
00317 doc.add_term("abc");
00318 doc.add_term("def");
00319 doc.add_term("ghi");
00320 const int N = 500;
00321 for (int i = 0; i < N; ++i) {
00322 db.add_document(doc);
00323 }
00324 db.commit();
00325
00326 Xapian::Database rodb(get_writable_database_as_database());
00327 db.add_document(doc);
00328 db.commit();
00329
00330 db.add_document(doc);
00331 db.commit();
00332
00333 db.add_document(doc);
00334 try {
00335 TEST_EQUAL(*rodb.termlist_begin(N - 1), "abc");
00336 return false;
00337 } catch (const Xapian::DatabaseModifiedError &) {
00338 }
00339
00340 try {
00341 Xapian::Enquire enq(rodb);
00342 enq.set_query(Xapian::Query("abc"));
00343 Xapian::MSet mset = enq.get_mset(0, 10);
00344 return false;
00345 } catch (const Xapian::DatabaseModifiedError &) {
00346 }
00347
00348 return true;
00349 }
00350
00352 DEFINE_TESTCASE(qpmemoryleak1, writable && !inmemory) {
00353
00354 Xapian::WritableDatabase wdb(get_writable_database());
00355 Xapian::Document doc;
00356
00357 doc.add_term("foo");
00358 for (int i = 100; i < 120; ++i) {
00359 doc.add_term(str(i));
00360 }
00361
00362 for (int j = 0; j < 50; ++j) {
00363 wdb.add_document(doc);
00364 }
00365 wdb.commit();
00366
00367 Xapian::Database database(get_writable_database_as_database());
00368 Xapian::QueryParser queryparser;
00369 queryparser.set_database(database);
00370 TEST_EXCEPTION(Xapian::DatabaseModifiedError,
00371 for (int k = 0; k < 3; ++k) {
00372 wdb.add_document(doc);
00373 wdb.commit();
00374 (void)queryparser.parse_query("1", queryparser.FLAG_PARTIAL);
00375 }
00376 );
00377
00378 return true;
00379 }
00380
00381 static void
00382 make_msize1_db(Xapian::WritableDatabase &db, const string &)
00383 {
00384 const char * value0 =
00385 "ABBCDEFGHIJKLMMNOPQQRSTTUUVVWXYZZaabcdefghhijjkllmnopqrsttuvwxyz";
00386 const char * value1 =
00387 "EMLEMMMMMMMNMMLMELEDNLEDMLMLDMLMLMLMEDGFHPOPBAHJIQJNGRKCGF";
00388 while (*value0) {
00389 Xapian::Document doc;
00390 doc.add_value(0, string(1, *value0++));
00391 if (*value1) {
00392 doc.add_value(1, string(1, *value1++));
00393 doc.add_term("K1");
00394 }
00395 db.add_document(doc);
00396 }
00397 }
00398
00400 DEFINE_TESTCASE(msize1, generated) {
00401 Xapian::Database db = get_database("msize1", make_msize1_db);
00402 Xapian::Enquire enq(db);
00403 enq.set_sort_by_value(1, false);
00404 enq.set_collapse_key(0);
00405 enq.set_query(Xapian::Query("K1"));
00406
00407 Xapian::MSet mset = enq.get_mset(0, 10, 1000);
00408 Xapian::doccount lb = mset.get_matches_lower_bound();
00409 Xapian::doccount ub = mset.get_matches_upper_bound();
00410 Xapian::doccount est = mset.get_matches_estimated();
00411 TEST_EQUAL(lb, ub);
00412 TEST_EQUAL(lb, est);
00413
00414 Xapian::MSet mset2 = enq.get_mset(50, 10, 1000);
00415 Xapian::doccount lb2 = mset2.get_matches_lower_bound();
00416 Xapian::doccount ub2 = mset2.get_matches_upper_bound();
00417 Xapian::doccount est2 = mset2.get_matches_estimated();
00418 TEST_EQUAL(lb2, ub2);
00419 TEST_EQUAL(lb2, est2);
00420 TEST_EQUAL(est, est2);
00421
00422 Xapian::MSet mset3 = enq.get_mset(0, 60);
00423 Xapian::doccount lb3 = mset3.get_matches_lower_bound();
00424 Xapian::doccount ub3 = mset3.get_matches_upper_bound();
00425 Xapian::doccount est3 = mset3.get_matches_estimated();
00426 TEST_EQUAL(lb3, ub3);
00427 TEST_EQUAL(lb3, est3);
00428 TEST_EQUAL(est, est3);
00429
00430 return true;
00431 }
00432
00433 static void
00434 make_msize2_db(Xapian::WritableDatabase &db, const string &)
00435 {
00436 const char * value0 = "AAABCDEEFGHIIJJKLLMNNOOPPQQRSTTUVWXYZ";
00437 const char * value1 = "MLEMNMLMLMEDEDEMLEMLMLMLPOAHGF";
00438 while (*value0) {
00439 Xapian::Document doc;
00440 doc.add_value(0, string(1, *value0++));
00441 if (*value1) {
00442 doc.add_value(1, string(1, *value1++));
00443 doc.add_term("K1");
00444 }
00445 db.add_document(doc);
00446 }
00447 }
00448
00450 DEFINE_TESTCASE(msize2, generated) {
00451 Xapian::Database db = get_database("msize2", make_msize2_db);
00452 Xapian::Enquire enq(db);
00453 enq.set_sort_by_value(1, false);
00454 enq.set_collapse_key(0);
00455 enq.set_query(Xapian::Query("K1"));
00456
00457 Xapian::MSet mset = enq.get_mset(0, 10, 1000);
00458 Xapian::doccount lb = mset.get_matches_lower_bound();
00459 Xapian::doccount ub = mset.get_matches_upper_bound();
00460 Xapian::doccount est = mset.get_matches_estimated();
00461 TEST_EQUAL(lb, ub);
00462 TEST_EQUAL(lb, est);
00463
00464 Xapian::MSet mset2 = enq.get_mset(50, 10, 1000);
00465 Xapian::doccount lb2 = mset2.get_matches_lower_bound();
00466 Xapian::doccount ub2 = mset2.get_matches_upper_bound();
00467 Xapian::doccount est2 = mset2.get_matches_estimated();
00468 TEST_EQUAL(lb2, ub2);
00469 TEST_EQUAL(lb2, est2);
00470 TEST_EQUAL(est, est2);
00471
00472 Xapian::MSet mset3 = enq.get_mset(0, 60);
00473 Xapian::doccount lb3 = mset3.get_matches_lower_bound();
00474 Xapian::doccount ub3 = mset3.get_matches_upper_bound();
00475 Xapian::doccount est3 = mset3.get_matches_estimated();
00476 TEST_EQUAL(lb3, ub3);
00477 TEST_EQUAL(lb3, est3);
00478 TEST_EQUAL(est, est3);
00479
00480 return true;
00481 }
00482
00483 static void
00484 make_xordecay1_db(Xapian::WritableDatabase &db, const string &)
00485 {
00486 for (int n = 1; n != 50; ++n) {
00487 Xapian::Document doc;
00488 for (int i = 1; i != 50; ++i) {
00489 if (n % i == 0)
00490 doc.add_term("N" + str(i));
00491 }
00492 db.add_document(doc);
00493 }
00494 }
00495
00497 DEFINE_TESTCASE(xordecay1, generated) {
00498 Xapian::Database db = get_database("xordecay1", make_xordecay1_db);
00499 Xapian::Enquire enq(db);
00500 enq.set_query(Xapian::Query(Xapian::Query::OP_XOR,
00501 Xapian::Query("N10"),
00502 Xapian::Query(Xapian::Query::OP_OR,
00503 Xapian::Query("N2"),
00504 Xapian::Query("N3"))));
00505 Xapian::MSet mset1 = enq.get_mset(0, 1);
00506 Xapian::MSet msetall = enq.get_mset(0, db.get_doccount());
00507
00508 TEST(mset_range_is_same(mset1, 0, msetall, 0, mset1.size()));
00509 return true;
00510 }
00511
00512 static void
00513 make_ordecay_db(Xapian::WritableDatabase &db, const string &)
00514 {
00515 const char * p = "VJ=QC]LUNTaARLI;715RR^];A4O=P4ZG<2CS4EM^^VS[A6QENR";
00516 for (int d = 0; p[d]; ++d) {
00517 int l = int(p[d] - '0');
00518 Xapian::Document doc;
00519 for (int n = 1; n < l; ++n) {
00520 doc.add_term("N" + str(n));
00521 if (n % (d + 1) == 0) {
00522 doc.add_term("M" + str(n));
00523 }
00524 }
00525 db.add_document(doc);
00526 }
00527 }
00528
00530 DEFINE_TESTCASE(ordecay1, generated) {
00531 Xapian::Database db = get_database("ordecay", make_ordecay_db);
00532 Xapian::Enquire enq(db);
00533 enq.set_query(Xapian::Query(Xapian::Query::OP_OR,
00534 Xapian::Query("N20"),
00535 Xapian::Query("N21")));
00536
00537 Xapian::MSet msetall = enq.get_mset(0, db.get_doccount());
00538 for (unsigned int i = 1; i < msetall.size(); ++i) {
00539 Xapian::MSet submset = enq.get_mset(0, i);
00540 TEST(mset_range_is_same(submset, 0, msetall, 0, submset.size()));
00541 }
00542 return true;
00543 }
00544
00548 DEFINE_TESTCASE(ordecay2, generated) {
00549 Xapian::Database db = get_database("ordecay", make_ordecay_db);
00550 Xapian::Enquire enq(db);
00551 std::vector<Xapian::Query> q;
00552 q.push_back(Xapian::Query("M20"));
00553 q.push_back(Xapian::Query("N21"));
00554 q.push_back(Xapian::Query("N22"));
00555 enq.set_query(Xapian::Query(Xapian::Query::OP_OR,
00556 Xapian::Query("N25"),
00557 Xapian::Query(Xapian::Query::OP_AND,
00558 q.begin(),
00559 q.end())));
00560
00561 Xapian::MSet msetall = enq.get_mset(0, db.get_doccount());
00562 for (unsigned int i = 1; i < msetall.size(); ++i) {
00563 Xapian::MSet submset = enq.get_mset(0, i);
00564 TEST(mset_range_is_same(submset, 0, msetall, 0, submset.size()));
00565 }
00566 return true;
00567 }
00568
00569 static void
00570 make_orcheck_db(Xapian::WritableDatabase &db, const string &)
00571 {
00572 static const int t1[6] = {2, 4, 6, 8, 10, 0};
00573 static const int t2[11] = {6, 7, 8, 11, 12, 13, 14, 15, 16, 17, 0};
00574 static const int t3[11] = {3, 7, 8, 11, 12, 13, 14, 15, 16, 17, 0};
00575
00576 for (unsigned i = 1; i <= 17; ++i) {
00577 Xapian::Document doc;
00578 db.replace_document(i, doc);
00579 }
00580 for (const int * p = t1; *p != 0; ++p) {
00581 Xapian::Document doc(db.get_document(*p));
00582 doc.add_term("T1");
00583 db.replace_document(*p, doc);
00584 }
00585 for (const int * p = t2; *p != 0; ++p) {
00586 Xapian::Document doc(db.get_document(*p));
00587 doc.add_term("T2");
00588 if (*p < 17) {
00589 doc.add_term("T2_lowfreq");
00590 }
00591 doc.add_value(2, "1");
00592 db.replace_document(*p, doc);
00593 }
00594 for (const int * p = t3; *p != 0; ++p) {
00595 Xapian::Document doc(db.get_document(*p));
00596 doc.add_term("T3");
00597 if (*p < 17) {
00598 doc.add_term("T3_lowfreq");
00599 }
00600 doc.add_value(3, "1");
00601 db.replace_document(*p, doc);
00602 }
00603 }
00604
00608 DEFINE_TESTCASE(orcheck1, generated) {
00609 Xapian::Database db = get_database("orcheck1", make_orcheck_db);
00610 Xapian::Enquire enq(db);
00611 Xapian::Query q1("T1");
00612 Xapian::Query q2("T2");
00613 Xapian::Query q2l("T2_lowfreq");
00614 Xapian::Query q3("T3");
00615 Xapian::Query q3l("T3_lowfreq");
00616 Xapian::Query v2(Xapian::Query::OP_VALUE_RANGE, 2, "0", "2");
00617 Xapian::Query v3(Xapian::Query::OP_VALUE_RANGE, 3, "0", "2");
00618
00619 tout << "Checking q2 OR q3\n";
00620 enq.set_query(Xapian::Query(Xapian::Query::OP_AND, q1,
00621 Xapian::Query(Xapian::Query::OP_OR, q2, q3)));
00622 mset_expect_order(enq.get_mset(0, db.get_doccount()), 8, 6);
00623
00624 tout << "Checking q2l OR q3\n";
00625 enq.set_query(Xapian::Query(Xapian::Query::OP_AND, q1,
00626 Xapian::Query(Xapian::Query::OP_OR, q2l, q3)));
00627 mset_expect_order(enq.get_mset(0, db.get_doccount()), 8, 6);
00628
00629 tout << "Checking q2 OR q3l\n";
00630 enq.set_query(Xapian::Query(Xapian::Query::OP_AND, q1,
00631 Xapian::Query(Xapian::Query::OP_OR, q2, q3l)));
00632 mset_expect_order(enq.get_mset(0, db.get_doccount()), 8, 6);
00633
00634 tout << "Checking v2 OR q3\n";
00635 enq.set_query(Xapian::Query(Xapian::Query::OP_AND, q1,
00636 Xapian::Query(Xapian::Query::OP_OR, v2, q3)));
00637 mset_expect_order(enq.get_mset(0, db.get_doccount()), 8, 6);
00638
00639 tout << "Checking q2 OR v3\n";
00640 enq.set_query(Xapian::Query(Xapian::Query::OP_AND, q1,
00641 Xapian::Query(Xapian::Query::OP_OR, q2, v3)));
00642
00643
00644 mset_expect_order(enq.get_mset(0, db.get_doccount()), 6, 8);
00645
00646 return true;
00647 }
00648
00653 DEFINE_TESTCASE(failedreplace1, brass || chert || flint) {
00654 Xapian::WritableDatabase db(get_writable_database());
00655 Xapian::Document doc;
00656 doc.add_term("foo");
00657 db.add_document(doc);
00658 Xapian::docid did = db.add_document(doc);
00659 doc.add_term("abc");
00660 doc.add_term(string(1000, 'm'));
00661 doc.add_term("xyz");
00662 TEST_EXCEPTION(Xapian::InvalidArgumentError, db.replace_document(did, doc));
00663 db.commit();
00664 TEST_EQUAL(db.get_doccount(), 0);
00665 TEST_EQUAL(db.get_termfreq("foo"), 0);
00666 return true;
00667 }
00668
00669 DEFINE_TESTCASE(failedreplace2, brass || chert || flint) {
00670 Xapian::WritableDatabase db(get_writable_database("apitest_simpledata"));
00671 db.commit();
00672 Xapian::doccount db_size = db.get_doccount();
00673 Xapian::Document doc;
00674 doc.set_data("wibble");
00675 doc.add_term("foo");
00676 doc.add_value(0, "seven");
00677 db.add_document(doc);
00678 Xapian::docid did = db.add_document(doc);
00679 doc.add_term("abc");
00680 doc.add_term(string(1000, 'm'));
00681 doc.add_term("xyz");
00682 doc.add_value(0, "six");
00683 TEST_EXCEPTION(Xapian::InvalidArgumentError, db.replace_document(did, doc));
00684 db.commit();
00685 TEST_EQUAL(db.get_doccount(), db_size);
00686 TEST_EQUAL(db.get_termfreq("foo"), 0);
00687 return true;
00688 }
00689
00691 DEFINE_TESTCASE(phrase3, positional) {
00692 Xapian::Database db = get_database("apitest_phrase");
00693
00694 const char * phrase_words[] = { "phrase", "near" };
00695 Xapian::Query q(Xapian::Query::OP_NEAR, phrase_words, phrase_words + 2, 12);
00696 q = Xapian::Query(Xapian::Query::OP_AND_MAYBE, Xapian::Query("pad"), q);
00697
00698 Xapian::Enquire enquire(db);
00699 enquire.set_query(q);
00700 Xapian::MSet mset = enquire.get_mset(0, 5);
00701
00702 return true;
00703 }
00704
00706
00707 DEFINE_TESTCASE(msetfirst2, backend) {
00708 Xapian::Database db(get_database("apitest_simpledata"));
00709 Xapian::Enquire enquire(db);
00710 enquire.set_query(Xapian::Query("paragraph"));
00711 Xapian::MSet mset;
00712
00713 mset = enquire.get_mset(0xfffffff0, 1);
00714 TEST_EQUAL(mset.get_firstitem(), 0xfffffff0);
00715
00716 mset = enquire.get_mset(1, 0xfffffff0);
00717 TEST_EQUAL(mset.get_firstitem(), 1);
00718
00719
00720 enquire.set_query(Xapian::Query::MatchNothing);
00721 mset = enquire.get_mset(1, 1);
00722 TEST_EQUAL(mset.get_firstitem(), 1);
00723 return true;
00724 }
00725
00726 DEFINE_TESTCASE(bm25weight2, backend) {
00727 Xapian::Database db(get_database("etext"));
00728 Xapian::Enquire enquire(db);
00729 enquire.set_query(Xapian::Query("the"));
00730 enquire.set_weighting_scheme(Xapian::BM25Weight(0, 0, 0, 0, 1));
00731 Xapian::MSet mset = enquire.get_mset(0, 100);
00732 TEST_REL(mset.size(),>=,2);
00733 Xapian::weight weight0 = mset[0].get_weight();
00734 for (size_t i = 1; i != mset.size(); ++i) {
00735 TEST_EQUAL(weight0, mset[i].get_weight());
00736 }
00737 return true;
00738 }
00739
00740 DEFINE_TESTCASE(tradweight2, backend) {
00741 Xapian::Database db(get_database("etext"));
00742 Xapian::Enquire enquire(db);
00743 enquire.set_query(Xapian::Query("the"));
00744 enquire.set_weighting_scheme(Xapian::TradWeight(0));
00745 Xapian::MSet mset = enquire.get_mset(0, 100);
00746 TEST_REL(mset.size(),>=,2);
00747 Xapian::weight weight0 = mset[0].get_weight();
00748 for (size_t i = 1; i != mset.size(); ++i) {
00749 TEST_EQUAL(weight0, mset[i].get_weight());
00750 }
00751 return true;
00752 }
00753
00754
00755 DEFINE_TESTCASE(emptydb1, backend) {
00756 Xapian::Database db(get_database(string()));
00757 static const Xapian::Query::op ops[] = {
00758 Xapian::Query::OP_AND,
00759 Xapian::Query::OP_OR,
00760 Xapian::Query::OP_AND_NOT,
00761 Xapian::Query::OP_XOR,
00762 Xapian::Query::OP_AND_MAYBE,
00763 Xapian::Query::OP_FILTER,
00764 Xapian::Query::OP_NEAR,
00765 Xapian::Query::OP_PHRASE,
00766 Xapian::Query::OP_ELITE_SET
00767 };
00768 const Xapian::Query::op * p;
00769 for (p = ops; p - ops != sizeof(ops) / sizeof(*ops); ++p) {
00770 tout << *p << endl;
00771 Xapian::Enquire enquire(db);
00772 Xapian::Query query(*p, Xapian::Query("a"), Xapian::Query("b"));
00773 enquire.set_query(query);
00774 Xapian::MSet mset = enquire.get_mset(0, 10);
00775 TEST_EQUAL(mset.get_matches_estimated(), 0);
00776 TEST_EQUAL(mset.get_matches_upper_bound(), 0);
00777 TEST_EQUAL(mset.get_matches_lower_bound(), 0);
00778 }
00779 return true;
00780 }