X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzrpn.c;h=60d45e271d1d9c46f2da0ef1dce7929a9d1bb34e;hb=863d336f803da454e03f39ee2225719fed05021e;hp=80d66c76b4f31362d946d2a526ac1670c625fb06;hpb=eb700030823ff35d2b94d2e6139ee40617520331;p=idzebra-moved-to-github.git diff --git a/index/zrpn.c b/index/zrpn.c index 80d66c7..60d45e2 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -1,5 +1,5 @@ -/* $Id: zrpn.c,v 1.125 2002-10-03 10:16:23 adam Exp $ - Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 +/* $Id: zrpn.c,v 1.144 2004-08-20 14:44:46 heikki Exp $ + Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps This file is part of the Zebra server. @@ -31,18 +31,28 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include "index.h" +#include #include #include #include #include #include +#include struct rpn_char_map_info { ZebraMaps zm; int reg_type; }; +typedef struct { + int type; + int major; + int minor; + Z_AttributesPlusTerm *zapt; +} AttrType; + + static const char **rpn_char_map_handler (void *vp, const char **from, int len) { struct rpn_char_map_info *p = (struct rpn_char_map_info *) vp; @@ -70,32 +80,17 @@ static void rpn_char_map_prepare (struct zebra_register *reg, int reg_type, dict_grep_cmap (reg->dict, map_info, rpn_char_map_handler); } -typedef struct { - int type; - int major; - int minor; - Z_AttributesPlusTerm *zapt; -} AttrType; - static int attr_find_ex (AttrType *src, oid_value *attributeSetP, const char **string_value) { int num_attributes; -#ifdef ASN_COMPILED num_attributes = src->zapt->attributes->num_attributes; -#else - num_attributes = src->zapt->num_attributes; -#endif while (src->major < num_attributes) { Z_AttributeElement *element; -#ifdef ASN_COMPILED element = src->zapt->attributes->attributes[src->major]; -#else - element = src->zapt->attributeList[src->major]; -#endif if (src->type == *element->attributeType) { switch (element->which) @@ -169,7 +164,7 @@ struct grep_info { #ifdef TERM_COUNT int *term_no; #endif - ISAMS_P *isam_p_buf; + ISAMC_P *isam_p_buf; int isam_p_size; int isam_p_indx; ZebraHandle zh; @@ -199,12 +194,12 @@ static void add_isam_p (const char *name, const char *info, { if (p->isam_p_indx == p->isam_p_size) { - ISAMS_P *new_isam_p_buf; + ISAMC_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 = (ISAMS_P *) xmalloc (sizeof(*new_isam_p_buf) * + new_isam_p_buf = (ISAMC_P *) xmalloc (sizeof(*new_isam_p_buf) * p->isam_p_size); if (p->isam_p_buf) { @@ -453,18 +448,43 @@ static int term_104 (ZebraMaps zebra_maps, int reg_type, int i = 0; int j = 0; - if (!term_pre (zebra_maps, reg_type, src, "#!", "#!")) + if (!term_pre (zebra_maps, reg_type, src, "?*#", "?*#")) return 0; s0 = *src; while (*s0) { - if (*s0 == '#') + if (*s0 == '?') + { + dst_term[j++] = *s0++; + if (*s0 >= '0' && *s0 <= '9') + { + int limit = 0; + while (*s0 >= '0' && *s0 <= '9') + { + limit = limit * 10 + (*s0 - '0'); + dst_term[j++] = *s0++; + } + if (limit > 20) + limit = 20; + while (--limit >= 0) + { + dst[i++] = '.'; + dst[i++] = '?'; + } + } + else + { + dst[i++] = '.'; + dst[i++] = '*'; + } + } + else if (*s0 == '*') { dst[i++] = '.'; dst[i++] = '*'; dst_term[j++] = *s0++; } - else if (*s0 == '!') + else if (*s0 == '#') { dst[i++] = '.'; dst_term[j++] = *s0++; @@ -680,7 +700,7 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, int relation_value; int i; char *term_tmp = term_dict + strlen(term_dict); - char term_component[256]; + char term_component[2*IT_MAX_WORD+20]; attr_init (&relation, zapt, 2); relation_value = attr_find (&relation, NULL); @@ -714,6 +734,9 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, *term_tmp++ = ']'; *term_tmp++ = '.'; *term_tmp++ = '*'; + + if ((term_tmp - term_dict) > IT_MAX_WORD) + break; } *term_tmp++ = ')'; *term_tmp = '\0'; @@ -743,6 +766,9 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, *term_tmp++ = '*'; *term_tmp++ = '|'; + + if ((term_tmp - term_dict) > IT_MAX_WORD) + break; } for (i = 0; term_component[i]; ) string_rel_add_char (&term_tmp, term_component, &i); @@ -773,6 +799,9 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, *term_tmp++ = '*'; *term_tmp++ = '|'; + + if ((term_tmp - term_dict) > IT_MAX_WORD) + break; } for (i = 0; term_component[i];) string_rel_add_char (&term_tmp, term_component, &i); @@ -812,6 +841,9 @@ static int string_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, *term_tmp++ = ']'; *term_tmp++ = '.'; *term_tmp++ = '*'; + + if ((term_tmp - term_dict) > IT_MAX_WORD) + break; } *term_tmp++ = ')'; *term_tmp = '\0'; @@ -881,6 +913,10 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, struct rpn_char_map_info rcmi; int space_split = complete_flag ? 0 : 1; + int bases_ok = 0; /* no of databases with OK attribute */ + int errCode = 0; /* err code (if any is not OK) */ + char *errString = 0; /* addinfo */ + rpn_char_map_prepare (zh->reg, reg_type, &rcmi); attr_init (&use, zapt, 1); use_value = attr_find_ex (&use, &curAttributeSet, &use_string); @@ -906,7 +942,7 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, zh->errString = basenames[base_no]; return -1; } - if (use_value == -2) /* string attribute (assume IDXPATH/any) */ + if (xpath_use > 0 && use_value == -2) { use_value = xpath_use; attp.local_attributes = &id_xpath_attr; @@ -923,17 +959,23 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } else { - if ((r=att_getentbyatt (zh, &attp, curAttributeSet, use_value))) + if ((r=att_getentbyatt (zh, &attp, curAttributeSet, use_value, + use_string))) { 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 (1)", use_value); - zh->errCode = 114; - zh->errString = nmem_strdup (stream, val_str); + errCode = 114; + if (use_string) + errString = nmem_strdup(stream, use_string); + else + { + char val_str[32]; + sprintf (val_str, "%d", use_value); + errString = nmem_strdup (stream, val_str); + } } else { @@ -945,10 +987,10 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, oident.value = curAttributeSet; oid_ent_to_oid (&oident, oid); - zh->errCode = 121; - zh->errString = nmem_strdup (stream, oident.desc); + errCode = 121; + errString = nmem_strdup (stream, oident.desc); } - return -1; + continue; } } for (local_attr = attp.local_attributes; local_attr; @@ -976,12 +1018,18 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } if (!prefix_len) { +#if 1 + bases_ok++; +#else char val_str[32]; - sprintf (val_str, "%d (2)", use_value); - zh->errCode = 114; - zh->errString = nmem_strdup (stream, val_str); - return -1; + sprintf (val_str, "%d", use_value); + errCode = 114; + errString = nmem_strdup (stream, val_str); +#endif + continue; } + bases_ok++; /* this has OK attributes */ + term_dict[prefix_len++] = ')'; term_dict[prefix_len++] = 1; term_dict[prefix_len++] = reg_type; @@ -1104,6 +1152,12 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, break; } } + if (!bases_ok) + { + zh->errCode = errCode; + zh->errString = errString; + return -1; + } *term_sub = termp; logf (LOG_DEBUG, "%d positions", grep_info->isam_p_indx); return 1; @@ -1199,237 +1253,6 @@ static int trans_scan_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, return 0; } -static RSET rpn_prox (ZebraHandle zh, RSET *rset, int rset_no, - int ordered, int exclusion, int relation, int distance) -{ - int i; - RSFD *rsfd; - int *more; - struct it_key **buf; - RSET result; - char prox_term[1024]; - 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); - more = (int *) xmalloc (sizeof(*more)*rset_no); - buf = (struct it_key **) xmalloc (sizeof(*buf)*rset_no); - - *prox_term = '\0'; - for (i = 0; ino_rset_terms; j++) - { - const char *nflags = rset[i]->rset_terms[j]->flags; - char *term = rset[i]->rset_terms[j]->name; - int lterm = strlen(term); - if (lterm + length_prox_term < sizeof(prox_term)-1) - { - if (length_prox_term) - prox_term[length_prox_term++] = ' '; - strcpy (prox_term + length_prox_term, term); - length_prox_term += lterm; - } - 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); - } - else if (ordered && relation == 3 && exclusion == 0 && distance == 1) - { - /* special proximity case = phrase search ... */ - rset_temp_parms parms; - RSFD rsfd_result; - - parms.rset_term = rset_term_create (prox_term, length_prox_term, - flags, term_type); - parms.rset_term->nn = min_nn; - parms.cmp = key_compare_it; - 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); - - while (*more) - { - for (i = 1; i 1) - { - more[i-1] = rset_read (rset[i-1], rsfd[i-1], - buf[i-1], &term_index); - break; - } - else if (cmp == 1) - { - if (buf[i-1]->seqno+1 != buf[i]->seqno) - { - more[i-1] = rset_read (rset[i-1], rsfd[i-1], - buf[i-1], &term_index); - break; - } - } - else - { - more[i] = rset_read (rset[i], rsfd[i], buf[i], - &term_index); - break; - } - } - if (i == rset_no) - { - rset_write (result, rsfd_result, buf[0]); - more[0] = rset_read (*rset, *rsfd, *buf, &term_index); - } - } - rset_close (result, rsfd_result); - } - else if (rset_no == 2) - { - /* generic proximity case (two input sets only) ... */ - rset_temp_parms parms; - RSFD rsfd_result; - - 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, term_type); - parms.rset_term->nn = min_nn; - parms.cmp = key_compare_it; - 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); - - while (more[0] && more[1]) - { - 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, term_type); - parms.rset_term->nn = 0; - result = rset_create (rset_kind_null, &parms); - } - for (i = 0; iterm->which); return rset_create (rset_kind_null, &parms); } else if (rset_no == 1) return (rset[0]); - result = rpn_prox (zh, rset, rset_no, 1, 0, 3, 1); - for (i = 0; iterm->which); return rset_create (rset_kind_null, &parms); } result = rset[0]; @@ -1632,6 +1463,7 @@ static RSET rpn_search_APT_or_list (ZebraHandle zh, bool_parms.rset_r = rset[i]; bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; + bool_parms.log_item = key_logdump_txt; result = rset_create (rset_kind_or, &bool_parms); } return result; @@ -1675,9 +1507,6 @@ static RSET rpn_search_APT_and_list (ZebraHandle zh, if (rset_no == 0) { rset_null_parms parms; - - parms.rset_term = rset_term_create (termz, -1, rank_type, - zapt->term->which); return rset_create (rset_kind_null, &parms); } result = rset[0]; @@ -1689,6 +1518,7 @@ static RSET rpn_search_APT_and_list (ZebraHandle zh, bool_parms.rset_r = rset[i]; bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; + bool_parms.log_item = key_logdump_txt; result = rset_create (rset_kind_and, &bool_parms); } return result; @@ -1755,20 +1585,24 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, oid_value attributeSet, struct grep_info *grep_info, int reg_type, int complete_flag, int num_bases, char **basenames, - char *term_dst) + char *term_dst, int xpath_use, NMEM stream) { char term_dict[2*IT_MAX_WORD+2]; int r, base_no; AttrType use; int use_value; + const char *use_string = 0; oid_value curAttributeSet = attributeSet; const char *termp; struct rpn_char_map_info rcmi; + int bases_ok = 0; /* no of databases with OK attribute */ + int errCode = 0; /* err code (if any is not OK) */ + char *errString = 0; /* addinfo */ + rpn_char_map_prepare (zh->reg, reg_type, &rcmi); attr_init (&use, zapt, 1); - use_value = attr_find (&use, &curAttributeSet); - logf (LOG_DEBUG, "numeric_term, use value %d", use_value); + use_value = attr_find_ex (&use, &curAttributeSet, &use_string); if (use_value == -1) use_value = 1016; @@ -1776,19 +1610,44 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, 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))) + if (use_value == -2) /* string attribute (assume IDXPATH/any) */ { - logf (LOG_DEBUG, "att_getentbyatt fail. set=%d use=%d r=%d", - curAttributeSet, use_value, r); - if (r == -1) - zh->errCode = 114; - else - zh->errCode = 121; - return -1; + use_value = xpath_use; + attp.local_attributes = &id_xpath_attr; + attp.attset_ordinal = VAL_IDXPATH; + id_xpath_attr.next = 0; + id_xpath_attr.local = use_value; + } + else if (curAttributeSet == VAL_IDXPATH) + { + attp.local_attributes = &id_xpath_attr; + attp.attset_ordinal = VAL_IDXPATH; + id_xpath_attr.next = 0; + id_xpath_attr.local = use_value; + } + else + { + if ((r=att_getentbyatt (zh, &attp, curAttributeSet, use_value, + use_string))) + { + 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); + errString = nmem_strdup (stream, val_str); + errCode = 114; + } + else + errCode = 121; + continue; + } } if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no])) { @@ -1821,9 +1680,13 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } if (!prefix_len) { - zh->errCode = 114; - return -1; + char val_str[32]; + sprintf (val_str, "%d", use_value); + errCode = 114; + errString = nmem_strdup (stream, val_str); + continue; } + bases_ok++; term_dict[prefix_len++] = ')'; term_dict[prefix_len++] = 1; term_dict[prefix_len++] = reg_type; @@ -1834,6 +1697,12 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, term_dst)) return 0; } + if (!bases_ok) + { + zh->errCode = errCode; + zh->errString = errString; + return -1; + } *term_sub = termp; logf (LOG_DEBUG, "%d positions", grep_info->isam_p_indx); return 1; @@ -1845,7 +1714,7 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh, oid_value attributeSet, NMEM stream, int reg_type, int complete_flag, - const char *rank_type, + const char *rank_type, int xpath_use, int num_bases, char **basenames) { char term_dst[IT_MAX_WORD+1]; @@ -1862,7 +1731,8 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh, grep_info.isam_p_indx = 0; r = numeric_term (zh, zapt, &termp, attributeSet, &grep_info, reg_type, complete_flag, num_bases, basenames, - term_dst); + term_dst, xpath_use, + stream); if (r < 1) break; logf (LOG_DEBUG, "term: %s", term_dst); @@ -1879,9 +1749,6 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh, if (rset_no == 0) { rset_null_parms parms; - - parms.rset_term = rset_term_create (term_dst, -1, rank_type, - zapt->term->which); return rset_create (rset_kind_null, &parms); } result = rset[0]; @@ -1893,6 +1760,7 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh, bool_parms.rset_r = rset[i]; bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; + bool_parms.log_item = key_logdump_txt; result = rset_create (rset_kind_and, &bool_parms); } return result; @@ -1907,20 +1775,28 @@ static RSET rpn_search_APT_local (ZebraHandle zh, Z_AttributesPlusTerm *zapt, RSET result; RSFD rsfd; struct it_key key; + int sys; rset_temp_parms parms; - 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"); result = rset_create (rset_kind_temp, &parms); rsfd = rset_open (result, RSETF_WRITE); - key.sysno = atoi (termz); + sys = atoi(termz); + if (sys <= 0) + sys = 1; +#if IT_KEY_NEW + key.mem[0] = sys; + key.mem[1] = 1; + key.len = 2; +#else + key.sysno = sys; key.seqno = 1; if (key.sysno <= 0) key.sysno = 1; +#endif rset_write (result, rsfd, &key); rset_close (result, rsfd); return result; @@ -2004,149 +1880,41 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, sks->sortRelation = (int *) nmem_malloc (stream, sizeof(*sks->sortRelation)); if (sort_relation_value == 1) - *sks->sortRelation = Z_SortRelation_ascending; + *sks->sortRelation = Z_SortKeySpec_ascending; else if (sort_relation_value == 2) - *sks->sortRelation = Z_SortRelation_descending; + *sks->sortRelation = Z_SortKeySpec_descending; else - *sks->sortRelation = Z_SortRelation_ascending; + *sks->sortRelation = Z_SortKeySpec_ascending; sks->caseSensitivity = (int *) nmem_malloc (stream, sizeof(*sks->caseSensitivity)); *sks->caseSensitivity = 0; -#ifdef ASN_COMPILED sks->which = Z_SortKeySpec_null; sks->u.null = odr_nullval (); -#else - sks->missingValueAction = 0; -#endif - sort_sequence->specs[i] = sks; - - parms.rset_term = rset_term_create (termz, -1, rank_type, - zapt->term->which); return rset_create (rset_kind_null, &parms); } -struct xpath_predicate { - int which; - union { -#define XPATH_PREDICATE_RELATION 1 - struct { - char *name; - char *op; - char *value; - } relation; -#define XPATH_PREDICATE_BOOLEAN 2 - struct { - const char *op; - struct xpath_predicate *left; - struct xpath_predicate *right; - } boolean; - } u; -}; - -struct xpath_location_step { - char *part; - struct xpath_predicate *predicate; -}; static int parse_xpath(ZebraHandle zh, Z_AttributesPlusTerm *zapt, oid_value attributeSet, - struct xpath_location_step *xpath, NMEM mem) + struct xpath_location_step *xpath, int max, NMEM mem) { oid_value curAttributeSet = attributeSet; AttrType use; const char *use_string = 0; - const char *cp; - int no = 0; attr_init (&use, zapt, 1); attr_find_ex (&use, &curAttributeSet, &use_string); if (!use_string || *use_string != '/') return -1; - cp = use_string; - while (*cp) - { - int i = 0; - while (*cp && !strchr("/[",*cp)) - { - i++; - cp++; - } - xpath[no].predicate = 0; - xpath[no].part = nmem_malloc (mem, i+1); - memcpy (xpath[no].part, cp - i, i); - xpath[no].part[i] = 0; - if (*cp == '[') - { - struct xpath_predicate *p = xpath[no].predicate = - nmem_malloc (mem, sizeof(struct xpath_predicate)); - - p->which = XPATH_PREDICATE_RELATION; - cp++; - while (*cp == ' ') - cp++; - - for (i = 0; *cp && !strchr("><=] ", *cp); i++) - cp++; - p->u.relation.name = nmem_malloc (mem, i+1); - memcpy (p->u.relation.name, cp - i, i); - p->u.relation.name[i] = 0; - while (*cp == ' ') - cp++; - if (*cp != ']') - { - for (i = 0; *cp && strchr(">=u.relation.op = nmem_malloc (mem, i+1); - if (i) - memcpy (p->u.relation.op, cp - i, i); - p->u.relation.op[i] = 0; - - while (*cp == ' ') - cp++; - - if (strchr("\"'", *cp)) - { - cp++; - for (i = 0; *cp && !strchr("\"'", *cp); i++) - cp++; - - p->u.relation.value = nmem_malloc (mem, i+1); - if (i) - memcpy (p->u.relation.value, cp - i, i); - p->u.relation.value[i] = 0; - yaz_log (LOG_LOG, "value=%s", p->u.relation.value); - - cp++; - } - else - { - for (i = 0; *cp && !strchr(" ]", *cp); i++) - cp++; - p->u.relation.value = nmem_malloc (mem, i+1); - if (i) - memcpy (p->u.relation.value, cp - i, i); - p->u.relation.value[i] = 0; - } - while (*cp == ' ') - cp++; - } - if (*cp == ']') - cp++; - } /* end of ] predicate */ - no++; - if (*cp != '/') - break; - cp++; - } - return no; + return zebra_parse_xpath_str(use_string, xpath, max, mem); } - + + static RSET xpath_trunc(ZebraHandle zh, NMEM stream, int reg_type, const char *term, int use, @@ -2165,20 +1933,12 @@ static RSET xpath_trunc(ZebraHandle zh, NMEM stream, if (grep_info_prepare (zh, 0 /* zapt */, &grep_info, '0', stream)) { rset_null_parms parms; - - parms.rset_term = rset_term_create (term, strlen(term), - flags, term_type); - parms.rset_term->nn = 0; return rset_create (rset_kind_null, &parms); } if (ord < 0) { rset_null_parms parms; - - parms.rset_term = rset_term_create (term, strlen(term), - flags, term_type); - parms.rset_term->nn = 0; return rset_create (rset_kind_null, &parms); } if (prefix_len) @@ -2307,18 +2067,25 @@ static RSET rpn_search_xpath (ZebraHandle zh, xpath[level].predicate->which == XPATH_PREDICATE_RELATION && xpath[level].predicate->u.relation.name[0]) { - char predicate_str[128]; - - strcpy (predicate_str, - xpath[level].predicate->u.relation.name+1); + WRBUF wbuf = wrbuf_alloc(); + wrbuf_puts(wbuf, xpath[level].predicate->u.relation.name+1); if (xpath[level].predicate->u.relation.value) { - strcat (predicate_str, "="); - strcat (predicate_str, - xpath[level].predicate->u.relation.value); + const char *cp = xpath[level].predicate->u.relation.value; + wrbuf_putc(wbuf, '='); + + while (*cp) + { + if (strchr(REGEX_CHARS, *cp)) + wrbuf_putc(wbuf, '\\'); + wrbuf_putc(wbuf, *cp); + cp++; + } } + wrbuf_puts(wbuf, ""); rset_attr = xpath_trunc ( - zh, stream, '0', predicate_str, 3, curAttributeSet); + zh, stream, '0', wrbuf_buf(wbuf), 3, curAttributeSet); + wrbuf_free(wbuf, 1); } else { @@ -2382,7 +2149,7 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (sort_flag) return rpn_sort_spec (zh, zapt, attributeSet, stream, sort_sequence, rank_type); - xpath_len = parse_xpath(zh, zapt, attributeSet, xpath, stream); + xpath_len = parse_xpath(zh, zapt, attributeSet, xpath, 10, stream); if (xpath_len >= 0) { xpath_use = 1016; @@ -2420,6 +2187,7 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, { rset = rpn_search_APT_numeric (zh, zapt, termz, attributeSet, stream, reg_id, complete_flag, rank_type, + xpath_use, num_bases, basenames); } else if (!strcmp (search_type, "always")) @@ -2460,6 +2228,7 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, } bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; + bool_parms.log_item = key_logdump_txt; switch (zop->which) { @@ -2473,21 +2242,11 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, r = rset_create (rset_kind_not, &bool_parms); break; case Z_Operator_prox: -#ifdef ASN_COMPILED if (zop->u.prox->which != Z_ProximityOperator_known) { zh->errCode = 132; return NULL; } -#else - if (zop->u.prox->which != Z_ProxCode_known) - { - zh->errCode = 132; - return NULL; - } -#endif - -#ifdef ASN_COMPILED if (*zop->u.prox->u.known != Z_ProxUnit_word) { char *val = (char *) nmem_malloc (stream, 16); @@ -2496,31 +2255,26 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, sprintf (val, "%d", *zop->u.prox->u.known); return NULL; } -#else - if (*zop->u.prox->proximityUnitCode != Z_ProxUnit_word) - { - char *val = (char *) nmem_malloc (stream, 16); - zh->errCode = 132; - zh->errString = val; - sprintf (val, "%d", *zop->u.prox->proximityUnitCode); - return NULL; - } -#endif else { - RSET rsets[2]; - - rsets[0] = bool_parms.rset_l; - rsets[1] = bool_parms.rset_r; + /* new / old prox */ + rset_prox_parms parms; + RSET twosets[2]; - 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]); + twosets[0] = bool_parms.rset_l; + twosets[1] = bool_parms.rset_r; + parms.rset = twosets; + parms.rset_no = 2; + parms.ordered = *zop->u.prox->ordered; + parms.exclusion = (!zop->u.prox->exclusion ? 0 : + *zop->u.prox->exclusion); + parms.relation = *zop->u.prox->relationType; + parms.distance = *zop->u.prox->distance; + parms.key_size = sizeof(struct it_key); + parms.cmp = key_compare_it; + parms.getseq = key_get_seq; + parms.log_item = key_logdump_txt; + r = rset_create(rset_kind_prox, &parms); } break; default: @@ -2549,6 +2303,8 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, nmem_strdup (stream, zs->u.simple->u.resultSetId); return 0; } + else + rset_dup(r); } else { @@ -2619,7 +2375,7 @@ RSET rpn_search (ZebraHandle zh, NMEM nmem, struct scan_info_entry { char *term; - ISAMS_P isam_p; + ISAMC_P isam_p; }; struct scan_info { @@ -2643,8 +2399,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(ISAMS_P)); - memcpy (&scan_info->list[idx].isam_p, info+1, sizeof(ISAMS_P)); + assert (*info == sizeof(ISAMC_P)); + memcpy (&scan_info->list[idx].isam_p, info+1, sizeof(ISAMC_P)); return 0; } @@ -2682,23 +2438,30 @@ static void scan_term_untrans (ZebraHandle zh, NMEM stream, int reg_type, static void count_set (RSET r, int *count) { - int psysno = 0; + zint psysno = 0; int kno = 0; struct it_key key; RSFD rfd; - int term_index; logf (LOG_DEBUG, "count_set"); *count = 0; rfd = rset_open (r, RSETF_READ); - while (rset_read (r, rfd, &key, &term_index)) + while (rset_read (r, rfd, &key)) { +#if IT_KEY_NEW + if (key.mem[0] != psysno) + { + psysno = key.mem[0]; + (*count)++; + } +#else if (key.sysno != psysno) { psysno = key.sysno; (*count)++; } +#endif kno++; } rset_close (r, rfd); @@ -2709,7 +2472,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, oid_value attributeset, int num_bases, char **basenames, int *position, int *num_entries, ZebraScanEntry **list, - int *is_partial) + int *is_partial, RSET limit_set, int return_zero) { int i; int pos = *position; @@ -2720,26 +2483,58 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, char termz[IT_MAX_WORD+20]; AttrType use; int use_value; + const char *use_string = 0; struct scan_info *scan_info_array; ZebraScanEntry *glist; int ords[32], ord_no = 0; int ptr[32]; + int bases_ok = 0; /* no of databases with OK attribute */ + int errCode = 0; /* err code (if any is not OK) */ + char *errString = 0; /* addinfo */ + unsigned reg_id; char *search_type = NULL; char rank_type[128]; int complete_flag; int sort_flag; + *list = 0; if (attributeset == VAL_NONE) attributeset = VAL_BIB1; + if (!limit_set) + { + AttrType termset; + int termset_value_numeric; + const char *termset_value_string; + 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; + + limit_set = resultSetRef (zh, termset_name); + } + } + yaz_log (LOG_DEBUG, "position = %d, num = %d set=%d", pos, num, attributeset); attr_init (&use, zapt, 1); - use_value = attr_find (&use, &attributeset); + use_value = attr_find_ex (&use, &attributeset, &use_string); if (zebra_maps_attr (zh->reg->zebra_maps, zapt, ®_id, &search_type, rank_type, &complete_flag, &sort_flag)) @@ -2758,16 +2553,21 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, attent attp; data1_local_attribute *local_attr; - if ((r=att_getentbyatt (zh, &attp, attributeset, use_value))) + if ((r=att_getentbyatt (zh, &attp, attributeset, use_value, + use_string))) { logf (LOG_DEBUG, "att_getentbyatt fail. set=%d use=%d", attributeset, use_value); if (r == -1) - zh->errCode = 114; + { + char val_str[32]; + sprintf (val_str, "%d", use_value); + errCode = 114; + errString = odr_strdup (stream, val_str); + } else - zh->errCode = 121; - *num_entries = 0; - return; + errCode = 121; + continue; } if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no])) { @@ -2776,6 +2576,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, *num_entries = 0; return; } + bases_ok++; for (local_attr = attp.local_attributes; local_attr && ord_no < 32; local_attr = local_attr->next) { @@ -2787,10 +2588,20 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, ords[ord_no++] = ord; } } + if (!bases_ok && errCode) + { + zh->errCode = errCode; + zh->errString = errString; + *num_entries = 0; + } if (ord_no == 0) { + char val_str[32]; + sprintf (val_str, "%d", use_value); + zh->errCode = 114; + zh->errString = odr_strdup (stream, val_str); + *num_entries = 0; - zh->errCode = 113; return; } /* prepare dictionary scanning */ @@ -2878,7 +2689,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; - bool_parms.rset_l = rset; + bool_parms.log_item = key_logdump_txt; + bool_parms.rset_l = rset; bool_parms.rset_r = rset2; rset = rset_create (rset_kind_or, &bool_parms); @@ -2886,6 +2698,18 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, ptr[j]++; } } + if (limit_set) + { + rset_bool_parms bool_parms; + + bool_parms.key_size = sizeof(struct it_key); + bool_parms.cmp = key_compare_it; + bool_parms.log_item = key_logdump_txt; + bool_parms.rset_l = rset; + bool_parms.rset_r = rset_dup(limit_set); + + rset = rset_create (rset_kind_and, &bool_parms); + } count_set (rset, &glist[i+before].occurrences); rset_delete (rset); } @@ -2946,7 +2770,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; - bool_parms.rset_l = rset; + bool_parms.log_item = key_logdump_txt; + bool_parms.rset_l = rset; bool_parms.rset_r = rset2; rset = rset_create (rset_kind_or, &bool_parms); @@ -2954,6 +2779,18 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, ptr[j]++; } } + if (limit_set) + { + rset_bool_parms bool_parms; + + bool_parms.key_size = sizeof(struct it_key); + bool_parms.cmp = key_compare_it; + bool_parms.log_item = key_logdump_txt; + bool_parms.rset_l = rset; + bool_parms.rset_r = rset_dup(limit_set); + + rset = rset_create (rset_kind_and, &bool_parms); + } count_set (rset, &glist[before-1-i].occurrences); rset_delete (rset); }