00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <config.h>
00023
00024 #include "perftest/perftest_matchdecider.h"
00025
00026 #include <xapian.h>
00027
00028 #include "backendmanager.h"
00029 #include "perftest.h"
00030 #include "str.h"
00031 #include "testrunner.h"
00032 #include "testsuite.h"
00033 #include "testutils.h"
00034
00035 using namespace std;
00036
00037 static void
00038 builddb_valuestest1(Xapian::WritableDatabase &db, const string & dbname)
00039 {
00040 logger.testcase_begin(dbname);
00041 unsigned int runsize = 1000000;
00042
00043
00044 std::map<std::string, std::string> params;
00045 params["runsize"] = str(runsize);
00046 logger.indexing_begin(dbname, params);
00047 for (unsigned int i = 0; i < runsize; ++i) {
00048 unsigned int v = i % 100;
00049 Xapian::Document doc;
00050 doc.set_data("test document " + str(i));
00051 doc.add_term("foo");
00052 string vs = str(v);
00053 if (vs.size() == 1) vs = "0" + vs;
00054 doc.add_value(0, vs);
00055 doc.add_term("F" + vs);
00056 doc.add_term("Q" + str(i));
00057 for (int j = 0; j != 100; ++j)
00058 doc.add_term("J" + str(j));
00059 db.replace_document(i + 10, doc);
00060 logger.indexing_add();
00061 }
00062 db.commit();
00063 logger.indexing_end();
00064 logger.testcase_end();
00065 }
00066
00067
00068 DEFINE_TESTCASE(valuesetmatchdecider1, writable && !remote && !inmemory) {
00069 Xapian::Database db;
00070 db = backendmanager->get_database("valuestest1", builddb_valuestest1,
00071 "valuestest1");
00072
00073 logger.testcase_begin("valuesetmatchdecider1");
00074 Xapian::Enquire enquire(db);
00075 Xapian::doccount runsize = db.get_doccount();
00076
00077 Xapian::Query query("foo");
00078 logger.searching_start("No match decider");
00079 logger.search_start();
00080 enquire.set_query(query);
00081 Xapian::MSet mset = enquire.get_mset(0, 10);
00082 logger.search_end(query, mset);
00083 TEST(mset.size() == 10);
00084 TEST(mset.get_matches_lower_bound() <= runsize);
00085 TEST(mset.get_matches_upper_bound() <= runsize);
00086
00087 logger.search_start();
00088 mset = enquire.get_mset(0, 10);
00089 logger.search_end(query, mset);
00090 TEST(mset.size() == 10);
00091 TEST(mset.get_matches_lower_bound() <= runsize);
00092 logger.searching_end();
00093
00094 Xapian::ValueSetMatchDecider md(0, true);
00095
00096 for (unsigned int i = 0; i < 100; ++i) {
00097 string vs = str(i);
00098 if (vs.size() == 1) vs = "0" + vs;
00099 md.add_value(vs);
00100
00101 logger.searching_start("Match decider accepting " + str(i + 1) + "%");
00102 logger.search_start();
00103 enquire.set_query(query);
00104 mset = enquire.get_mset(0, 10, 0, NULL, &md);
00105 logger.search_end(query, mset);
00106 TEST_EQUAL(mset.size(), 10);
00107 TEST_REL(mset.get_matches_lower_bound(),<=,runsize * (i + 1) / 100);
00108 logger.searching_end();
00109
00110 Xapian::Query query2(Xapian::Query::OP_FILTER, query,
00111 Xapian::Query(Xapian::Query::OP_VALUE_LE, 0, vs));
00112 logger.searching_start("Value range LE accepting " + str(i + 1) + "%");
00113 Xapian::MSet mset2;
00114 logger.search_start();
00115 enquire.set_query(query2);
00116 mset2 = enquire.get_mset(0, 10);
00117 logger.search_end(query2, mset2);
00118 TEST_EQUAL(mset2.size(), 10);
00119 TEST_REL(mset2.get_matches_lower_bound(),<=,runsize * (i + 1) / 100);
00120 test_mset_order_equal(mset, mset2);
00121 logger.searching_end();
00122 }
00123
00124 logger.testcase_end();
00125 return true;
00126 }
00127
00128
00129 DEFINE_TESTCASE(alldocsiter1, writable && !remote && !inmemory) {
00130 Xapian::Database db;
00131 db = backendmanager->get_database("valuestest1", builddb_valuestest1,
00132 "valuestest1");
00133
00134 logger.testcase_begin("alldocsiter1");
00135
00136 logger.searching_start("AllDocsPostingIterator, full iteration");
00137 logger.search_start();
00138 Xapian::PostingIterator begin(db.postlist_begin(""));
00139 Xapian::PostingIterator end(db.postlist_end(""));
00140 while (begin != end) {
00141 ++begin;
00142 }
00143 logger.search_end(Xapian::Query(), Xapian::MSet());
00144
00145 logger.searching_end();
00146
00147 logger.testcase_end();
00148 return true;
00149 }