void test_freqfilepos(TestBatch *batch) { TermInfo* tinfo = TInfo_new(10); TInfo_Set_Post_FilePos(tinfo, 20); TInfo_Set_Skip_FilePos(tinfo, 40); TInfo_Set_Lex_FilePos(tinfo, 50); TermInfo* cloned_tinfo = TInfo_Clone(tinfo); TEST_FALSE(batch, Lucy_TInfo_Equals(tinfo, (lucy_Obj*)cloned_tinfo),"the clone should be a separate C struct"); TEST_INT_EQ(batch, TInfo_Get_Doc_Freq(tinfo), 10, "new sets doc_freq correctly" ); TEST_INT_EQ(batch, TInfo_Get_Doc_Freq(tinfo), 10, "... doc_freq cloned" ); TEST_INT_EQ(batch, TInfo_Get_Post_FilePos(tinfo), 20, "... post_filepos cloned" ); TEST_INT_EQ(batch, TInfo_Get_Skip_FilePos(tinfo), 40, "... skip_filepos cloned" ); TEST_INT_EQ(batch, TInfo_Get_Lex_FilePos(tinfo), 50, "... lex_filepos cloned" ); TInfo_Set_Doc_Freq(tinfo, 5); TEST_INT_EQ(batch, TInfo_Get_Doc_Freq(tinfo), 5, "set/get doc_freq" ); TEST_INT_EQ(batch, TInfo_Get_Doc_Freq(cloned_tinfo), 10, "setting orig doesn't affect clone" ); TInfo_Set_Post_FilePos(tinfo, 15); TEST_INT_EQ(batch, TInfo_Get_Post_FilePos(tinfo), 15, "set/get post_filepos" ); TInfo_Set_Skip_FilePos(tinfo, 35); TEST_INT_EQ(batch, TInfo_Get_Skip_FilePos(tinfo), 35, "set/get skip_filepos" ); TInfo_Set_Lex_FilePos(tinfo, 45); TEST_INT_EQ(batch, TInfo_Get_Lex_FilePos(tinfo), 45, "set/get lex_filepos" ); DECREF(tinfo); DECREF(cloned_tinfo); }
void MatchTInfoStepper_write_key_frame(MatchTermInfoStepper *self, OutStream *outstream, Obj *value) { TermInfo *tinfo = (TermInfo*)CERTIFY(value, TERMINFO); int32_t doc_freq = TInfo_Get_Doc_Freq(tinfo); // Write doc_freq. OutStream_Write_C32(outstream, doc_freq); // Write postings file pointer. OutStream_Write_C64(outstream, tinfo->post_filepos); // Write skip file pointer (maybe). if (doc_freq >= self->skip_interval) { OutStream_Write_C64(outstream, tinfo->skip_filepos); } TInfo_Mimic((TermInfo*)self->value, (Obj*)tinfo); }
void MatchTInfoStepper_Write_Key_Frame_IMP(MatchTermInfoStepper *self, OutStream *outstream, Obj *value) { MatchTermInfoStepperIVARS *const ivars = MatchTInfoStepper_IVARS(self); TermInfo *tinfo = (TermInfo*)CERTIFY(value, TERMINFO); int32_t doc_freq = TInfo_Get_Doc_Freq(tinfo); TermInfoIVARS *const tinfo_ivars = TInfo_IVARS((TermInfo*)value); // Write doc_freq. OutStream_Write_C32(outstream, doc_freq); // Write postings file pointer. OutStream_Write_C64(outstream, tinfo_ivars->post_filepos); // Write skip file pointer (maybe). if (doc_freq >= ivars->skip_interval) { OutStream_Write_C64(outstream, tinfo_ivars->skip_filepos); } TInfo_Mimic((TermInfo*)ivars->value, (Obj*)tinfo); }
void MatchTInfoStepper_Write_Delta_IMP(MatchTermInfoStepper *self, OutStream *outstream, Obj *value) { MatchTermInfoStepperIVARS *const ivars = MatchTInfoStepper_IVARS(self); TermInfo *tinfo = (TermInfo*)CERTIFY(value, TERMINFO); TermInfo *last_tinfo = (TermInfo*)ivars->value; int32_t doc_freq = TInfo_Get_Doc_Freq(tinfo); int64_t post_delta = TInfo_IVARS(tinfo)->post_filepos - TInfo_IVARS(last_tinfo)->post_filepos; // Write doc_freq. OutStream_Write_C32(outstream, doc_freq); // Write postings file pointer delta. OutStream_Write_C64(outstream, post_delta); // Write skip file pointer (maybe). if (doc_freq >= ivars->skip_interval) { OutStream_Write_C64(outstream, TInfo_IVARS(tinfo)->skip_filepos); } TInfo_Mimic((TermInfo*)ivars->value, (Obj*)tinfo); }
uint32_t DefLexReader_Doc_Freq_IMP(DefaultLexiconReader *self, String *field, Obj *term) { TermInfo *tinfo = S_find_tinfo(self, field, term); return tinfo ? TInfo_Get_Doc_Freq(tinfo) : 0; }