X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzrpn.c;h=b8b2a766c17cf8ab494371217de4c778bcb70f21;hb=89d059a3e4541ff00bbb4193ba34c1dbe1e21928;hp=30b7b30b794de6c973e59e8d933d47c027b6ba36;hpb=285a986588deacac089734552a7149142f7afc7d;p=idzebra-moved-to-github.git diff --git a/index/zrpn.c b/index/zrpn.c index 30b7b30..b8b2a76 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -1,10 +1,45 @@ /* - * Copyright (C) 1995-1999, Index Data + * Copyright (C) 1995-2001, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: zrpn.c,v $ - * Revision 1.97 1999-10-14 14:33:50 adam + * Revision 1.108 2001-11-14 22:06:27 adam + * Rank-weight may be controlled via query. + * + * Revision 1.107 2001/10/15 19:53:43 adam + * POSIX thread updates. First work on term sets. + * + * Revision 1.106 2001/04/11 07:58:13 adam + * Bug fix: multiple space mapped to one space when using complete subfield. + * + * Revision 1.105 2000/11/08 13:46:59 adam + * Fixed scan: server could break if bad attribute/database was selected. + * Work on remote update. + * + * Revision 1.104 2000/04/05 09:49:35 adam + * On Unix, zebra/z'mbol uses automake. + * + * Revision 1.103 2000/03/20 19:08:36 adam + * Added remote record import using Z39.50 extended services and Segment + * Requests. + * + * Revision 1.102 2000/03/15 15:00:31 adam + * First work on threaded version. + * + * Revision 1.101 2000/03/02 14:35:03 adam + * Fixed proximity handling. + * + * Revision 1.100 1999/12/28 15:48:12 adam + * Minor Fix. + * + * Revision 1.99 1999/12/23 09:03:32 adam + * Changed behaviour of trunc=105 so that * is regular .* and ! is regular . + * + * Revision 1.98 1999/11/30 13:48:04 adam + * Improved installation. Updated for inclusion of YAZ header files. + * + * Revision 1.97 1999/10/14 14:33:50 adam * Added truncation 5=106. * * Revision 1.96 1999/09/23 10:05:05 adam @@ -365,9 +400,9 @@ static const char **rpn_char_map_handler (void *vp, const char **from, int len) static void rpn_char_map_prepare (ZebraHandle zh, int reg_type, struct rpn_char_map_info *map_info) { - map_info->zm = zh->zebra_maps; + map_info->zm = zh->service->zebra_maps; map_info->reg_type = reg_type; - dict_grep_cmap (zh->dict, map_info, rpn_char_map_handler); + dict_grep_cmap (zh->service->dict, map_info, rpn_char_map_handler); } typedef struct { @@ -377,7 +412,8 @@ typedef struct { Z_AttributesPlusTerm *zapt; } AttrType; -static int attr_find (AttrType *src, oid_value *attributeSetP) +static int attr_find_ex (AttrType *src, oid_value *attributeSetP, + const char **string_value) { int num_attributes; @@ -411,19 +447,34 @@ static int attr_find (AttrType *src, oid_value *attributeSetP) return *element->value.numeric; break; case Z_AttributeValue_complex: - if (src->minor >= element->value.complex->num_list || - element->value.complex->list[src->minor]->which != + if (src->minor >= element->value.complex->num_list) + break; + if (element->value.complex->list[src->minor]->which == Z_StringOrNumeric_numeric) - break; - ++(src->minor); - if (element->attributeSet && attributeSetP) - { - oident *attrset; - - attrset = oid_getentbyoid (element->attributeSet); - *attributeSetP = attrset->value; - } - return *element->value.complex->list[src->minor-1]->u.numeric; + { + ++(src->minor); + if (element->attributeSet && attributeSetP) + { + oident *attrset; + + attrset = oid_getentbyoid (element->attributeSet); + *attributeSetP = attrset->value; + } + return + *element->value.complex->list[src->minor-1]->u.numeric; + } + else if (element->value.complex->list[src->minor]->which == + Z_StringOrNumeric_string) + { + if (!string_value) + break; + ++(src->minor); + *string_value = + element->value.complex->list[src->minor-1]->u.string; + return -2; + } + else + break; default: assert (0); } @@ -433,6 +484,11 @@ static int attr_find (AttrType *src, oid_value *attributeSetP) return -1; } +static int attr_find (AttrType *src, oid_value *attributeSetP) +{ + return attr_find_ex (src, attributeSetP, 0); +} + static void attr_init (AttrType *src, Z_AttributesPlusTerm *zapt, int type) { @@ -448,11 +504,12 @@ struct grep_info { #ifdef TERM_COUNT int *term_no; #endif - ISAM_P *isam_p_buf; + ISAMS_P *isam_p_buf; int isam_p_size; int isam_p_indx; ZebraHandle zh; int reg_type; + ZebraSet termset; }; static void term_untrans (ZebraHandle zh, int reg_type, @@ -460,7 +517,8 @@ static void term_untrans (ZebraHandle zh, int reg_type, { while (*src) { - const char *cp = zebra_maps_output (zh->zebra_maps, reg_type, &src); + const char *cp = zebra_maps_output (zh->service->zebra_maps, + reg_type, &src); if (!cp) *dst++ = *src++; else @@ -475,12 +533,12 @@ static void add_isam_p (const char *name, const char *info, { if (p->isam_p_indx == p->isam_p_size) { - ISAM_P *new_isam_p_buf; + ISAMS_P *new_isam_p_buf; #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) * + new_isam_p_buf = (ISAMS_P *) xmalloc (sizeof(*new_isam_p_buf) * p->isam_p_size); if (p->isam_p_buf) { @@ -505,9 +563,24 @@ static void add_isam_p (const char *name, const char *info, assert (*info == sizeof(*p->isam_p_buf)); memcpy (p->isam_p_buf + p->isam_p_indx, info+1, sizeof(*p->isam_p_buf)); -#if 0 - term_untrans (p->zh, p->reg_type, term_tmp, name+2); - logf (LOG_DEBUG, "grep: %s", term_tmp); +#if 1 + if (p->termset) + { + const char *db; + int set, use; + char term_tmp[512]; + int su_code = 0; + int len = key_SU_decode (&su_code, name); + + term_untrans (p->zh, p->reg_type, term_tmp, name+len+1); + logf (LOG_LOG, "grep: %d %c %s", su_code, name[len], term_tmp); + zebraExplain_lookup_ord (p->zh->service->zei, + su_code, &db, &set, &use); + logf (LOG_LOG, "grep: set=%d use=%d db=%s", set, use, db); + + resultSetAddTerm (p->zh, p->termset, name[len], db, + set, use, term_tmp); + } #endif (p->isam_p_indx)++; } @@ -551,6 +624,9 @@ static int term_100 (ZebraMaps zebra_maps, int reg_type, int i = 0; int j = 0; + const char *space_start = 0; + const char *space_end = 0; + if (!term_pre (zebra_maps, reg_type, src, NULL, NULL)) return 0; s0 = *src; @@ -558,8 +634,33 @@ static int term_100 (ZebraMaps zebra_maps, int reg_type, { s1 = s0; map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0)); - if (space_split && **map == *CHR_SPACE) - break; + if (space_split) + { + if (**map == *CHR_SPACE) + break; + } + else /* complete subfield only. */ + { + if (**map == *CHR_SPACE) + { /* save space mapping for later .. */ + space_start = s1; + space_end = s0; + continue; + } + else if (space_start) + { /* reload last space */ + while (space_start < space_end) + { + if (!isalnum (*space_start) && *space_start != '-') + dst[i++] = '\\'; + dst_term[j++] = *space_start; + dst[i++] = *space_start++; + } + /* and reset */ + space_start = space_end = 0; + } + } + /* add non-space char */ while (s1 < s0) { if (!isalnum (*s1) && *s1 != '-') @@ -720,7 +821,7 @@ static int term_104 (ZebraMaps zebra_maps, int reg_type, return i; } -/* term_105/106: handle term, where trunc=Process # and ! and right trunc */ +/* term_105/106: handle term, where trunc=Process * and ! and right trunc */ static int term_105 (ZebraMaps zebra_maps, int reg_type, const char **src, char *dst, int space_split, char *dst_term, int right_truncate) @@ -738,7 +839,7 @@ static int term_105 (ZebraMaps zebra_maps, int reg_type, if (*s0 == '*') { dst[i++] = '.'; - dst[i++] = '+'; + dst[i++] = '*'; dst_term[j++] = *s0++; } else if (*s0 == '!') @@ -920,7 +1021,8 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, switch (relation_value) { case 1: - if (!term_100 (zh->zebra_maps, reg_type, term_sub, term_component, + if (!term_100 (zh->service->zebra_maps, reg_type, + term_sub, term_component, space_split, term_dst)) return 0; logf (LOG_DEBUG, "Relation <"); @@ -949,7 +1051,8 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, *term_tmp = '\0'; break; case 2: - if (!term_100 (zh->zebra_maps, reg_type, term_sub, term_component, + if (!term_100 (zh->service->zebra_maps, reg_type, + term_sub, term_component, space_split, term_dst)) return 0; logf (LOG_DEBUG, "Relation <="); @@ -979,8 +1082,8 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, *term_tmp = '\0'; break; case 5: - if (!term_100 (zh->zebra_maps, reg_type, term_sub, term_component, - space_split, term_dst)) + if (!term_100 (zh->service->zebra_maps, reg_type, + term_sub, term_component, space_split, term_dst)) return 0; logf (LOG_DEBUG, "Relation >"); @@ -1011,8 +1114,8 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, *term_tmp = '\0'; break; case 4: - if (!term_100 (zh->zebra_maps, reg_type, term_sub, term_component, - space_split, term_dst)) + if (!term_100 (zh->service->zebra_maps, reg_type, term_sub, + term_component, space_split, term_dst)) return 0; logf (LOG_DEBUG, "Relation >="); @@ -1048,8 +1151,8 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, case 3: default: logf (LOG_DEBUG, "Relation ="); - if (!term_100 (zh->zebra_maps, reg_type, term_sub, term_component, - space_split, term_dst)) + if (!term_100 (zh->service->zebra_maps, reg_type, term_sub, + term_component, space_split, term_dst)) return 0; strcat (term_tmp, "("); strcat (term_tmp, term_component); @@ -1121,7 +1224,7 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } return -1; } - if (zebraExplain_curDatabase (zh->zei, basenames[base_no])) + if (zebraExplain_curDatabase (zh->service->zei, basenames[base_no])) { zh->errCode = 109; /* Database unavailable */ zh->errString = basenames[base_no]; @@ -1134,7 +1237,7 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, char ord_buf[32]; int i, ord_len; - ord = zebraExplain_lookupSU (zh->zei, attp.attset_ordinal, + ord = zebraExplain_lookupSU (zh->service->zei, attp.attset_ordinal, local_attr->local); if (ord < 0) continue; @@ -1143,7 +1246,7 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, else term_dict[prefix_len++] = '('; - ord_len = key_SU_code (ord, ord_buf); + ord_len = key_SU_encode (ord, ord_buf); for (i = 0; idict, term_dict, 0, grep_info, &max_pos, - 0, grep_handle); + r = dict_lookup_grep (zh->service->dict, term_dict, 0, + grep_info, &max_pos, 0, grep_handle); if (r) logf (LOG_WARN, "dict_lookup_grep fail, rel=gt: %d", r); break; case 1: /* right truncation */ term_dict[j++] = '('; - if (!term_100 (zh->zebra_maps, reg_type, + if (!term_100 (zh->service->zebra_maps, reg_type, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ".*)"); - dict_lookup_grep (zh->dict, term_dict, 0, grep_info, + dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, &max_pos, 0, grep_handle); break; case 2: /* keft truncation */ term_dict[j++] = '('; term_dict[j++] = '.'; term_dict[j++] = '*'; - if (!term_100 (zh->zebra_maps, reg_type, + if (!term_100 (zh->service->zebra_maps, reg_type, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ")"); - dict_lookup_grep (zh->dict, term_dict, 0, grep_info, + dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, &max_pos, 0, grep_handle); break; case 3: /* left&right truncation */ term_dict[j++] = '('; term_dict[j++] = '.'; term_dict[j++] = '*'; - if (!term_100 (zh->zebra_maps, reg_type, + if (!term_100 (zh->service->zebra_maps, reg_type, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ".*)"); - dict_lookup_grep (zh->dict, term_dict, 0, grep_info, + dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, &max_pos, 0, grep_handle); break; zh->errCode = 120; return -1; case 101: /* process # in term */ term_dict[j++] = '('; - if (!term_101 (zh->zebra_maps, reg_type, + if (!term_101 (zh->service->zebra_maps, reg_type, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ")"); - r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info, + r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, &max_pos, 0, grep_handle); if (r) logf (LOG_WARN, "dict_lookup_grep err, trunc=#: %d", r); break; case 102: /* Regexp-1 */ term_dict[j++] = '('; - if (!term_102 (zh->zebra_maps, reg_type, + if (!term_102 (zh->service->zebra_maps, reg_type, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ")"); logf (LOG_DEBUG, "Regexp-1 tolerance=%d", r); - r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info, + r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, &max_pos, 0, grep_handle); if (r) logf (LOG_WARN, "dict_lookup_grep err, trunc=regular: %d", @@ -1234,12 +1337,12 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, case 103: /* Regexp-2 */ r = 1; term_dict[j++] = '('; - if (!term_103 (zh->zebra_maps, reg_type, + if (!term_103 (zh->service->zebra_maps, reg_type, &termp, term_dict + j, &r, space_split, term_dst)) return 0; strcat (term_dict, ")"); logf (LOG_DEBUG, "Regexp-2 tolerance=%d", r); - r = dict_lookup_grep (zh->dict, term_dict, r, grep_info, + r = dict_lookup_grep (zh->service->dict, term_dict, r, grep_info, &max_pos, 2, grep_handle); if (r) logf (LOG_WARN, "dict_lookup_grep err, trunc=eregular: %d", @@ -1247,33 +1350,33 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, break; case 104: /* process # and ! in term */ term_dict[j++] = '('; - if (!term_104 (zh->zebra_maps, reg_type, + if (!term_104 (zh->service->zebra_maps, reg_type, &termp, term_dict + j, space_split, term_dst)) return 0; strcat (term_dict, ")"); - r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info, + r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, &max_pos, 0, grep_handle); if (r) logf (LOG_WARN, "dict_lookup_grep err, trunc=#/!: %d", r); break; case 105: /* process * and ! in term */ term_dict[j++] = '('; - if (!term_105 (zh->zebra_maps, reg_type, + if (!term_105 (zh->service->zebra_maps, reg_type, &termp, term_dict + j, space_split, term_dst, 1)) return 0; strcat (term_dict, ")"); - r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info, + r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, &max_pos, 0, grep_handle); if (r) logf (LOG_WARN, "dict_lookup_grep err, trunc=*/!: %d", r); break; case 106: /* process * and ! in term */ term_dict[j++] = '('; - if (!term_105 (zh->zebra_maps, reg_type, + if (!term_105 (zh->service->zebra_maps, reg_type, &termp, term_dict + j, space_split, term_dst, 0)) return 0; strcat (term_dict, ")"); - r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info, + r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, &max_pos, 0, grep_handle); if (r) logf (LOG_WARN, "dict_lookup_grep err, trunc=*/!: %d", r); @@ -1312,7 +1415,7 @@ static void trans_scan_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, while ((len = (cp_end - cp)) > 0) { - map = zebra_maps_input (zh->zebra_maps, reg_type, &cp, len); + map = zebra_maps_input (zh->service->zebra_maps, reg_type, &cp, len); if (**map == *CHR_SPACE) space_map = *map; else @@ -1328,99 +1431,8 @@ static void trans_scan_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, termz[i] = '\0'; } -static RSET rpn_proximity (ZebraHandle zh, RSET rset1, RSET rset2, - int ordered, - int exclusion, int relation, int distance) -{ - int i; - RSFD rsfd1, rsfd2; - int more1, more2; - struct it_key buf1, buf2; - RSFD rsfd_result; - RSET result; - rset_temp_parms parms; - int term_index; - - rsfd1 = rset_open (rset1, RSETF_READ); - more1 = rset_read (rset1, rsfd1, &buf1, &term_index); - - rsfd2 = rset_open (rset2, RSETF_READ); - more2 = rset_read (rset2, rsfd2, &buf2, &term_index); - - parms.key_size = sizeof (struct it_key); - parms.temp_path = res_get (zh->res, "setTmpDir"); - result = rset_create (rset_kind_temp, &parms); - rsfd_result = rset_open (result, RSETF_WRITE); - - logf (LOG_DEBUG, "rpn_proximity excl=%d ord=%d rel=%d dis=%d", - exclusion, ordered, relation, distance); - while (more1 && more2) - { - int cmp = key_compare_it (&buf1, &buf2); - if (cmp < -1) - more1 = rset_read (rset1, rsfd1, &buf1, &term_index); - else if (cmp > 1) - more2 = rset_read (rset2, rsfd2, &buf2, &term_index); - else - { - int sysno = buf1.sysno; - int seqno[500]; - int n = 0; - - seqno[n++] = buf1.seqno; - while ((more1 = rset_read (rset1, rsfd1, &buf1, &term_index)) && - sysno == buf1.sysno) - if (n < 500) - seqno[n++] = buf1.seqno; - do - { - for (i = 0; i= */ - if (diff >= distance) - excl = !excl; - break; - case 5: /* > */ - if (diff > distance) - excl = !excl; - break; - case 6: /* != */ - if (diff != distance) - excl = !excl; - break; - } - if (excl) - rset_write (result, rsfd_result, &buf2); - } - } while ((more2 = rset_read (rset2, rsfd2, &buf2, &term_index)) && - sysno == buf2.sysno); - } - } - rset_close (result, rsfd_result); - rset_close (rset1, rsfd1); - rset_close (rset2, rsfd2); - return result; -} - -static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no) +static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no, + int ordered, int exclusion, int relation, int distance) { int i; RSFD *rsfd; @@ -1460,6 +1472,11 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no) } for (i = 0; i= 0) - { - rset_close (rset[i], rsfd[i]); - xfree (buf[i]); - --i; - } + parms.rset_term = rset_term_create (prox_term, length_prox_term, flags); parms.rset_term->nn = 0; result = rset_create (rset_kind_null, &parms); } - else + else if (ordered && relation == 3 && exclusion == 0 && distance == 1) { + /* special proximity case = phrase search ... */ rset_temp_parms parms; RSFD rsfd_result; @@ -1489,7 +1502,7 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no) flags); parms.rset_term->nn = min_nn; parms.key_size = sizeof (struct it_key); - parms.temp_path = res_get (zh->res, "setTmpDir"); + parms.temp_path = res_get (zh->service->res, "setTmpDir"); result = rset_create (rset_kind_temp, &parms); rsfd_result = rset_open (result, RSETF_WRITE); @@ -1533,14 +1546,106 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no) more[0] = rset_read (*rset, *rsfd, *buf, &term_index); } } - - for (i = 0; inn = min_nn; + parms.key_size = sizeof (struct it_key); + parms.temp_path = res_get (zh->service->res, "setTmpDir"); + result = rset_create (rset_kind_temp, &parms); + rsfd_result = rset_open (result, RSETF_WRITE); + + while (more[0] && more[1]) { - rset_close (rset[i], rsfd[i]); - xfree (buf[i]); + int cmp = key_compare_it (buf[0], buf[1]); + if (cmp < -1) + more[0] = rset_read (rset[0], rsfd[0], buf[0], &term_index); + else if (cmp > 1) + more[1] = rset_read (rset[1], rsfd[1], buf[1], &term_index); + else + { + int sysno = buf[0]->sysno; + int seqno[500]; + int n = 0; + + seqno[n++] = buf[0]->seqno; + while ((more[0] = rset_read (rset[0], rsfd[0], buf[0], + &term_index)) && + sysno == buf[0]->sysno) + if (n < 500) + seqno[n++] = buf[0]->seqno; + do + { + for (i = 0; iseqno - seqno[i]; + int excl = exclusion; + if (!ordered && diff < 0) + diff = -diff; + switch (relation) + { + case 1: /* < */ + if (diff < distance && diff >= 0) + excl = !excl; + break; + case 2: /* <= */ + if (diff <= distance && diff >= 0) + excl = !excl; + break; + case 3: /* == */ + if (diff == distance && diff >= 0) + excl = !excl; + break; + case 4: /* >= */ + if (diff >= distance && diff >= 0) + excl = !excl; + break; + case 5: /* > */ + if (diff > distance && diff >= 0) + excl = !excl; + break; + case 6: /* != */ + if (diff != distance && diff >= 0) + excl = !excl; + break; + } + if (excl) + { + rset_write (result, rsfd_result, buf[1]); + break; + } + } + } while ((more[1] = rset_read (rset[1], rsfd[1], buf[1], + &term_index)) && + sysno == buf[1]->sysno); + } } rset_close (result, rsfd_result); } + else + { + rset_null_parms parms; + + parms.rset_term = rset_term_create (prox_term, length_prox_term, + flags); + parms.rset_term->nn = 0; + result = rset_create (rset_kind_null, &parms); + } + for (i = 0; izebra_maps, reg_id, ex_list, + wrbuf = zebra_replace(zh->service->zebra_maps, reg_id, ex_list, termz, strlen(termz)); if (!wrbuf) return nmem_strdup(stream, termz); @@ -1592,6 +1697,53 @@ char *normalize_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, } } +static int grep_info_prepare (ZebraHandle zh, + Z_AttributesPlusTerm *zapt, + struct grep_info *grep_info, + int reg_type, + NMEM stream) +{ + AttrType termset; + int termset_value_numeric; + const char *termset_value_string; + +#ifdef TERM_COUNT + grep_info->term_no = 0; +#endif + grep_info->isam_p_size = 0; + grep_info->isam_p_buf = NULL; + grep_info->zh = zh; + grep_info->reg_type = reg_type; + grep_info->termset = 0; + + attr_init (&termset, zapt, 8); + termset_value_numeric = + attr_find_ex (&termset, NULL, &termset_value_string); + if (termset_value_numeric != -1) + { + char resname[32]; + const char *termset_name = 0; + if (termset_value_numeric != -2) + { + + sprintf (resname, "%d", termset_value_numeric); + termset_name = resname; + } + else + termset_name = termset_value_string; + logf (LOG_LOG, "creating termset set %s", termset_name); + grep_info->termset = resultSetAdd (zh, termset_name, 1); + if (!grep_info->termset) + { + zh->errCode = 128; + zh->errString = nmem_strdup (stream, termset_name); + return -1; + } + } + return 0; +} + + static RSET rpn_search_APT_phrase (ZebraHandle zh, Z_AttributesPlusTerm *zapt, const char *termz_org, @@ -1608,14 +1760,8 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh, char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type); const char *termp = termz; -#ifdef TERM_COUNT - grep_info.term_no = 0; -#endif - grep_info.isam_p_size = 0; - grep_info.isam_p_buf = NULL; - grep_info.zh = zh; - grep_info.reg_type = reg_type; - + if (grep_info_prepare (zh, zapt, &grep_info, reg_type, stream)) + return 0; while (1) { logf (LOG_DEBUG, "APT_phrase termp=%s", termp); @@ -1646,7 +1792,7 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh, } else if (rset_no == 1) return (rset[0]); - result = rpn_prox (zh, rset, rset_no); + result = rpn_prox (zh, rset, rset_no, 1, 0, 3, 1); for (i = 0; izebra_maps, reg_type, term_sub, term_tmp, 1, + if (!term_100 (zh->service->zebra_maps, reg_type, term_sub, term_tmp, 1, term_dst)) return 0; term_value = atoi (term_tmp); @@ -1831,7 +1966,7 @@ static int numeric_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, sprintf (term_tmp, "(0*%d)", term_value); } logf (LOG_DEBUG, "dict_lookup_grep: %s", term_tmp); - r = dict_lookup_grep (zh->dict, term_dict, 0, grep_info, max_pos, + r = dict_lookup_grep (zh->service->dict, term_dict, 0, grep_info, max_pos, 0, grep_handle); if (r) logf (LOG_WARN, "dict_lookup_grep fail, rel=gt: %d", r); @@ -1879,7 +2014,7 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, zh->errCode = 121; return -1; } - if (zebraExplain_curDatabase (zh->zei, basenames[base_no])) + if (zebraExplain_curDatabase (zh->service->zei, basenames[base_no])) { zh->errCode = 109; /* Database unavailable */ zh->errString = basenames[base_no]; @@ -1892,7 +2027,7 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, char ord_buf[32]; int i, ord_len; - ord = zebraExplain_lookupSU (zh->zei, attp.attset_ordinal, + ord = zebraExplain_lookupSU (zh->service->zei, attp.attset_ordinal, local_attr->local); if (ord < 0) continue; @@ -1901,7 +2036,7 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, else term_dict[prefix_len++] = '('; - ord_len = key_SU_code (ord, ord_buf); + ord_len = key_SU_encode (ord, ord_buf); for (i = 0; ires, "setTmpDir"); + parms.temp_path = res_get (zh->service->res, "setTmpDir"); result = rset_create (rset_kind_temp, &parms); rsfd = rset_open (result, RSETF_WRITE); @@ -2126,13 +2255,13 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, { unsigned reg_id; char *search_type = NULL; - char *rank_type = NULL; + char rank_type[128]; int complete_flag; int sort_flag; char termz[IT_MAX_WORD+1]; - zebra_maps_attr (zh->zebra_maps, zapt, ®_id, &search_type, - &rank_type, &complete_flag, &sort_flag); + zebra_maps_attr (zh->service->zebra_maps, zapt, ®_id, &search_type, + rank_type, &complete_flag, &sort_flag); logf (LOG_DEBUG, "reg_id=%c", reg_id); logf (LOG_DEBUG, "complete_flag=%d", complete_flag); @@ -2257,12 +2386,22 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, return NULL; } #endif - r = rpn_proximity (zh, bool_parms.rset_l, bool_parms.rset_r, - *zop->u.prox->ordered, - (!zop->u.prox->exclusion ? 0 : - *zop->u.prox->exclusion), - *zop->u.prox->relationType, - *zop->u.prox->distance); + else + { + RSET rsets[2]; + + rsets[0] = bool_parms.rset_l; + rsets[1] = bool_parms.rset_r; + + r = rpn_prox (zh, rsets, 2, + *zop->u.prox->ordered, + (!zop->u.prox->exclusion ? 0 : + *zop->u.prox->exclusion), + *zop->u.prox->relationType, + *zop->u.prox->distance); + rset_delete (rsets[0]); + rset_delete (rsets[1]); + } break; default: zh->errCode = 110; @@ -2283,18 +2422,24 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, logf (LOG_DEBUG, "rpn_search_ref"); r = resultSetRef (zh, zs->u.simple->u.resultSetId); if (!r) + { r = rset_create (rset_kind_null, NULL); + zh->errCode = 30; + zh->errString = + nmem_strdup (stream, zs->u.simple->u.resultSetId); + return 0; + } } else { zh->errCode = 3; - return NULL; + return 0; } } else { zh->errCode = 3; - return NULL; + return 0; } return r; } @@ -2354,7 +2499,7 @@ RSET rpn_search (ZebraHandle zh, NMEM nmem, struct scan_info_entry { char *term; - ISAM_P isam_p; + ISAMS_P isam_p; }; struct scan_info { @@ -2378,8 +2523,8 @@ static int scan_handle (char *name, const char *info, int pos, void *client) scan_info->list[idx].term = (char *) odr_malloc (scan_info->odr, strlen(name + len_prefix)+1); strcpy (scan_info->list[idx].term, name + len_prefix); - assert (*info == sizeof(ISAM_P)); - memcpy (&scan_info->list[idx].isam_p, info+1, sizeof(ISAM_P)); + assert (*info == sizeof(ISAMS_P)); + memcpy (&scan_info->list[idx].isam_p, info+1, sizeof(ISAMS_P)); return 0; } @@ -2441,7 +2586,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, unsigned reg_id; char *search_type = NULL; - char *rank_type = NULL; + char rank_type[128]; int complete_flag; int sort_flag; *list = 0; @@ -2454,9 +2599,10 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, attr_init (&use, zapt, 1); use_value = attr_find (&use, &attributeset); - if (zebra_maps_attr (zh->zebra_maps, zapt, ®_id, &search_type, - &rank_type, &complete_flag, &sort_flag)) + if (zebra_maps_attr (zh->service->zebra_maps, zapt, ®_id, &search_type, + rank_type, &complete_flag, &sort_flag)) { + *num_entries = 0; zh->errCode = 113; return ; } @@ -2480,10 +2626,11 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, *num_entries = 0; return; } - if (zebraExplain_curDatabase (zh->zei, basenames[base_no])) + if (zebraExplain_curDatabase (zh->service->zei, basenames[base_no])) { zh->errString = basenames[base_no]; zh->errCode = 109; /* Database unavailable */ + *num_entries = 0; return; } for (local_attr = attp.local_attributes; local_attr && ord_no < 32; @@ -2491,7 +2638,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, { int ord; - ord = zebraExplain_lookupSU (zh->zei, attp.attset_ordinal, + ord = zebraExplain_lookupSU (zh->service->zei, attp.attset_ordinal, local_attr->local); if (ord > 0) ords[ord_no++] = ord; @@ -2499,6 +2646,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, } if (ord_no == 0) { + *num_entries = 0; zh->errCode = 113; return; } @@ -2525,15 +2673,15 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, for (j = 0; jlist[j].term = NULL; - prefix_len += key_SU_code (ords[i], termz + prefix_len); + prefix_len += key_SU_encode (ords[i], termz + prefix_len); termz[prefix_len++] = reg_id; termz[prefix_len] = 0; strcpy (scan_info->prefix, termz); trans_scan_term (zh, zapt, termz+prefix_len, reg_id); - dict_scan (zh->dict, termz, &before_tmp, &after_tmp, scan_info, - scan_handle); + dict_scan (zh->service->dict, termz, &before_tmp, &after_tmp, + scan_info, scan_handle); } glist = (ZebraScanEntry *) odr_malloc (stream, (before+after)*sizeof(*glist));