Changeset 76d73d55aa0ba896da711c5ed3d0e2b3e236ef3e

Show
Ignore:
Timestamp:
04/29/08 21:55:34 (8 months ago)
Author:
David Balmain <dbalmain@…>
Parents:
8d89448795e517f0f1afd9bb633dc677fde09712
Children:
509f049ac9cf69528db8cc623f391741200e8499, 4d029545b40f84527ced49dc4058d41efd235873
git-committer:
David Balmain <dbalmain@gmail.com> / 2008-04-29T21:55:34Z+1000
Message:

Full gcov test coverage for term_vector.c

Was actually able to delete a lot of code that wasn't being used anymore; a
hang over from when term-vectors used to be stored seperately from documents.

Location:
c
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • c/include/index.h

    r0c11a5 r76d73d  
    548548 ****************************************************************************/ 
    549549 
     550#define FRT_TV_FIELD_INIT_CAPA 8 
    550551typedef struct FrtTermVector 
    551552{ 
     
    561562extern int frt_tv_get_tv_term_index(FrtTermVector *tv, const char *term); 
    562563extern FrtTVTerm *frt_tv_get_tv_term(FrtTermVector *tv, const char *term); 
    563  
    564 /**************************************************************************** 
    565  * 
    566  * FrtTermVectorsWriter 
    567  * 
    568  ****************************************************************************/ 
    569  
    570 #define FRT_TV_FIELD_INIT_CAPA 8 
    571  
    572 typedef struct FrtTermVectorsWriter 
    573 { 
    574     FrtOutStream *tvx_out; 
    575     FrtOutStream *tvd_out; 
    576     FrtFieldInfos *fis; 
    577     FrtTVField *fields; 
    578     off_t tvd_ptr; 
    579 } FrtTermVectorsWriter; 
    580  
    581 extern FrtTermVectorsWriter *frt_tvw_open(FrtStore *store, 
    582                                    const char *segment, 
    583                                    FrtFieldInfos *fis); 
    584 extern void frt_tvw_open_doc(FrtTermVectorsWriter *tvw); 
    585 extern void frt_tvw_close_doc(FrtTermVectorsWriter *tvw); 
    586 extern void frt_tvw_add_postings(FrtTermVectorsWriter *tvw, 
    587                              int field_num, 
    588                              FrtPostingList **plists, 
    589                              int posting_count, 
    590                              FrtOffset *offsets, 
    591                              int offset_count); 
    592 extern void frt_tvw_close(FrtTermVectorsWriter *tvw); 
    593  
    594 /**************************************************************************** 
    595  * 
    596  * FrtTermVectorsReader 
    597  * 
    598  ****************************************************************************/ 
    599  
    600 typedef struct FrtTermVectorsReader 
    601 { 
    602   int size; 
    603   FrtInStream *tvx_in; 
    604   FrtInStream *tvd_in; 
    605   FrtFieldInfos *fis; 
    606 } FrtTermVectorsReader; 
    607  
    608 extern FrtTermVectorsReader *frt_tvr_open(FrtStore *store, 
    609                                    const char *segment, 
    610                                    FrtFieldInfos *fis); 
    611 extern FrtTermVectorsReader *frt_tvr_clone(FrtTermVectorsReader *orig); 
    612 extern void frt_tvr_close(FrtTermVectorsReader *tvr); 
    613 extern FrtHash *frt_tvr_get_tv(FrtTermVectorsReader *tvr, int doc_num); 
    614 extern FrtTermVector *frt_tvr_get_field_tv(FrtTermVectorsReader *tvr, 
    615                                     int doc_num, 
    616                                     int field_num); 
    617564 
    618565/**************************************************************************** 
     
    883830    FrtSegmentInfo *si; 
    884831    FrtFieldInfos *fis; 
    885     FrtTermVectorsWriter *tvw; 
    886832    FrtFieldsWriter *fw; 
    887833    FrtMemoryPool *mp; 
  • c/include/internal.h

    r7b6066 r76d73d  
    315315#define TermVector              FrtTermVector 
    316316#define TermVectorValue         FrtTermVectorValue 
    317 #define TermVectorsReader       FrtTermVectorsReader 
    318 #define TermVectorsWriter       FrtTermVectorsWriter 
    319317#define TermWriter              FrtTermWriter 
    320318#define Token                   FrtToken 
     
    947945#define tv_get_tv_term                          frt_tv_get_tv_term 
    948946#define tv_get_tv_term_index                    frt_tv_get_tv_term_index 
    949 #define tvr_clone                               frt_tvr_clone 
    950 #define tvr_close                               frt_tvr_close 
    951 #define tvr_get_field_tv                        frt_tvr_get_field_tv 
    952 #define tvr_get_tv                              frt_tvr_get_tv 
    953 #define tvr_open                                frt_tvr_open 
    954 #define tvw_add_postings                        frt_tvw_add_postings 
    955 #define tvw_close                               frt_tvw_close 
    956 #define tvw_close_doc                           frt_tvw_close_doc 
    957 #define tvw_open                                frt_tvw_open 
    958 #define tvw_open_doc                            frt_tvw_open_doc 
    959947#define u16                                     frt_u16 
    960948#define u32                                     frt_u32 
  • c/include/search.h

    r8f4fd0 r76d73d  
    212212struct FrtQuery 
    213213{ 
    214     int           ref_cnt; 
    215     float         boost; 
    216     FrtWeight        *weight; 
    217     FrtQuery        *(*rewrite)(FrtQuery *self, FrtIndexReader *ir); 
    218     void          (*extract_terms)(FrtQuery *self, FrtHashSet *terms); 
    219     FrtSimilarity   *(*get_similarity)(FrtQuery *self, FrtSearcher *searcher); 
    220     char         *(*to_s)(FrtQuery *self, FrtSymbol field); 
    221     unsigned long (*hash)(FrtQuery *self); 
    222     int           (*eq)(FrtQuery *self, FrtQuery *o); 
    223     void          (*destroy_i)(FrtQuery *self); 
    224     FrtWeight       *(*create_weight_i)(FrtQuery *self, FrtSearcher *searcher); 
    225     FrtMatchVector  *(*get_matchv_i)(FrtQuery *self, FrtMatchVector *mv, FrtTermVector *tv); 
    226     FrtQueryType type; 
     214    int             ref_cnt; 
     215    float           boost; 
     216    FrtWeight      *weight; 
     217    FrtQuery       *(*rewrite)(FrtQuery *self, FrtIndexReader *ir); 
     218    void            (*extract_terms)(FrtQuery *self, FrtHashSet *terms); 
     219    FrtSimilarity  *(*get_similarity)(FrtQuery *self, FrtSearcher *searcher); 
     220    char           *(*to_s)(FrtQuery *self, FrtSymbol field); 
     221    unsigned long   (*hash)(FrtQuery *self); 
     222    int             (*eq)(FrtQuery *self, FrtQuery *o); 
     223    void            (*destroy_i)(FrtQuery *self); 
     224    FrtWeight      *(*create_weight_i)(FrtQuery *self, FrtSearcher *searcher); 
     225    FrtMatchVector *(*get_matchv_i)(FrtQuery *self, FrtMatchVector *mv, FrtTermVector *tv); 
     226    FrtQueryType    type; 
    227227}; 
    228228 
  • c/src/index.c

    r2ac444 r76d73d  
    59415941            } 
    59425942            doc += base;          /* convert to merged space */ 
    5943  
    5944 #ifdef DEBUG 
    5945             if (doc && doc <= last_doc) { 
    5946                 RAISE(STATE_ERROR, "Docs not ordered, %d < %d", doc, last_doc); 
    5947             } 
    5948 #endif 
     5943            assert(doc == 0 || doc > last_doc); 
     5944 
    59495945            df++; 
    5950  
    59515946            if (0 == (df % skip_interval)) { 
    59525947                skip_buf_add(skip_buf, last_doc); 
  • c/src/term_vectors.c

    r950230 r76d73d  
    3333    char *mid_term; 
    3434 
    35     while (hi >= lo) { 
     35    while (hi > lo) { 
    3636        mid = (lo + hi) >> 1; 
    3737        mid_term = tv->terms[mid].text; 
     
    5050        return hi; 
    5151    } 
    52     else { 
    53         return -1; 
    54     } 
    55     return hi; 
     52    return -1; 
    5653} 
    5754 
     
    6663    } 
    6764} 
    68  
    69 /**************************************************************************** 
    70  * 
    71  * TermVectorsReader 
    72  * 
    73  ****************************************************************************/ 
    74  
    75 TermVectorsReader *tvr_open(Store *store, 
    76                             const char *segment, 
    77                             FieldInfos *fis) 
    78 { 
    79     TermVectorsReader *tvr = ALLOC(TermVectorsReader); 
    80     char file_name[SEGMENT_NAME_MAX_LENGTH]; 
    81  
    82     tvr->fis = fis; 
    83     sprintf(file_name, "%s.tvx", segment); 
    84     tvr->tvx_in = store->open_input(store, file_name); 
    85     tvr->size = is_length(tvr->tvx_in) / 12; 
    86  
    87     sprintf(file_name, "%s.tvd", segment); 
    88     tvr->tvd_in = store->open_input(store, file_name); 
    89     return tvr; 
    90 } 
    91  
    92 TermVectorsReader *tvr_clone(TermVectorsReader *orig) 
    93 { 
    94     TermVectorsReader *tvr = ALLOC(TermVectorsReader); 
    95  
    96     memcpy(tvr, orig, sizeof(TermVectorsReader)); 
    97     tvr->tvx_in = is_clone(orig->tvx_in); 
    98     tvr->tvd_in = is_clone(orig->tvd_in); 
    99      
    100     return tvr; 
    101 } 
    102  
    103 void tvr_close(TermVectorsReader *tvr) 
    104 { 
    105     is_close(tvr->tvx_in); 
    106     is_close(tvr->tvd_in); 
    107     free(tvr); 
    108 } 
    109  
    110 static TermVector *tvr_read_term_vector(TermVectorsReader *tvr, int field_num) 
    111 { 
    112     TermVector *tv = ALLOC_AND_ZERO(TermVector); 
    113     InStream *tvd_in = tvr->tvd_in; 
    114     FieldInfo *fi = tvr->fis->fields[field_num]; 
    115     const int num_terms = is_read_vint(tvd_in); 
    116      
    117     tv->field_num = field_num; 
    118     tv->field = fi->name; 
    119  
    120     if (num_terms > 0) { 
    121         int i, j, delta_start, delta_len, total_len, freq; 
    122         int store_positions = fi_store_positions(fi); 
    123         int store_offsets = fi_store_offsets(fi); 
    124         uchar buffer[MAX_WORD_SIZE]; 
    125         TVTerm *term; 
    126  
    127         tv->term_cnt = num_terms; 
    128         tv->terms = ALLOC_AND_ZERO_N(TVTerm, num_terms); 
    129  
    130         for (i = 0; i < num_terms; i++) { 
    131             term = &(tv->terms[i]); 
    132             /* read delta encoded term */ 
    133             delta_start = is_read_vint(tvd_in); 
    134             delta_len = is_read_vint(tvd_in); 
    135             total_len = delta_start + delta_len; 
    136             is_read_bytes(tvd_in, buffer + delta_start, delta_len); 
    137             buffer[total_len++] = '\0'; 
    138             term->text = (char *)memcpy(ALLOC_N(char, total_len), buffer, 
    139                                         total_len); 
    140  
    141             /* read freq */ 
    142             freq = term->freq = is_read_vint(tvd_in); 
    143  
    144             /* read positions if necessary */ 
    145             if (store_positions) { 
    146                 int *positions = term->positions = ALLOC_N(int, freq); 
    147                 int pos = 0; 
    148                 for (j = 0; j < freq; j++) { 
    149                     positions[j] = pos += is_read_vint(tvd_in); 
    150                 } 
    151             } 
    152  
    153             /* read offsets if necessary */ 
    154         } 
    155         if (store_offsets) { 
    156             int num_positions = tv->offset_cnt = is_read_vint(tvd_in); 
    157             Offset *offsets = tv->offsets = ALLOC_N(Offset, num_positions); 
    158             int offset = 0; 
    159             for (i = 0; i < num_positions; i++) { 
    160                 offsets[i].start = offset += is_read_vint(tvd_in); 
    161                 offsets[i].end = offset += is_read_vint(tvd_in); 
    162             } 
    163         } 
    164     } 
    165     return tv; 
    166 } 
    167  
    168 Hash *tvr_get_tv(TermVectorsReader *tvr, int doc_num) 
    169 { 
    170     Hash *term_vectors = h_new_str((free_ft)NULL, (free_ft)&tv_destroy); 
    171     int i; 
    172     InStream *tvx_in = tvr->tvx_in; 
    173     InStream *tvd_in = tvr->tvd_in; 
    174     off_t data_ptr, field_index_ptr; 
    175     int field_cnt; 
    176     int *field_nums; 
    177  
    178     if (doc_num >= 0 && doc_num < tvr->size) { 
    179         is_seek(tvx_in, 12 * doc_num); 
    180  
    181         data_ptr = (off_t)is_read_u64(tvx_in); 
    182         field_index_ptr = data_ptr + (off_t)is_read_u32(tvx_in); 
    183  
    184         /* scan fields to get position of field_num's term vector */ 
    185         is_seek(tvd_in, field_index_ptr); 
    186  
    187         field_cnt = is_read_vint(tvd_in); 
    188         field_nums = ALLOC_N(int, field_cnt); 
    189  
    190         for (i = 0; i < field_cnt; i++) { 
    191             field_nums[i] = is_read_vint(tvd_in); 
    192             is_read_vint(tvd_in); /* skip space, we don't need it */ 
    193         } 
    194         is_seek(tvd_in, data_ptr); 
    195  
    196         for (i = 0; i < field_cnt; i++) { 
    197             TermVector *tv = tvr_read_term_vector(tvr, field_nums[i]); 
    198             h_set(term_vectors, tv->field, tv); 
    199         } 
    200         free(field_nums); 
    201     } 
    202     return term_vectors; 
    203 } 
    204  
    205 TermVector *tvr_get_field_tv(TermVectorsReader *tvr, 
    206                              int doc_num, 
    207                              int field_num) 
    208 { 
    209     int i; 
    210     InStream *tvx_in = tvr->tvx_in; 
    211     InStream *tvd_in = tvr->tvd_in; 
    212     off_t data_ptr, field_index_ptr; 
    213     int field_cnt; 
    214     int offset = 0; 
    215     TermVector *tv = NULL; 
    216  
    217     if (doc_num >= 0 && doc_num < tvr->size) { 
    218         is_seek(tvx_in, 12 * doc_num); 
    219  
    220         data_ptr = (off_t)is_read_u64(tvx_in); 
    221         field_index_ptr = data_ptr + (off_t)is_read_u32(tvx_in); 
    222  
    223         /* scan fields to get position of field_num's term vector */ 
    224         is_seek(tvd_in, field_index_ptr); 
    225  
    226         field_cnt = is_read_vint(tvd_in); 
    227         for (i = 0; i < field_cnt; i++) { 
    228             if ((int)is_read_vint(tvd_in) == field_num) { 
    229                 break; 
    230             } 
    231             offset += is_read_vint(tvd_in); /* space taken by field */ 
    232         } 
    233         if (i < field_cnt) { 
    234             /* field was found */ 
    235             is_seek(tvd_in, data_ptr + offset); 
    236             tv = tvr_read_term_vector(tvr, field_num); 
    237         } 
    238     } 
    239     return tv; 
    240 } 
    241  
    242 /**************************************************************************** 
    243  * 
    244  * TermVectorsWriter 
    245  * 
    246  ****************************************************************************/ 
    247  
    248 TermVectorsWriter *tvw_open(Store *store, const char *segment, FieldInfos *fis) 
    249 { 
    250     TermVectorsWriter *tvw = ALLOC(TermVectorsWriter); 
    251     char file_name[SEGMENT_NAME_MAX_LENGTH]; 
    252     tvw->fis = fis; 
    253     tvw->fields = ary_new_type_capa(TVField, TV_FIELD_INIT_CAPA); 
    254  
    255     snprintf(file_name, SEGMENT_NAME_MAX_LENGTH, "%s.tvx", segment); 
    256     tvw->tvx_out = store->new_output(store, file_name); 
    257  
    258     snprintf(file_name, SEGMENT_NAME_MAX_LENGTH, "%s.tvd", segment); 
    259     tvw->tvd_out = store->new_output(store, file_name); 
    260  
    261     return tvw; 
    262 } 
    263  
    264 void tvw_close(TermVectorsWriter *tvw) 
    265 { 
    266     os_close(tvw->tvx_out); 
    267     os_close(tvw->tvd_out); 
    268     ary_free(tvw->fields); 
    269     free(tvw); 
    270 } 
    271  
    272 void tvw_open_doc(TermVectorsWriter *tvw) 
    273 { 
    274     ary_size(tvw->fields) = 0; 
    275     tvw->tvd_ptr = os_pos(tvw->tvd_out); 
    276     os_write_u64(tvw->tvx_out, tvw->tvd_ptr); 
    277 } 
    278  
    279 void tvw_close_doc(TermVectorsWriter *tvw) 
    280 { 
    281     int i; 
    282     OutStream *tvd_out = tvw->tvd_out; 
    283     os_write_u32(tvw->tvx_out, (u32)(os_pos(tvw->tvd_out) - tvw->tvd_ptr)); 
    284     os_write_vint(tvd_out, ary_size(tvw->fields)); 
    285     for (i = 0; i < ary_size(tvw->fields); i++) { 
    286         os_write_vint(tvd_out, tvw->fields[i].field_num); 
    287         os_write_vint(tvd_out, tvw->fields[i].size); 
    288     } 
    289 } 
    290  
    291 void tvw_add_postings(TermVectorsWriter *tvw, 
    292                       int field_num, 
    293                       PostingList **plists, 
    294                       int posting_count, 
    295                       Offset *offsets, 
    296                       int offset_count) 
    297 { 
    298     int i, delta_start, delta_length; 
    299     const char *last_term = EMPTY_STRING; 
    300     off_t tvd_start_pos = os_pos(tvw->tvd_out); 
    301     OutStream *tvd_out = tvw->tvd_out; 
    302     PostingList *plist; 
    303     Posting *posting; 
    304     Occurence *occ; 
    305     FieldInfo *fi = tvw->fis->fields[field_num]; 
    306     int store_positions = fi_store_positions(fi); 
    307  
    308     ary_grow(tvw->fields); 
    309     ary_last(tvw->fields).field_num = field_num; 
    310  
    311     os_write_vint(tvd_out, posting_count); 
    312     for (i = 0; i < posting_count; i++) { 
    313         plist = plists[i]; 
    314         posting = plist->last; 
    315         delta_start = hlp_string_diff(last_term, plist->term); 
    316         delta_length = plist->term_len - delta_start; 
    317  
    318         os_write_vint(tvd_out, delta_start);  /* write shared prefix length */ 
    319         os_write_vint(tvd_out, delta_length); /* write delta length */ 
    320         /* write delta chars */ 
    321         os_write_bytes(tvd_out, 
    322                        (uchar *)(plist->term + delta_start), 
    323                        delta_length); 
    324         os_write_vint(tvd_out, posting->freq); 
    325         last_term = plist->term; 
    326  
    327         if (store_positions) { 
    328             /* use delta encoding for positions */ 
    329             int last_pos = 0; 
    330             for (occ = posting->first_occ; occ; occ = occ->next) { 
    331                 os_write_vint(tvd_out, occ->pos - last_pos); 
    332                 last_pos = occ->pos; 
    333             } 
    334         } 
    335  
    336     } 
    337  
    338     if (fi_store_offsets(fi)) { 
    339         /* use delta encoding for offsets */ 
    340         int last_end = 0; 
    341         os_write_vint(tvd_out, offset_count);  /* write shared prefix length */ 
    342         for (i = 0; i < offset_count; i++) { 
    343             int start = offsets[i].start; 
    344             int end = offsets[i].end; 
    345             os_write_vint(tvd_out, start - last_end); 
    346             os_write_vint(tvd_out, end - start); 
    347             last_end = end; 
    348         } 
    349     } 
    350  
    351     ary_last(tvw->fields).size = os_pos(tvd_out) - tvd_start_pos; 
    352 } 
    353  
    354