Annotation of embedaddon/sqlite3/test/fts3c.test, revision 1.1.1.1

1.1       misho       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>