/*********************************************** !!!! DO NOT EDIT THIS FILE !!!! This file was auto-generated by Build.PL from lib/KinoSearch/Search/HitCollector.pm See KinoSearch::Docs::DevGuide for details. ***********************************************/ #line 297 "lib/KinoSearch/Search/HitCollector.pm" #include "KinoSearchSearchHitCollector.h" HitCollector* Kino_HC_new() { HitCollector *hc; /* allocate memory and init */ Kino_New(0, hc, 1, HitCollector); hc->f = 0; hc->i = 0; hc->storage = NULL; hc->storage_ref = &PL_sv_undef; hc->filter_bits = NULL; hc->filter_bits_ref = &PL_sv_undef; /* force the subclass to spec a collect method */ hc->collect = Kino_HC_collect_death; return hc; } void Kino_HC_collect_death(HitCollector *hc, U32 doc_num, float score) { Kino_confess("hit_collector->collect must be assigned in a subclass"); } void Kino_HC_collect_HitQueue(HitCollector *hc, U32 doc_num, float score) { /* add to the total number of hits */ hc->i++; /* bail if the score doesn't exceed the minimum */ if (score < hc->f) { return; } else { SV *element; char doc_num_buf[4]; PriorityQueue *hit_queue; hit_queue = (PriorityQueue*)hc->storage; /* put a dualvar scalar -- encoded doc_num in PV, score in NV */ element = sv_newmortal(); (void)SvUPGRADE(element, SVt_PVNV); Kino_encode_bigend_U32(doc_num, &doc_num_buf); sv_setpvn(element, doc_num_buf, (STRLEN)4); SvNV_set(element, (double)score); SvNOK_on(element); (void)Kino_PriQ_insert(hit_queue, element); /* store the bubble score in a more accessible spot */ if (hit_queue->size == hit_queue->max_size) { SV *least_sv; least_sv = Kino_PriQ_peek(hit_queue); hc->f = SvNV(least_sv); } } } void Kino_HC_collect_BitVec(HitCollector *hc, U32 doc_num, float score) { BitVector *bit_vec; bit_vec = (BitVector*)hc->storage; /* add to the total number of hits */ hc->i++; /* add the doc_num to the BitVector */ Kino_BitVec_set(bit_vec, doc_num); } void Kino_HC_collect_filtered(HitCollector *hc, U32 doc_num, float score) { if (hc->filter_bits == NULL) { Kino_confess("filter_bits not set on FilteredCollector"); } if (Kino_BitVec_get(hc->filter_bits, doc_num)) { HitCollector *inner_collector; inner_collector = (HitCollector*)hc->storage; inner_collector->collect(inner_collector, doc_num, score); } } void Kino_HC_collect_offset(HitCollector *hc, U32 doc_num, float score) { HitCollector *inner_collector = (HitCollector*)hc->storage; U32 offset_doc_num = doc_num + hc->f; inner_collector->collect(inner_collector, offset_doc_num, score); } void Kino_HC_destroy(HitCollector *hc) { SvREFCNT_dec(hc->storage_ref); SvREFCNT_dec(hc->filter_bits_ref); Kino_Safefree(hc); }