File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / test / fts3c.test
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:16 2012 UTC (12 years, 4 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    1: # 2008 June 26
    2: #
    3: # The author disclaims copyright to this source code.  In place of
    4: # a legal notice, here is a blessing:
    5: #
    6: #    May you do good and not evil.
    7: #    May you find forgiveness for yourself and forgive others.
    8: #    May you share freely, never taking more than you give.
    9: #
   10: #*************************************************************************
   11: # This file exercises some new testing functions in the FTS3 module,
   12: # and then uses them to do some basic tests that FTS3 is internally
   13: # working as expected.
   14: #
   15: 
   16: set testdir [file dirname $argv0]
   17: source $testdir/tester.tcl
   18: source $testdir/fts3_common.tcl
   19: 
   20: # If SQLITE_ENABLE_FTS3 is not defined, omit this file.
   21: ifcapable !fts3 {
   22:   finish_test
   23:   return
   24: }
   25: 
   26: #*************************************************************************
   27: # Utility function to check for the expected terms in the segment
   28: # level/index.  _all version does same but for entire index.
   29: proc check_terms {test level index terms} {
   30:   set where "level = $level AND idx = $index"
   31:   do_test $test.terms [list fts3_terms t1 $where] $terms
   32: }
   33: proc check_terms_all {test terms} {
   34:   do_test $test.terms [list fts3_terms t1 1] $terms
   35: }
   36: 
   37: # Utility function to check for the expected doclist for the term in
   38: # segment level/index.  _all version does same for entire index.
   39: proc check_doclist {test level index term doclist} {
   40:   set where "level = $level AND idx = $index"
   41:   do_test $test [list fts3_doclist t1 $term $where] $doclist
   42: }
   43: proc check_doclist_all {test term doclist} {
   44:   do_test $test [list fts3_doclist t1 $term 1] $doclist
   45: }
   46: 
   47: #*************************************************************************
   48: # Test the segments resulting from straight-forward inserts.
   49: db eval {
   50:   DROP TABLE IF EXISTS t1;
   51:   CREATE VIRTUAL TABLE t1 USING fts3(c);
   52:   INSERT INTO t1 (docid, c) VALUES (1, 'This is a test');
   53:   INSERT INTO t1 (docid, c) VALUES (2, 'That was a test');
   54:   INSERT INTO t1 (docid, c) VALUES (3, 'This is a test');
   55: }
   56: 
   57: # Check for expected segments and expected matches.
   58: do_test fts3c-1.0.segments {
   59:   execsql {
   60:     SELECT level, idx FROM t1_segdir ORDER BY level, idx;
   61:   }
   62: } {0 0 0 1 0 2}
   63: do_test fts3c-1.0.matches {
   64:   execsql {
   65:     SELECT OFFSETS(t1) FROM t1
   66:      WHERE t1 MATCH 'this OR that OR was OR a OR is OR test' ORDER BY docid;
   67:   }
   68: } [list {0 0 0 4 0 4 5 2 0 3 8 1 0 5 10 4} \
   69:         {0 1 0 4 0 2 5 3 0 3 9 1 0 5 11 4} \
   70:         {0 0 0 4 0 4 5 2 0 3 8 1 0 5 10 4}]
   71: 
   72: # Check the specifics of the segments constructed.
   73: # Logical view of entire index.
   74: check_terms_all   fts3c-1.0.1   {a is test that this was}
   75: check_doclist_all fts3c-1.0.1.1 a {[1 0[2]] [2 0[2]] [3 0[2]]}
   76: check_doclist_all fts3c-1.0.1.2 is {[1 0[1]] [3 0[1]]}
   77: check_doclist_all fts3c-1.0.1.3 test {[1 0[3]] [2 0[3]] [3 0[3]]}
   78: check_doclist_all fts3c-1.0.1.4 that {[2 0[0]]}
   79: check_doclist_all fts3c-1.0.1.5 this {[1 0[0]] [3 0[0]]}
   80: check_doclist_all fts3c-1.0.1.6 was {[2 0[1]]}
   81: 
   82: # Segment 0,0
   83: check_terms   fts3c-1.0.2   0 0 {a is test this}
   84: check_doclist fts3c-1.0.2.1 0 0 a {[1 0[2]]}
   85: check_doclist fts3c-1.0.2.2 0 0 is {[1 0[1]]}
   86: check_doclist fts3c-1.0.2.3 0 0 test {[1 0[3]]}
   87: check_doclist fts3c-1.0.2.4 0 0 this {[1 0[0]]}
   88: 
   89: # Segment 0,1
   90: check_terms   fts3c-1.0.3   0 1 {a test that was}
   91: check_doclist fts3c-1.0.3.1 0 1 a {[2 0[2]]}
   92: check_doclist fts3c-1.0.3.2 0 1 test {[2 0[3]]}
   93: check_doclist fts3c-1.0.3.3 0 1 that {[2 0[0]]}
   94: check_doclist fts3c-1.0.3.4 0 1 was {[2 0[1]]}
   95: 
   96: # Segment 0,2
   97: check_terms   fts3c-1.0.4   0 2 {a is test this}
   98: check_doclist fts3c-1.0.4.1 0 2 a {[3 0[2]]}
   99: check_doclist fts3c-1.0.4.2 0 2 is {[3 0[1]]}
  100: check_doclist fts3c-1.0.4.3 0 2 test {[3 0[3]]}
  101: check_doclist fts3c-1.0.4.4 0 2 this {[3 0[0]]}
  102: 
  103: #*************************************************************************
  104: # Test the segments resulting from inserts followed by a delete.
  105: db eval {
  106:   DROP TABLE IF EXISTS t1;
  107:   CREATE VIRTUAL TABLE t1 USING fts3(c);
  108:   INSERT INTO t1 (docid, c) VALUES (1, 'This is a test');
  109:   INSERT INTO t1 (docid, c) VALUES (2, 'That was a test');
  110:   INSERT INTO t1 (docid, c) VALUES (3, 'This is a test');
  111:   DELETE FROM t1 WHERE docid = 1;
  112: }
  113: 
  114: do_test fts3c-1.1.segments {
  115:   execsql {
  116:     SELECT level, idx FROM t1_segdir ORDER BY level, idx;
  117:   }
  118: } {0 0 0 1 0 2 0 3}
  119: do_test fts3c-1.1.matches {
  120:   execsql {
  121:     SELECT OFFSETS(t1) FROM t1
  122:      WHERE t1 MATCH 'this OR that OR was OR a OR is OR test' ORDER BY docid;
  123:   }
  124: } {{0 1 0 4 0 2 5 3 0 3 9 1 0 5 11 4} {0 0 0 4 0 4 5 2 0 3 8 1 0 5 10 4}}
  125: 
  126: check_terms_all fts3c-1.1.1 {a is test that this was}
  127: check_doclist_all fts3c-1.1.1.1 a {[2 0[2]] [3 0[2]]}
  128: check_doclist_all fts3c-1.1.1.2 is {[3 0[1]]}
  129: check_doclist_all fts3c-1.1.1.3 test {[2 0[3]] [3 0[3]]}
  130: check_doclist_all fts3c-1.1.1.4 that {[2 0[0]]}
  131: check_doclist_all fts3c-1.1.1.5 this {[3 0[0]]}
  132: check_doclist_all fts3c-1.1.1.6 was {[2 0[1]]}
  133: 
  134: check_terms fts3c-1.1.2 0 0 {a is test this}
  135: check_doclist fts3c-1.1.2.1 0 0 a {[1 0[2]]}
  136: check_doclist fts3c-1.1.2.2 0 0 is {[1 0[1]]}
  137: check_doclist fts3c-1.1.2.3 0 0 test {[1 0[3]]}
  138: check_doclist fts3c-1.1.2.4 0 0 this {[1 0[0]]}
  139: 
  140: check_terms fts3c-1.1.3 0 1 {a test that was}
  141: check_doclist fts3c-1.1.3.1 0 1 a {[2 0[2]]}
  142: check_doclist fts3c-1.1.3.2 0 1 test {[2 0[3]]}
  143: check_doclist fts3c-1.1.3.3 0 1 that {[2 0[0]]}
  144: check_doclist fts3c-1.1.3.4 0 1 was {[2 0[1]]}
  145: 
  146: check_terms fts3c-1.1.4 0 2 {a is test this}
  147: check_doclist fts3c-1.1.4.1 0 2 a {[3 0[2]]}
  148: check_doclist fts3c-1.1.4.2 0 2 is {[3 0[1]]}
  149: check_doclist fts3c-1.1.4.3 0 2 test {[3 0[3]]}
  150: check_doclist fts3c-1.1.4.4 0 2 this {[3 0[0]]}
  151: 
  152: check_terms fts3c-1.1.5 0 3 {a is test this}
  153: check_doclist fts3c-1.1.5.1 0 3 a {[1]}
  154: check_doclist fts3c-1.1.5.2 0 3 is {[1]}
  155: check_doclist fts3c-1.1.5.3 0 3 test {[1]}
  156: check_doclist fts3c-1.1.5.4 0 3 this {[1]}
  157: 
  158: #*************************************************************************
  159: # Test results when all references to certain tokens are deleted.
  160: db eval {
  161:   DROP TABLE IF EXISTS t1;
  162:   CREATE VIRTUAL TABLE t1 USING fts3(c);
  163:   INSERT INTO t1 (docid, c) VALUES (1, 'This is a test');
  164:   INSERT INTO t1 (docid, c) VALUES (2, 'That was a test');
  165:   INSERT INTO t1 (docid, c) VALUES (3, 'This is a test');
  166:   DELETE FROM t1 WHERE docid IN (1,3);
  167: }
  168: 
  169: # Still 4 segments because 0,3 will contain deletes for docid 1 and 3.
  170: do_test fts3c-1.2.segments {
  171:   execsql {
  172:     SELECT level, idx FROM t1_segdir ORDER BY level, idx;
  173:   }
  174: } {0 0 0 1 0 2 0 3}
  175: do_test fts3c-1.2.matches {
  176:   execsql {
  177:     SELECT OFFSETS(t1) FROM t1
  178:      WHERE t1 MATCH 'this OR that OR was OR a OR is OR test' ORDER BY docid;
  179:   }
  180: } {{0 1 0 4 0 2 5 3 0 3 9 1 0 5 11 4}}
  181: 
  182: check_terms_all fts3c-1.2.1 {a is test that this was}
  183: check_doclist_all fts3c-1.2.1.1 a {[2 0[2]]}
  184: check_doclist_all fts3c-1.2.1.2 is {}
  185: check_doclist_all fts3c-1.2.1.3 test {[2 0[3]]}
  186: check_doclist_all fts3c-1.2.1.4 that {[2 0[0]]}
  187: check_doclist_all fts3c-1.2.1.5 this {}
  188: check_doclist_all fts3c-1.2.1.6 was {[2 0[1]]}
  189: 
  190: check_terms fts3c-1.2.2 0 0 {a is test this}
  191: check_doclist fts3c-1.2.2.1 0 0 a {[1 0[2]]}
  192: check_doclist fts3c-1.2.2.2 0 0 is {[1 0[1]]}
  193: check_doclist fts3c-1.2.2.3 0 0 test {[1 0[3]]}
  194: check_doclist fts3c-1.2.2.4 0 0 this {[1 0[0]]}
  195: 
  196: check_terms fts3c-1.2.3 0 1 {a test that was}
  197: check_doclist fts3c-1.2.3.1 0 1 a {[2 0[2]]}
  198: check_doclist fts3c-1.2.3.2 0 1 test {[2 0[3]]}
  199: check_doclist fts3c-1.2.3.3 0 1 that {[2 0[0]]}
  200: check_doclist fts3c-1.2.3.4 0 1 was {[2 0[1]]}
  201: 
  202: check_terms fts3c-1.2.4 0 2 {a is test this}
  203: check_doclist fts3c-1.2.4.1 0 2 a {[3 0[2]]}
  204: check_doclist fts3c-1.2.4.2 0 2 is {[3 0[1]]}
  205: check_doclist fts3c-1.2.4.3 0 2 test {[3 0[3]]}
  206: check_doclist fts3c-1.2.4.4 0 2 this {[3 0[0]]}
  207: 
  208: check_terms fts3c-1.2.5 0 3 {a is test this}
  209: check_doclist fts3c-1.2.5.1 0 3 a {[1] [3]}
  210: check_doclist fts3c-1.2.5.2 0 3 is {[1] [3]}
  211: check_doclist fts3c-1.2.5.3 0 3 test {[1] [3]}
  212: check_doclist fts3c-1.2.5.4 0 3 this {[1] [3]}
  213: 
  214: #*************************************************************************
  215: # Test results when everything is optimized manually.
  216: db eval {
  217:   DROP TABLE IF EXISTS t1;
  218:   CREATE VIRTUAL TABLE t1 USING fts3(c);
  219:   INSERT INTO t1 (docid, c) VALUES (1, 'This is a test');
  220:   INSERT INTO t1 (docid, c) VALUES (2, 'That was a test');
  221:   INSERT INTO t1 (docid, c) VALUES (3, 'This is a test');
  222:   DELETE FROM t1 WHERE docid IN (1,3);
  223:   DROP TABLE IF EXISTS t1old;
  224:   ALTER TABLE t1 RENAME TO t1old;
  225:   CREATE VIRTUAL TABLE t1 USING fts3(c);
  226:   INSERT INTO t1 (docid, c) SELECT docid, c FROM t1old;
  227:   DROP TABLE t1old;
  228: }
  229: 
  230: # Should be a single optimal segment with the same logical results.
  231: do_test fts3c-1.3.segments {
  232:   execsql {
  233:     SELECT level, idx FROM t1_segdir ORDER BY level, idx;
  234:   }
  235: } {0 0}
  236: do_test fts3c-1.3.matches {
  237:   execsql {
  238:     SELECT OFFSETS(t1) FROM t1
  239:      WHERE t1 MATCH 'this OR that OR was OR a OR is OR test' ORDER BY docid;
  240:   }
  241: } {{0 1 0 4 0 2 5 3 0 3 9 1 0 5 11 4}}
  242: 
  243: check_terms_all fts3c-1.3.1 {a test that was}
  244: check_doclist_all fts3c-1.3.1.1 a {[2 0[2]]}
  245: check_doclist_all fts3c-1.3.1.2 test {[2 0[3]]}
  246: check_doclist_all fts3c-1.3.1.3 that {[2 0[0]]}
  247: check_doclist_all fts3c-1.3.1.4 was {[2 0[1]]}
  248: 
  249: check_terms fts3c-1.3.2 0 0 {a test that was}
  250: check_doclist fts3c-1.3.2.1 0 0 a {[2 0[2]]}
  251: check_doclist fts3c-1.3.2.2 0 0 test {[2 0[3]]}
  252: check_doclist fts3c-1.3.2.3 0 0 that {[2 0[0]]}
  253: check_doclist fts3c-1.3.2.4 0 0 was {[2 0[1]]}
  254: 
  255: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>