00001
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 "api_percentages.h"
00025
00026 #include <xapian.h>
00027
00028 #include "apitest.h"
00029 #include "backendmanager_local.h"
00030 #include "testutils.h"
00031
00032 #include <cfloat>
00033
00034 using namespace std;
00035
00036
00037
00038
00039 DEFINE_TESTCASE(consistency3, backend) {
00040 Xapian::Database db(get_database("apitest_sortconsist"));
00041 Xapian::Enquire enquire(db);
00042 enquire.set_query(Xapian::Query("foo"));
00043 enquire.set_sort_by_value(1, 0);
00044 Xapian::doccount lots = 3;
00045 Xapian::MSet bigmset = enquire.get_mset(0, lots);
00046 TEST_EQUAL(bigmset.size(), lots);
00047 for (Xapian::doccount start = 0; start < lots; ++start) {
00048 tout << *bigmset[start] << ":" << bigmset[start].get_weight() << ":"
00049 << bigmset[start].get_percent() << "%" << endl;
00050 for (Xapian::doccount size = 0; size < lots - start; ++size) {
00051 Xapian::MSet mset = enquire.get_mset(start, size);
00052 if (mset.size()) {
00053 TEST_EQUAL(start + mset.size(),
00054 min(start + size, bigmset.size()));
00055 } else if (size) {
00056 TEST(start >= bigmset.size());
00057 }
00058 for (Xapian::doccount i = 0; i < mset.size(); ++i) {
00059 TEST_EQUAL(*mset[i], *bigmset[start + i]);
00060 TEST_EQUAL_DOUBLE(mset[i].get_weight(),
00061 bigmset[start + i].get_weight());
00062 TEST_EQUAL_DOUBLE(mset[i].get_percent(),
00063 bigmset[start + i].get_percent());
00064 }
00065 }
00066 }
00067 return true;
00068 }
00069
00070 class MyPostingSource : public Xapian::PostingSource {
00071 vector<pair<Xapian::docid, Xapian::weight> > weights;
00072 vector<pair<Xapian::docid, Xapian::weight> >::const_iterator i;
00073 bool started;
00074
00075 MyPostingSource(const vector<pair<Xapian::docid, Xapian::weight> > &weights_,
00076 Xapian::weight max_wt)
00077 : weights(weights_), started(false)
00078 {
00079 set_maxweight(max_wt);
00080 }
00081
00082 public:
00083 MyPostingSource() : started(false) { }
00084
00085 PostingSource * clone() const
00086 {
00087 return new MyPostingSource(weights, get_maxweight());
00088 }
00089
00090 void append_docweight(Xapian::docid did, Xapian::weight wt) {
00091 weights.push_back(make_pair(did, wt));
00092 if (wt > get_maxweight()) set_maxweight(wt);
00093 }
00094
00095 void init(const Xapian::Database &) { started = false; }
00096
00097 Xapian::weight get_weight() const { return i->second; }
00098
00099 Xapian::doccount get_termfreq_min() const { return weights.size(); }
00100 Xapian::doccount get_termfreq_est() const { return weights.size(); }
00101 Xapian::doccount get_termfreq_max() const { return weights.size(); }
00102
00103 void next(Xapian::weight ) {
00104 if (!started) {
00105 i = weights.begin();
00106 started = true;
00107 } else {
00108 ++i;
00109 }
00110 }
00111
00112 bool at_end() const {
00113 return (i == weights.end());
00114 }
00115
00116 Xapian::docid get_docid() const { return i->first; }
00117
00118 string get_description() const {
00119 return "MyPostingSource";
00120 }
00121 };
00122
00123
00125 DEFINE_TESTCASE(pctcutoff4, backend && !remote && !multi) {
00126
00127
00128 int epsilons = 0;
00129 Xapian::Database db(get_database("apitest_simpledata"));
00130 Xapian::Enquire enquire(db);
00131 while (true) {
00132 MyPostingSource source;
00133 source.append_docweight(1, 100);
00134 source.append_docweight(2, 50 - epsilons * DBL_EPSILON);
00135 enquire.set_query(Xapian::Query(&source));
00136 Xapian::MSet mset = enquire.get_mset(0, 10);
00137 TEST_EQUAL(mset.size(), 2);
00138 if (mset[1].get_percent() != 50) break;
00139 ++epsilons;
00140 }
00141
00142
00143
00144 MyPostingSource source;
00145 source.append_docweight(1, 100);
00146 source.append_docweight(2, 50);
00147 source.append_docweight(3, 50 - (epsilons - 1) * DBL_EPSILON);
00148 source.append_docweight(4, 50 - epsilons * DBL_EPSILON);
00149 source.append_docweight(5, 25);
00150
00151 enquire.set_query(Xapian::Query(&source));
00152 Xapian::MSet mset1 = enquire.get_mset(0, 10);
00153 TEST_EQUAL(mset1.size(), 5);
00154 TEST_EQUAL(mset1[2].get_percent(), 50);
00155 TEST_EQUAL(mset1[3].get_percent(), 49);
00156
00157
00158
00159 int percent = 100;
00160 for (Xapian::MSetIterator i = mset1.begin(); i != mset1.end(); ++i) {
00161 int new_percent = mset1.convert_to_percent(i);
00162 tout << "mset1 item = " << i.get_percent() << "%\n";
00163 if (new_percent != percent) {
00164 enquire.set_cutoff(percent);
00165 Xapian::MSet mset2 = enquire.get_mset(0, 10);
00166 tout << "cutoff = " << percent << "%, "
00167 "mset size = " << mset2.size() << "\n";
00168 TEST_EQUAL(mset2.size(), i.get_rank());
00169 percent = new_percent;
00170 }
00171 }
00172
00173 return true;
00174 }
00175
00177 DEFINE_TESTCASE(pctcutoff5, backend) {
00178 Xapian::Database db(get_database("apitest_simpledata"));
00179 Xapian::Enquire enquire(db);
00180 enquire.set_query(Xapian::Query("test"));
00181 enquire.set_cutoff(42);
00182 Xapian::MSet mset;
00183
00184 enquire.set_sort_by_value(0, false);
00185 TEST_EXCEPTION(Xapian::UnimplementedError, mset = enquire.get_mset(0, 10));
00186
00187 enquire.set_sort_by_value(0, true);
00188 TEST_EXCEPTION(Xapian::UnimplementedError, mset = enquire.get_mset(0, 10));
00189
00190 enquire.set_sort_by_value_then_relevance(0, false);
00191 TEST_EXCEPTION(Xapian::UnimplementedError, mset = enquire.get_mset(0, 10));
00192
00193 enquire.set_sort_by_value_then_relevance(0, true);
00194 TEST_EXCEPTION(Xapian::UnimplementedError, mset = enquire.get_mset(0, 10));
00195
00196 return true;
00197 }
00198
00199
00200 DEFINE_TESTCASE(topercent3, remote) {
00201 BackendManagerLocal local_manager;
00202 local_manager.set_datadir(test_driver::get_srcdir() + "/testdata/");
00203 Xapian::Database db;
00204 db.add_database(get_database("apitest_simpledata"));
00205 db.add_database(local_manager.get_database("apitest_simpledata"));
00206
00207 Xapian::Enquire enquire(db);
00208 enquire.set_sort_by_value(1, false);
00209
00210 const char * terms[] = { "paragraph", "banana" };
00211 enquire.set_query(Xapian::Query(Xapian::Query::OP_OR, terms, terms + 2));
00212
00213 Xapian::MSet mset = enquire.get_mset(0, 20);
00214
00215 Xapian::MSetIterator i;
00216 for (i = mset.begin(); i != mset.end(); ++i) {
00217
00218 TEST_REL(i.get_percent(),<,100);
00219 }
00220
00221 return true;
00222 }
00223
00224
00225
00226 DEFINE_TESTCASE(topercent4, backend) {
00227 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00228
00229 Xapian::Query query(Xapian::Query::OP_FILTER,
00230 Xapian::Query("paragraph"),
00231 Xapian::Query("queri"));
00232 query = Xapian::Query(Xapian::Query::OP_XOR,
00233 query, Xapian::Query("rubbish"));
00234
00235 enquire.set_query(query);
00236 Xapian::MSet mset = enquire.get_mset(0, 10);
00237
00238
00239 TEST(!mset.empty());
00240 TEST_EQUAL(mset[0].get_percent(), 50);
00241
00242 return true;
00243 }
00244
00246 DEFINE_TESTCASE(topercent5, backend) {
00247 Xapian::Enquire enquire(get_database("apitest_simpledata"));
00248 Xapian::Query q(Xapian::Query::OP_OR,
00249 Xapian::Query("paragraph"), Xapian::Query("xyzzy"));
00250 enquire.set_query(q);
00251 Xapian::MSet mset = enquire.get_mset(0, 10);
00252 TEST(!mset.empty());
00253 TEST(mset[0].get_percent() < 100);
00254
00255
00256
00257 TEST(mset[0].get_percent() >= 50);
00258 return true;
00259 }