-/* $Id: rpnsearch.c,v 1.27 2007-12-07 14:09:09 adam Exp $
+/* $Id: rpnsearch.c,v 1.28 2007-12-10 17:06:08 adam Exp $
Copyright (C) 1995-2007
Index Data ApS
static void add_non_space(const char *start, const char *end,
WRBUF term_dict,
- char *dst_term, int *dst_ptr,
+ WRBUF display_term,
const char **map, int q_map_match)
{
size_t sz = end - start;
- memcpy(dst_term + *dst_ptr, start, sz);
- (*dst_ptr) += sz;
+
+ wrbuf_write(display_term, start, sz);
if (!q_map_match)
{
while (start < end)
static int term_100_icu(zebra_map_t zm,
const char **src, WRBUF term_dict, int space_split,
- char *dst_term)
+ WRBUF display_term)
{
int i;
const char *res_buf = 0;
size_t res_len = 0;
- if (!zebra_map_tokenize_next(zm, &res_buf, &res_len))
+ const char *display_buf;
+ size_t display_len;
+ if (!zebra_map_tokenize_next(zm, &res_buf, &res_len,
+ &display_buf, &display_len))
{
*src += strlen(*src);
return 0;
}
- strcat(dst_term, *src);
+ wrbuf_write(display_term, display_buf, display_len);
for (i = 0; i < res_len; i++)
{
if (strchr(REGEX_CHARS, res_buf[i]))
/* term_100: handle term, where trunc = none(no operators at all) */
static int term_100(zebra_map_t zm,
const char **src, WRBUF term_dict, int space_split,
- char *dst_term)
+ WRBUF display_term)
{
const char *s0;
const char **map;
int i = 0;
- int j = 0;
const char *space_start = 0;
const char *space_end = 0;
if (zebra_maps_is_icu(zm))
- return term_100_icu(zm, src, term_dict, space_split, dst_term);
+ return term_100_icu(zm, src, term_dict, space_split, display_term);
if (!term_pre(zm, src, NULL, NULL, !space_split))
return 0;
{
if (strchr(REGEX_CHARS, *space_start))
wrbuf_putc(term_dict, '\\');
- dst_term[j++] = *space_start;
+ wrbuf_putc(display_term, *space_start);
wrbuf_putc(term_dict, *space_start);
space_start++;
}
i++;
- add_non_space(s1, s0, term_dict, dst_term, &j,
- map, q_map_match);
+ add_non_space(s1, s0, term_dict, display_term, map, q_map_match);
}
- dst_term[j] = '\0';
*src = s0;
return i;
}
/* term_101: handle term, where trunc = Process # */
static int term_101(zebra_map_t zm,
const char **src, WRBUF term_dict, int space_split,
- char *dst_term)
+ WRBUF display_term)
{
const char *s0;
const char **map;
int i = 0;
- int j = 0;
if (!term_pre(zm, src, "#", "#", !space_split))
return 0;
{
i++;
wrbuf_puts(term_dict, ".*");
- dst_term[j++] = *s0++;
+ wrbuf_putc(display_term, *s0);
+ s0++;
}
else
{
break;
i++;
- add_non_space(s1, s0, term_dict, dst_term, &j,
- map, q_map_match);
+ add_non_space(s1, s0, term_dict, display_term, map, q_map_match);
}
}
- dst_term[j++] = '\0';
*src = s0;
return i;
}
/* term_103: handle term, where trunc = re-2 (regular expressions) */
static int term_103(zebra_map_t zm, const char **src,
WRBUF term_dict, int *errors, int space_split,
- char *dst_term)
+ WRBUF display_term)
{
int i = 0;
- int j = 0;
const char *s0;
const char **map;
{
if (strchr("^\\()[].*+?|-", *s0))
{
- dst_term[j++] = *s0;
+ wrbuf_putc(display_term, *s0);
wrbuf_putc(term_dict, *s0);
s0++;
i++;
break;
i++;
- add_non_space(s1, s0, term_dict, dst_term, &j,
- map, q_map_match);
+ add_non_space(s1, s0, term_dict, display_term, map, q_map_match);
}
}
- dst_term[j] = '\0';
*src = s0;
return i;
/* term_103: handle term, where trunc = re-1 (regular expressions) */
static int term_102(zebra_map_t zm, const char **src,
- WRBUF term_dict, int space_split, char *dst_term)
+ WRBUF term_dict, int space_split, WRBUF display_term)
{
- return term_103(zm, src, term_dict, NULL, space_split, dst_term);
+ return term_103(zm, src, term_dict, NULL, space_split, display_term);
}
/* term_104: handle term, process # and ! */
static int term_104(zebra_map_t zm, const char **src,
- WRBUF term_dict, int space_split, char *dst_term)
+ WRBUF term_dict, int space_split, WRBUF display_term)
{
const char *s0;
const char **map;
int i = 0;
- int j = 0;
if (!term_pre(zm, src, "?*#", "?*#", !space_split))
return 0;
if (*s0 == '?')
{
i++;
- dst_term[j++] = *s0++;
+ wrbuf_putc(display_term, *s0);
+ s0++;
if (*s0 >= '0' && *s0 <= '9')
{
int limit = 0;
while (*s0 >= '0' && *s0 <= '9')
{
limit = limit * 10 + (*s0 - '0');
- dst_term[j++] = *s0++;
+ wrbuf_putc(display_term, *s0);
+ s0++;
}
if (limit > 20)
limit = 20;
{
i++;
wrbuf_puts(term_dict, ".*");
- dst_term[j++] = *s0++;
+ wrbuf_putc(display_term, *s0);
+ s0++;
}
else if (*s0 == '#')
{
i++;
wrbuf_puts(term_dict, ".");
- dst_term[j++] = *s0++;
+ wrbuf_putc(display_term, *s0);
+ s0++;
}
else
{
break;
i++;
- add_non_space(s1, s0, term_dict, dst_term, &j,
- map, q_map_match);
+ add_non_space(s1, s0, term_dict, display_term, map, q_map_match);
}
}
- dst_term[j++] = '\0';
*src = s0;
return i;
}
/* term_105/106: handle term, where trunc = Process * and ! and right trunc */
static int term_105(zebra_map_t zm, const char **src,
WRBUF term_dict, int space_split,
- char *dst_term, int right_truncate)
+ WRBUF display_term, int right_truncate)
{
const char *s0;
const char **map;
int i = 0;
- int j = 0;
if (!term_pre(zm, src, "*!", "*!", !space_split))
return 0;
{
i++;
wrbuf_puts(term_dict, ".*");
- dst_term[j++] = *s0++;
+ wrbuf_putc(display_term, *s0);
+ s0++;
}
else if (*s0 == '!')
{
i++;
wrbuf_putc(term_dict, '.');
- dst_term[j++] = *s0++;
+ wrbuf_putc(display_term, *s0);
+ s0++;
}
else
{
break;
i++;
- add_non_space(s1, s0, term_dict, dst_term, &j,
- map, q_map_match);
+ add_non_space(s1, s0, term_dict, display_term, map, q_map_match);
}
}
if (right_truncate)
wrbuf_puts(term_dict, ".*");
- dst_term[j++] = '\0';
*src = s0;
return i;
}
static int string_relation(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
const char **term_sub, WRBUF term_dict,
const Odr_oid *attributeSet,
- zebra_map_t zm, int space_split, char *term_dst,
+ zebra_map_t zm, int space_split,
+ WRBUF display_term,
int *error_code)
{
AttrType relation;
switch (relation_value)
{
case 1:
- if (!term_100(zm, term_sub, term_component, space_split, term_dst))
+ if (!term_100(zm, term_sub, term_component, space_split, display_term))
{
wrbuf_destroy(term_component);
return 0;
wrbuf_putc(term_dict, ')');
break;
case 2:
- if (!term_100(zm, term_sub, term_component, space_split, term_dst))
+ if (!term_100(zm, term_sub, term_component, space_split, display_term))
{
wrbuf_destroy(term_component);
return 0;
wrbuf_putc(term_dict, ')');
break;
case 5:
- if (!term_100(zm, term_sub, term_component, space_split, term_dst))
+ if (!term_100(zm, term_sub, term_component, space_split, display_term))
{
wrbuf_destroy(term_component);
return 0;
wrbuf_putc(term_dict, ')');
break;
case 4:
- if (!term_100(zm, term_sub, term_component, space_split, term_dst))
+ if (!term_100(zm, term_sub, term_component, space_split, display_term))
{
wrbuf_destroy(term_component);
return 0;
if (!**term_sub)
return 1;
yaz_log(log_level_rpn, "Relation =");
- if (!term_100(zm, term_sub, term_component, space_split, term_dst))
+ if (!term_100(zm, term_sub, term_component, space_split, display_term))
{
wrbuf_destroy(term_component);
return 0;
const Odr_oid *attributeSet, NMEM stream,
struct grep_info *grep_info,
const char *index_type, int complete_flag,
- char *term_dst,
+ WRBUF display_term,
const char *xpath_use,
struct ord_list **ol,
zebra_map_t zm);
const Odr_oid *attributeSet, NMEM stream,
struct grep_info *grep_info,
const char *index_type, int complete_flag,
- char *term_dst,
const char *rank_type,
const char *xpath_use,
NMEM rset_nmem,
zint hits_limit_value;
const char *term_ref_id_str = 0;
WRBUF term_dict = wrbuf_alloc();
+ WRBUF display_term = wrbuf_alloc();
*rset = 0;
zebra_term_limits_APT(zh, zapt, &hits_limit_value, &term_ref_id_str,
stream);
res = string_term(zh, zapt, term_sub, term_dict,
attributeSet, stream, grep_info,
index_type, complete_flag,
- term_dst, xpath_use, &ol, zm);
+ display_term, xpath_use, &ol, zm);
wrbuf_destroy(term_dict);
- if (res != ZEBRA_OK)
- return res;
- if (!*term_sub) /* no more terms ? */
- return res;
- yaz_log(log_level_rpn, "term: %s", term_dst);
- *rset = rset_trunc(zh, grep_info->isam_p_buf,
- grep_info->isam_p_indx, term_dst,
- strlen(term_dst), rank_type, 1 /* preserve pos */,
- zapt->term->which, rset_nmem,
- kc, kc->scope, ol, index_type, hits_limit_value,
- term_ref_id_str);
- if (!*rset)
- return ZEBRA_FAIL;
- return ZEBRA_OK;
+ if (res == ZEBRA_OK && *term_sub)
+ {
+ yaz_log(log_level_rpn, "term: %s", wrbuf_cstr(display_term));
+ *rset = rset_trunc(zh, grep_info->isam_p_buf,
+ grep_info->isam_p_indx, wrbuf_buf(display_term),
+ wrbuf_len(display_term), rank_type,
+ 1 /* preserve pos */,
+ zapt->term->which, rset_nmem,
+ kc, kc->scope, ol, index_type, hits_limit_value,
+ term_ref_id_str);
+ if (!*rset)
+ res = ZEBRA_FAIL;
+ }
+ wrbuf_destroy(display_term);
+ return res;
}
static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
const Odr_oid *attributeSet, NMEM stream,
struct grep_info *grep_info,
const char *index_type, int complete_flag,
- char *term_dst,
+ WRBUF display_term,
const char *xpath_use,
struct ord_list **ol,
zebra_map_t zm)
case 100: /* do not truncate */
if (!string_relation(zh, zapt, &termp, term_dict,
attributeSet,
- zm, space_split, term_dst,
+ zm, space_split, display_term,
&relation_error))
{
if (relation_error)
break;
case 1: /* right truncation */
wrbuf_putc(term_dict, '(');
- if (!term_100(zm, &termp, term_dict, space_split, term_dst))
+ if (!term_100(zm, &termp, term_dict, space_split, display_term))
{
*term_sub = 0;
return ZEBRA_OK;
break;
case 2: /* keft truncation */
wrbuf_puts(term_dict, "(.*");
- if (!term_100(zm, &termp, term_dict, space_split, term_dst))
+ if (!term_100(zm, &termp, term_dict, space_split, display_term))
{
*term_sub = 0;
return ZEBRA_OK;
break;
case 3: /* left&right truncation */
wrbuf_puts(term_dict, "(.*");
- if (!term_100(zm, &termp, term_dict, space_split, term_dst))
+ if (!term_100(zm, &termp, term_dict, space_split, display_term))
{
*term_sub = 0;
return ZEBRA_OK;
break;
case 101: /* process # in term */
wrbuf_putc(term_dict, '(');
- if (!term_101(zm, &termp, term_dict, space_split, term_dst))
+ if (!term_101(zm, &termp, term_dict, space_split, display_term))
{
*term_sub = 0;
return ZEBRA_OK;
break;
case 102: /* Regexp-1 */
wrbuf_putc(term_dict, '(');
- if (!term_102(zm, &termp, term_dict, space_split, term_dst))
+ if (!term_102(zm, &termp, term_dict, space_split, display_term))
{
*term_sub = 0;
return ZEBRA_OK;
regex_range = 1;
wrbuf_putc(term_dict, '(');
if (!term_103(zm, &termp, term_dict, ®ex_range,
- space_split, term_dst))
+ space_split, display_term))
{
*term_sub = 0;
return ZEBRA_OK;
break;
case 104: /* process # and ! in term */
wrbuf_putc(term_dict, '(');
- if (!term_104(zm, &termp, term_dict, space_split, term_dst))
+ if (!term_104(zm, &termp, term_dict, space_split, display_term))
{
*term_sub = 0;
return ZEBRA_OK;
break;
case 105: /* process * and ! in term */
wrbuf_putc(term_dict, '(');
- if (!term_105(zm, &termp, term_dict, space_split, term_dst, 1))
+ if (!term_105(zm, &termp, term_dict, space_split, display_term, 1))
{
*term_sub = 0;
return ZEBRA_OK;
break;
case 106: /* process * and ! in term */
wrbuf_putc(term_dict, '(');
- if (!term_105(zm, &termp, term_dict, space_split, term_dst, 0))
+ if (!term_105(zm, &termp, term_dict, space_split, display_term, 0))
{
*term_sub = 0;
return ZEBRA_OK;
struct rset_key_control *kc,
zebra_map_t zm)
{
- char term_dst[IT_MAX_WORD+1];
struct grep_info grep_info;
const char *termp = termz;
int alloc_sets = 0;
*num_result_sets = 0;
- *term_dst = 0;
if (grep_info_prepare(zh, zapt, &grep_info, index_type) == ZEBRA_FAIL)
return ZEBRA_FAIL;
- while(1)
+ while (1)
{
ZEBRA_RES res;
res = search_term(zh, zapt, &termp, attributeSet,
stream, &grep_info,
index_type, complete_flag,
- term_dst, rank_type,
+ rank_type,
xpath_use, rset_nmem,
&(*result_sets)[*num_result_sets],
kc, zm);
struct grep_info *grep_info,
int *max_pos,
zebra_map_t zm,
- char *term_dst,
+ WRBUF display_term,
int *error_code)
{
AttrType relation;
{
case 1:
yaz_log(log_level_rpn, "Relation <");
- if (!term_100(zm, term_sub, term_num, 1, term_dst))
+ if (!term_100(zm, term_sub, term_num, 1, display_term))
{
wrbuf_destroy(term_num);
return 0;
break;
case 2:
yaz_log(log_level_rpn, "Relation <=");
- if (!term_100(zm, term_sub, term_num, 1, term_dst))
+ if (!term_100(zm, term_sub, term_num, 1, display_term))
{
wrbuf_destroy(term_num);
return 0;
break;
case 4:
yaz_log(log_level_rpn, "Relation >=");
- if (!term_100(zm, term_sub, term_num, 1, term_dst))
+ if (!term_100(zm, term_sub, term_num, 1, display_term))
{
wrbuf_destroy(term_num);
return 0;
break;
case 5:
yaz_log(log_level_rpn, "Relation >");
- if (!term_100(zm, term_sub, term_num, 1, term_dst))
+ if (!term_100(zm, term_sub, term_num, 1, display_term))
{
wrbuf_destroy(term_num);
return 0;
case -1:
case 3:
yaz_log(log_level_rpn, "Relation =");
- if (!term_100(zm, term_sub, term_num, 1, term_dst))
+ if (!term_100(zm, term_sub, term_num, 1, display_term))
{
wrbuf_destroy(term_num);
return 0;
const Odr_oid *attributeSet, NMEM stream,
struct grep_info *grep_info,
const char *index_type, int complete_flag,
- char *term_dst,
+ WRBUF display_term,
const char *xpath_use,
struct ord_list **ol)
{
if (!numeric_relation(zh, zapt, &termp, term_dict,
attributeSet, grep_info, &max_pos, zm,
- term_dst, &relation_error))
+ display_term, &relation_error))
{
if (relation_error)
{
RSET *rset,
struct rset_key_control *kc)
{
- char term_dst[IT_MAX_WORD+1];
const char *termp = termz;
RSET *result_sets = 0;
int num_result_sets = 0;
{
struct ord_list *ol;
WRBUF term_dict = wrbuf_alloc();
+ WRBUF display_term = wrbuf_alloc();
if (alloc_sets == num_result_sets)
{
int add = 10;
res = numeric_term(zh, zapt, &termp, term_dict,
attributeSet, stream, &grep_info,
index_type, complete_flag,
- term_dst, xpath_use, &ol);
+ display_term, xpath_use, &ol);
wrbuf_destroy(term_dict);
if (res == ZEBRA_FAIL || termp == 0)
+ {
+ wrbuf_destroy(display_term);
break;
- yaz_log(YLOG_DEBUG, "term: %s", term_dst);
+ }
+ yaz_log(YLOG_DEBUG, "term: %s", wrbuf_cstr(display_term));
result_sets[num_result_sets] =
rset_trunc(zh, grep_info.isam_p_buf,
- grep_info.isam_p_indx, term_dst,
- strlen(term_dst), rank_type,
+ grep_info.isam_p_indx, wrbuf_buf(display_term),
+ wrbuf_len(display_term), rank_type,
0 /* preserve position */,
zapt->term->which, rset_nmem,
kc, kc->scope, ol, index_type,
hits_limit_value,
term_ref_id_str);
+ wrbuf_destroy(display_term);
if (!result_sets[num_result_sets])
break;
num_result_sets++;