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_valuestream.h"
00026
00027 #include <xapian.h>
00028 #include "testsuite.h"
00029 #include "testutils.h"
00030
00031 #include "apitest.h"
00032
00033 using namespace std;
00034
00036 DEFINE_TESTCASE(valuestream1, backend && !multi) {
00037
00038 Xapian::Database db = get_database("apitest_simpledata");
00039
00040 for (Xapian::valueno slot = 0; slot < 15; ++slot) {
00041 tout << "testing valuestream iteration for slot " << slot << endl;
00042 Xapian::ValueIterator it = db.valuestream_begin(slot);
00043 while (it != db.valuestream_end(slot)) {
00044 TEST_EQUAL(it.get_valueno(), slot);
00045 string value = *it;
00046 Xapian::docid did = it.get_docid();
00047
00048 Xapian::Document doc = db.get_document(did);
00049 TEST_EQUAL(doc.get_value(slot), value);
00050
00051 ++it;
00052 }
00053 }
00054
00055 return true;
00056 }
00057
00059 DEFINE_TESTCASE(valuestream2, backend) {
00060 Xapian::Database db = get_database("etext");
00061
00062 for (Xapian::valueno slot = 0; slot < 15; ++slot) {
00063 unsigned interval = 1;
00064 while (interval < 1999) {
00065 tout.str(string());
00066 tout << "testing valuestream skip_to for slot " << slot
00067 << " with interval " << interval << endl;
00068 Xapian::docid did = 1;
00069 Xapian::ValueIterator it = db.valuestream_begin(slot);
00070 if (it == db.valuestream_end(slot)) break;
00071 while (it.skip_to(did), it != db.valuestream_end(slot)) {
00072 TEST_EQUAL(it.get_valueno(), slot);
00073 string value = *it;
00074
00075
00076 Xapian::docid actual_did = it.get_docid();
00077 TEST_REL(actual_did,>=,did);
00078 while (did < actual_did) {
00079 Xapian::Document doc = db.get_document(did);
00080 TEST(doc.get_value(slot).empty());
00081 ++did;
00082 }
00083
00084 Xapian::Document doc = db.get_document(actual_did);
00085 TEST_EQUAL(doc.get_value(slot), value);
00086 did += interval;
00087 }
00088 interval = interval * 3 - 1;
00089 }
00090 }
00091
00092 return true;
00093 }
00094
00096 DEFINE_TESTCASE(valuestream3, backend) {
00097 Xapian::Database db = get_database("etext");
00098
00099
00100 typedef enum {
00101 CHECK, CHECK_AND_NEXT, CHECK2, SKIP_TO, CHECK_AND_LOOP
00102 } test_op;
00103 test_op operation = CHECK;
00104
00105 for (Xapian::valueno slot = 0; slot < 15; ++slot) {
00106 unsigned interval = 1;
00107 while (interval < 1999) {
00108 tout << "testing valuestream check for slot " << slot
00109 << " with interval " << interval << endl;
00110 Xapian::docid did = 1;
00111 Xapian::ValueIterator it = db.valuestream_begin(slot);
00112 if (it == db.valuestream_end(slot)) break;
00113 while (true) {
00114 bool positioned = true;
00115 switch (operation) {
00116 case CHECK_AND_LOOP:
00117 operation = CHECK;
00118
00119 case CHECK: case CHECK2:
00120 positioned = it.check(did);
00121 break;
00122 case CHECK_AND_NEXT: {
00123 bool was_skip_to = it.check(did);
00124 if (!was_skip_to) ++it;
00125 break;
00126 }
00127 case SKIP_TO:
00128 it.skip_to(did);
00129 break;
00130 }
00131 operation = test_op(operation + 1);
00132 if (positioned) {
00133 if (it == db.valuestream_end(slot)) break;
00134 TEST_EQUAL(it.get_valueno(), slot);
00135 string value = *it;
00136
00137
00138 Xapian::docid actual_did = it.get_docid();
00139 while (did < actual_did) {
00140 Xapian::Document doc = db.get_document(did);
00141 TEST(doc.get_value(slot).empty());
00142 ++did;
00143 }
00144
00145 Xapian::Document doc = db.get_document(actual_did);
00146 TEST_EQUAL(doc.get_value(slot), value);
00147 }
00148 did += interval;
00149 }
00150 interval = interval * 3 - 1;
00151 }
00152 }
00153
00154 return true;
00155 }
00156
00161 DEFINE_TESTCASE(valueweightsource5, writable && valuestats) {
00162
00163 SKIP_TEST_FOR_BACKEND("inmemory");
00164
00165
00166
00167 SKIP_TEST_FOR_BACKEND("remote");
00168 Xapian::WritableDatabase db = get_writable_database();
00169 Xapian::Document doc;
00170 doc.add_value(1, Xapian::sortable_serialise(3.14));
00171 db.replace_document(1, doc);
00172 db.replace_document(0xffffffff, doc);
00173 db.commit();
00174
00175 Xapian::ValueWeightPostingSource src(1);
00176 src.init(db);
00177 src.next(0.0);
00178 TEST(!src.at_end());
00179 TEST_EQUAL(src.get_docid(), 1);
00180 src.next(0.0);
00181 TEST(!src.at_end());
00182 TEST_EQUAL(src.get_docid(), 0xffffffff);
00183 src.next(0.0);
00184 TEST(src.at_end());
00185
00186 return true;
00187 }
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209 DEFINE_TESTCASE(valuemapsource1, backend) {
00210 Xapian::Database db(get_database("apitest_phrase"));
00211 Xapian::Enquire enq(db);
00212
00213 Xapian::ValueMapPostingSource src(13);
00214 src.add_mapping("Thi", 2.0);
00215 src.add_mapping("The", 1.0);
00216 src.add_mapping("You", 3.0);
00217 src.add_mapping("War", 4.0);
00218 src.add_mapping("Fri", 5.0);
00219
00220
00221 enq.set_query(Xapian::Query(&src));
00222 Xapian::MSet mset = enq.get_mset(0, 5);
00223
00224 TEST(mset.size() == 5);
00225 mset_expect_order(mset, 5, 4, 3, 1, 2);
00226
00227
00228 src.clear_mappings();
00229 src.set_default_weight(3.5);
00230 src.add_mapping("Thi", 2.0);
00231 src.add_mapping("The", 1.0);
00232 src.add_mapping("You", 3.0);
00233 src.add_mapping("War", 4.0);
00234 src.add_mapping("Fri", 5.0);
00235
00236 enq.set_query(Xapian::Query(&src));
00237 mset = enq.get_mset(0, 5);
00238
00239 TEST(mset.size() == 5);
00240 mset_expect_order(mset, 5, 4, 6, 7, 8);
00241
00242 return true;
00243 }
00244
00245
00246
00247 DEFINE_TESTCASE(valuemapsource2, backend && !multi) {
00248 Xapian::Database db(get_database("apitest_phrase"));
00249
00250 {
00251 Xapian::ValueMapPostingSource src(100);
00252 src.init(db);
00253 TEST(src.at_end() == false);
00254 src.next(0.0);
00255 TEST(src.at_end() == true);
00256 }
00257
00258 {
00259 Xapian::ValueMapPostingSource src(100);
00260 src.init(db);
00261 TEST(src.at_end() == false);
00262 src.skip_to(1, 0.0);
00263 TEST(src.at_end() == true);
00264 }
00265
00266 {
00267 Xapian::ValueMapPostingSource src(100);
00268 src.init(db);
00269 TEST(src.at_end() == false);
00270 src.check(1, 0.0);
00271 TEST(src.at_end() == true);
00272 }
00273
00274 return true;
00275 }
00276
00277
00278
00279 DEFINE_TESTCASE(fixedweightsource2, !backend) {
00280 Xapian::Database db;
00281
00282 {
00283 Xapian::FixedWeightPostingSource src(5.0);
00284 src.init(db);
00285 TEST(src.at_end() == false);
00286 src.next(0.0);
00287 TEST(src.at_end() == true);
00288 }
00289
00290 {
00291 Xapian::FixedWeightPostingSource src(5.0);
00292 src.init(db);
00293 TEST(src.at_end() == false);
00294 src.skip_to(1, 0.0);
00295 TEST(src.at_end() == true);
00296 }
00297
00298
00299
00300
00301
00302 return true;
00303 }
00304
00305
00306 DEFINE_TESTCASE(decvalwtsource1, writable) {
00307 Xapian::WritableDatabase db = get_writable_database();
00308
00309 Xapian::Document doc;
00310 doc.add_value(1, Xapian::sortable_serialise(3));
00311 db.add_document(doc);
00312 doc.add_value(1, Xapian::sortable_serialise(2));
00313 db.add_document(doc);
00314 doc.add_value(1, Xapian::sortable_serialise(1));
00315 db.add_document(doc);
00316 db.commit();
00317
00318
00319 {
00320 Xapian::DecreasingValueWeightPostingSource src(1);
00321 src.init(db);
00322
00323 src.next(0.0);
00324 TEST(!src.at_end());
00325 TEST_EQUAL(src.get_docid(), 1);
00326
00327 src.next(0.0);
00328 TEST(!src.at_end());
00329 TEST_EQUAL(src.get_docid(), 2);
00330
00331 src.next(0.0);
00332 TEST(!src.at_end());
00333 TEST_EQUAL(src.get_docid(), 3);
00334
00335 src.next(0.0);
00336 TEST(src.at_end());
00337 }
00338
00339
00340 {
00341 Xapian::DecreasingValueWeightPostingSource src(1);
00342 src.init(db);
00343
00344 src.next(1.5);
00345 TEST(!src.at_end());
00346 TEST_EQUAL(src.get_docid(), 1);
00347
00348 src.next(1.5);
00349 TEST(!src.at_end());
00350 TEST_EQUAL(src.get_docid(), 2);
00351
00352 src.next(1.5);
00353 TEST(src.at_end());
00354 }
00355
00356
00357 doc.add_value(1, Xapian::sortable_serialise(2));
00358 db.add_document(doc);
00359
00360 {
00361 Xapian::DecreasingValueWeightPostingSource src(1, 1, 3);
00362 src.init(db);
00363
00364 src.next(1.5);
00365 TEST(!src.at_end());
00366 TEST_EQUAL(src.get_docid(), 1);
00367
00368 src.next(1.5);
00369 TEST(!src.at_end());
00370 TEST_EQUAL(src.get_docid(), 2);
00371
00372 src.next(1.5);
00373 TEST(!src.at_end());
00374 TEST_EQUAL(src.get_docid(), 4);
00375
00376 src.next(1.5);
00377 TEST(src.at_end());
00378 }
00379
00380 {
00381 Xapian::DecreasingValueWeightPostingSource src(1, 1, 3);
00382 src.init(db);
00383
00384 src.next(1.5);
00385 TEST(!src.at_end());
00386 TEST_EQUAL(src.get_docid(), 1);
00387
00388 src.skip_to(3, 1.5);
00389 TEST(!src.at_end());
00390 TEST_EQUAL(src.get_docid(), 4);
00391
00392 src.next(1.5);
00393 TEST(src.at_end());
00394 }
00395
00396 {
00397 Xapian::DecreasingValueWeightPostingSource src(1, 1, 3);
00398 src.init(db);
00399
00400 src.next(1.5);
00401 TEST(!src.at_end());
00402 TEST_EQUAL(src.get_docid(), 1);
00403
00404 TEST(src.check(3, 1.5));
00405 TEST(!src.at_end());
00406 TEST_EQUAL(src.get_docid(), 4);
00407
00408 src.next(1.5);
00409 TEST(src.at_end());
00410 }
00411
00412 return true;
00413 }
00414
00415
00416
00417 DEFINE_TESTCASE(decvalwtsource2, writable) {
00418 Xapian::WritableDatabase db = get_writable_database();
00419
00420 Xapian::Document doc;
00421 doc.add_value(1, Xapian::sortable_serialise(1));
00422 db.add_document(doc);
00423 doc.add_value(1, Xapian::sortable_serialise(3));
00424 db.add_document(doc);
00425 doc.add_value(1, Xapian::sortable_serialise(3));
00426 db.add_document(doc);
00427 doc.add_value(1, Xapian::sortable_serialise(1));
00428 db.add_document(doc);
00429 db.commit();
00430
00431
00432 {
00433 Xapian::DecreasingValueWeightPostingSource src(1);
00434 src.init(db);
00435
00436 src.next(0.0);
00437 TEST(!src.at_end());
00438 TEST_EQUAL(src.get_docid(), 1);
00439
00440 src.next(0.0);
00441 TEST(!src.at_end());
00442 TEST_EQUAL(src.get_docid(), 2);
00443
00444 src.next(0.0);
00445 TEST(!src.at_end());
00446 TEST_EQUAL(src.get_docid(), 3);
00447
00448 src.next(0.0);
00449 TEST(!src.at_end());
00450 TEST_EQUAL(src.get_docid(), 4);
00451
00452 src.next(0.0);
00453 TEST(src.at_end());
00454 }
00455
00456
00457 {
00458 Xapian::DecreasingValueWeightPostingSource src(1, 2);
00459 src.init(db);
00460
00461 src.next(1.5);
00462 TEST(!src.at_end());
00463 TEST_EQUAL(src.get_docid(), 1);
00464
00465 src.next(1.5);
00466 TEST(!src.at_end());
00467 TEST_EQUAL(src.get_docid(), 2);
00468
00469 src.next(1.5);
00470 TEST(!src.at_end());
00471 TEST_EQUAL(src.get_docid(), 3);
00472
00473 src.next(1.5);
00474 TEST(src.at_end());
00475 }
00476
00477
00478 doc.add_value(1, Xapian::sortable_serialise(2));
00479 db.add_document(doc);
00480
00481 {
00482 Xapian::DecreasingValueWeightPostingSource src(1, 2, 4);
00483 src.init(db);
00484
00485 src.next(1.5);
00486 TEST(!src.at_end());
00487 TEST_EQUAL(src.get_docid(), 1);
00488
00489 src.next(1.5);
00490 TEST(!src.at_end());
00491 TEST_EQUAL(src.get_docid(), 2);
00492
00493 src.next(1.5);
00494 TEST(!src.at_end());
00495 TEST_EQUAL(src.get_docid(), 3);
00496
00497 src.next(1.5);
00498 TEST(!src.at_end());
00499 TEST_EQUAL(src.get_docid(), 5);
00500
00501 src.next(1.5);
00502 TEST(src.at_end());
00503 }
00504
00505 {
00506 Xapian::DecreasingValueWeightPostingSource src(1, 2, 4);
00507 src.init(db);
00508
00509 TEST(src.check(1, 1.5));
00510 TEST(!src.at_end());
00511 TEST_EQUAL(src.get_docid(), 1);
00512
00513 src.next(1.5);
00514 TEST(!src.at_end());
00515 TEST_EQUAL(src.get_docid(), 2);
00516
00517 src.skip_to(4, 1.5);
00518 TEST(!src.at_end());
00519 TEST_EQUAL(src.get_docid(), 5);
00520
00521 src.next(1.5);
00522 TEST(src.at_end());
00523 }
00524
00525 {
00526 Xapian::DecreasingValueWeightPostingSource src(1, 2, 4);
00527 src.init(db);
00528
00529 TEST(src.check(1, 1.5));
00530 TEST(!src.at_end());
00531 TEST_EQUAL(src.get_docid(), 1);
00532
00533 src.next(1.5);
00534 TEST(!src.at_end());
00535 TEST_EQUAL(src.get_docid(), 2);
00536
00537 TEST(src.check(4, 1.5));
00538 TEST(!src.at_end());
00539 TEST_EQUAL(src.get_docid(), 5);
00540
00541 src.next(1.5);
00542 TEST(src.at_end());
00543 }
00544
00545 return true;
00546 }
00547
00548
00549 DEFINE_TESTCASE(decvalwtsource3, writable) {
00550 Xapian::WritableDatabase db = get_writable_database();
00551
00552 Xapian::Document doc;
00553 doc.add_term("foo");
00554 doc.add_value(1, Xapian::sortable_serialise(1));
00555 db.add_document(doc);
00556 doc.add_value(1, Xapian::sortable_serialise(3));
00557 db.add_document(doc);
00558 doc.add_term("bar");
00559 doc.add_value(1, Xapian::sortable_serialise(3));
00560 db.add_document(doc);
00561 doc.add_value(1, Xapian::sortable_serialise(1));
00562 db.add_document(doc);
00563 db.commit();
00564
00565 Xapian::DecreasingValueWeightPostingSource ps(1, 2, 5);
00566 Xapian::Query q(&ps);
00567 Xapian::Enquire enq(db);
00568 enq.set_query(q);
00569
00570 Xapian::MSet mset1(enq.get_mset(0, 1));
00571 Xapian::MSet mset2(enq.get_mset(0, 2));
00572 Xapian::MSet mset3(enq.get_mset(0, 3));
00573 Xapian::MSet mset4(enq.get_mset(0, 4));
00574
00575 TEST_EQUAL(mset1.size(), 1);
00576 TEST_EQUAL(mset2.size(), 2);
00577 TEST_EQUAL(mset3.size(), 3);
00578 TEST_EQUAL(mset4.size(), 4);
00579
00580 TEST(mset_range_is_same(mset1, 0, mset2, 0, 1));
00581 TEST(mset_range_is_same(mset2, 0, mset3, 0, 2));
00582 TEST(mset_range_is_same(mset3, 0, mset4, 0, 3));
00583
00584 return true;
00585 }
00586
00587
00588
00589 DEFINE_TESTCASE(decvalwtsource4, backend && !multi) {
00590 Xapian::Database db = get_database("apitest_declen");
00591
00592 Xapian::DecreasingValueWeightPostingSource ps(11, 2, 5);
00593 Xapian::Query q(&ps);
00594 Xapian::Enquire enq(db);
00595 enq.set_query(q);
00596
00597 Xapian::MSet mset1(enq.get_mset(0, 1));
00598 Xapian::MSet mset2(enq.get_mset(0, 2));
00599 Xapian::MSet mset3(enq.get_mset(0, 3));
00600 Xapian::MSet mset4(enq.get_mset(0, 4));
00601
00602 TEST_EQUAL(mset1.size(), 1);
00603 TEST_EQUAL(mset2.size(), 2);
00604 TEST_EQUAL(mset3.size(), 3);
00605 TEST_EQUAL(mset4.size(), 4);
00606
00607 TEST(mset_range_is_same(mset1, 0, mset2, 0, 1));
00608 TEST(mset_range_is_same(mset2, 0, mset3, 0, 2));
00609 TEST(mset_range_is_same(mset3, 0, mset4, 0, 3));
00610
00611 return true;
00612 }
00613
00614
00615
00616 DEFINE_TESTCASE(decvalwtsource5, writable) {
00617 Xapian::WritableDatabase db = get_writable_database();
00618
00619 Xapian::Document doc;
00620 doc.add_value(1, Xapian::sortable_serialise(1));
00621 db.add_document(doc);
00622 doc.add_value(2, Xapian::sortable_serialise(1));
00623 db.add_document(doc);
00624 db.commit();
00625
00626 {
00627 Xapian::DecreasingValueWeightPostingSource ps(1);
00628 Xapian::Query q(&ps);
00629 Xapian::Enquire enq(db);
00630 enq.set_query(q);
00631 Xapian::MSet mset1(enq.get_mset(0, 3));
00632 TEST_EQUAL(mset1.size(), 2);
00633 }
00634 {
00635 Xapian::DecreasingValueWeightPostingSource ps(2);
00636 Xapian::Query q(&ps);
00637 Xapian::Enquire enq(db);
00638 enq.set_query(q);
00639 Xapian::MSet mset1(enq.get_mset(0, 3));
00640 TEST_EQUAL(mset1.size(), 1);
00641 }
00642 {
00643 Xapian::DecreasingValueWeightPostingSource ps(3);
00644 Xapian::Query q(&ps);
00645 Xapian::Enquire enq(db);
00646 enq.set_query(q);
00647 Xapian::MSet mset1(enq.get_mset(0, 3));
00648 TEST_EQUAL(mset1.size(), 0);
00649 }
00650
00651 return true;
00652 }