/*********************************************** !!!! DO NOT EDIT THIS FILE !!!! This file was auto-generated by Build.PL from lib/KinoSearch/Search/TermScorer.pm See KinoSearch::Docs::DevGuide for details. ***********************************************/ #line 190 "lib/KinoSearch/Search/TermScorer.pm" #include "KinoSearchSearchTermScorer.h" void Kino_TermScorer_init_child(Scorer *scorer){ TermScorerChild *child; /* allocate */ Kino_New(0, child, 1, TermScorerChild); scorer->child = child; child->doc_nums_sv = newSV(0); child->freqs_sv = newSV(0); /* define abstract methods */ scorer->next = Kino_TermScorer_next; scorer->doc = Kino_TermScorer_doc; scorer->score = Kino_TermScorer_score; /* init */ child->doc = 0; child->term_docs = NULL; child->pointer = 0; child->pointer_max = 0; child->doc_nums = NULL; child->freqs = NULL; child->weight_value = 0.0; child->norms = NULL; child->score_cache = NULL; child->weight_sv = &PL_sv_undef; child->term_docs_sv = &PL_sv_undef; child->norms_sv = &PL_sv_undef; } void Kino_TermScorer_fill_score_cache(Scorer *scorer) { TermScorerChild *child; float *cache_ptr; int i; child = (TermScorerChild*)scorer->child; Kino_Safefree(child->score_cache); Kino_New(0, child->score_cache, KINO_SCORE_CACHE_SIZE, float); cache_ptr = child->score_cache; for (i = 0; i < KINO_SCORE_CACHE_SIZE; i++) { *cache_ptr++ = scorer->sim->tf(scorer->sim, i) * child->weight_value; } } void Kino_TermScorer_destroy(Scorer *scorer) { TermScorerChild *child; child = (TermScorerChild*)scorer->child; Kino_Safefree(child->score_cache); SvREFCNT_dec(child->term_docs_sv); SvREFCNT_dec(child->norms_sv); SvREFCNT_dec(child->weight_sv); SvREFCNT_dec(child->doc_nums_sv); SvREFCNT_dec(child->freqs_sv); Kino_Safefree(child); Kino_Scorer_destroy(scorer); } bool Kino_TermScorer_next(Scorer* scorer) { TermScorerChild *child = (TermScorerChild*)scorer->child; /* refill the queue if needed */ if (++child->pointer >= child->pointer_max) { child->pointer_max = child->term_docs->bulk_read(child->term_docs, child->doc_nums_sv, child->freqs_sv, 1024); child->doc_nums = (U32*)SvPV_nolen(child->doc_nums_sv); child->freqs = (U32*)SvPV_nolen(child->freqs_sv); if (child->pointer_max != 0) { child->pointer = 0; } else { child->doc = KINO_TERM_SCORER_SENTINEL; /* TODO Lucene calls termDocs.close() here. */ return 0; } } child->doc = child->doc_nums[child->pointer]; return 1; } float Kino_TermScorer_score(Scorer* scorer) { TermScorerChild *child; U32 freq; float score; unsigned char norm; child = (TermScorerChild*)scorer->child; freq = child->freqs[child->pointer]; if (freq < KINO_SCORE_CACHE_SIZE) { /* cache hit, so we don't need to recompute the whole score */ score = child->score_cache[freq]; } else { score = scorer->sim->tf(scorer->sim, freq) * child->weight_value; } /* normalize for field */ norm = child->norms[child->doc]; score *= scorer->sim->norm_decoder[norm]; return score; } void Kino_TermScorer_score_batch(Scorer *scorer, U32 start, U32 end, HitCollector* hc) { TermScorerChild *child; U32 freq; unsigned char norm; float score; child = (TermScorerChild*)scorer->child; scorer->next(scorer); while(child->doc < end) { freq = child->freqs[child->pointer]; if (freq < KINO_SCORE_CACHE_SIZE) { /* cache hit, so we don't need to recompute the whole score */ score = child->score_cache[freq]; } else { score = scorer->sim->tf(scorer->sim, freq) * child->weight_value; } /* normalize for field */ norm = child->norms[child->doc]; score *= scorer->sim->norm_decoder[norm]; hc->collect(hc, child->doc, score); /* time for a refill? */ if (++child->pointer >= child->pointer_max) { /* try to get more docs and freqs */ child->pointer_max = child->term_docs->bulk_read( child->term_docs, child->doc_nums_sv, child->freqs_sv, 1024); child->doc_nums = (U32*)SvPV_nolen(child->doc_nums_sv); child->freqs = (U32*)SvPV_nolen(child->freqs_sv); /* bail if we didn't get any more docs */ if (child->pointer_max != 0) { child->pointer = 0; } else { child->doc = KINO_TERM_SCORER_SENTINEL; /* TODO Lucene calls termDocs.close() here. */ return; } } child->doc = child->doc_nums[ child->pointer ]; } } U32 Kino_TermScorer_doc(Scorer* scorer) { TermScorerChild *child = (TermScorerChild*)scorer->child; return child->doc; }