Compiler* PhraseQuery_Make_Compiler_IMP(PhraseQuery *self, Searcher *searcher, float boost, bool subordinate) { PhraseQueryIVARS *const ivars = PhraseQuery_IVARS(self); if (Vec_Get_Size(ivars->terms) == 1) { // Optimize for one-term "phrases". Obj *term = Vec_Fetch(ivars->terms, 0); TermQuery *term_query = TermQuery_new(ivars->field, term); TermCompiler *term_compiler; TermQuery_Set_Boost(term_query, ivars->boost); term_compiler = (TermCompiler*)TermQuery_Make_Compiler(term_query, searcher, boost, subordinate); DECREF(term_query); return (Compiler*)term_compiler; } else { PhraseCompiler *compiler = PhraseCompiler_new(self, searcher, boost); if (!subordinate) { PhraseCompiler_Normalize(compiler); } return (Compiler*)compiler; } }
PhraseCompiler* PhraseCompiler_init(PhraseCompiler *self, PhraseQuery *parent, Searcher *searcher, float boost) { Schema *schema = Searcher_Get_Schema(searcher); Similarity *sim = Schema_Fetch_Sim(schema, parent->field); VArray *terms = parent->terms; uint32_t i, max; // Try harder to find a Similarity if necessary. if (!sim) { sim = Schema_Get_Similarity(schema); } // Init. Compiler_init((Compiler*)self, (Query*)parent, searcher, sim, boost); // Store IDF for the phrase. self->idf = 0; for (i = 0, max = VA_Get_Size(terms); i < max; i++) { Obj *term = VA_Fetch(terms, i); int32_t doc_max = Searcher_Doc_Max(searcher); int32_t doc_freq = Searcher_Doc_Freq(searcher, parent->field, term); self->idf += Sim_IDF(sim, doc_freq, doc_max); } // Calculate raw weight. self->raw_weight = self->idf * self->boost; // Make final preparations. PhraseCompiler_Normalize(self); return self; }
PhraseCompiler* PhraseCompiler_init(PhraseCompiler *self, PhraseQuery *parent, Searchable *searchable, float boost) { Schema *schema = Searchable_Get_Schema(searchable); Similarity *sim = Schema_Fetch_Sim(schema, parent->field); VArray *terms = parent->terms; u32_t i, max; /* Try harder to find a Similarity if necessary. */ if (!sim) { sim = Schema_Get_Similarity(schema); } /* Init. */ Compiler_init((Compiler*)self, (Query*)parent, searchable, sim, boost); /* Store IDF for the phrase. */ self->idf = 0; for (i = 0, max = VA_Get_Size(terms); i < max; i++) { Obj *term = VA_Fetch(terms, i); self->idf += Sim_IDF(sim, searchable, parent->field, term); } /* Calculate raw weight. */ self->raw_weight = self->idf * self->boost; /* Make final preparations. */ PhraseCompiler_Normalize(self); return self; }