00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <config.h>
00025
00026 #include "api_opvalue.h"
00027
00028 #include <xapian.h>
00029
00030 #include "apitest.h"
00031 #include "testsuite.h"
00032 #include "testutils.h"
00033
00034 #include <string>
00035
00036 using namespace std;
00037
00038
00039 DEFINE_TESTCASE(valuerange1, backend) {
00040 Xapian::Database db(get_database("apitest_phrase"));
00041 Xapian::Enquire enq(db);
00042 static const char * vals[] = {
00043 "", " ", "a", "aa", "abcd", "e", "g", "h", "hzz", "i", "l", "z", NULL
00044 };
00045 for (const char **start = vals; *start; ++start) {
00046 for (const char **end = vals; *end; ++end) {
00047 Xapian::Query query(Xapian::Query::OP_VALUE_RANGE, 1, *start, *end);
00048 enq.set_query(query);
00049 Xapian::MSet mset = enq.get_mset(0, 20);
00050
00051 set<Xapian::docid> matched;
00052 Xapian::MSetIterator i;
00053 for (i = mset.begin(); i != mset.end(); ++i) {
00054 matched.insert(*i);
00055 string value = db.get_document(*i).get_value(1);
00056 TEST_REL(value,>=,*start);
00057 TEST_REL(value,<=,*end);
00058 }
00059
00060 for (Xapian::docid j = db.get_lastdocid(); j != 0; --j) {
00061 if (matched.find(j) == matched.end()) {
00062 string value = db.get_document(j).get_value(1);
00063 tout << value << " < '" << *start << "' or > '" << *end << "'" << endl;
00064 TEST(value < *start || value > *end);
00065 }
00066 }
00067 }
00068 }
00069 return true;
00070 }
00071
00072
00073
00074 DEFINE_TESTCASE(valuerange2, writable) {
00075 Xapian::WritableDatabase db = get_writable_database();
00076 Xapian::Document doc;
00077 doc.set_data("5");
00078 doc.add_value(0, "5");
00079 db.replace_document(5, doc);
00080 Xapian::Enquire enq(db);
00081
00082 Xapian::Query query(Xapian::Query::OP_VALUE_LE, 0, "6");
00083 enq.set_query(query);
00084 Xapian::MSet mset = enq.get_mset(0, 20);
00085
00086 TEST_EQUAL(mset.size(), 1);
00087 TEST_EQUAL(*(mset[0]), 5);
00088 return true;
00089 }
00090
00091 static void
00092 make_valuerange5(Xapian::WritableDatabase &db, const string &)
00093 {
00094 Xapian::Document doc;
00095 doc.add_value(0, "BOOK");
00096 db.add_document(doc);
00097 doc.add_value(0, "VOLUME");
00098 db.add_document(doc);
00099 }
00100
00101
00102 DEFINE_TESTCASE(valuerange5, generated) {
00103 Xapian::Database db = get_database("valuerange5", make_valuerange5);
00104 if (db.get_value_lower_bound(0).empty()) {
00105
00106
00107
00108 TEST_EXCEPTION(Xapian::UnimplementedError,
00109 db.get_value_upper_bound(0));
00110 return true;
00111 }
00112
00113 Xapian::Enquire enq(db);
00114
00115 Xapian::Query query(Xapian::Query::OP_VALUE_RANGE, 0, "APPLE", "BANANA");
00116 enq.set_query(query);
00117 Xapian::MSet mset = enq.get_mset(0, 0);
00118 TEST_EQUAL(mset.get_matches_estimated(), 0);
00119
00120 Xapian::Query query2(Xapian::Query::OP_VALUE_RANGE, 0, "WALRUS", "ZEBRA");
00121 enq.set_query(query2);
00122 mset = enq.get_mset(0, 0);
00123 TEST_EQUAL(mset.get_matches_estimated(), 0);
00124
00125 return true;
00126 }
00127
00128
00129 DEFINE_TESTCASE(valuege1, backend) {
00130 Xapian::Database db(get_database("apitest_phrase"));
00131 Xapian::Enquire enq(db);
00132 static const char * vals[] = {
00133 "", " ", "a", "aa", "abcd", "e", "g", "h", "hzz", "i", "l", "z", NULL
00134 };
00135 for (const char **start = vals; *start; ++start) {
00136 Xapian::Query query(Xapian::Query::OP_VALUE_GE, 1, *start);
00137 enq.set_query(query);
00138 Xapian::MSet mset = enq.get_mset(0, 20);
00139
00140 set<Xapian::docid> matched;
00141 Xapian::MSetIterator i;
00142 for (i = mset.begin(); i != mset.end(); ++i) {
00143 matched.insert(*i);
00144 string value = db.get_document(*i).get_value(1);
00145 tout << "'" << *start << "' <= '" << value << "'" << endl;
00146 TEST_REL(value,>=,*start);
00147 }
00148
00149
00150 for (Xapian::docid j = db.get_lastdocid(); j != 0; --j) {
00151 if (matched.find(j) == matched.end()) {
00152 string value = db.get_document(j).get_value(1);
00153 tout << value << " < '" << *start << "'" << endl;
00154 TEST_REL(value,<,*start);
00155 }
00156 }
00157 }
00158 return true;
00159 }
00160
00161
00162
00163 DEFINE_TESTCASE(valuege2, backend) {
00164 Xapian::Database db(get_database("apitest_phrase"));
00165 Xapian::Enquire enq(db);
00166 Xapian::Query query(Xapian::Query::OP_AND,
00167 Xapian::Query("what"),
00168 Xapian::Query(Xapian::Query::OP_VALUE_GE, 1, "aa"));
00169 enq.set_query(query);
00170 Xapian::MSet mset = enq.get_mset(0, 20);
00171 return true;
00172 }
00173
00174
00175 DEFINE_TESTCASE(valuele1, backend) {
00176 Xapian::Database db(get_database("apitest_phrase"));
00177 Xapian::Enquire enq(db);
00178 static const char * vals[] = {
00179 "", " ", "a", "aa", "abcd", "e", "g", "h", "hzz", "i", "l", "z", NULL
00180 };
00181 for (const char **end = vals; *end; ++end) {
00182 Xapian::Query query(Xapian::Query::OP_VALUE_LE, 1, *end);
00183 enq.set_query(query);
00184 Xapian::MSet mset = enq.get_mset(0, 20);
00185
00186 set<Xapian::docid> matched;
00187 Xapian::MSetIterator i;
00188 for (i = mset.begin(); i != mset.end(); ++i) {
00189 matched.insert(*i);
00190 string value = db.get_document(*i).get_value(1);
00191 TEST_REL(value,<=,*end);
00192 }
00193
00194
00195 for (Xapian::docid j = db.get_lastdocid(); j != 0; --j) {
00196 if (matched.find(j) == matched.end()) {
00197 string value = db.get_document(j).get_value(1);
00198 TEST_REL(value,>,*end);
00199 }
00200 }
00201 }
00202 return true;
00203 }
00204
00205
00206 DEFINE_TESTCASE(valuege3, !backend) {
00207 Xapian::Query query(Xapian::Query::OP_VALUE_GE, 0, "");
00208 TEST_STRINGS_EQUAL(query.get_description(), Xapian::Query::MatchAll.get_description());
00209 return true;
00210 }
00211
00212
00213 DEFINE_TESTCASE(valuege4, backend) {
00214 Xapian::Database db(get_database("apitest_phrase"));
00215 Xapian::Enquire enq(db);
00216
00217
00218
00219
00220 Xapian::Query query(Xapian::Query::OP_AND,
00221 Xapian::Query("fridg"),
00222 Xapian::Query(Xapian::Query::OP_VALUE_GE, 1, "aa"));
00223 enq.set_query(query);
00224 Xapian::MSet mset = enq.get_mset(0, 20);
00225 return true;
00226 }
00227
00228
00229 DEFINE_TESTCASE(valuerange3, backend) {
00230 Xapian::Database db(get_database("apitest_phrase"));
00231 Xapian::Enquire enq(db);
00232 Xapian::Query query(Xapian::Query::OP_AND,
00233 Xapian::Query("what"),
00234 Xapian::Query(Xapian::Query::OP_VALUE_RANGE, 1,
00235 "aa", "z"));
00236 enq.set_query(query);
00237 Xapian::MSet mset = enq.get_mset(0, 20);
00238 return true;
00239 }
00240
00241
00242 DEFINE_TESTCASE(valuerange4, backend) {
00243 Xapian::Database db(get_database("apitest_phrase"));
00244 Xapian::Enquire enq(db);
00245 Xapian::Query query(Xapian::Query::OP_AND,
00246 Xapian::Query("fridg"),
00247 Xapian::Query(Xapian::Query::OP_VALUE_RANGE, 1,
00248 "aa", "z"));
00249 enq.set_query(query);
00250 Xapian::MSet mset = enq.get_mset(0, 20);
00251 return true;
00252 }