LCOV - code coverage report
Current view: top level - home/olly/git/atia-xapian/xapian-core/tests - api_replacedoc.cc (source / functions) Hit Total Coverage
Test: Test Coverage for xapian-core r Lines: 146 147 99.3 %
Date: 2011-08-21 Functions: 4 4 100.0 %
Branches: 36 136 26.5 %

           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                 :            : }

Generated by: LCOV version 1.8