/* This file is part of the Zebra server.
- Copyright (C) 1994-2009 Index Data
+ Copyright (C) 1994-2011 Index Data
Zebra is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
*/
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <stdio.h>
#include <assert.h>
#ifdef WIN32
}
static int term_pre(zebra_map_t zm, const char **src,
- const char *ct1, const char *ct2, int first)
+ const char *ct1, int first)
{
const char *s1, *s0 = *src;
const char **map;
{
if (ct1 && strchr(ct1, *s0))
break;
- if (ct2 && strchr(ct2, *s0))
- break;
s1 = s0;
map = zebra_maps_input(zm, &s1, strlen(s1), first);
if (**map != *CHR_SPACE)
const char *space_start = 0;
const char *space_end = 0;
- if (!term_pre(zm, src, NULL, NULL, !space_split))
+ if (!term_pre(zm, src, 0, !space_split))
return 0;
s0 = *src;
while (*s0)
const char **map;
int i = 0;
- if (!term_pre(zm, src, "#", "#", !space_split))
+ if (!term_pre(zm, src, "#", !space_split))
return 0;
s0 = *src;
while (*s0)
const char *s0;
const char **map;
- if (!term_pre(zm, src, "^\\()[].*+?|", "(", !space_split))
+ if (!term_pre(zm, src, "^\\()[].*+?|", !space_split))
return 0;
s0 = *src;
if (errors && *s0 == '+' && s0[1] && s0[2] == '+' && s0[3] &&
}
-/* term_104: handle term, process # and ! */
+/* term_104: handle term, process ?n * # */
static int term_104(zebra_map_t zm, const char **src,
WRBUF term_dict, int space_split, WRBUF display_term)
{
const char **map;
int i = 0;
- if (!term_pre(zm, src, "?*#", "?*#", !space_split))
+ if (!term_pre(zm, src, "?*#", !space_split))
return 0;
s0 = *src;
while (*s0)
return i;
}
-/* term_105/106: handle term, where trunc = Process * and ! and right trunc */
+/* term_105/106: handle term, process * ! and possibly right_truncate */
static int term_105(zebra_map_t zm, const char **src,
WRBUF term_dict, int space_split,
WRBUF display_term, int right_truncate)
const char **map;
int i = 0;
- if (!term_pre(zm, src, "*!", "*!", !space_split))
+ if (!term_pre(zm, src, "\\*!", !space_split))
return 0;
s0 = *src;
while (*s0)
wrbuf_putc(display_term, *s0);
s0++;
}
+ else if (*s0 == '\\')
+ {
+ i++;
+ wrbuf_puts(term_dict, "\\\\");
+ wrbuf_putc(display_term, *s0);
+ s0++;
+ }
else
{
const char *s1 = s0;
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);
- *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);
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);
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,
{
ZEBRA_RES res;
struct ord_list *ol;
- zint hits_limit_value;
+ zint hits_limit_value = hits_limit;
const char *term_ref_id_str = 0;
WRBUF term_dict = wrbuf_alloc();
WRBUF display_term = wrbuf_alloc();
}
wrbuf_putc(term_dict, ')');
break;
- case 104: /* process # and ! in term */
+ case 104: /* process ?n * # term */
wrbuf_putc(term_dict, '(');
if (!term_104(zm, &termp, term_dict, space_split, display_term))
{
}
wrbuf_putc(term_dict, ')');
break;
- case 105: /* process * and ! in term */
+ case 105: /* process * ! in term and right truncate */
wrbuf_putc(term_dict, '(');
if (!term_105(zm, &termp, term_dict, space_split, display_term, 1))
{
}
wrbuf_putc(term_dict, ')');
break;
- case 106: /* process * and ! in term */
+ case 106: /* process * ! in term */
wrbuf_putc(term_dict, '(');
if (!term_105(zm, &termp, term_dict, space_split, display_term, 0))
{
Z_AttributesPlusTerm *zapt,
const char *termz,
const Odr_oid *attributeSet,
+ zint hits_limit,
NMEM stream,
const char *index_type, int complete_flag,
const char *rank_type,
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,
Z_AttributesPlusTerm *zapt,
const char *termz,
const Odr_oid *attributeSet,
+ zint hits_limit,
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));
- 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,
Z_AttributesPlusTerm *zapt,
const char *termz_org,
const Odr_oid *attributeSet,
+ zint hits_limit,
NMEM stream,
const char *index_type,
int complete_flag,
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,
Z_AttributesPlusTerm *zapt,
const char *termz_org,
const Odr_oid *attributeSet,
+ zint hits_limit,
NMEM stream,
const char *index_type,
int complete_flag,
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,
Z_AttributesPlusTerm *zapt,
const char *termz_org,
const Odr_oid *attributeSet,
+ zint hits_limit,
NMEM stream,
const char *index_type,
int complete_flag,
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,
sk->u.sortAttributes->id = odr_oiddup_nmem(stream, attributeSet);
sk->u.sortAttributes->list = zapt->attributes;
- sks->sortRelation = (int *)
+ sks->sortRelation = (Odr_int *)
nmem_malloc(stream, sizeof(*sks->sortRelation));
if (sort_relation_value == 1)
*sks->sortRelation = Z_SortKeySpec_ascending;
else
*sks->sortRelation = Z_SortKeySpec_ascending;
- sks->caseSensitivity = (int *)
+ sks->caseSensitivity = (Odr_int *)
nmem_malloc(stream, sizeof(*sks->caseSensitivity));
*sks->caseSensitivity = 0;
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,
- 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,
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)
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,
*/
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,
}
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,
}
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,
}
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,
ZEBRA_RES rpn_search_top(ZebraHandle zh, Z_RPNStructure *zs,
const Odr_oid *attributeSet,
+ zint hits_limit,
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);
- res = rpn_search_structure(zh, zs, attributeSet,
+ res = rpn_search_structure(zh, zs, attributeSet, hits_limit,
stream, rset_nmem,
sort_sequence,
num_bases, basenames,
}
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,
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,
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,
{
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)