Branch data Line data Source code
1 : : /* api_replacedoc.cc: tests of document replacing.
2 : : *
3 : : * Copyright 2009 Richard Boulton
4 : : *
5 : : * This program is free software; you can redistribute it and/or
6 : : * modify it under the terms of the GNU General Public License as
7 : : * published by the Free Software Foundation; either version 2 of the
8 : : * License, or (at your option) any later version.
9 : : *
10 : : * This program is distributed in the hope that it will be useful,
11 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 : : * GNU General Public License for more details.
14 : : *
15 : : * You should have received a copy of the GNU General Public License
16 : : * along with this program; if not, write to the Free Software
17 : : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
18 : : * USA
19 : : */
20 : :
21 : : #include <config.h>
22 : :
23 : : #include "api_replacedoc.h"
24 : :
25 : : #include <string>
26 : : #include <map>
27 : :
28 : : using namespace std;
29 : :
30 : : #include <xapian.h>
31 : : #include "testsuite.h"
32 : : #include "testutils.h"
33 : :
34 : : #include "apitest.h"
35 : : #include "dbcheck.h"
36 : :
37 : : // Test that positionlists are updated correctly.
38 : 10 : DEFINE_TESTCASE(poslistupdate1, positional && writable) {
39 : 10 : Xapian::WritableDatabase db = get_writable_database();
40 : :
41 : 10 : Xapian::Document doc;
42 : 10 : doc.add_posting("pos", 2);
43 : 10 : doc.add_posting("pos", 3);
44 : 10 : db.add_document(doc);
45 : 10 : db.flush();
46 : :
47 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(pos, wdf=2, pos=[2, 3])");
48 : :
49 : 10 : doc = db.get_document(1);
50 : 10 : doc.add_term("pos2");
51 : 10 : db.replace_document(1, doc);
52 : 10 : db.flush();
53 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1),
54 : : "Term(pos, wdf=2, pos=[2, 3]), "
55 : : "Term(pos2, wdf=1)");
56 : :
57 : 10 : doc = db.get_document(1);
58 : 10 : doc.add_posting("pos3", 1);
59 : 10 : doc.add_posting("pos3", 5);
60 : 10 : db.replace_document(1, doc);
61 : 10 : db.flush();
62 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1),
63 : : "Term(pos, wdf=2, pos=[2, 3]), "
64 : : "Term(pos2, wdf=1), "
65 : : "Term(pos3, wdf=2, pos=[1, 5])");
66 : :
67 : 10 : doc = db.get_document(1);
68 : 10 : doc.remove_term("pos");
69 : 10 : db.replace_document(1, doc);
70 : 10 : db.flush();
71 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1),
72 : : "Term(pos2, wdf=1), "
73 : : "Term(pos3, wdf=2, pos=[1, 5])");
74 : :
75 : : // Regression test: the old positionlist fragment used to be left lying
76 : : // around here.
77 : 10 : Xapian::PositionIterator posit(db.positionlist_begin(1, "pos"));
78 [ - + ][ # # ]: 10 : TEST(posit == db.positionlist_end(1, "pos"));
79 : :
80 : 10 : doc = db.get_document(1);
81 : 10 : doc.remove_term("pos3");
82 : 10 : db.replace_document(1, doc);
83 : 10 : db.flush();
84 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1),
85 : : "Term(pos2, wdf=1)");
86 : :
87 : : // Regression test: the old positionlist fragment used to be left lying
88 : : // around here.
89 : 10 : Xapian::PositionIterator posit2(db.positionlist_begin(1, "pos3"));
90 [ - + ][ # # ]: 10 : TEST(posit2 == db.positionlist_end(1, "pos3"));
91 : :
92 : 10 : doc = db.get_document(1);
93 : 10 : doc.add_term("pos");
94 : 10 : db.replace_document(1, doc);
95 : 10 : db.flush();
96 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1),
97 : : "Term(pos, wdf=1), "
98 : : "Term(pos2, wdf=1)");
99 : :
100 : 10 : return true;
101 : : }
102 : :
103 : : static Xapian::Document
104 : 80 : basic_doc() {
105 : 80 : Xapian::Document doc;
106 : 80 : doc.add_term("z0", 0);
107 : 80 : doc.add_term("z1", 1);
108 : 0 : return doc;
109 : : }
110 : :
111 : : static string
112 : 10 : basic_docterms() {
113 : 10 : return ", Term(z0, wdf=0), Term(z1, wdf=1)";
114 : : }
115 : :
116 : : /** Check that changing the wdf of a term in a document works.
117 : : */
118 : 10 : DEFINE_TESTCASE(modtermwdf1, writable) {
119 : 10 : Xapian::WritableDatabase db(get_writable_database());
120 : :
121 : 10 : string bdt(basic_docterms());
122 : :
123 : : // Add a simple document.
124 : 10 : Xapian::Document doc1(basic_doc());
125 : 10 : doc1.add_term("takeaway", 1);
126 : 10 : db.add_document(doc1);
127 : :
128 : 10 : dbcheck(db, 1, 1);
129 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaway, wdf=1)" + bdt);
130 : :
131 : : // Modify the wdf of an existing document, checking stats before flush.
132 : 10 : Xapian::Document doc2(basic_doc());
133 : 10 : doc2.add_term("takeaway", 2);
134 : 10 : db.replace_document(1, doc2);
135 : 10 : dbcheck(db, 1, 1);
136 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaway, wdf=2)" + bdt);
137 : :
138 : : // Remove a term, and then put it back again.
139 : 10 : Xapian::Document doc0(basic_doc());
140 : 10 : db.replace_document(1, doc0);
141 : 10 : dbcheck(db, 1, 1);
142 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), bdt.substr(2));
143 : 10 : db.replace_document(1, doc1);
144 : 10 : dbcheck(db, 1, 1);
145 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaway, wdf=1)" + bdt);
146 : :
147 : : // Remove a term, flush, then put it back, remove it, and put it back.
148 : : // This is to test the handling of items in the change cache.
149 : 10 : db.replace_document(1, doc0);
150 : 10 : db.flush();
151 : 10 : db.replace_document(1, doc2);
152 : 10 : db.replace_document(1, doc0);
153 : 10 : db.replace_document(1, doc2);
154 : 10 : db.flush();
155 : 10 : dbcheck(db, 1, 1);
156 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaway, wdf=2)" + bdt);
157 : :
158 : : // Remove a term, and then put it back again without checking stats.
159 : 10 : db.replace_document(1, doc0);
160 : 10 : db.replace_document(1, doc2);
161 : 10 : dbcheck(db, 1, 1);
162 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaway, wdf=2)" + bdt);
163 : :
164 : : // Modify a term, and then put it back again without checking stats.
165 : 10 : db.replace_document(1, doc1);
166 : 10 : db.replace_document(1, doc2);
167 : 10 : dbcheck(db, 1, 1);
168 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaway, wdf=2)" + bdt);
169 : :
170 : : // Modify the wdf of an existing document, checking stats after flush.
171 : 10 : Xapian::Document doc3(basic_doc());
172 : 10 : doc3.add_term("takeaway", 3);
173 : 10 : db.replace_document(1, doc3);
174 : 10 : db.flush();
175 : 10 : dbcheck(db, 1, 1);
176 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaway, wdf=3)" + bdt);
177 : :
178 : : // Change a document, without changing its length.
179 : 10 : Xapian::Document doc3_diff(basic_doc());
180 : 10 : doc3_diff.add_term("takeaways", 3);
181 : 10 : db.replace_document(1, doc3_diff);
182 : 10 : db.flush();
183 : 10 : dbcheck(db, 1, 1);
184 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaways, wdf=3)" + bdt);
185 : :
186 : : // Put it back.
187 : 10 : db.replace_document(1, doc3);
188 : 10 : dbcheck(db, 1, 1);
189 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaway, wdf=3)" + bdt);
190 : :
191 : : // Modify a document taken from the database.
192 : 10 : Xapian::Document doc4(db.get_document(1));
193 : 10 : Xapian::Document doc3a(db.get_document(1)); // need this one later
194 : 10 : doc3a.termlist_count(); // Pull the document termlist into memory.
195 : 10 : doc4.add_term("takeaway", 1);
196 : 10 : db.replace_document(1, doc4);
197 : 10 : dbcheck(db, 1, 1);
198 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaway, wdf=4)" + bdt);
199 : :
200 : : // Add a document which was previously added and then modified.
201 : 10 : doc1.add_term("takeaway", 1);
202 : 10 : db.replace_document(1, doc1);
203 : 10 : dbcheck(db, 1, 1);
204 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaway, wdf=2)" + bdt);
205 : :
206 : : // Add back a document which was taken from the database, but never modified.
207 : 10 : db.replace_document(1, doc3a);
208 : 10 : dbcheck(db, 1, 1);
209 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaway, wdf=3)" + bdt);
210 : :
211 : : // Add a position to the document.
212 : 10 : Xapian::Document doc5(db.get_document(1));
213 : 10 : doc5.add_posting("takeaway", 1, 2);
214 : 10 : db.replace_document(1, doc5);
215 : 10 : dbcheck(db, 1, 1);
216 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaway, wdf=5, pos=[1])" + bdt);
217 : :
218 : : // Add a position without changing the wdf.
219 : 10 : Xapian::Document doc5b(db.get_document(1));
220 : 10 : doc5b.add_posting("takeaway", 2, 0);
221 : 10 : db.replace_document(1, doc5b);
222 : 10 : dbcheck(db, 1, 1);
223 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaway, wdf=5, pos=[1, 2])" + bdt);
224 : :
225 : : // Delete a position without changing the wdf.
226 : 10 : Xapian::Document doc5c(basic_doc());
227 : 10 : doc5c.add_posting("takeaway", 2, 5);
228 : 10 : db.replace_document(1, doc5c);
229 : 10 : dbcheck(db, 1, 1);
230 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaway, wdf=5, pos=[2])" + bdt);
231 : :
232 : : // Delete the other position without changing the wdf.
233 : 10 : Xapian::Document doc5d(basic_doc());
234 : 10 : doc5d.add_term("takeaway", 5);
235 : 10 : db.replace_document(1, doc5d);
236 : 10 : dbcheck(db, 1, 1);
237 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaway, wdf=5)" + bdt);
238 : :
239 : : // Reduce the wdf to 0, but don't delete the term.
240 : 10 : Xapian::Document doc0freq(basic_doc());
241 : 10 : doc0freq.add_term("takeaway", 0);
242 : 10 : db.replace_document(1, doc0freq);
243 : 10 : dbcheck(db, 1, 1);
244 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), "Term(takeaway, wdf=0)" + bdt);
245 : :
246 : : // Reduce the wdf to 0, and delete the term.
247 : 10 : db.replace_document(1, doc0);
248 : 10 : dbcheck(db, 1, 1);
249 [ - + ][ # # ]: 10 : TEST_EQUAL(docterms_to_string(db, 1), bdt.substr(2));
250 : :
251 : : // Delete the document.
252 : 10 : db.delete_document(1);
253 : 10 : dbcheck(db, 0, 1);
254 [ + - ][ - + ]: 20 : TEST_EXCEPTION(Xapian::DocNotFoundError, docterms_to_string(db, 1));
[ # # ][ - + ]
255 [ - + ][ # # ]: 10 : TEST_EQUAL(postlist_to_string(db, "takeaway"), "");
256 [ + - ][ - + ]: 20 : TEST_EXCEPTION(Xapian::DocNotFoundError, docstats_to_string(db, 1));
[ # # ][ - + ]
257 [ - + ][ # # ]: 10 : TEST_EQUAL(termstats_to_string(db, "takeaway"), "tf=0,cf=0");
258 [ - + ][ # # ]: 10 : TEST_EQUAL(dbstats_to_string(db), "dc=0,al=0,ld=1");
259 : :
260 : 10 : return true;
261 : : }
|