+RSET resultSetRef (ZebraHandle zh, Z_ResultSetId *resultSetId)
+{
+ ZebraSet s;
+
+ if ((s = resultSetGet (zh, resultSetId)))
+ return s->rset;
+ return NULL;
+}
+
+void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset)
+{
+ int kno = 0;
+ struct it_key key;
+ RSFD rfd;
+ int term_index, i;
+ ZebraRankClass rank_class;
+ struct rank_control *rc;
+ struct zset_sort_info *sort_info;
+
+ sort_info = zebraSet->sort_info;
+ sort_info->num_entries = 0;
+ zebraSet->hits = 0;
+ rfd = rset_open (rset, RSETF_READ);
+
+ logf (LOG_DEBUG, "resultSetRank");
+ for (i = 0; i < rset->no_rset_terms; i++)
+ logf (LOG_DEBUG, "term=\"%s\" cnt=%d type=%s",
+ rset->rset_terms[i]->name,
+ rset->rset_terms[i]->nn,
+ rset->rset_terms[i]->flags);
+
+ rank_class = zebraRankLookup (zh, "rank-1");
+ rc = rank_class->control;
+
+ if (rset_read (rset, rfd, &key, &term_index))
+ {
+ int psysno = key.sysno;
+ int score;
+ void *handle =
+ (*rc->begin) (zh, rank_class->class_handle, rset);
+ (zebraSet->hits)++;
+ do
+ {
+ kno++;
+ if (key.sysno != psysno)
+ {
+ score = (*rc->calc) (handle, psysno);
+
+ resultSetInsertRank (zh, sort_info, psysno, score, 'A');
+ (zebraSet->hits)++;
+ psysno = key.sysno;
+ }
+ (*rc->add) (handle, key.seqno, term_index);
+ }
+ while (rset_read (rset, rfd, &key, &term_index));
+ score = (*rc->calc) (handle, psysno);
+ resultSetInsertRank (zh, sort_info, psysno, score, 'A');
+ (*rc->end) (zh, handle);
+ }
+ rset_close (rset, rfd);
+ logf (LOG_DEBUG, "%d keys, %d distinct sysnos", kno, zebraSet->hits);
+}
+
+ZebraRankClass zebraRankLookup (ZebraHandle zh, const char *name)
+{
+ ZebraRankClass p = zh->rank_classes;
+ while (p && strcmp (p->control->name, name))
+ p = p->next;
+ if (p && !p->init_flag)
+ {
+ if (p->control->create)
+ p->class_handle = (*p->control->create)(zh);
+ p->init_flag = 1;
+ }
+ return p;
+}
+
+void zebraRankInstall (ZebraHandle zh, struct rank_control *ctrl)
+{
+ ZebraRankClass p = (ZebraRankClass) xmalloc (sizeof(*p));
+ p->control = (struct rank_control *) xmalloc (sizeof(*p->control));
+ memcpy (p->control, ctrl, sizeof(*p->control));
+ p->control->name = xstrdup (ctrl->name);
+ p->init_flag = 0;
+ p->next = zh->rank_classes;
+ zh->rank_classes = p;
+}
+
+void zebraRankDestroy (ZebraHandle zh)
+{
+ ZebraRankClass p = zh->rank_classes;
+ while (p)
+ {
+ ZebraRankClass p_next = p->next;
+ if (p->init_flag && p->control->destroy)
+ (*p->control->destroy)(zh, p->class_handle);
+ xfree (p->control->name);
+ xfree (p->control);
+ xfree (p);
+ p = p_next;
+ }
+ zh->rank_classes = NULL;
+}