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_randomidx.h"
00025
00026 #include <cstdlib>
00027 #include <string>
00028 #include <xapian.h>
00029
00030 #include "backendmanager.h"
00031 #include "perftest.h"
00032 #include "testrunner.h"
00033 #include "testsuite.h"
00034 #include "testutils.h"
00035 #include "str.h"
00036
00037 using namespace std;
00038
00041 static unsigned int
00042 rand_int(unsigned int range)
00043 {
00044 return (unsigned int)(range * (rand() / (RAND_MAX + 1.0)));
00045 }
00046
00049 static unsigned int
00050 rand_int(unsigned int min, unsigned int max)
00051 {
00052 return min + (unsigned int)((max + 1 - min) * (rand() / (RAND_MAX + 1.0)));
00053 }
00054
00055
00056
00059 static double
00060 rand_01()
00061 {
00062 return rand() / (RAND_MAX + 1.0);
00063 }
00064
00070 static string
00071 gen_word(unsigned int length, unsigned int char_range)
00072 {
00073 string result;
00074 result.reserve(length);
00075 for (unsigned int i = 0; i != length; ++i) {
00076 char ch = char('a' + rand_int(char_range));
00077 result.append(1, ch);
00078 }
00079 return result;
00080 }
00081
00082
00083 DEFINE_TESTCASE(randomidx1, writable && !inmemory) {
00084 logger.testcase_begin("randomidx1");
00085
00086 std::string dbname("randomidx1");
00087 Xapian::WritableDatabase dbw = backendmanager->get_writable_database(dbname, "");
00088
00089 unsigned int runsize = 100000;
00090 unsigned int seed = 42;
00091
00092
00093 unsigned int slots_used = 10;
00094 double slot_probability = 0.7;
00095 unsigned int slotval_minlen = 1;
00096 unsigned int slotval_maxlen = 6;
00097
00098 unsigned int minterms = 100;
00099 unsigned int maxterms = 1000;
00100 unsigned int mintermlen = 1;
00101 unsigned int maxtermlen = 10;
00102 unsigned int termcharrange = 10;
00103
00104 srand(seed);
00105
00106 std::map<std::string, std::string> params;
00107 params["runsize"] = str(runsize);
00108 params["seed"] = str(seed);
00109 params["slots_used"] = str(slots_used);
00110 params["slot_probability"] = str(slot_probability);
00111 params["slotval_minlen"] = str(slotval_minlen);
00112 params["slotval_maxlen"] = str(slotval_maxlen);
00113 params["minterms"] = str(minterms);
00114 params["maxterms"] = str(maxterms);
00115 params["mintermlen"] = str(mintermlen);
00116 params["maxtermlen"] = str(maxtermlen);
00117 params["termcharrange"] = str(termcharrange);
00118 logger.indexing_begin(dbname, params);
00119
00120 unsigned int i;
00121 for (i = 0; i < runsize; ++i) {
00122 Xapian::Document doc;
00123 doc.set_data("random document " + str(i));
00124
00125 unsigned int terms = rand_int(minterms, maxterms);
00126 for (unsigned int j = 0; j < terms; ++j) {
00127 unsigned int termlen = rand_int(mintermlen, maxtermlen);
00128 doc.add_term(gen_word(termlen, termcharrange));
00129 }
00130
00131
00132
00133
00134 for (unsigned int slot = 0; slot < slots_used; ++slot) {
00135 if (rand_01() < slot_probability) {
00136 unsigned int len = rand_int(slotval_minlen, slotval_maxlen);
00137 doc.add_value(slot, gen_word(len, slot + 2));
00138 }
00139 }
00140
00141 dbw.add_document(doc);
00142 logger.indexing_add();
00143 }
00144 dbw.commit();
00145 logger.indexing_end();
00146
00147 logger.testcase_end();
00148 return true;
00149 }