Matcher* PhraseCompiler_Make_Matcher_IMP(PhraseCompiler *self, SegReader *reader, bool need_score) { UNUSED_VAR(need_score); PhraseCompilerIVARS *const ivars = PhraseCompiler_IVARS(self); PhraseQueryIVARS *const parent_ivars = PhraseQuery_IVARS((PhraseQuery*)ivars->parent); Vector *const terms = parent_ivars->terms; uint32_t num_terms = Vec_Get_Size(terms); // Bail if there are no terms. if (!num_terms) { return NULL; } // Bail unless field is valid and posting type supports positions. Similarity *sim = PhraseCompiler_Get_Similarity(self); Posting *posting = Sim_Make_Posting(sim); if (posting == NULL || !Obj_is_a((Obj*)posting, SCOREPOSTING)) { DECREF(posting); return NULL; } DECREF(posting); // Bail if there's no PostingListReader for this segment. PostingListReader *const plist_reader = (PostingListReader*)SegReader_Fetch( reader, Class_Get_Name(POSTINGLISTREADER)); if (!plist_reader) { return NULL; } // Look up each term. Vector *plists = Vec_new(num_terms); for (uint32_t i = 0; i < num_terms; i++) { Obj *term = Vec_Fetch(terms, i); PostingList *plist = PListReader_Posting_List(plist_reader, parent_ivars->field, term); // Bail if any one of the terms isn't in the index. if (!plist || !PList_Get_Doc_Freq(plist)) { DECREF(plist); DECREF(plists); return NULL; } Vec_Push(plists, (Obj*)plist); } Matcher *retval = (Matcher*)PhraseMatcher_new(sim, plists, (Compiler*)self); DECREF(plists); return retval; }
PostingPool* PostPool_init(PostingPool *self, Schema *schema, Snapshot *snapshot, Segment *segment, PolyReader *polyreader, String *field, LexiconWriter *lex_writer, MemoryPool *mem_pool, OutStream *lex_temp_out, OutStream *post_temp_out, OutStream *skip_out) { // Init. SortEx_init((SortExternal*)self); PostingPoolIVARS *const ivars = PostPool_IVARS(self); ivars->doc_base = 0; ivars->last_doc_id = 0; ivars->doc_map = NULL; ivars->post_count = 0; ivars->lexicon = NULL; ivars->plist = NULL; ivars->lex_temp_in = NULL; ivars->post_temp_in = NULL; ivars->lex_start = INT64_MAX; ivars->post_start = INT64_MAX; ivars->lex_end = 0; ivars->post_end = 0; ivars->skip_stepper = SkipStepper_new(); // Assign. ivars->schema = (Schema*)INCREF(schema); ivars->snapshot = (Snapshot*)INCREF(snapshot); ivars->segment = (Segment*)INCREF(segment); ivars->polyreader = (PolyReader*)INCREF(polyreader); ivars->lex_writer = (LexiconWriter*)INCREF(lex_writer); ivars->mem_pool = (MemoryPool*)INCREF(mem_pool); ivars->field = Str_Clone(field); ivars->lex_temp_out = (OutStream*)INCREF(lex_temp_out); ivars->post_temp_out = (OutStream*)INCREF(post_temp_out); ivars->skip_out = (OutStream*)INCREF(skip_out); // Derive. Similarity *sim = Schema_Fetch_Sim(schema, field); ivars->posting = Sim_Make_Posting(sim); ivars->type = (FieldType*)INCREF(Schema_Fetch_Type(schema, field)); ivars->field_num = Seg_Field_Num(segment, field); return self; }