Mailing List Archive

r3881 - trunk/c_src/KinoSearch/Search/HitCollector
Author: creamyg
Date: 2008-09-18 20:48:00 -0700 (Thu, 18 Sep 2008)
New Revision: 3881

Modified:
trunk/c_src/KinoSearch/Search/HitCollector/SortCollector.c
trunk/c_src/KinoSearch/Search/HitCollector/TopDocCollector.bp
trunk/c_src/KinoSearch/Search/HitCollector/TopDocCollector.c
Log:
Add a recyclable ScoreDoc/FieldDoc to TopDocCollector/SortCollector, so that
it can be reinserted with a new score and doc num, instead of needing to
construct a fresh ScoreDoc each insertion. This matters quite a bit when the
scores are constant, as with a TermScorer for a MatchPosting field.


Modified: trunk/c_src/KinoSearch/Search/HitCollector/SortCollector.c
===================================================================
--- trunk/c_src/KinoSearch/Search/HitCollector/SortCollector.c 2008-09-19 03:35:26 UTC (rev 3880)
+++ trunk/c_src/KinoSearch/Search/HitCollector/SortCollector.c 2008-09-19 03:48:00 UTC (rev 3881)
@@ -17,19 +17,15 @@
SortCollector*
SortColl_init(SortCollector *self, FieldDocCollator *collator, u32_t num_hits)
{
- HC_init((HitCollector*)self);
-
/* Init. */
- self->min_doc = -1;
- self->min_score = 0.0f;
- self->total_hits = 0;
- self->num_hits = 0;
+ TDColl_init((TopDocCollector*)self, num_hits);
+ self->min_doc = 0;

/* Assign. */
- self->num_hits = num_hits;
- self->collator = REFCOUNT_INC(collator);
+ self->collator = REFCOUNT_INC(collator);

/* Derive. */
+ REFCOUNT_DEC(self->hit_q);
self->hit_q = (HitQueue*)SortedHitQ_new(num_hits);

return self;
@@ -39,8 +35,7 @@
SortColl_destroy(SortCollector *self)
{
REFCOUNT_DEC(self->collator);
- REFCOUNT_DEC(self->hit_q);
- FREE_OBJ(self);
+ TDColl_destroy((TopDocCollector*)self);
}

void
@@ -57,18 +52,26 @@
return;
}
else {
- FieldDoc *const field_doc
- = FieldDoc_new(doc_num, tally->score, self->collator);
SortedHitQueue *const hit_q = (SortedHitQueue*)self->hit_q;

- SortedHitQ_Insert(hit_q, (Obj*)field_doc);
- REFCOUNT_DEC(field_doc);
+ if (self->bumped) {
+ FieldDoc *const field_doc = (FieldDoc*)self->bumped;
+ field_doc->doc_num = doc_num;
+ field_doc->score = tally->score;
+ self->bumped = (ScoreDoc*)HitQ_Jostle(hit_q, (Obj*)field_doc);
+ REFCOUNT_DEC(field_doc);
+ }
+ else {
+ FieldDoc *const field_doc
+ = FieldDoc_new(doc_num, tally->score, self->collator);
+ self->bumped = (ScoreDoc*)HitQ_Jostle(hit_q, (Obj*)field_doc);
+ REFCOUNT_DEC(field_doc);
+ }

/* Store the bubble score in a more accessible spot. */
- if (hit_q->size == hit_q->max_size) {
- FieldDoc *const least = (FieldDoc*)SortedHitQ_Peek(hit_q);
- self->min_doc = least->doc_num;
- self->min_score = least->score;
+ if (self->bumped) {
+ self->min_doc = self->bumped->doc_num;
+ self->min_score = self->bumped->score;
}
}
}

Modified: trunk/c_src/KinoSearch/Search/HitCollector/TopDocCollector.bp
===================================================================
--- trunk/c_src/KinoSearch/Search/HitCollector/TopDocCollector.bp 2008-09-19 03:35:26 UTC (rev 3880)
+++ trunk/c_src/KinoSearch/Search/HitCollector/TopDocCollector.bp 2008-09-19 03:48:00 UTC (rev 3881)
@@ -13,6 +13,7 @@
u32_t num_hits;
u32_t total_hits;
HitQueue *hit_q;
+ ScoreDoc *bumped;

static incremented TopDocCollector*
new(u32_t size);

Modified: trunk/c_src/KinoSearch/Search/HitCollector/TopDocCollector.c
===================================================================
--- trunk/c_src/KinoSearch/Search/HitCollector/TopDocCollector.c 2008-09-19 03:35:26 UTC (rev 3880)
+++ trunk/c_src/KinoSearch/Search/HitCollector/TopDocCollector.c 2008-09-19 03:48:00 UTC (rev 3881)
@@ -20,6 +20,7 @@
/* Init. */
self->min_score = 0.0;
self->total_hits = 0;
+ self->bumped = NULL;

/* Assign. */
self->num_hits = num_hits;
@@ -33,6 +34,7 @@
void
TDColl_destroy(TopDocCollector *self)
{
+ REFCOUNT_DEC(self->bumped);
REFCOUNT_DEC(self->hit_q);
FREE_OBJ(self);
}
@@ -45,21 +47,29 @@

/* Bail if the score doesn't exceed the minimum. */
if ( self->total_hits > self->num_hits
- && tally->score < self->min_score
+ && tally->score <= self->min_score
) {
return;
}
else if (self->num_hits > 0) {
- ScoreDoc *const score_doc = ScoreDoc_new(doc_num, tally->score);
- HitQueue *const hit_q = self->hit_q;
+ HitQueue *const hit_q = self->hit_q;

- HitQ_Insert(hit_q, (Obj*)score_doc);
- REFCOUNT_DEC(score_doc);
+ if (self->bumped) {
+ ScoreDoc *const score_doc = self->bumped;
+ score_doc->doc_num = doc_num;
+ score_doc->score = tally->score;
+ self->bumped = (ScoreDoc*)HitQ_Jostle(hit_q, (Obj*)score_doc);
+ REFCOUNT_DEC(score_doc);
+ }
+ else {
+ ScoreDoc *const score_doc = ScoreDoc_new(doc_num, tally->score);
+ self->bumped = (ScoreDoc*)HitQ_Jostle(hit_q, (Obj*)score_doc);
+ REFCOUNT_DEC(score_doc);
+ }

/* Store the bubble score in a more accessible spot. */
- if (hit_q->size == hit_q->max_size) {
- ScoreDoc *const least = (ScoreDoc*)HitQ_Peek(hit_q);
- self->min_score = least->score;
+ if (self->bumped) {
+ self->min_score = self->bumped->score;
}
}
}


_______________________________________________
kinosearch-commits mailing list
kinosearch-commits@rectangular.com
http://www.rectangular.com/mailman/listinfo/kinosearch-commits