-/* $Id: rset.c,v 1.47 2005-06-02 11:59:54 adam Exp $
+/* $Id: rset.c,v 1.52 2005-06-22 19:42:39 adam Exp $
Copyright (C) 1995-2005
Index Data ApS
{
TERMID termid;
char buf[100];
- while(rfd->counted_items < rs->hits_limit
+ while(rfd->counted_items <= rs->hits_limit
&& rset_default_read(rfd, buf, &termid))
;
rs->hits_count = rfd->counted_items;
+ yaz_log(log_level, "rset_close rset=%p hits_count=" ZINT_FORMAT
+ " hits_limit=" ZINT_FORMAT,
+ rs, rs->hits_count, rs->hits_limit);
rs->hits_approx = 0;
- if (rs->hits_count >= rs->hits_limit)
+ if (rs->hits_count > rs->hits_limit)
{
double cur, tot;
zint est;
rset = (RSET) nmem_malloc(nmem, sizeof(*rset));
yaz_log(log_level, "rs_create(%s) rs=%p (nm=%p)", sel->desc, rset, nmem);
+ yaz_log(log_level, " ref_id=%s limit=" ZINT_FORMAT,
+ (term && term->ref_id ? term->ref_id : "null"),
+ rset->hits_limit);
rset->nmem = nmem;
rset->control = sel;
rset->refcount = 1;
rset->free_list = NULL;
rset->use_list = NULL;
rset->hits_count = 0;
- rset->hits_limit = 1000;
+ rset->hits_limit = 0;
rset->hits_round = 1000;
rset->keycontrol = kcontrol;
(*kcontrol->inc)(kcontrol);
rset->scope = scope;
rset->term = term;
if (term)
+ {
term->rset = rset;
-
+ rset->hits_limit = term->hits_limit;
+ }
rset->no_children = no_children;
rset->children = 0;
if (no_children)
}
}
+struct ord_list *ord_list_create(NMEM nmem)
+{
+ return 0;
+}
+
+struct ord_list *ord_list_append(NMEM nmem, struct ord_list *list,
+ int ord)
+{
+ struct ord_list *n = nmem_malloc(nmem, sizeof(*n));
+ n->ord = ord;
+ n->next = list;
+ return n;
+}
+
+struct ord_list *ord_list_dup(NMEM nmem, struct ord_list *list)
+{
+ struct ord_list *n = ord_list_create(nmem);
+ for (; list; list = list->next)
+ n = ord_list_append(nmem, n, list->ord);
+ return n;
+}
+
/**
\brief Creates a TERMID entry.
\param name Term/Name buffer with given length
\param flags for term
\param type Term Type, Z_Term_general, Z_Term_characterString,..
\param nmem memory for term.
+ \param ol ord list
+ \param reg_type register type
+ \param hits_limit limit before counting stops and gets approximate
+ \param ref_id supplied ID for term that can be used to identify this
*/
TERMID rset_term_create(const char *name, int length, const char *flags,
- int type, NMEM nmem)
+ int type, NMEM nmem, struct ord_list *ol,
+ int reg_type,
+ zint hits_limit, const char *ref_id)
{
TERMID t;
else if (length == -1)
t->name = nmem_strdup(nmem, name);
else
- {
- t->name = (char*) nmem_malloc(nmem, length+1);
- memcpy (t->name, name, length);
- t->name[length] = '\0';
- }
+ t->name = nmem_strdupn(nmem, name, length);
+ if (!ref_id)
+ t->ref_id = 0;
+ else
+ t->ref_id = nmem_strdup(nmem, ref_id);
if (!flags)
t->flags = NULL;
else
t->flags = nmem_strdup(nmem, flags);
+ t->hits_limit = hits_limit;
t->type = type;
+ t->reg_type = reg_type;
t->rankpriv = 0;
t->rset = 0;
+ t->ol = ord_list_dup(nmem, ol);
return t;
}
if (rc > 0)
{
if (rfd->counted_items == 0 ||
- (rset->keycontrol->cmp)(buf, rfd->counted_buf) >= rset->scope)
+ (rset->keycontrol->cmp)(buf, rfd->counted_buf) > rset->scope)
{
memcpy(rfd->counted_buf, buf, rset->keycontrol->key_size);
rfd->counted_items++;