-/* $Id: rpnsearch.c,v 1.31 2008-01-26 15:48:29 adam Exp $
- Copyright (C) 1995-2007
- Index Data ApS
-
-This file is part of the Zebra server.
+/* This file is part of the Zebra server.
+ Copyright (C) 2004-2013 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
dict_grep_cmap(reg->dict, map_info, rpn_char_map_handler);
}
-#define TERM_COUNT
-
-struct grep_info {
-#ifdef TERM_COUNT
- int *term_no;
-#endif
+#define TERM_COUNT
+
+struct grep_info {
+#ifdef TERM_COUNT
+ int *term_no;
+#endif
ISAM_P *isam_p_buf;
- int isam_p_size;
+ int isam_p_size;
int isam_p_indx;
int trunc_max;
ZebraHandle zh;
const char *index_type;
ZebraSet termset;
-};
+};
static int add_isam_p(const char *name, const char *info,
struct grep_info *p)
if (p->isam_p_indx == p->isam_p_size)
{
ISAM_P *new_isam_p_buf;
-#ifdef TERM_COUNT
- int *new_term_no;
+#ifdef TERM_COUNT
+ int *new_term_no;
#endif
p->isam_p_size = 2*p->isam_p_size + 100;
new_isam_p_buf = (ISAM_P *) xmalloc(sizeof(*new_isam_p_buf) *
int ord = 0;
const char *index_name;
int len = key_SU_decode(&ord, (const unsigned char *) name);
-
+
zebra_term_untrans (p->zh, p->index_type, term_tmp, name+len);
yaz_log(log_level_rpn, "grep: %d %c %s", ord, name[len], term_tmp);
zebraExplain_lookup_ord(p->zh->reg->zei,
ord, 0 /* index_type */, &db, &index_name);
yaz_log(log_level_rpn, "grep: db=%s index=%s", db, index_name);
-
+
resultSetAddTerm(p->zh, p->termset, name[len], db,
index_name, term_tmp);
}
}
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)
assert(in_buf);
assert(out_size > 20);
*out_buf = '\0';
- for (k = 0; k<in_size; k++)
+ for (k = 0; k < in_size; k++)
{
int c = in_buf[k] & 0xff;
int pc;
}
}
-#define REGEX_CHARS " []()|.*+?!\"$"
+#define REGEX_CHARS " ^[]()|.*+?!\"$\\"
static void add_non_space(const char *start, const char *end,
WRBUF term_dict,
{
char tmpbuf[80];
esc_str(tmpbuf, sizeof(tmpbuf), map[0], strlen(map[0]));
-
+
wrbuf_puts(term_dict, map[0]);
}
}
-static int term_100_icu(zebra_map_t zm,
+/* ICU sort keys seem to be of the form
+ basechars \x01 accents \x01 length
+ For now we'll just right truncate from basechars . This
+ may give false hits due to accents not being used.
+*/
+static size_t icu_basechars(const char *buf, size_t i)
+{
+ while (i > 0 && buf[--i] != '\x01') /* skip length */
+ ;
+ while (i > 0 && buf[--i] != '\x01') /* skip accents */
+ ;
+ return i; /* only basechars left */
+}
+
+static int term_102_icu(zebra_map_t zm,
const char **src, WRBUF term_dict, int space_split,
WRBUF display_term)
{
- int i;
+ int no_terms = 0;
+ const char *s0 = *src, *s1;
+ while (*s0 == ' ')
+ s0++;
+ s1 = s0;
+ for (;;)
+ {
+ if (*s1 == ' ' && space_split)
+ break;
+ else if (*s1 && !strchr(REGEX_CHARS "-", *s1))
+ s1++;
+ else
+ {
+ /* EOF or regex reserved char */
+ if (s0 != s1)
+ {
+ const char *res_buf = 0;
+ size_t res_len = 0;
+ const char *display_buf;
+ size_t display_len;
+
+ zebra_map_tokenize_start(zm, s0, s1 - s0);
+
+ if (zebra_map_tokenize_next(zm, &res_buf, &res_len,
+ &display_buf, &display_len))
+ {
+ size_t i;
+ res_len = icu_basechars(res_buf, res_len);
+ for (i = 0; i < res_len; i++)
+ {
+ if (strchr(REGEX_CHARS "\\", res_buf[i]))
+ wrbuf_putc(term_dict, '\\');
+ if (res_buf[i] < 32)
+ wrbuf_putc(term_dict, '\x01');
+
+ wrbuf_putc(term_dict, res_buf[i]);
+ }
+ wrbuf_write(display_term, display_buf, display_len);
+
+ no_terms++;
+ }
+ }
+ if (*s1 == '\0')
+ break;
+
+ wrbuf_putc(term_dict, *s1);
+ wrbuf_putc(display_term, *s1);
+
+ s1++;
+ s0 = s1;
+ }
+ }
+ if (no_terms)
+ wrbuf_puts(term_dict, "\x01\x01.*");
+ *src = s1;
+ return no_terms;
+}
+
+static int term_100_icu(zebra_map_t zm,
+ const char **src, WRBUF term_dict, int space_split,
+ WRBUF display_term,
+ int mode)
+{
+ size_t i;
const char *res_buf = 0;
size_t res_len = 0;
const char *display_buf;
size_t display_len;
+ const char *s0 = *src, *s1;
+
+ while (*s0 == ' ')
+ s0++;
+
+ if (*s0 == '\0')
+ return 0;
+
+ if (space_split)
+ {
+ s1 = s0;
+ while (*s1 && *s1 != ' ')
+ s1++;
+ }
+ else
+ s1 = s0 + strlen(s0);
+
+ *src = s1;
+
+ zebra_map_tokenize_start(zm, s0, s1 - s0);
+
if (!zebra_map_tokenize_next(zm, &res_buf, &res_len,
&display_buf, &display_len))
{
- *src += strlen(*src);
return 0;
}
wrbuf_write(display_term, display_buf, display_len);
+ if (mode)
+ {
+ res_len = icu_basechars(res_buf, res_len);
+ }
+ if (mode & 2)
+ wrbuf_puts(term_dict, ".*");
for (i = 0; i < res_len; i++)
{
if (strchr(REGEX_CHARS "\\", res_buf[i]))
wrbuf_putc(term_dict, '\\');
if (res_buf[i] < 32)
- wrbuf_putc(term_dict, 1);
+ wrbuf_putc(term_dict, '\x01');
+
wrbuf_putc(term_dict, res_buf[i]);
}
+ if (mode & 1)
+ wrbuf_puts(term_dict, ".*");
+ else if (mode)
+ wrbuf_puts(term_dict, "\x01\x01.*");
return 1;
}
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, display_term);
-
- if (!term_pre(zm, src, NULL, NULL, !space_split))
+ if (!term_pre(zm, src, 0, !space_split))
return 0;
s0 = *src;
while (*s0)
wrbuf_putc(display_term, *space_start);
wrbuf_putc(term_dict, *space_start);
space_start++;
-
+
}
/* and reset */
space_start = space_end = 0;
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] &&
}
}
*src = s0;
-
+
return i;
}
}
-/* term_104: handle term, process # and ! */
-static int term_104(zebra_map_t zm, const char **src,
+/* 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 *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)
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,
+/* 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;
strcpy(dst, "(-[0-9]+|(");
else
strcpy(dst, "((");
- }
+ }
else
{
if (!islt)
if (d == '0')
continue;
d--;
- }
+ }
else
{
if (d == '9')
d++;
}
}
-
+
strcpy(dst + dst_p, numstr);
dst_p = strlen(dst) - pos - 1;
else
{
if (d != '9')
- {
+ {
dst[dst_p++] = '[';
dst[dst_p++] = d;
dst[dst_p++] = '-';
else
dst[dst_p++] = d;
}
- for (i = 0; i<pos; i++)
+ for (i = 0; i < pos; i++)
{
dst[dst_p++] = '[';
dst[dst_p++] = '0';
{
/* match everything less than 10^(pos-1) */
strcat(dst, "0*");
- for (i = 1; i<pos; i++)
+ for (i = 1; i < pos; i++)
strcat(dst, "[0-9]?");
}
else
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,
+ zebra_map_t zm, int space_split,
WRBUF display_term,
int *error_code)
{
return 0;
}
yaz_log(log_level_rpn, "Relation <");
-
+
wrbuf_putc(term_dict, '(');
for (i = 0; i < wrbuf_len(term_component); )
{
int j = 0;
-
+
if (i)
wrbuf_putc(term_dict, '|');
while (j < i)
wrbuf_putc(term_dict, '[');
wrbuf_putc(term_dict, '^');
-
+
wrbuf_putc(term_dict, 1);
wrbuf_putc(term_dict, FIRST_IN_FIELD_CHAR);
-
+
string_rel_add_char(term_dict, term_component, &i);
wrbuf_putc(term_dict, '-');
-
+
wrbuf_putc(term_dict, ']');
wrbuf_putc(term_dict, '.');
wrbuf_putc(term_dict, '*');
while (j < i)
string_rel_add_char(term_dict, term_component, &j);
wrbuf_putc(term_dict, '[');
-
+
wrbuf_putc(term_dict, '^');
wrbuf_putc(term_dict, '-');
string_rel_add_char(term_dict, term_component, &i);
}
static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
- const char **term_sub,
+ const char **term_sub,
WRBUF term_dict,
const Odr_oid *attributeSet, NMEM stream,
struct grep_info *grep_info,
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 char **term_sub,
+ 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,
+ const char *rank_type,
const char *xpath_use,
NMEM rset_nmem,
RSET *rset,
{
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();
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,
+ wrbuf_len(display_term), rank_type,
1 /* preserve pos */,
zapt->term->which, rset_nmem,
kc, kc->scope, ol, index_type, hits_limit_value,
}
static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
- const char **term_sub,
+ const char **term_sub,
WRBUF term_dict,
const Odr_oid *attributeSet, NMEM stream,
struct grep_info *grep_info,
yaz_log(log_level_rpn, "truncation value %d", truncation_value);
termp = *term_sub; /* start of term for each database */
-
+
if (zebra_apt_get_ord(zh, zapt, index_type, xpath_use,
attributeSet, &ord) != ZEBRA_OK)
{
*term_sub = 0;
return ZEBRA_FAIL;
}
-
+
wrbuf_rewind(term_dict); /* new dictionary regexp term */
-
+
*ol = ord_list_append(stream, *ol, ord);
ord_len = key_SU_encode(ord, ord_buf);
-
+
wrbuf_putc(term_dict, '(');
-
- for (i = 0; i<ord_len; i++)
+
+ for (i = 0; i < ord_len; i++)
{
wrbuf_putc(term_dict, 1); /* our internal regexp escape char */
wrbuf_putc(term_dict, ord_buf[i]);
}
wrbuf_putc(term_dict, ')');
-
+
prefix_len = wrbuf_len(term_dict);
-
- switch (truncation_value)
- {
- case -1: /* not specified */
- case 100: /* do not truncate */
- if (!string_relation(zh, zapt, &termp, term_dict,
- attributeSet,
- zm, space_split, display_term,
- &relation_error))
+
+ if (zebra_maps_is_icu(zm))
+ {
+ int relation_value;
+ AttrType relation;
+
+ attr_init_APT(&relation, zapt, 2);
+ relation_value = attr_find(&relation, NULL);
+ if (relation_value == 103) /* always matches */
+ termp += strlen(termp); /* move to end of term */
+ else if (relation_value == 3 || relation_value == 102 || relation_value == -1)
{
- if (relation_error)
+ /* ICU case */
+ switch (truncation_value)
{
- zebra_setError(zh, relation_error, 0);
+ case -1: /* not specified */
+ case 100: /* do not truncate */
+ if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 0))
+ {
+ *term_sub = 0;
+ return ZEBRA_OK;
+ }
+ break;
+ case 102:
+ if (!term_102_icu(zm, &termp, term_dict, space_split, display_term))
+ {
+ *term_sub = 0;
+ return ZEBRA_OK;
+ }
+ break;
+ case 1: /* right truncation */
+ if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 1))
+ {
+ *term_sub = 0;
+ return ZEBRA_OK;
+ }
+ break;
+ case 2:
+ if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 2))
+ {
+ *term_sub = 0;
+ return ZEBRA_OK;
+ }
+ break;
+ case 3:
+ if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 3))
+ {
+ *term_sub = 0;
+ return ZEBRA_OK;
+ }
+ break;
+ default:
+ zebra_setError_zint(zh,
+ YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE,
+ truncation_value);
return ZEBRA_FAIL;
}
- *term_sub = 0;
- return ZEBRA_OK;
}
- break;
- case 1: /* right truncation */
- wrbuf_putc(term_dict, '(');
- if (!term_100(zm, &termp, term_dict, space_split, display_term))
- {
- *term_sub = 0;
- return ZEBRA_OK;
- }
- wrbuf_puts(term_dict, ".*)");
- break;
- case 2: /* keft truncation */
- wrbuf_puts(term_dict, "(.*");
- if (!term_100(zm, &termp, term_dict, space_split, display_term))
- {
- *term_sub = 0;
- return ZEBRA_OK;
- }
- wrbuf_putc(term_dict, ')');
- break;
- case 3: /* left&right truncation */
- wrbuf_puts(term_dict, "(.*");
- if (!term_100(zm, &termp, term_dict, space_split, display_term))
- {
- *term_sub = 0;
- return ZEBRA_OK;
- }
- wrbuf_puts(term_dict, ".*)");
- break;
- case 101: /* process # in term */
- wrbuf_putc(term_dict, '(');
- if (!term_101(zm, &termp, term_dict, space_split, display_term))
- {
- *term_sub = 0;
- return ZEBRA_OK;
- }
- wrbuf_puts(term_dict, ")");
- break;
- case 102: /* Regexp-1 */
- wrbuf_putc(term_dict, '(');
- if (!term_102(zm, &termp, term_dict, space_split, display_term))
- {
- *term_sub = 0;
- return ZEBRA_OK;
- }
- wrbuf_putc(term_dict, ')');
- break;
- case 103: /* Regexp-2 */
- regex_range = 1;
- wrbuf_putc(term_dict, '(');
- if (!term_103(zm, &termp, term_dict, ®ex_range,
- space_split, display_term))
- {
- *term_sub = 0;
- return ZEBRA_OK;
- }
- wrbuf_putc(term_dict, ')');
- break;
- case 104: /* process # and ! in term */
- wrbuf_putc(term_dict, '(');
- if (!term_104(zm, &termp, term_dict, space_split, display_term))
- {
- *term_sub = 0;
- return ZEBRA_OK;
- }
- wrbuf_putc(term_dict, ')');
- break;
- case 105: /* process * and ! in term */
- wrbuf_putc(term_dict, '(');
- if (!term_105(zm, &termp, term_dict, space_split, display_term, 1))
+ else
{
- *term_sub = 0;
- return ZEBRA_OK;
+ zebra_setError_zint(zh,
+ YAZ_BIB1_UNSUPP_RELATION_ATTRIBUTE,
+ relation_value);
+ return ZEBRA_FAIL;
}
- wrbuf_putc(term_dict, ')');
- break;
- case 106: /* process * and ! in term */
- wrbuf_putc(term_dict, '(');
- if (!term_105(zm, &termp, term_dict, space_split, display_term, 0))
+ }
+ else
+ {
+ /* non-ICU case. using string.chr and friends */
+ switch (truncation_value)
{
- *term_sub = 0;
- return ZEBRA_OK;
+ case -1: /* not specified */
+ case 100: /* do not truncate */
+ if (!string_relation(zh, zapt, &termp, term_dict,
+ attributeSet,
+ zm, space_split, display_term,
+ &relation_error))
+ {
+ if (relation_error)
+ {
+ zebra_setError(zh, relation_error, 0);
+ return ZEBRA_FAIL;
+ }
+ *term_sub = 0;
+ return ZEBRA_OK;
+ }
+ break;
+ case 1: /* right truncation */
+ wrbuf_putc(term_dict, '(');
+ if (!term_100(zm, &termp, term_dict, space_split, display_term))
+ {
+ *term_sub = 0;
+ return ZEBRA_OK;
+ }
+ wrbuf_puts(term_dict, ".*)");
+ break;
+ case 2: /* left truncation */
+ wrbuf_puts(term_dict, "(.*");
+ if (!term_100(zm, &termp, term_dict, space_split, display_term))
+ {
+ *term_sub = 0;
+ return ZEBRA_OK;
+ }
+ wrbuf_putc(term_dict, ')');
+ break;
+ case 3: /* left&right truncation */
+ wrbuf_puts(term_dict, "(.*");
+ if (!term_100(zm, &termp, term_dict, space_split, display_term))
+ {
+ *term_sub = 0;
+ return ZEBRA_OK;
+ }
+ wrbuf_puts(term_dict, ".*)");
+ break;
+ case 101: /* process # in term */
+ wrbuf_putc(term_dict, '(');
+ if (!term_101(zm, &termp, term_dict, space_split, display_term))
+ {
+ *term_sub = 0;
+ return ZEBRA_OK;
+ }
+ wrbuf_puts(term_dict, ")");
+ break;
+ case 102: /* Regexp-1 */
+ wrbuf_putc(term_dict, '(');
+ if (!term_102(zm, &termp, term_dict, space_split, display_term))
+ {
+ *term_sub = 0;
+ return ZEBRA_OK;
+ }
+ wrbuf_putc(term_dict, ')');
+ break;
+ case 103: /* Regexp-2 */
+ regex_range = 1;
+ wrbuf_putc(term_dict, '(');
+ if (!term_103(zm, &termp, term_dict, ®ex_range,
+ space_split, display_term))
+ {
+ *term_sub = 0;
+ return ZEBRA_OK;
+ }
+ wrbuf_putc(term_dict, ')');
+ break;
+ case 104: /* process ?n * # term */
+ wrbuf_putc(term_dict, '(');
+ if (!term_104(zm, &termp, term_dict, space_split, display_term))
+ {
+ *term_sub = 0;
+ return ZEBRA_OK;
+ }
+ wrbuf_putc(term_dict, ')');
+ break;
+ case 105: /* process * ! in term and right truncate */
+ wrbuf_putc(term_dict, '(');
+ if (!term_105(zm, &termp, term_dict, space_split, display_term, 1))
+ {
+ *term_sub = 0;
+ return ZEBRA_OK;
+ }
+ wrbuf_putc(term_dict, ')');
+ break;
+ case 106: /* process * ! in term */
+ wrbuf_putc(term_dict, '(');
+ if (!term_105(zm, &termp, term_dict, space_split, display_term, 0))
+ {
+ *term_sub = 0;
+ return ZEBRA_OK;
+ }
+ wrbuf_putc(term_dict, ')');
+ break;
+ default:
+ zebra_setError_zint(zh,
+ YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE,
+ truncation_value);
+ return ZEBRA_FAIL;
}
- wrbuf_putc(term_dict, ')');
- break;
- default:
- zebra_setError_zint(zh,
- YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE,
- truncation_value);
- return ZEBRA_FAIL;
}
if (1)
{
wrbuf_destroy(pr_wr);
}
r = dict_lookup_grep(zh->reg->dict, wrbuf_cstr(term_dict), regex_range,
- grep_info, &max_pos,
+ grep_info, &max_pos,
ord_len /* number of "exact" chars */,
grep_handle);
if (r == 1)
const char *termset_name = 0;
if (termset_value_numeric != -2)
{
-
+
sprintf(resname, "%d", termset_value_numeric);
termset_name = resname;
}
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,
struct grep_info grep_info;
const char *termp = termz;
int alloc_sets = 0;
-
+
*num_result_sets = 0;
if (grep_info_prepare(zh, zapt, &grep_info, index_type) == ZEBRA_FAIL)
return ZEBRA_FAIL;
while (1)
- {
+ {
ZEBRA_RES res;
if (alloc_sets == *num_result_sets)
{
int add = 10;
- RSET *rnew = (RSET *) nmem_malloc(stream, (alloc_sets+add) *
+ RSET *rnew = (RSET *) nmem_malloc(stream, (alloc_sets+add) *
sizeof(*rnew));
if (alloc_sets)
memcpy(rnew, *result_sets, alloc_sets * sizeof(*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,
grep_info_delete(&grep_info);
return ZEBRA_OK;
}
-
+
/**
\brief Create result set(s) for list of terms
\param zh Zebra Handle
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,
struct rset_key_control *kc)
{
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,
char *val;
ISAM_P isam_p;
zebra_map_t zm = zebra_map_get_or_add(zh->reg->zebra_maps, index_type);
-
+
attr_init_APT(&position, zapt, 3);
position_value = attr_find(&position, NULL);
switch(position_value)
assert(*val == sizeof(ISAM_P));
memcpy(&isam_p, val+1, sizeof(isam_p));
- *rset = zebra_create_rset_isam(zh, rset_nmem, kc, kc->scope,
+ *rset = zebra_create_rset_isam(zh, rset_nmem, kc, kc->scope,
isam_p, 0);
}
return ZEBRA_OK;
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,
&result_sets, &num_result_sets, kc);
-
+
if (res != ZEBRA_OK)
return res;
if (num_result_sets > 0)
{
RSET first_set = 0;
- res = search_position(zh, zapt, attributeSet,
+ res = search_position(zh, zapt, attributeSet,
index_type,
rset_nmem, &first_set,
kc);
if (res != ZEBRA_OK)
{
int i;
- for (i = 0; i<num_result_sets; i++)
+ for (i = 0; i < num_result_sets; i++)
rset_delete(result_sets[i]);
return res;
}
}
}
if (num_result_sets == 0)
- *rset = rset_create_null(rset_nmem, kc, 0);
+ *rset = rset_create_null(rset_nmem, kc, 0);
else if (num_result_sets == 1)
*rset = result_sets[0];
else
Z_AttributesPlusTerm *zapt,
const char *termz_org,
const Odr_oid *attributeSet,
+ zint hits_limit,
NMEM stream,
- const char *index_type,
+ const char *index_type,
int complete_flag,
const char *rank_type,
const char *xpath_use,
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,
if (res != ZEBRA_OK)
return res;
- for (i = 0; i<num_result_sets; i++)
+ for (i = 0; i < num_result_sets; i++)
{
RSET first_set = 0;
- res = search_position(zh, zapt, attributeSet,
+ res = search_position(zh, zapt, attributeSet,
index_type,
rset_nmem, &first_set,
kc);
if (res != ZEBRA_OK)
{
- for (i = 0; i<num_result_sets; i++)
+ for (i = 0; i < num_result_sets; i++)
rset_delete(result_sets[i]);
return res;
}
tmp_set[0] = first_set;
tmp_set[1] = result_sets[i];
-
+
result_sets[i] = rset_create_prox(
rset_nmem, kc, kc->scope,
2, tmp_set,
}
}
if (num_result_sets == 0)
- *rset = rset_create_null(rset_nmem, kc, 0);
+ *rset = rset_create_null(rset_nmem, kc, 0);
else if (num_result_sets == 1)
*rset = result_sets[0];
else
Z_AttributesPlusTerm *zapt,
const char *termz_org,
const Odr_oid *attributeSet,
+ zint hits_limit,
NMEM stream,
- const char *index_type,
+ const char *index_type,
int complete_flag,
- const char *rank_type,
+ const char *rank_type,
const char *xpath_use,
NMEM rset_nmem,
RSET *rset,
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,
kc);
if (res != ZEBRA_OK)
return res;
- for (i = 0; i<num_result_sets; i++)
+ for (i = 0; i < num_result_sets; i++)
{
RSET first_set = 0;
- res = search_position(zh, zapt, attributeSet,
+ res = search_position(zh, zapt, attributeSet,
index_type,
rset_nmem, &first_set,
kc);
if (res != ZEBRA_OK)
{
- for (i = 0; i<num_result_sets; i++)
+ for (i = 0; i < num_result_sets; i++)
rset_delete(result_sets[i]);
return res;
}
tmp_set[0] = first_set;
tmp_set[1] = result_sets[i];
-
+
result_sets[i] = rset_create_prox(
rset_nmem, kc, kc->scope,
2, tmp_set,
if (num_result_sets == 0)
- *rset = rset_create_null(rset_nmem, kc, 0);
+ *rset = rset_create_null(rset_nmem, kc, 0);
else if (num_result_sets == 1)
*rset = result_sets[0];
else
case 1:
yaz_log(log_level_rpn, "Relation <");
if (!term_100(zm, term_sub, term_num, 1, display_term))
- {
+ {
wrbuf_destroy(term_num);
return 0;
}
if (!term_100(zm, term_sub, term_num, 1, display_term))
{
wrbuf_destroy(term_num);
- return 0;
+ return 0;
}
term_value = atoi(wrbuf_cstr(term_num));
wrbuf_printf(term_dict, "(0*%d)", term_value);
break;
default:
*error_code = YAZ_BIB1_UNSUPP_RELATION_ATTRIBUTE;
- wrbuf_destroy(term_num);
+ wrbuf_destroy(term_num);
return 0;
}
- r = dict_lookup_grep(zh->reg->dict, wrbuf_cstr(term_dict),
+ r = dict_lookup_grep(zh->reg->dict, wrbuf_cstr(term_dict),
0, grep_info, max_pos, 0, grep_handle);
if (r == 1)
}
static ZEBRA_RES numeric_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
- const char **term_sub,
+ const char **term_sub,
WRBUF term_dict,
const Odr_oid *attributeSet, NMEM stream,
struct grep_info *grep_info,
int ord, ord_len, i;
char ord_buf[32];
zebra_map_t zm = zebra_map_get_or_add(zh->reg->zebra_maps, index_type);
-
+
*ol = ord_list_create(stream);
rpn_char_map_prepare(zh->reg, zm, &rcmi);
termp = *term_sub;
-
+
if (zebra_apt_get_ord(zh, zapt, index_type, xpath_use,
attributeSet, &ord) != ZEBRA_OK)
{
return ZEBRA_FAIL;
}
-
+
wrbuf_rewind(term_dict);
-
+
*ol = ord_list_append(stream, *ol, ord);
-
+
ord_len = key_SU_encode(ord, ord_buf);
-
+
wrbuf_putc(term_dict, '(');
for (i = 0; i < ord_len; i++)
{
wrbuf_putc(term_dict, ord_buf[i]);
}
wrbuf_putc(term_dict, ')');
-
+
if (!numeric_relation(zh, zapt, &termp, term_dict,
attributeSet, grep_info, &max_pos, zm,
display_term, &relation_error))
return ZEBRA_OK;
}
-
+
static ZEBRA_RES rpn_search_APT_numeric(ZebraHandle zh,
Z_AttributesPlusTerm *zapt,
const char *termz,
const Odr_oid *attributeSet,
+ zint hits_limit,
NMEM stream,
- const char *index_type,
+ const char *index_type,
int complete_flag,
- const char *rank_type,
+ const char *rank_type,
const char *xpath_use,
NMEM rset_nmem,
RSET *rset,
ZEBRA_RES res;
struct grep_info grep_info;
int alloc_sets = 0;
- zint hits_limit_value;
+ zint hits_limit_value = hits_limit;
const char *term_ref_id_str = 0;
zebra_term_limits_APT(zh, zapt, &hits_limit_value, &term_ref_id_str,
if (grep_info_prepare(zh, zapt, &grep_info, index_type) == ZEBRA_FAIL)
return ZEBRA_FAIL;
while (1)
- {
+ {
struct ord_list *ol;
WRBUF term_dict = wrbuf_alloc();
WRBUF display_term = wrbuf_alloc();
if (alloc_sets == num_result_sets)
{
int add = 10;
- RSET *rnew = (RSET *) nmem_malloc(stream, (alloc_sets+add) *
+ RSET *rnew = (RSET *) nmem_malloc(stream, (alloc_sets+add) *
sizeof(*rnew));
if (alloc_sets)
memcpy(rnew, result_sets, alloc_sets * sizeof(*rnew));
grep_info.isam_p_indx, wrbuf_buf(display_term),
wrbuf_len(display_term), rank_type,
0 /* preserve position */,
- zapt->term->which, rset_nmem,
+ zapt->term->which, rset_nmem,
kc, kc->scope, ol, index_type,
hits_limit_value,
term_ref_id_str);
{
Record rec;
zint sysno = atozint(termz);
-
+
if (sysno <= 0)
sysno = 0;
rec = rec_get(zh->reg->records, sysno);
*rset = rset_create_temp(rset_nmem, kc, kc->scope,
res_get(zh->res, "setTmpDir"), 0);
rsfd = rset_open(*rset, RSETF_WRITE);
-
+
key.mem[0] = sysno;
key.mem[1] = 1;
key.len = 2;
Z_SortKeySpec *sks;
Z_SortKey *sk;
char termz[20];
-
+
attr_init_APT(&sort_relation_type, zapt, 7);
sort_relation_value = attr_find(&sort_relation_type, &attributeSet);
sort_sequence->specs = (Z_SortKeySpec **)
nmem_malloc(stream, sort_sequence->num_specs *
sizeof(*sort_sequence->specs));
- for (i = 0; i<sort_sequence->num_specs; i++)
+ for (i = 0; i < sort_sequence->num_specs; i++)
sort_sequence->specs[i] = 0;
}
if (zapt->term->which != Z_Term_general)
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 if (sort_relation_value == 2)
*sks->sortRelation = Z_SortKeySpec_descending;
- else
+ else
*sks->sortRelation = Z_SortKeySpec_ascending;
- sks->caseSensitivity = (int *)
+ sks->caseSensitivity = (Odr_int *)
nmem_malloc(stream, sizeof(*sks->caseSensitivity));
*sks->caseSensitivity = 0;
const Odr_oid *curAttributeSet = attributeSet;
AttrType use;
const char *use_string = 0;
-
+
attr_init_APT(&use, zapt, 1);
attr_find_ex(&use, &curAttributeSet, &use_string);
return zebra_parse_xpath_str(use_string, xpath, max, mem);
}
-
-
+
+
static RSET xpath_trunc(ZebraHandle zh, NMEM stream,
- const char *index_type, const char *term,
+ const char *index_type, const char *term,
const char *xpath_use,
NMEM rset_nmem,
struct rset_key_control *kc)
{
struct grep_info grep_info;
- int ord = zebraExplain_lookup_attr_str(zh->reg->zei,
+ int ord = zebraExplain_lookup_attr_str(zh->reg->zei,
zinfo_index_category_index,
index_type, xpath_use);
if (grep_info_prepare(zh, 0 /* zapt */, &grep_info, "0") == ZEBRA_FAIL)
return rset_create_null(rset_nmem, kc, 0);
-
+
if (ord < 0)
return rset_create_null(rset_nmem, kc, 0);
else
{
- int i, r, max_pos;
+ int i, max_pos;
char ord_buf[32];
RSET rset;
WRBUF term_dict = wrbuf_alloc();
const char *flags = "void";
wrbuf_putc(term_dict, '(');
- for (i = 0; i<ord_len; i++)
+ for (i = 0; i < ord_len; i++)
{
wrbuf_putc(term_dict, 1);
wrbuf_putc(term_dict, ord_buf[i]);
}
wrbuf_putc(term_dict, ')');
wrbuf_puts(term_dict, term);
-
+
grep_info.isam_p_indx = 0;
- r = dict_lookup_grep(zh->reg->dict, wrbuf_cstr(term_dict), 0,
- &grep_info, &max_pos, 0, grep_handle);
+ dict_lookup_grep(zh->reg->dict, wrbuf_cstr(term_dict), 0,
+ &grep_info, &max_pos, 0, grep_handle);
yaz_log(YLOG_DEBUG, "%s %d positions", term,
grep_info.isam_p_indx);
rset = rset_trunc(zh, grep_info.isam_p_buf,
}
yaz_log(YLOG_DEBUG, "xpath len=%d", xpath_len);
- for (i = 0; i<xpath_len; i++)
+ for (i = 0; i < xpath_len; i++)
{
yaz_log(log_level_rpn, "XPATH %d %s", i, xpath[i].part);
/a/b[@c = y] val range(b/a/,freetext(w,1016,val),b/a/,@c = y)
/a[@c = y]/b val range(a/,range(b/a/,freetext(w,1016,val),b/a/),a/,@c = y)
/a[@c = x]/b[@c = y] range(a/,range(b/a/,freetext(w,1016,val),b/a/,@c = y),a/,@c = x)
-
+
*/
dict_grep_cmap(zh->reg->dict, 0, 0);
-
+
{
int level = xpath_len;
int first_path = 1;
-
+
while (--level >= 0)
{
WRBUF xpath_rev = wrbuf_alloc();
{
const char *cp = xpath[level].predicate->u.relation.value;
wrbuf_putc(wbuf, '=');
-
+
while (*cp)
{
if (strchr(REGEX_CHARS, *cp))
}
}
rset_attr = xpath_trunc(
- zh, stream, "0", wrbuf_cstr(wbuf),
- ZEBRA_XPATH_ATTR_NAME,
+ zh, stream, "0", wrbuf_cstr(wbuf),
+ ZEBRA_XPATH_ATTR_NAME,
rset_nmem, kc);
wrbuf_destroy(wbuf);
- }
- else
+ }
+ else
{
if (!first_path)
{
continue;
}
}
- yaz_log(log_level_rpn, "xpath_rev (%d) = %s", level,
+ yaz_log(log_level_rpn, "xpath_rev (%d) = %s", level,
wrbuf_cstr(xpath_rev));
if (wrbuf_len(xpath_rev))
{
- rset_start_tag = xpath_trunc(zh, stream, "0",
+ rset_start_tag = xpath_trunc(zh, stream, "0",
wrbuf_cstr(xpath_rev),
- ZEBRA_XPATH_ELM_BEGIN,
+ ZEBRA_XPATH_ELM_BEGIN,
rset_nmem, kc);
if (always_matches)
rset = rset_start_tag;
else
{
- rset_end_tag = xpath_trunc(zh, stream, "0",
+ rset_end_tag = xpath_trunc(zh, stream, "0",
wrbuf_cstr(xpath_rev),
- ZEBRA_XPATH_ELM_END,
+ ZEBRA_XPATH_ELM_END,
rset_nmem, kc);
-
+
rset = rset_create_between(rset_nmem, kc, kc->scope,
rset_start_tag, rset,
rset_end_tag, rset_attr);
#define MAX_XPATH_STEPS 10
-static ZEBRA_RES rpn_search_database(ZebraHandle zh,
+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,
+ int num_bases, const char **basenames,
NMEM rset_nmem,
RSET *rset,
struct rset_key_control *kc)
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)
rset_delete(rsets[i]);
*rset = 0;
}
- else
+ else
{
if (num_bases == 1)
*rset = rsets[0];
else if (num_bases == 0)
- *rset = rset_create_null(rset_nmem, kc, 0);
+ *rset = rset_create_null(rset_nmem, kc, 0);
else
*rset = rset_create_or(rset_nmem, kc, kc->scope, 0 /* TERMID */,
num_bases, rsets);
return res;
}
-static ZEBRA_RES rpn_search_database(ZebraHandle zh,
+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,
}
zebra_maps_attr(zh->reg->zebra_maps, zapt, &index_type, &search_type,
rank_type, &complete_flag, &sort_flag);
-
+
yaz_log(YLOG_DEBUG, "index_type=%s", index_type);
yaz_log(YLOG_DEBUG, "complete_flag=%d", complete_flag);
yaz_log(YLOG_DEBUG, "search_type=%s", search_type);
return rpn_sort_spec(zh, zapt, attributeSet, stream, sort_sequence,
rank_type, rset_nmem, rset, kc);
/* consider if an X-Path query is used */
- xpath_len = rpn_check_xpath(zh, zapt, attributeSet,
+ xpath_len = rpn_check_xpath(zh, zapt, attributeSet,
xpath, MAX_XPATH_STEPS, stream);
if (xpath_len >= 0)
{
- if (xpath[xpath_len-1].part[0] == '@')
+ if (xpath[xpath_len-1].part[0] == '@')
xpath_use = ZEBRA_XPATH_ATTR_CDATA; /* last step is attribute */
else
- xpath_use = ZEBRA_XPATH_CDATA; /* searching for cdata */
+ xpath_use = ZEBRA_XPATH_CDATA; /* searching for cdata */
if (1)
{
if (relation_value == 103) /* alwaysmatches */
{
*rset = 0; /* signal no "term" set */
- return rpn_search_xpath(zh, stream, rank_type, *rset,
+ return rpn_search_xpath(zh, stream, rank_type, *rset,
xpath_len, xpath, rset_nmem, rset, kc);
}
}
/* search using one of the various search type strategies
termz is our UTF-8 search term
- attributeSet is top-level default attribute set
+ attributeSet is top-level default attribute set
stream is ODR for search
reg_id is the register type
complete_flag is 1 for complete subfield, 0 for incomplete
*/
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,
}
else if (!strcmp(search_type, "numeric"))
{
- res = rpn_search_APT_numeric(zh, zapt, termz, attributeSet, stream,
+ res = rpn_search_APT_numeric(zh, zapt, termz, attributeSet, hits_limit,
+ stream,
index_type, complete_flag, rank_type,
xpath_use,
rset_nmem,
return res;
if (!*rset)
return ZEBRA_FAIL;
- return rpn_search_xpath(zh, stream, rank_type, *rset,
+ return rpn_search_xpath(zh, stream, rank_type, *rset,
xpath_len, xpath, rset_nmem, rset, kc);
}
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,
Z_AttributesPlusTerm *zapt = zs->u.simple->u.attributesPlusTerm;
AttrType global_hits_limit_attr;
int l;
-
+
attr_init_APT(&global_hits_limit_attr, zapt, 12);
-
+
l = attr_find(&global_hits_limit_attr, NULL);
if (l != -1)
*approx_limit = l;
}
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,
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,
+ sort_sequence,
num_bases, basenames,
&result_sets, &num_result_sets,
0 /* no parent op */,
if (res != ZEBRA_OK)
{
int i;
- for (i = 0; i<num_result_sets; i++)
+ for (i = 0; i < num_result_sets; i++)
rset_delete(result_sets[i]);
*result_set = 0;
}
}
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,
if (res != ZEBRA_OK)
{
int i;
- for (i = 0; i<num_result_sets_l; i++)
+ for (i = 0; i < num_result_sets_l; i++)
rset_delete(result_sets_l[i]);
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,
if (res != ZEBRA_OK)
{
int i;
- for (i = 0; i<num_result_sets_l; i++)
+ for (i = 0; i < num_result_sets_l; i++)
rset_delete(result_sets_l[i]);
- for (i = 0; i<num_result_sets_r; i++)
+ for (i = 0; i < num_result_sets_r; i++)
rset_delete(result_sets_r[i]);
return res;
}
/* make a new list of result for all children */
*num_result_sets = num_result_sets_l + num_result_sets_r;
- *result_sets = nmem_malloc(stream, *num_result_sets *
+ *result_sets = nmem_malloc(stream, *num_result_sets *
sizeof(**result_sets));
- memcpy(*result_sets, result_sets_l,
+ memcpy(*result_sets, result_sets_l,
num_result_sets_l * sizeof(**result_sets));
- memcpy(*result_sets + num_result_sets_l, result_sets_r,
+ memcpy(*result_sets + num_result_sets_l, result_sets_r,
num_result_sets_r * sizeof(**result_sets));
if (!parent_op || parent_op->which != zop->which
case Z_Operator_prox:
if (zop->u.prox->which != Z_ProximityOperator_known)
{
- zebra_setError(zh,
+ zebra_setError(zh,
YAZ_BIB1_UNSUPP_PROX_UNIT_CODE,
0);
return ZEBRA_FAIL;
{
rset = rset_create_prox(rset_nmem, kc,
kc->scope,
- *num_result_sets, *result_sets,
+ *num_result_sets, *result_sets,
*zop->u.prox->ordered,
- (!zop->u.prox->exclusion ?
+ (!zop->u.prox->exclusion ?
0 : *zop->u.prox->exclusion),
*zop->u.prox->relationType,
*zop->u.prox->distance );
return ZEBRA_FAIL;
}
*num_result_sets = 1;
- *result_sets = nmem_malloc(stream, *num_result_sets *
+ *result_sets = nmem_malloc(stream, *num_result_sets *
sizeof(**result_sets));
(*result_sets)[0] = rset;
}
{
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)
rset = resultSetRef(zh, zs->u.simple->u.resultSetId);
if (!rset)
{
- zebra_setError(zh,
+ zebra_setError(zh,
YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST,
zs->u.simple->u.resultSetId);
return ZEBRA_FAIL;
return ZEBRA_FAIL;
}
*num_result_sets = 1;
- *result_sets = nmem_malloc(stream, *num_result_sets *
+ *result_sets = nmem_malloc(stream, *num_result_sets *
sizeof(**result_sets));
(*result_sets)[0] = rset;
}
/*
* Local variables:
* c-basic-offset: 4
+ * c-file-style: "Stroustrup"
* indent-tabs-mode: nil
* End:
* vim: shiftwidth=4 tabstop=8 expandtab