X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzrpn.c;h=88dbefcdcbc924e2ebe3ee245ff900128d990759;hb=47ea1fc957c7b97bb30a26698f072109cae275e4;hp=2a14aee18d4fd42ac4ad4f00eb1cc9662041c151;hpb=2b1851bd5565e3d21f9cf9a37661a584c063b75f;p=idzebra-moved-to-github.git diff --git a/index/zrpn.c b/index/zrpn.c index 2a14aee..88dbefc 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -3,7 +3,7 @@ * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * - * $Id: zrpn.c,v 1.112 2002-04-04 14:14:13 adam Exp $ + * $Id: zrpn.c,v 1.117 2002-07-25 13:06:43 adam Exp $ */ #include #include @@ -20,6 +20,7 @@ #include #include #include +#include struct rpn_char_map_info { ZebraMaps zm; @@ -84,17 +85,17 @@ static int attr_find_ex (AttrType *src, oid_value *attributeSetP, case Z_AttributeValue_complex: if (src->minor >= element->value.complex->num_list) break; + if (element->attributeSet && attributeSetP) + { + oident *attrset; + + attrset = oid_getentbyoid (element->attributeSet); + *attributeSetP = attrset->value; + } if (element->value.complex->list[src->minor]->which == Z_StringOrNumeric_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; } @@ -249,6 +250,8 @@ static int term_pre (ZebraMaps zebra_maps, int reg_type, const char **src, return *s0; } +#define REGEX_CHARS "[]()|.*+!" + /* term_100: handle term, where trunc=none (no operators at all) */ static int term_100 (ZebraMaps zebra_maps, int reg_type, const char **src, char *dst, int space_split, @@ -286,7 +289,7 @@ static int term_100 (ZebraMaps zebra_maps, int reg_type, { /* reload last space */ while (space_start < space_end) { - if (!isalnum (*space_start) && *space_start != '-') + if (strchr (REGEX_CHARS, *space_start)) dst[i++] = '\\'; dst_term[j++] = *space_start; dst[i++] = *space_start++; @@ -298,7 +301,7 @@ static int term_100 (ZebraMaps zebra_maps, int reg_type, /* add non-space char */ while (s1 < s0) { - if (!isalnum (*s1) && *s1 != '-') + if (strchr(REGEX_CHARS, *s1)) dst[i++] = '\\'; dst_term[j++] = *s1; dst[i++] = *s1++; @@ -339,7 +342,7 @@ static int term_101 (ZebraMaps zebra_maps, int reg_type, break; while (s1 < s0) { - if (!isalnum (*s1)) + if (strchr(REGEX_CHARS, *s1)) dst[i++] = '\\'; dst_term[j++] = *s1; dst[i++] = *s1++; @@ -388,7 +391,7 @@ static int term_103 (ZebraMaps zebra_maps, int reg_type, const char **src, break; while (s1 < s0) { - if (!isalnum (*s1)) + if (strchr(REGEX_CHARS, *s1)) dst[i++] = '\\'; dst_term[j++] = *s1; dst[i++] = *s1++; @@ -443,7 +446,7 @@ static int term_104 (ZebraMaps zebra_maps, int reg_type, break; while (s1 < s0) { - if (!isalnum (*s1)) + if (strchr(REGEX_CHARS, *s1)) dst[i++] = '\\'; dst_term[j++] = *s1; dst[i++] = *s1++; @@ -489,7 +492,7 @@ static int term_105 (ZebraMaps zebra_maps, int reg_type, break; while (s1 < s0) { - if (!isalnum (*s1)) + if (strchr(REGEX_CHARS, *s1)) dst[i++] = '\\'; dst_term[j++] = *s1; dst[i++] = *s1++; @@ -797,12 +800,44 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, - const char **term_sub, - oid_value attributeSet, NMEM stream, - struct grep_info *grep_info, - int reg_type, int complete_flag, - int num_bases, char **basenames, - char *term_dst) + const char **term_sub, + oid_value attributeSet, NMEM stream, + struct grep_info *grep_info, + int reg_type, int complete_flag, + int num_bases, char **basenames, + char *term_dst); + +static RSET term_trunc (ZebraHandle zh, Z_AttributesPlusTerm *zapt, + const char **term_sub, + oid_value attributeSet, NMEM stream, + struct grep_info *grep_info, + int reg_type, int complete_flag, + int num_bases, char **basenames, + char *term_dst, + const char *rank_type) +{ + int r; + grep_info->isam_p_indx = 0; + r = string_term (zh, zapt, term_sub, attributeSet, stream, grep_info, + reg_type, complete_flag, num_bases, basenames, + term_dst); + if (r < 1) + return 0; + logf (LOG_DEBUG, "term: %s", term_dst); + return 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); +} + + +static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, + const char **term_sub, + oid_value attributeSet, NMEM stream, + struct grep_info *grep_info, + int reg_type, int complete_flag, + int num_bases, char **basenames, + char *term_dst) { char term_dict[2*IT_MAX_WORD+4000]; int j, r, base_no; @@ -810,6 +845,7 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, int truncation_value; AttrType use; int use_value; + const char *use_string = 0; oid_value curAttributeSet = attributeSet; const char *termp; struct rpn_char_map_info rcmi; @@ -817,86 +853,101 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, rpn_char_map_prepare (zh->reg, reg_type, &rcmi); attr_init (&use, zapt, 1); - use_value = attr_find (&use, &curAttributeSet); + use_value = attr_find_ex (&use, &curAttributeSet, &use_string); logf (LOG_DEBUG, "string_term, use value %d", use_value); attr_init (&truncation, zapt, 5); truncation_value = attr_find (&truncation, NULL); logf (LOG_DEBUG, "truncation value %d", truncation_value); - if (use_value == -1) + if (use_value == -1) /* no attribute - assumy "any" */ + use_value = 1016; + if (use_value == -2) /* string attribute - assumy "any" */ use_value = 1016; for (base_no = 0; base_no < num_bases; base_no++) { attent attp; + data1_local_attribute id_xpath_attr; data1_local_attribute *local_attr; int max_pos, prefix_len = 0; termp = *term_sub; - if ((r=att_getentbyatt (zh, &attp, curAttributeSet, use_value))) - { - logf (LOG_DEBUG, "att_getentbyatt fail. set=%d use=%d r=%d", - curAttributeSet, use_value, r); - if (r == -1) - { - char val_str[32]; - sprintf (val_str, "%d", use_value); - zh->errCode = 114; - zh->errString = nmem_strdup (stream, val_str); - } - else - { - int oid[OID_SIZE]; - struct oident oident; - oident.proto = PROTO_Z3950; - oident.oclass = CLASS_ATTSET; - oident.value = curAttributeSet; - oid_ent_to_oid (&oident, oid); - - zh->errCode = 121; - zh->errString = nmem_strdup (stream, oident.desc); - } - return -1; - } if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no])) { zh->errCode = 109; /* Database unavailable */ zh->errString = basenames[base_no]; return -1; } + if (curAttributeSet == VAL_IDXPATH) + { + attp.local_attributes = &id_xpath_attr; + attp.attset_ordinal = curAttributeSet; + id_xpath_attr.next = 0; + id_xpath_attr.local = use_value; + } + else + { + if ((r=att_getentbyatt (zh, &attp, curAttributeSet, use_value))) + { + logf (LOG_DEBUG, "att_getentbyatt fail. set=%d use=%d r=%d", + curAttributeSet, use_value, r); + if (r == -1) + { + /* set was found, but value wasn't defined */ + char val_str[32]; + sprintf (val_str, "%d", use_value); + zh->errCode = 114; + zh->errString = nmem_strdup (stream, val_str); + } + else + { + int oid[OID_SIZE]; + struct oident oident; + + oident.proto = PROTO_Z3950; + oident.oclass = CLASS_ATTSET; + oident.value = curAttributeSet; + oid_ent_to_oid (&oident, oid); + + zh->errCode = 121; + zh->errString = nmem_strdup (stream, oident.desc); + } + return -1; + } + } for (local_attr = attp.local_attributes; local_attr; local_attr = local_attr->next) { int ord; - char ord_buf[32]; - int i, ord_len; - + char ord_buf[32]; + int i, ord_len; + ord = zebraExplain_lookupSU (zh->reg->zei, attp.attset_ordinal, - local_attr->local); + local_attr->local); if (ord < 0) continue; if (prefix_len) term_dict[prefix_len++] = '|'; else term_dict[prefix_len++] = '('; - - ord_len = key_SU_encode (ord, ord_buf); - for (i = 0; ierrCode = 114; - zh->errString = nmem_strdup (stream, val_str); + char val_str[32]; + sprintf (val_str, "%d", use_value); + zh->errCode = 114; + zh->errString = nmem_strdup (stream, val_str); return -1; } - term_dict[prefix_len++] = ')'; + term_dict[prefix_len++] = ')'; term_dict[prefix_len++] = 1; term_dict[prefix_len++] = reg_type; logf (LOG_DEBUG, "reg_type = %d", term_dict[prefix_len-1]); @@ -1023,17 +1074,55 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, return 1; } -static void trans_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, - char *termz) + +static int trans_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, + char *termz) { size_t sizez; Z_Term *term = zapt->term; - sizez = term->u.general->len; - if (sizez > IT_MAX_WORD-1) - sizez = IT_MAX_WORD-1; - memcpy (termz, term->u.general->buf, sizez); - termz[sizez] = '\0'; + switch (term->which) + { + case Z_Term_general: +#if HAVE_ICONV_H + if (zh->iconv_to_utf8 != (iconv_t)(-1)) + { + char *inbuf = term->u.general->buf; + size_t inleft = term->u.general->len; + char *outbuf = termz; + size_t outleft = IT_MAX_WORD-1; + size_t ret; + + yaz_log (LOG_DEBUG, "converting general from ISO-8859-1"); + ret = iconv(zh->iconv_to_utf8, &inbuf, &inleft, + &outbuf, &outleft); + if (ret == (size_t)(-1)) + { + ret = iconv(zh->iconv_to_utf8, 0, 0, 0, 0); + zh->errCode = 125; + return -1; + } + *outbuf = 0; + return 0; + } +#endif + sizez = term->u.general->len; + if (sizez > IT_MAX_WORD-1) + sizez = IT_MAX_WORD-1; + memcpy (termz, term->u.general->buf, sizez); + termz[sizez] = '\0'; + break; + case Z_Term_characterString: + sizez = strlen(term->u.characterString); + if (sizez > IT_MAX_WORD-1) + sizez = IT_MAX_WORD-1; + memcpy (termz, term->u.characterString, sizez); + termz[sizez] = '\0'; + break; + default: + zh->errCode = 124; + } + return 0; } static void trans_scan_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, @@ -1078,6 +1167,7 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no, int length_prox_term = 0; int min_nn = 10000000; int term_index; + int term_type = Z_Term_characterString; const char *flags = NULL; rsfd = (RSFD *) xmalloc (sizeof(*rsfd)*rset_no); @@ -1103,6 +1193,12 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no, if (min_nn > rset[i]->rset_terms[j]->nn) min_nn = rset[i]->rset_terms[j]->nn; flags = nflags; + term_type = rset[i]->rset_terms[j]->type; + + /* only if all term types are of type characterString .. */ + /* the resulting term is of that type */ + if (term_type != Z_Term_characterString) + term_type = Z_Term_general; } } for (i = 0; inn = 0; result = rset_create (rset_kind_null, &parms); } @@ -1134,7 +1230,7 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no, RSFD rsfd_result; parms.rset_term = rset_term_create (prox_term, length_prox_term, - flags); + flags, term_type); parms.rset_term->nn = min_nn; parms.cmp = key_compare_it; parms.key_size = sizeof (struct it_key); @@ -1193,7 +1289,7 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no, logf (LOG_LOG, "generic prox, dist = %d, relation = %d, ordered =%d, exclusion=%d", distance, relation, ordered, exclusion); parms.rset_term = rset_term_create (prox_term, length_prox_term, - flags); + flags, term_type); parms.rset_term->nn = min_nn; parms.cmp = key_compare_it; parms.key_size = sizeof (struct it_key); @@ -1273,7 +1369,7 @@ static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no, rset_null_parms parms; parms.rset_term = rset_term_create (prox_term, length_prox_term, - flags); + flags, term_type); parms.rset_term->nn = 0; result = rset_create (rset_kind_null, &parms); } @@ -1334,6 +1430,14 @@ char *normalize_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, } } +static void grep_info_delete (struct grep_info *grep_info) +{ +#ifdef TERM_COUNT + xfree(grep_info->term_no); +#endif + xfree (grep_info->isam_p_buf); +} + static int grep_info_prepare (ZebraHandle zh, Z_AttributesPlusTerm *zapt, struct grep_info *grep_info, @@ -1392,7 +1496,7 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh, { char term_dst[IT_MAX_WORD+1]; RSET rset[60], result; - int i, r, rset_no = 0; + int i, rset_no = 0; struct grep_info grep_info; char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type); const char *termp = termz; @@ -1403,29 +1507,23 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh, while (1) { logf (LOG_DEBUG, "APT_phrase termp=%s", termp); - grep_info.isam_p_indx = 0; - r = string_term (zh, zapt, &termp, attributeSet, stream, &grep_info, - reg_type, complete_flag, num_bases, basenames, - term_dst); - if (r < 1) + rset[rset_no] = term_trunc (zh, zapt, &termp, attributeSet, + stream, &grep_info, + reg_type, complete_flag, + num_bases, basenames, + term_dst, rank_type); + if (!rset[rset_no]) break; - logf (LOG_DEBUG, "term: %s", term_dst); - rset[rset_no] = rset_trunc (zh, grep_info.isam_p_buf, - grep_info.isam_p_indx, term_dst, - strlen(term_dst), rank_type); - assert (rset[rset_no]); if (++rset_no >= (int) (sizeof(rset)/sizeof(*rset))) break; } -#ifdef TERM_COUNT - xfree(grep_info.term_no); -#endif - xfree (grep_info.isam_p_buf); + grep_info_delete (&grep_info); if (rset_no == 0) { rset_null_parms parms; - parms.rset_term = rset_term_create (termz, -1, rank_type); + parms.rset_term = rset_term_create (termz, -1, rank_type, + zapt->term->which); return rset_create (rset_kind_null, &parms); } else if (rset_no == 1) @@ -1447,7 +1545,7 @@ static RSET rpn_search_APT_or_list (ZebraHandle zh, { char term_dst[IT_MAX_WORD+1]; RSET rset[60], result; - int i, r, rset_no = 0; + int i, rset_no = 0; struct grep_info grep_info; char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type); const char *termp = termz; @@ -1457,29 +1555,23 @@ static RSET rpn_search_APT_or_list (ZebraHandle zh, while (1) { logf (LOG_DEBUG, "APT_or_list termp=%s", termp); - grep_info.isam_p_indx = 0; - r = string_term (zh, zapt, &termp, attributeSet, stream, &grep_info, - reg_type, complete_flag, num_bases, basenames, - term_dst); - if (r < 1) + rset[rset_no] = term_trunc (zh, zapt, &termp, attributeSet, + stream, &grep_info, + reg_type, complete_flag, + num_bases, basenames, + term_dst, rank_type); + if (!rset[rset_no]) break; - logf (LOG_DEBUG, "term: %s", term_dst); - rset[rset_no] = rset_trunc (zh, grep_info.isam_p_buf, - grep_info.isam_p_indx, term_dst, - strlen(term_dst), rank_type); - assert (rset[rset_no]); if (++rset_no >= (int) (sizeof(rset)/sizeof(*rset))) break; } -#ifdef TERM_COUNT - xfree(grep_info.term_no); -#endif - xfree (grep_info.isam_p_buf); + grep_info_delete (&grep_info); if (rset_no == 0) { rset_null_parms parms; - parms.rset_term = rset_term_create (termz, -1, rank_type); + parms.rset_term = rset_term_create (termz, -1, rank_type, + zapt->term->which); return rset_create (rset_kind_null, &parms); } result = rset[0]; @@ -1507,7 +1599,7 @@ static RSET rpn_search_APT_and_list (ZebraHandle zh, { char term_dst[IT_MAX_WORD+1]; RSET rset[60], result; - int i, r, rset_no = 0; + int i, rset_no = 0; struct grep_info grep_info; char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type); const char *termp = termz; @@ -1517,29 +1609,24 @@ static RSET rpn_search_APT_and_list (ZebraHandle zh, while (1) { logf (LOG_DEBUG, "APT_and_list termp=%s", termp); - grep_info.isam_p_indx = 0; - r = string_term (zh, zapt, &termp, attributeSet, stream, &grep_info, - reg_type, complete_flag, num_bases, basenames, - term_dst); - if (r < 1) + rset[rset_no] = term_trunc (zh, zapt, &termp, attributeSet, + stream, &grep_info, + reg_type, complete_flag, + num_bases, basenames, + term_dst, rank_type); + if (!rset[rset_no]) break; - logf (LOG_DEBUG, "term: %s", term_dst); - rset[rset_no] = rset_trunc (zh, grep_info.isam_p_buf, - grep_info.isam_p_indx, term_dst, - strlen(term_dst), rank_type); assert (rset[rset_no]); if (++rset_no >= (int) (sizeof(rset)/sizeof(*rset))) break; } -#ifdef TERM_COUNT - xfree(grep_info.term_no); -#endif - xfree (grep_info.isam_p_buf); + grep_info_delete (&grep_info); if (rset_no == 0) { rset_null_parms parms; - parms.rset_term = rset_term_create (termz, -1, rank_type); + parms.rset_term = rset_term_create (termz, -1, rank_type, + zapt->term->which); return rset_create (rset_kind_null, &parms); } result = rset[0]; @@ -1730,20 +1817,20 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh, logf (LOG_DEBUG, "term: %s", term_dst); rset[rset_no] = rset_trunc (zh, grep_info.isam_p_buf, grep_info.isam_p_indx, term_dst, - strlen(term_dst), rank_type); + strlen(term_dst), rank_type, + 0 /* preserve position */, + zapt->term->which); assert (rset[rset_no]); if (++rset_no >= (int) (sizeof(rset)/sizeof(*rset))) break; } -#ifdef TERM_COUNT - xfree(grep_info.term_no); -#endif - xfree (grep_info.isam_p_buf); + grep_info_delete (&grep_info); if (rset_no == 0) { rset_null_parms parms; - parms.rset_term = rset_term_create (term_dst, -1, rank_type); + parms.rset_term = rset_term_create (term_dst, -1, rank_type, + zapt->term->which); return rset_create (rset_kind_null, &parms); } result = rset[0]; @@ -1771,7 +1858,8 @@ static RSET rpn_search_APT_local (ZebraHandle zh, Z_AttributesPlusTerm *zapt, struct it_key key; rset_temp_parms parms; - parms.rset_term = rset_term_create (termz, -1, rank_type); + parms.rset_term = rset_term_create (termz, -1, rank_type, + zapt->term->which); parms.cmp = key_compare_it; parms.key_size = sizeof (struct it_key); parms.temp_path = res_get (zh->res, "setTmpDir"); @@ -1884,10 +1972,141 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, sort_sequence->specs[i] = sks; - parms.rset_term = rset_term_create (termz, -1, rank_type); + parms.rset_term = rset_term_create (termz, -1, rank_type, + zapt->term->which); return rset_create (rset_kind_null, &parms); } +static RSET rpn_search_xpath (ZebraHandle zh, Z_AttributesPlusTerm *zapt, + oid_value attributeSet, + int num_bases, char **basenames, + NMEM stream, const char *rank_type, RSET rset) +{ + AttrType use; + const char *use_string = 0; + oid_value curAttributeSet = attributeSet; + char term_dict[2048]; + int base_no; + int reg_type = '0'; + struct grep_info grep_info; + + yaz_log (LOG_LOG, "rpn_search_xpath 1"); + attr_init (&use, zapt, 1); + attr_find_ex (&use, &curAttributeSet, &use_string); + + if (curAttributeSet != VAL_IDXPATH) + { + yaz_log (LOG_LOG, "rpn_search_xpath - not 1"); + return rset; + } + if (!use_string) + { + yaz_log (LOG_LOG, "rpn_search_xpath - not 2"); + return rset; + } + + dict_grep_cmap (zh->reg->dict, 0, 0); + if (grep_info_prepare (zh, zapt, &grep_info, reg_type, stream)) + return 0; + + yaz_log (LOG_LOG, "rpn_search_xpath 2"); + for (base_no = 0; base_no < num_bases; base_no++) + { + const char *termp = use_string; + rset_between_parms parms; + RSET rset_start_tag, rset_end_tag; + int ord, ord_len, i, r, max_pos; + int prefix_len ; + char ord_buf[32]; + if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no])) + { + zh->errCode = 109; /* Database unavailable */ + zh->errString = basenames[base_no]; + return rset; + } + + prefix_len = 0; + ord = zebraExplain_lookupSU (zh->reg->zei, curAttributeSet, 1); + if (ord < 0) + continue; + if (prefix_len) + term_dict[prefix_len++] = '|'; + else + term_dict[prefix_len++] = '('; + + ord_len = key_SU_encode (ord, ord_buf); + for (i = 0; ireg->dict, term_dict, 0, + &grep_info, &max_pos, 0, grep_handle); + yaz_log (LOG_LOG, "%s %d positions", use_string, + grep_info.isam_p_indx); + rset_start_tag = + rset_trunc (zh, grep_info.isam_p_buf, + grep_info.isam_p_indx, use_string, strlen(use_string), + rank_type, 1, zapt->term->which); + + prefix_len = 0; + ord = zebraExplain_lookupSU (zh->reg->zei, curAttributeSet, 2); + if (ord < 0) + continue; + if (prefix_len) + term_dict[prefix_len++] = '|'; + else + term_dict[prefix_len++] = '('; + + ord_len = key_SU_encode (ord, ord_buf); + for (i = 0; ireg->dict, term_dict, 0, + &grep_info, &max_pos, 0, grep_handle); + + yaz_log (LOG_LOG, "%s %d positions", use_string, + grep_info.isam_p_indx); + rset_end_tag = + rset_trunc (zh, grep_info.isam_p_buf, + grep_info.isam_p_indx, use_string, strlen(use_string), + rank_type, 1, zapt->term->which); + + parms.key_size = sizeof(struct it_key); + parms.cmp = key_compare_it; + parms.rset_l = rset_start_tag; + parms.rset_m = rset; + parms.rset_r = rset_end_tag; + parms.printer = key_print_it; + yaz_log (LOG_LOG, "rpn_search_xpath 4"); + rset = rset_create (rset_kind_between, &parms); + } + grep_info_delete (&grep_info); + + return rset; +} + + static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, oid_value attributeSet, NMEM stream, @@ -1900,6 +2119,7 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, int complete_flag; int sort_flag; char termz[IT_MAX_WORD+1]; + RSET rset = 0; zebra_maps_attr (zh->reg->zebra_maps, zapt, ®_id, &search_type, rank_type, &complete_flag, &sort_flag); @@ -1909,12 +2129,8 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, logf (LOG_DEBUG, "search_type=%s", search_type); logf (LOG_DEBUG, "rank_type=%s", rank_type); - if (zapt->term->which != Z_Term_general) - { - zh->errCode = 124; - return NULL; - } - trans_term (zh, zapt, termz); + if (trans_term (zh, zapt, termz)) + return 0; if (sort_flag) return rpn_sort_spec (zh, zapt, attributeSet, stream, sort_sequence, @@ -1922,35 +2138,37 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (!strcmp (search_type, "phrase")) { - return rpn_search_APT_phrase (zh, zapt, termz, attributeSet, stream, + rset = rpn_search_APT_phrase (zh, zapt, termz, attributeSet, stream, reg_id, complete_flag, rank_type, num_bases, basenames); } else if (!strcmp (search_type, "and-list")) { - return rpn_search_APT_and_list (zh, zapt, termz, attributeSet, stream, + rset = rpn_search_APT_and_list (zh, zapt, termz, attributeSet, stream, reg_id, complete_flag, rank_type, num_bases, basenames); } else if (!strcmp (search_type, "or-list")) { - return rpn_search_APT_or_list (zh, zapt, termz, attributeSet, stream, + rset = rpn_search_APT_or_list (zh, zapt, termz, attributeSet, stream, reg_id, complete_flag, rank_type, num_bases, basenames); } else if (!strcmp (search_type, "local")) { - return rpn_search_APT_local (zh, zapt, termz, attributeSet, stream, + rset = rpn_search_APT_local (zh, zapt, termz, attributeSet, stream, rank_type); } else if (!strcmp (search_type, "numeric")) { - return rpn_search_APT_numeric (zh, zapt, termz, attributeSet, stream, + rset = rpn_search_APT_numeric (zh, zapt, termz, attributeSet, stream, reg_id, complete_flag, rank_type, num_bases, basenames); } - zh->errCode = 118; - return NULL; + else + zh->errCode = 118; + return rpn_search_xpath (zh, zapt, attributeSet, num_bases, basenames, + stream, rank_type, rset); } static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, @@ -2357,7 +2575,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, &glist[i+before].term, mterm); rset = rset_trunc (zh, &scan_info_array[j0].list[ptr[j0]].isam_p, 1, glist[i+before].term, strlen(glist[i+before].term), - NULL); + NULL, 0, zapt->term->which); ptr[j0]++; for (j = j0+1; jterm->which); bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; @@ -2423,7 +2642,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, rset = rset_trunc (zh, &scan_info_array[j0].list[before-1-ptr[j0]].isam_p, 1, glist[before-1-i].term, strlen(glist[before-1-i].term), - NULL); + NULL, 0, zapt->term->which); ptr[j0]++; @@ -2439,7 +2658,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, rset2 = rset_trunc (zh, &scan_info_array[j].list[before-1-ptr[j]].isam_p, 1, glist[before-1-i].term, - strlen(glist[before-1-i].term), NULL); + strlen(glist[before-1-i].term), NULL, 0, + zapt->term->which); bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it;