We now pass the hits_limit to most evaluation functions. This
is the default limit .. Taken from Zebra Handle (approx_limit)
or from attribute 12 - if given.
struct rset_key_control *zebra_key_control_create(ZebraHandle zh);
ZEBRA_RES rpn_search_top(ZebraHandle zh, Z_RPNStructure *zs,
struct rset_key_control *zebra_key_control_create(ZebraHandle zh);
ZEBRA_RES rpn_search_top(ZebraHandle zh, Z_RPNStructure *zs,
- const Odr_oid *attributeSet,
+ const Odr_oid *attributeSet, zint hits_limit,
NMEM stream, NMEM rset_nmem,
Z_SortKeySpecList *sort_sequence,
int num_bases, const char **basenames,
NMEM stream, NMEM rset_nmem,
Z_SortKeySpecList *sort_sequence,
int num_bases, const char **basenames,
AttrType term_ref_id_attr;
AttrType hits_limit_attr;
int term_ref_id_int;
AttrType term_ref_id_attr;
AttrType hits_limit_attr;
int term_ref_id_int;
+ zint hits_limit_from_attr;
attr_init_APT(&hits_limit_attr, zapt, 11);
attr_init_APT(&hits_limit_attr, zapt, 11);
- *hits_limit_value = attr_find(&hits_limit_attr, NULL);
+ hits_limit_from_attr = attr_find(&hits_limit_attr, NULL);
attr_init_APT(&term_ref_id_attr, zapt, 10);
term_ref_id_int = attr_find_ex(&term_ref_id_attr, NULL, term_ref_id_str);
attr_init_APT(&term_ref_id_attr, zapt, 10);
term_ref_id_int = attr_find_ex(&term_ref_id_attr, NULL, term_ref_id_str);
sprintf(res, "%d", term_ref_id_int);
*term_ref_id_str = res;
}
sprintf(res, "%d", term_ref_id_int);
*term_ref_id_str = res;
}
+ if (hits_limit_from_attr != -1)
+ *hits_limit_value = hits_limit_from_attr;
- /* no limit given ? */
- if (*hits_limit_value == -1)
- {
- if (*term_ref_id_str)
- {
- /* use global if term_ref is present */
- *hits_limit_value = zh->approx_limit;
- }
- else
- {
- /* no counting if term_ref is not present */
- *hits_limit_value = 0;
- }
- }
- else if (*hits_limit_value == 0)
- {
- /* 0 is the same as global limit */
- *hits_limit_value = zh->approx_limit;
- }
yaz_log(YLOG_DEBUG, "term_limits_APT ref_id=%s limit=" ZINT_FORMAT,
*term_ref_id_str ? *term_ref_id_str : "none",
*hits_limit_value);
yaz_log(YLOG_DEBUG, "term_limits_APT ref_id=%s limit=" ZINT_FORMAT,
*term_ref_id_str ? *term_ref_id_str : "none",
*hits_limit_value);
static ZEBRA_RES search_term(ZebraHandle zh,
Z_AttributesPlusTerm *zapt,
const char **term_sub,
static ZEBRA_RES search_term(ZebraHandle zh,
Z_AttributesPlusTerm *zapt,
const char **term_sub,
- const Odr_oid *attributeSet, NMEM stream,
+ const Odr_oid *attributeSet,
+ zint hits_limit, NMEM stream,
struct grep_info *grep_info,
const char *index_type, int complete_flag,
const char *rank_type,
struct grep_info *grep_info,
const char *index_type, int complete_flag,
const char *rank_type,
{
ZEBRA_RES res;
struct ord_list *ol;
{
ZEBRA_RES res;
struct ord_list *ol;
+ zint hits_limit_value = hits_limit;
const char *term_ref_id_str = 0;
WRBUF term_dict = wrbuf_alloc();
WRBUF display_term = wrbuf_alloc();
const char *term_ref_id_str = 0;
WRBUF term_dict = wrbuf_alloc();
WRBUF display_term = wrbuf_alloc();
Z_AttributesPlusTerm *zapt,
const char *termz,
const Odr_oid *attributeSet,
Z_AttributesPlusTerm *zapt,
const char *termz,
const Odr_oid *attributeSet,
NMEM stream,
const char *index_type, int complete_flag,
const char *rank_type,
NMEM stream,
const char *index_type, int complete_flag,
const char *rank_type,
alloc_sets = alloc_sets + add;
*result_sets = rnew;
}
alloc_sets = alloc_sets + add;
*result_sets = rnew;
}
- res = search_term(zh, zapt, &termp, attributeSet,
+ res = search_term(zh, zapt, &termp, attributeSet, hits_limit,
stream, &grep_info,
index_type, complete_flag,
rank_type,
stream, &grep_info,
index_type, complete_flag,
rank_type,
Z_AttributesPlusTerm *zapt,
const char *termz,
const Odr_oid *attributeSet,
Z_AttributesPlusTerm *zapt,
const char *termz,
const Odr_oid *attributeSet,
NMEM stream,
const char *index_type, int complete_flag,
const char *rank_type,
NMEM stream,
const char *index_type, int complete_flag,
const char *rank_type,
zebra_map_t zm = zebra_map_get_or_add(zh->reg->zebra_maps, index_type);
if (zebra_maps_is_icu(zm))
zebra_map_tokenize_start(zm, termz, strlen(termz));
zebra_map_t zm = zebra_map_get_or_add(zh->reg->zebra_maps, index_type);
if (zebra_maps_is_icu(zm))
zebra_map_tokenize_start(zm, termz, strlen(termz));
- return search_terms_chrmap(zh, zapt, termz, attributeSet,
+ return search_terms_chrmap(zh, zapt, termz, attributeSet, hits_limit,
stream, index_type, complete_flag,
rank_type, xpath_use,
rset_nmem, result_sets, num_result_sets,
stream, index_type, complete_flag,
rank_type, xpath_use,
rset_nmem, result_sets, num_result_sets,
Z_AttributesPlusTerm *zapt,
const char *termz_org,
const Odr_oid *attributeSet,
Z_AttributesPlusTerm *zapt,
const char *termz_org,
const Odr_oid *attributeSet,
NMEM stream,
const char *index_type,
int complete_flag,
NMEM stream,
const char *index_type,
int complete_flag,
RSET *result_sets = 0;
int num_result_sets = 0;
ZEBRA_RES res =
RSET *result_sets = 0;
int num_result_sets = 0;
ZEBRA_RES res =
- search_terms_list(zh, zapt, termz_org, attributeSet,
+ search_terms_list(zh, zapt, termz_org, attributeSet, hits_limit,
stream, index_type, complete_flag,
rank_type, xpath_use,
rset_nmem,
stream, index_type, complete_flag,
rank_type, xpath_use,
rset_nmem,
Z_AttributesPlusTerm *zapt,
const char *termz_org,
const Odr_oid *attributeSet,
Z_AttributesPlusTerm *zapt,
const char *termz_org,
const Odr_oid *attributeSet,
NMEM stream,
const char *index_type,
int complete_flag,
NMEM stream,
const char *index_type,
int complete_flag,
int num_result_sets = 0;
int i;
ZEBRA_RES res =
int num_result_sets = 0;
int i;
ZEBRA_RES res =
- search_terms_list(zh, zapt, termz_org, attributeSet,
+ search_terms_list(zh, zapt, termz_org, attributeSet, hits_limit,
stream, index_type, complete_flag,
rank_type, xpath_use,
rset_nmem,
stream, index_type, complete_flag,
rank_type, xpath_use,
rset_nmem,
Z_AttributesPlusTerm *zapt,
const char *termz_org,
const Odr_oid *attributeSet,
Z_AttributesPlusTerm *zapt,
const char *termz_org,
const Odr_oid *attributeSet,
NMEM stream,
const char *index_type,
int complete_flag,
NMEM stream,
const char *index_type,
int complete_flag,
int num_result_sets = 0;
int i;
ZEBRA_RES res =
int num_result_sets = 0;
int i;
ZEBRA_RES res =
- search_terms_list(zh, zapt, termz_org, attributeSet,
+ search_terms_list(zh, zapt, termz_org, attributeSet, hits_limit,
stream, index_type, complete_flag,
rank_type, xpath_use,
rset_nmem,
stream, index_type, complete_flag,
rank_type, xpath_use,
rset_nmem,
static ZEBRA_RES rpn_search_database(ZebraHandle zh,
Z_AttributesPlusTerm *zapt,
static ZEBRA_RES rpn_search_database(ZebraHandle zh,
Z_AttributesPlusTerm *zapt,
- const Odr_oid *attributeSet, NMEM stream,
+ const Odr_oid *attributeSet,
+ zint hits_limit, NMEM stream,
Z_SortKeySpecList *sort_sequence,
NMEM rset_nmem,
RSET *rset,
struct rset_key_control *kc);
static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
Z_SortKeySpecList *sort_sequence,
NMEM rset_nmem,
RSET *rset,
struct rset_key_control *kc);
static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
- const Odr_oid *attributeSet, NMEM stream,
+ const Odr_oid *attributeSet,
+ zint hits_limit, NMEM stream,
Z_SortKeySpecList *sort_sequence,
int num_bases, const char **basenames,
NMEM rset_nmem,
Z_SortKeySpecList *sort_sequence,
int num_bases, const char **basenames,
NMEM rset_nmem,
res = ZEBRA_FAIL;
break;
}
res = ZEBRA_FAIL;
break;
}
- res = rpn_search_database(zh, zapt, attributeSet, stream,
+ res = rpn_search_database(zh, zapt, attributeSet, hits_limit, stream,
sort_sequence,
rset_nmem, rsets+i, kc);
if (res != ZEBRA_OK)
sort_sequence,
rset_nmem, rsets+i, kc);
if (res != ZEBRA_OK)
static ZEBRA_RES rpn_search_database(ZebraHandle zh,
Z_AttributesPlusTerm *zapt,
static ZEBRA_RES rpn_search_database(ZebraHandle zh,
Z_AttributesPlusTerm *zapt,
- const Odr_oid *attributeSet, NMEM stream,
+ const Odr_oid *attributeSet,
+ zint hits_limit, NMEM stream,
Z_SortKeySpecList *sort_sequence,
NMEM rset_nmem,
RSET *rset,
Z_SortKeySpecList *sort_sequence,
NMEM rset_nmem,
RSET *rset,
*/
if (!strcmp(search_type, "phrase"))
{
*/
if (!strcmp(search_type, "phrase"))
{
- res = rpn_search_APT_phrase(zh, zapt, termz, attributeSet, stream,
+ res = rpn_search_APT_phrase(zh, zapt, termz, attributeSet, hits_limit,
+ stream,
index_type, complete_flag, rank_type,
xpath_use,
rset_nmem,
index_type, complete_flag, rank_type,
xpath_use,
rset_nmem,
}
else if (!strcmp(search_type, "and-list"))
{
}
else if (!strcmp(search_type, "and-list"))
{
- res = rpn_search_APT_and_list(zh, zapt, termz, attributeSet, stream,
+ res = rpn_search_APT_and_list(zh, zapt, termz, attributeSet, hits_limit,
+ stream,
index_type, complete_flag, rank_type,
xpath_use,
rset_nmem,
index_type, complete_flag, rank_type,
xpath_use,
rset_nmem,
}
else if (!strcmp(search_type, "or-list"))
{
}
else if (!strcmp(search_type, "or-list"))
{
- res = rpn_search_APT_or_list(zh, zapt, termz, attributeSet, stream,
+ res = rpn_search_APT_or_list(zh, zapt, termz, attributeSet, hits_limit,
+ stream,
index_type, complete_flag, rank_type,
xpath_use,
rset_nmem,
index_type, complete_flag, rank_type,
xpath_use,
rset_nmem,
}
static ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs,
}
static ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs,
- const Odr_oid *attributeSet,
+ const Odr_oid *attributeSet,
+ zint hits_limit,
NMEM stream, NMEM rset_nmem,
Z_SortKeySpecList *sort_sequence,
int num_bases, const char **basenames,
NMEM stream, NMEM rset_nmem,
Z_SortKeySpecList *sort_sequence,
int num_bases, const char **basenames,
ZEBRA_RES rpn_search_top(ZebraHandle zh, Z_RPNStructure *zs,
const Odr_oid *attributeSet,
ZEBRA_RES rpn_search_top(ZebraHandle zh, Z_RPNStructure *zs,
const Odr_oid *attributeSet,
NMEM stream, NMEM rset_nmem,
Z_SortKeySpecList *sort_sequence,
int num_bases, const char **basenames,
NMEM stream, NMEM rset_nmem,
Z_SortKeySpecList *sort_sequence,
int num_bases, const char **basenames,
ZEBRA_RES res;
struct rset_key_control *kc = zebra_key_control_create(zh);
ZEBRA_RES res;
struct rset_key_control *kc = zebra_key_control_create(zh);
- res = rpn_search_structure(zh, zs, attributeSet,
+ res = rpn_search_structure(zh, zs, attributeSet, hits_limit,
stream, rset_nmem,
sort_sequence,
num_bases, basenames,
stream, rset_nmem,
sort_sequence,
num_bases, basenames,
}
ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs,
}
ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs,
- const Odr_oid *attributeSet,
+ const Odr_oid *attributeSet, zint hits_limit,
NMEM stream, NMEM rset_nmem,
Z_SortKeySpecList *sort_sequence,
int num_bases, const char **basenames,
NMEM stream, NMEM rset_nmem,
Z_SortKeySpecList *sort_sequence,
int num_bases, const char **basenames,
int num_result_sets_r = 0;
res = rpn_search_structure(zh, zs->u.complex->s1,
int num_result_sets_r = 0;
res = rpn_search_structure(zh, zs->u.complex->s1,
- attributeSet, stream, rset_nmem,
+ attributeSet, hits_limit, stream, rset_nmem,
sort_sequence,
num_bases, basenames,
&result_sets_l, &num_result_sets_l,
sort_sequence,
num_bases, basenames,
&result_sets_l, &num_result_sets_l,
return res;
}
res = rpn_search_structure(zh, zs->u.complex->s2,
return res;
}
res = rpn_search_structure(zh, zs->u.complex->s2,
- attributeSet, stream, rset_nmem,
+ attributeSet, hits_limit, stream, rset_nmem,
sort_sequence,
num_bases, basenames,
&result_sets_r, &num_result_sets_r,
sort_sequence,
num_bases, basenames,
&result_sets_r, &num_result_sets_r,
{
yaz_log(YLOG_DEBUG, "rpn_search_APT");
res = rpn_search_APT(zh, zs->u.simple->u.attributesPlusTerm,
{
yaz_log(YLOG_DEBUG, "rpn_search_APT");
res = rpn_search_APT(zh, zs->u.simple->u.attributesPlusTerm,
- attributeSet, stream, sort_sequence,
+ attributeSet, hits_limit,
+ stream, sort_sequence,
num_bases, basenames, rset_nmem, &rset,
kc);
if (res != ZEBRA_OK)
num_bases, basenames, rset_nmem, &rset,
kc);
if (res != ZEBRA_OK)
rpn_get_top_approx_limit(zh, rpn->RPNStructure, &sset->approx_limit);
res = rpn_search_top(zh, rpn->RPNStructure, rpn->attributeSetId,
rpn_get_top_approx_limit(zh, rpn->RPNStructure, &sset->approx_limit);
res = rpn_search_top(zh, rpn->RPNStructure, rpn->attributeSetId,
nmem, rset_nmem,
sort_sequence,
sset->num_bases, sset->basenames,
nmem, rset_nmem,
sort_sequence,
sset->num_bases, sset->basenames,
for (i = 0; sort_sequence->specs[i]; i++)
;
sort_sequence->num_specs = i;
for (i = 0; sort_sequence->specs[i]; i++)
;
sort_sequence->num_specs = i;
- rset->hits_limit = sset->approx_limit;
+ rset_set_hits_limit(rset, sset->approx_limit);
+
if (!i)
{
res = resultSetRank(zh, sset, rset, rset_nmem);
if (!i)
{
res = resultSetRank(zh, sset, rset, rset_nmem);
}
if (rfd->counted_items > rset->hits_limit)
stop_flag = 1;
}
if (rfd->counted_items > rset->hits_limit)
stop_flag = 1;
+ if (stop_flag)
+ {
+ zebraSet->estimated_hit_count = 1;
+ break;
+ }
if (psysno)
{ /* only if we did have a previous record */
score = (*rc->calc)(handle, psysno, pstaticrank,
if (psysno)
{ /* only if we did have a previous record */
score = (*rc->calc)(handle, psysno, pstaticrank,
resultSetInsertRank(zh, sort_info, psysno, score, 'A');
count++;
}
resultSetInsertRank(zh, sort_info, psysno, score, 'A');
count++;
}
- 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];
psysno = this_sys;
if (zh->m_staticrank)
pstaticrank = key.mem[0];
static int log_level = 0;
static int log_level_initialized = 0;
static int log_level = 0;
static int log_level_initialized = 0;
/**
\brief Common constuctor for RFDs
\param rs Result set handle.
/**
\brief Common constuctor for RFDs
\param rs Result set handle.
void rset_set_hits_limit(RSET rs, zint l)
{
void rset_set_hits_limit(RSET rs, zint l)
{
+ yaz_log(log_level, "rset_set_hits_limit %p l=" ZINT_FORMAT, rs, l);