X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzrpn.c;h=a5da2449f25c068a629f4391a992e2d89337fe01;hb=bf1f271315a6acfd52d8d7abf1aee2e0502bdbf2;hp=cb79ef5dd57ee5fb569e06213260f2274bfac72e;hpb=e8acd5b751eb2e7e7fc0470309185984406f561b;p=idzebra-moved-to-github.git diff --git a/index/zrpn.c b/index/zrpn.c index cb79ef5..a5da244 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -4,7 +4,25 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zrpn.c,v $ - * Revision 1.47 1996-05-15 18:36:28 adam + * Revision 1.53 1996-06-26 09:21:43 adam + * Bug fix: local attribute set wasn't obeyed in scan. + * + * Revision 1.52 1996/06/17 14:26:20 adam + * Function gen_regular_rel changed to handle negative numbers. + * + * Revision 1.51 1996/06/11 10:54:15 quinn + * Relevance work + * + * Revision 1.50 1996/06/07 08:51:53 adam + * Bug fix: Character mapping was broken (introducued by last revision). + * + * Revision 1.49 1996/06/04 10:18:11 adam + * Search/scan uses character mapping module. + * + * Revision 1.48 1996/05/28 15:15:01 adam + * Bug fix: Didn't handle unknown database correctly. + * + * Revision 1.47 1996/05/15 18:36:28 adam * Function trans_term transforms unsearchable characters to blanks. * * Revision 1.46 1996/05/15 11:57:56 adam @@ -172,26 +190,13 @@ #include "zserver.h" #include "attribute.h" +#include #include #include #include #include #include -int index_word_prefix_map (char *string, oid_value attrSet, int attrUse, - char *basename) -{ - attent *attp; - - logf (LOG_DEBUG, "oid_value attrSet = %d, attrUse = %d", attrSet, attrUse); - attp = att_getentbyatt (attrSet, attrUse); - if (!attp) - return -1; - logf (LOG_DEBUG, "ord=%d", attp->attset_ordinal); - return index_word_prefix (string, attp->attset_ordinal, - attp->local_attributes->local, basename); -} - typedef struct { int type; int major; @@ -495,17 +500,25 @@ static RSET rset_trunc (ISAM isam, ISAM_P *isam_p, int no) return rset_trunc_r (isam, isam_p, 0, no, 100); } -struct grep_info { - ISAM_P *isam_p_buf; - int isam_p_size; - int isam_p_indx; -}; +#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_indx; +}; static void add_isam_p (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; +#endif p->isam_p_size = 2*p->isam_p_size + 100; new_isam_p_buf = xmalloc (sizeof(*new_isam_p_buf) * @@ -517,6 +530,18 @@ static void add_isam_p (const char *info, struct grep_info *p) xfree (p->isam_p_buf); } p->isam_p_buf = new_isam_p_buf; + +#ifdef TERM_COUNT + new_term_no = xmalloc (sizeof(*new_term_no) * + p->isam_p_size); + if (p->term_no) + { + memcpy (new_term_no, p->isam_p_buf, + p->isam_p_indx * sizeof(*p->term_no)); + xfree (p->term_no); + } + p->term_no = new_term_no; +#endif } assert (*info == sizeof(*p->isam_p_buf)); memcpy (p->isam_p_buf + p->isam_p_indx, info+1, sizeof(*p->isam_p_buf)); @@ -525,19 +550,45 @@ static void add_isam_p (const char *info, struct grep_info *p) static int grep_handle (char *name, const char *info, void *p) { - logf (LOG_DEBUG, "dict name: %s", name); add_isam_p (info, p); return 0; } +/* gen_regular_rel - generate regular expression from relation + * val: border value (inclusive) + * islt: 1 if <=; 0 if >=. + */ static void gen_regular_rel (char *dst, int val, int islt) { - int dst_p = 1; + int dst_p; int w, d, i; int pos = 0; char numstr[20]; - *dst = '('; + logf (LOG_DEBUG, "gen_regular_rel. val=%d, islt=%d", val, islt); + if (val >= 0) + { + if (islt) + strcpy (dst, "(-[0-9]+|"); + else + strcpy (dst, "("); + } + else + { + if (!islt) + { + strcpy (dst, "([0-9]+|-"); + dst_p = strlen (dst); + islt = 1; + } + else + { + strcpy (dst, "(-"); + islt = 0; + } + val = -val; + } + dst_p = strlen (dst); sprintf (numstr, "%d", val); for (w = strlen(numstr); --w >= 0; pos++) { @@ -714,6 +765,7 @@ static int field_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, { zi->errCode = 109; /* Database unavailable */ zi->errString = basenames[base_no]; + return -1; } for (local_attr = attp->local_attributes; local_attr; local_attr = local_attr->next) @@ -728,20 +780,16 @@ static int field_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, term_dict[prefix_len++] = '|'; else term_dict[prefix_len++] = '('; - if ((ord >= 'A' && ord <= 'Z') || (ord >= 'a' && ord <= 'z')) - term_dict[prefix_len++] = ord; - else - { - term_dict[prefix_len++] = '\\'; - term_dict[prefix_len++] = ord; - } + term_dict[prefix_len++] = 1; + term_dict[prefix_len++] = ord; } if (!prefix_len) { zi->errCode = 114; return -1; } - term_dict[prefix_len++] = ')'; + term_dict[prefix_len++] = ')'; + term_dict[prefix_len++] = 1; term_dict[prefix_len++] = regType; term_dict[prefix_len] = '\0'; if (!relational_term (zi, zapt, term_sub, term_dict, @@ -825,28 +873,43 @@ static int field_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, static void trans_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, char *termz) { - size_t i, sizez; - int sep = 0; + size_t sizez; Z_Term *term = zapt->term; sizez = term->u.general->len; if (sizez > IT_MAX_WORD-1) sizez = IT_MAX_WORD-1; - for (i = 0; i < sizez; i++) + memcpy (termz, term->u.general->buf, sizez); + termz[sizez] = '\0'; +} + +static void trans_scan_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, + char *termz) +{ + Z_Term *term = zapt->term; + char **map; + const char *cp = (const char *) term->u.general->buf; + const char *cp_end = cp + term->u.general->len; + const char *src; + int i = 0; + int prev_space = 0; + int len; + + while ((len = (cp_end - cp)) > 0) { - if (!isalnum(term->u.general->buf[i])) - sep = 1; - else + map = map_chrs_input (&cp, len); + if (**map == *CHR_SPACE) { - if (sep) - *termz++ = ' '; - *termz++ = index_char_cvt (term->u.general->buf[i]); - sep = 0; - } + if (prev_space) + continue; + prev_space = 1; + } + else + prev_space = 0; + for (src = *map; *src; src++) + termz[i++] = *src; } - if (sep) - *termz++ = ' '; - *termz = '\0'; + termz[i] = '\0'; } static RSET rpn_search_APT_relevance (ZServerInfo *zi, @@ -858,13 +921,15 @@ static RSET rpn_search_APT_relevance (ZServerInfo *zi, char termz[IT_MAX_WORD+1]; char term_sub[IT_MAX_WORD+1]; struct grep_info grep_info; - char *p0 = termz, *p1 = NULL; + char *p0 = termz; RSET result; + int term_index = 0; parms.key_size = sizeof(struct it_key); parms.max_rec = 100; parms.cmp = key_compare; parms.is = zi->wordIsam; + parms.no_terms = 0; if (zapt->term->which != Z_Term_general) { @@ -873,33 +938,58 @@ static RSET rpn_search_APT_relevance (ZServerInfo *zi, } trans_term (zi, zapt, termz); +#ifdef TERM_COUNT + grep_info.term_no = 0; +#endif grep_info.isam_p_indx = 0; grep_info.isam_p_size = 0; grep_info.isam_p_buf = NULL; while (1) { - if ((p1 = strchr (p0, ' '))) + char **map; + char *p2, *p1; + + p1 = p0; + while (*(p0 = p1)) { - memcpy (term_sub, p0, p1-p0); - term_sub[p1-p0] = '\0'; + map = map_chrs_input (&p1, strlen(p1)); + if (**map != *CHR_SPACE) + break; } - else - strcpy (term_sub, p0); + if (!*p0) + break; + + p1 = p0; + while (*(p2 = p1)) + { + map = map_chrs_input (&p1, strlen(p1)); + if (**map == *CHR_SPACE) + break; + } + if (p2 == p0) + break; + memcpy (term_sub, p0, p2-p0); + term_sub[p2-p0] = '\0'; + p0 = p2; if (field_term (zi, zapt, term_sub, 'w', attributeSet, &grep_info, num_bases, basenames)) return NULL; - if (!p1) - break; - p0 = p1; - while (*++p0 == ' ') - ; +#ifdef TERM_COUNT + for (; term_index < grep_info.isam_p_indx; term_index++) + grep_info.term_no[term_index] = parms.no_terms; + parms.no_terms++; +#endif } + parms.term_no = grep_info.term_no; parms.isam_positions = grep_info.isam_p_buf; parms.no_isam_positions = grep_info.isam_p_indx; if (grep_info.isam_p_indx > 0) result = rset_create (rset_kind_relevance, &parms); else result = rset_create (rset_kind_null, NULL); +#ifdef TERM_COUNT + xfree(grep_info.term_no); +#endif xfree (grep_info.isam_p_buf); return result; } @@ -921,6 +1011,9 @@ static RSET rpn_search_APT_cphrase (ZServerInfo *zi, } trans_term (zi, zapt, termz); +#ifdef TERM_COUNT + grep_info.term_no = 0; +#endif grep_info.isam_p_indx = 0; grep_info.isam_p_size = 0; grep_info.isam_p_buf = NULL; @@ -939,44 +1032,9 @@ static RSET rpn_search_APT_cphrase (ZServerInfo *zi, else result = rset_trunc (zi->wordIsam, grep_info.isam_p_buf, grep_info.isam_p_indx); - xfree (grep_info.isam_p_buf); - return result; -} -static RSET rpn_search_APT_word (ZServerInfo *zi, - Z_AttributesPlusTerm *zapt, - oid_value attributeSet, - int num_bases, char **basenames) -{ - rset_isam_parms parms; - char termz[IT_MAX_WORD+1]; - struct grep_info grep_info; - RSET result; - - if (zapt->term->which != Z_Term_general) - { - zi->errCode = 124; - return NULL; - } - trans_term (zi, zapt, termz); - - grep_info.isam_p_indx = 0; - grep_info.isam_p_size = 0; - grep_info.isam_p_buf = NULL; - - if (field_term (zi, zapt, termz, 'w', attributeSet, &grep_info, - num_bases, basenames)) - return NULL; - if (grep_info.isam_p_indx < 1) - result = rset_create (rset_kind_null, NULL); - else if (grep_info.isam_p_indx == 1) - { - parms.is = zi->wordIsam; - parms.pos = *grep_info.isam_p_buf; - result = rset_create (rset_kind_isam, &parms); - } - else - result = rset_trunc (zi->wordIsam, grep_info.isam_p_buf, - grep_info.isam_p_indx); +#ifdef TERM_COUNT + xfree(grep_info.term_no); +#endif xfree (grep_info.isam_p_buf); return result; } @@ -1074,7 +1132,7 @@ static RSET rpn_search_APT_phrase (ZServerInfo *zi, { char termz[IT_MAX_WORD+1]; char term_sub[IT_MAX_WORD+1]; - char *p0 = termz, *p1 = NULL; + char *p0 = termz; RSET rset[60], result; int i, rset_no = 0; struct grep_info grep_info; @@ -1086,18 +1144,40 @@ static RSET rpn_search_APT_phrase (ZServerInfo *zi, } trans_term (zi, zapt, termz); +#ifdef TERM_COUNT + grep_info.term_no = 0; +#endif grep_info.isam_p_size = 0; grep_info.isam_p_buf = NULL; while (1) { - if ((p1 = strchr (p0, ' '))) + char **map; + char *p2, *p1; + + p1 = p0; + while (*(p0 = p1)) { - memcpy (term_sub, p0, p1-p0); - term_sub[p1-p0] = '\0'; + map = map_chrs_input (&p1, strlen(p1)); + if (**map != *CHR_SPACE) + break; } - else - strcpy (term_sub, p0); + if (!*p0) + break; + + p1 = p0; + while (*(p2 = p1)) + { + map = map_chrs_input (&p1, strlen(p1)); + if (**map == *CHR_SPACE) + break; + } + if (p2 == p0) + break; + + memcpy (term_sub, p0, p2-p0); + term_sub[p2-p0] = '\0'; + p0 = p2; grep_info.isam_p_indx = 0; if (field_term (zi, zapt, term_sub, 'w', attributeSet, &grep_info, @@ -1120,12 +1200,10 @@ static RSET rpn_search_APT_phrase (ZServerInfo *zi, assert (rset[rset_no]); if (++rset_no >= sizeof(rset)/sizeof(*rset)) break; - if (!p1) - break; - p0 = p1; - while (*++p0 == ' ') - ; } +#ifdef TERM_COUNT + xfree(grep_info.term_no); +#endif xfree (grep_info.isam_p_buf); if (rset_no == 0) return rset_create (rset_kind_null, NULL); @@ -1210,8 +1288,8 @@ static RSET rpn_search_APT (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, if (completeness_value == 2 || completeness_value == 3) return rpn_search_APT_cphrase (zi, zapt, attributeSet, num_bases, basenames); - return rpn_search_APT_word (zi, zapt, attributeSet, - num_bases, basenames); + return rpn_search_APT_phrase (zi, zapt, attributeSet, + num_bases, basenames); case 3: /* key */ break; case 4: /* year */ @@ -1240,8 +1318,8 @@ static RSET rpn_search_APT (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, case 107: /* local-number */ return rpn_search_APT_local (zi, zapt, attributeSet); case 108: /* string */ - return rpn_search_APT_word (zi, zapt, attributeSet, - num_bases, basenames); + return rpn_search_APT_phrase (zi, zapt, attributeSet, + num_bases, basenames); case 109: /* numeric string */ break; } @@ -1391,6 +1469,7 @@ int rpn_search (ZServerInfo *zi, oident *attrset; oid_value attributeSet; + dict_grep_cmap (zi->wordDict, map_chrs_input); zlog_rpn (rpn); zi->errCode = 0; @@ -1446,6 +1525,20 @@ static int scan_handle (char *name, const char *info, int pos, void *client) } +static void scan_term_untrans (ODR odr, char **dstp, const char *src) +{ + char *dst = odr_malloc (odr, strlen(src)*2+1); + *dstp = dst; + + while (*src) + { + const char *cp = map_chrs_output (&src); + while (*cp) + *dst++ = *cp++; + } + *dst = '\0'; +} + int rpn_scan (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, oid_value attributeset, int num_bases, char **basenames, @@ -1470,17 +1563,17 @@ int rpn_scan (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, logf (LOG_DEBUG, "scan, position = %d, num = %d", pos, num); + if (attributeset == VAL_NONE) + attributeset = VAL_BIB1; + attr_init (&use, zapt, 1); - use_value = attr_find (&use, NULL); + use_value = attr_find (&use, &attributeset); logf (LOG_DEBUG, "use value %d", use_value); attr_init (&completeness, zapt, 6); completeness_value = attr_find (&completeness, NULL); logf (LOG_DEBUG, "completeness value %d", completeness_value); - if (attributeset == VAL_NONE) - attributeset = VAL_BIB1; - if (use_value == -1) use_value = 1016; for (base_no = 0; base_no < num_bases && ord_no < 32; base_no++) @@ -1535,7 +1628,9 @@ int rpn_scan (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, (completeness_value==2 || completeness_value==3) ? 'p': 'w'; termz[prefix_len] = 0; strcpy (scan_info->prefix, termz); - trans_term (zi, zapt, termz+prefix_len); + + trans_scan_term (zi, zapt, termz+prefix_len); + dict_scan (zi->wordDict, termz, &before_tmp, &after_tmp, scan_info, scan_handle); } @@ -1564,9 +1659,7 @@ int rpn_scan (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, } if (j0 == -1) break; - glist[i+before].term = odr_malloc (zi->odr, strlen(mterm)+1); - strcpy (glist[i+before].term, mterm); - + scan_term_untrans (zi->odr, &glist[i+before].term, mterm); parms.is = zi->wordIsam; parms.pos = scan_info_array[j0].list[ptr[j0]].isam_p; rset = rset_create (rset_kind_isam, &parms); @@ -1628,8 +1721,8 @@ int rpn_scan (ZServerInfo *zi, Z_AttributesPlusTerm *zapt, } if (j0 == -1) break; - glist[before-1-i].term = odr_malloc (zi->odr, strlen(mterm)+1); - strcpy (glist[before-1-i].term, mterm); + + scan_term_untrans (zi->odr, &glist[before-1-i].term, mterm); parms.is = zi->wordIsam; parms.pos = scan_info_array[j0].list[before-1-ptr[j0]].isam_p;