-/* $Id: zsets.c,v 1.112 2006-10-29 17:20:01 adam Exp $
- Copyright (C) 1995-2006
+/* $Id: zsets.c,v 1.119 2007-01-17 15:35:48 adam Exp $
+ Copyright (C) 1995-2007
Index Data ApS
This file is part of the Zebra server.
int term_entries_max;
struct zebra_set *next;
int locked;
+ int estimated_hit_count;
zint cache_position; /* last position */
RSFD cache_rfd; /* rfd (NULL if not existing) */
log_level_set = 1;
}
-ZEBRA_RES resultSetSearch(ZebraHandle zh, NMEM nmem, NMEM rset_nmem,
- Z_RPNQuery *rpn, ZebraSet sset)
+
+static ZEBRA_RES resultSetSearch(ZebraHandle zh, NMEM nmem, NMEM rset_nmem,
+ Z_RPNQuery *rpn, ZebraSet sset)
{
RSET rset = 0;
oident *attrset;
int sort_status, i;
ZEBRA_RES res = ZEBRA_OK;
- zh->hits = 0;
-
sort_sequence = (Z_SortKeySpecList *)
nmem_malloc(nmem, sizeof(*sort_sequence));
sort_sequence->num_specs = 10; /* FIXME - Hard-coded number */
sort_sequence->specs[i] = 0;
attrset = oid_getentbyoid (rpn->attributeSetId);
+
+ rpn_get_top_approx_limit(zh, rpn->RPNStructure, &sset->approx_limit);
+
res = rpn_search_top(zh, rpn->RPNStructure, attrset->value,
nmem, rset_nmem,
sort_sequence,
}
-ZEBRA_RES resultSetAddRPN (ZebraHandle zh, NMEM m, Z_RPNQuery *rpn,
- int num_bases, char **basenames,
- const char *setname)
+ZEBRA_RES resultSetAddRPN(ZebraHandle zh, NMEM m, Z_RPNQuery *rpn,
+ int num_bases, char **basenames,
+ const char *setname,
+ zint *hits, int *estimated_hit_count)
{
ZebraSet zebraSet;
int i;
ZEBRA_RES res;
- zh->hits = 0;
+ *hits = 0;
+ *estimated_hit_count = 0;
zebraSet = resultSetAdd(zh, setname, 1);
if (!zebraSet)
res = resultSetSearch(zh, zebraSet->nmem, zebraSet->rset_nmem,
rpn, zebraSet);
- zh->hits = zebraSet->hits;
+ *hits = zebraSet->hits;
+ if (zebraSet->estimated_hit_count)
+ *estimated_hit_count = 1;
+
if (zebraSet->rset)
zebraSet->rpn = rpn;
zebraSet->locked = 0;
s->cache_position = 0;
s->cache_rfd = 0;
s->approx_limit = zh->approx_limit;
+ s->estimated_hit_count = 0;
return s;
}
struct zset_sort_info *sort_info = sset->sort_info;
int i, j;
- sortIdx_sysno (zh->reg->sortIdx, sysno);
+ zebra_sort_sysno(zh->reg->sort_index, sysno);
for (i = 0; i<num_criteria; i++)
{
char *this_entry_buf = tmp_cmp_buf[i];
memset(this_entry_buf, '\0', SORT_IDX_ENTRYSIZE);
if (criteria[i].ord != -1)
{
- sortIdx_type(zh->reg->sortIdx, criteria[i].ord);
- sortIdx_read(zh->reg->sortIdx, this_entry_buf);
+ zebra_sort_type(zh->reg->sort_index, criteria[i].ord);
+ zebra_sort_read(zh->reg->sort_index, this_entry_buf);
}
}
i = sort_info->num_entries;
kno++;
if (this_sys != psysno)
{
+ if ((sset->hits & 255) == 0 && zh->break_handler_func)
+ {
+ if (zh->break_handler_func(zh->break_handler_data))
+ {
+ rset_set_hits_limit(rset, 0);
+ break;
+ }
+ }
(sset->hits)++;
psysno = this_sys;
resultSetInsertSort(zh, sset,
sort_info = zebraSet->sort_info;
sort_info->num_entries = 0;
zebraSet->hits = 0;
+ zebraSet->estimated_hit_count = 0;
rset_getterms(rset, 0, 0, &n);
terms = (TERMID *) nmem_malloc(nmem, sizeof(*terms)*n);
rset_getterms(rset, terms, n, &numTerms);
-
rank_class = zebraRankLookup(zh, rank_handler_name);
if (!rank_class)
{
struct rank_control *rc = rank_class->control;
int score;
zint count = 0;
-
- void *handle =
- (*rc->begin) (zh->reg, rank_class->class_handle, rset, nmem,
- terms, numTerms);
+ void *handle = (*rc->begin) (zh->reg, rank_class->class_handle, rset,
+ nmem, terms, numTerms);
zint psysno = 0; /* previous doc id / sys no */
zint pstaticrank = 0; /* previous static rank */
int stop_flag = 0;
key_logdump_txt(log_level_searchhits, &key, termid->name);
if (this_sys != psysno)
{ /* new record .. */
+ if (!(rfd->counted_items & 255) && zh->break_handler_func)
+ {
+ if (zh->break_handler_func(zh->break_handler_data))
+ {
+ yaz_log(YLOG_LOG, "Aborted search");
+ stop_flag = 1;
+ }
+ }
if (rfd->counted_items > rset->hits_limit)
- break;
+ stop_flag = 1;
if (psysno)
{ /* only if we did have a previous record */
score = (*rc->calc) (handle, psysno, pstaticrank,
/* insert the hit. A=Ascending */
resultSetInsertRank (zh, sort_info, psysno, score, 'A');
count++;
- if (stop_flag)
- break;
}
+ if (stop_flag)
+ {
+ zebraSet->estimated_hit_count = 1;
+ rset_set_hits_limit(rset, 0);
+ break;
+ }
psysno = this_sys;
if (zh->m_staticrank)
pstaticrank = key.mem[0];