TopDocs* PolySearcher_Top_Docs_IMP(PolySearcher *self, Query *query, uint32_t num_wanted, SortSpec *sort_spec) { PolySearcherIVARS *const ivars = PolySearcher_IVARS(self); Schema *schema = PolySearcher_Get_Schema(self); VArray *searchers = ivars->searchers; I32Array *starts = ivars->starts; HitQueue *hit_q = sort_spec ? HitQ_new(schema, sort_spec, num_wanted) : HitQ_new(NULL, NULL, num_wanted); uint32_t total_hits = 0; Compiler *compiler = Query_Is_A(query, COMPILER) ? ((Compiler*)INCREF(query)) : Query_Make_Compiler(query, (Searcher*)self, Query_Get_Boost(query), false); for (uint32_t i = 0, max = VA_Get_Size(searchers); i < max; i++) { Searcher *searcher = (Searcher*)VA_Fetch(searchers, i); int32_t base = I32Arr_Get(starts, i); TopDocs *top_docs = Searcher_Top_Docs(searcher, (Query*)compiler, num_wanted, sort_spec); VArray *sub_match_docs = TopDocs_Get_Match_Docs(top_docs); total_hits += TopDocs_Get_Total_Hits(top_docs); S_modify_doc_ids(sub_match_docs, base); for (uint32_t j = 0, jmax = VA_Get_Size(sub_match_docs); j < jmax; j++) { MatchDoc *match_doc = (MatchDoc*)VA_Fetch(sub_match_docs, j); if (!HitQ_Insert(hit_q, INCREF(match_doc))) { break; } } DECREF(top_docs); } VArray *match_docs = HitQ_Pop_All(hit_q); TopDocs *retval = TopDocs_new(match_docs, total_hits); DECREF(match_docs); DECREF(compiler); DECREF(hit_q); return retval; }
Highlighter* Highlighter_init(Highlighter *self, Searcher *searcher, Obj *query, String *field, uint32_t excerpt_length) { HighlighterIVARS *const ivars = Highlighter_IVARS(self); ivars->query = Searcher_Glean_Query(searcher, query); ivars->searcher = (Searcher*)INCREF(searcher); ivars->field = Str_Clone(field); ivars->excerpt_length = excerpt_length; ivars->slop = excerpt_length / 3; ivars->pre_tag = Str_new_from_trusted_utf8("<strong>", 8); ivars->post_tag = Str_new_from_trusted_utf8("</strong>", 9); if (Query_Is_A(ivars->query, COMPILER)) { ivars->compiler = (Compiler*)INCREF(ivars->query); } else { ivars->compiler = Query_Make_Compiler(ivars->query, searcher, Query_Get_Boost(ivars->query), false); } return self; }