Hits* Hits_init(Hits *self, Searcher *searcher, TopDocs *top_docs, uint32_t offset) { self->searcher = (Searcher*)INCREF(searcher); self->top_docs = (TopDocs*)INCREF(top_docs); self->match_docs = (VArray*)INCREF(TopDocs_Get_Match_Docs(top_docs)); self->offset = offset; return self; }
Hits* Hits_init(Hits *self, Searcher *searcher, TopDocs *top_docs, uint32_t offset) { HitsIVARS *const ivars = Hits_IVARS(self); ivars->searcher = (Searcher*)INCREF(searcher); ivars->top_docs = (TopDocs*)INCREF(top_docs); ivars->match_docs = (VArray*)INCREF(TopDocs_Get_Match_Docs(top_docs)); ivars->offset = offset; return self; }
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; }