X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzrpn.c;h=9927949690ce70432bb8a6d878f98d3c848fab0d;hb=47eeb5384a8fae8bcac8afb8a84782ca094683f9;hp=951f83f47d8d18758bcb88e3d761be7c04ea57d7;hpb=e8393fc8e78d777294f6eabf4029b90d566cf978;p=idzebra-moved-to-github.git diff --git a/index/zrpn.c b/index/zrpn.c index 951f83f..9927949 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -1,4 +1,4 @@ -/* $Id: zrpn.c,v 1.193 2005-05-31 13:01:37 adam Exp $ +/* $Id: zrpn.c,v 1.200 2005-06-14 20:28:54 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -24,7 +24,8 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #ifdef WIN32 #include -#else +#endif +#if HAVE_UNISTD_H #include #endif #include @@ -50,7 +51,6 @@ typedef struct Z_AttributesPlusTerm *zapt; } AttrType; - static int log_level_set = 0; static int log_level_rpn = 0; @@ -987,7 +987,8 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, struct grep_info *grep_info, int reg_type, int complete_flag, int num_bases, char **basenames, - char *term_dst, int xpath_use); + char *term_dst, int xpath_use, + struct ord_list **ol); static ZEBRA_RES term_trunc(ZebraHandle zh, Z_AttributesPlusTerm *zapt, @@ -1003,11 +1004,12 @@ static ZEBRA_RES term_trunc(ZebraHandle zh, struct rset_key_control *kc) { ZEBRA_RES res; + struct ord_list *ol; *rset = 0; grep_info->isam_p_indx = 0; res = string_term(zh, zapt, term_sub, attributeSet, stream, grep_info, reg_type, complete_flag, num_bases, basenames, - term_dst, xpath_use); + term_dst, xpath_use, &ol); if (res != ZEBRA_OK) return res; if (!*term_sub) /* no more terms ? */ @@ -1017,7 +1019,7 @@ static ZEBRA_RES term_trunc(ZebraHandle zh, grep_info->isam_p_indx, term_dst, strlen(term_dst), rank_type, 1 /* preserve pos */, zapt->term->which, rset_nmem, - kc, kc->scope); + kc, kc->scope, ol, reg_type); if (!*rset) return ZEBRA_FAIL; return ZEBRA_OK; @@ -1036,7 +1038,8 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, struct grep_info *grep_info, int reg_type, int complete_flag, int num_bases, char **basenames, - char *term_dst, int xpath_use) + char *term_dst, int xpath_use, + struct ord_list **ol) { char term_dict[2*IT_MAX_WORD+4000]; int j, r, base_no; @@ -1054,6 +1057,9 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, int errCode = 0; /* err code (if any is not OK) */ char *errString = 0; /* addinfo */ + + *ol = ord_list_create(stream); + rpn_char_map_prepare (zh->reg, reg_type, &rcmi); attr_init(&use, zapt, 1); use_value = attr_find_ex(&use, &curAttributeSet, &use_string); @@ -1122,6 +1128,7 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, term_dict[prefix_len++] = ord_buf[i]; } attp.local_attributes = 0; /* no more attributes */ + *ol = ord_list_append(stream, *ol, ord); } else { @@ -1167,6 +1174,7 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, local_attr->local); if (ord < 0) continue; + *ol = ord_list_append(stream, *ol, ord); if (prefix_len) term_dict[prefix_len++] = '|'; else @@ -1425,50 +1433,6 @@ static ZEBRA_RES trans_scan_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, return ZEBRA_OK; } -char *normalize_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, - const char *termz, NMEM stream, unsigned reg_id) -{ - WRBUF wrbuf = 0; - AttrType truncation; - int truncation_value; - char *ex_list = 0; - - attr_init(&truncation, zapt, 5); - truncation_value = attr_find(&truncation, NULL); - - switch (truncation_value) - { - default: - ex_list = ""; - break; - case 101: - ex_list = "#"; - break; - case 102: - case 103: - ex_list = 0; - break; - case 104: - ex_list = "!#"; - break; - case 105: - ex_list = "!*"; - break; - } - if (ex_list) - wrbuf = zebra_replace(zh->reg->zebra_maps, reg_id, ex_list, - termz, strlen(termz)); - if (!wrbuf) - return nmem_strdup(stream, termz); - else - { - char *buf = (char*) nmem_malloc(stream, wrbuf_len(wrbuf)+1); - memcpy (buf, wrbuf_buf(wrbuf), wrbuf_len(wrbuf)); - buf[wrbuf_len(wrbuf)] = '\0'; - return buf; - } -} - static void grep_info_delete(struct grep_info *grep_info) { #ifdef TERM_COUNT @@ -1523,10 +1487,26 @@ static ZEBRA_RES grep_info_prepare(ZebraHandle zh, return ZEBRA_OK; } - +/** + \brief Create result set(s) for list of terms + \param zh Zebra Handle + \param termz term as used in query but converted to UTF-8 + \param attributeSet default attribute set + \param stream memory for result + \param reg_type register type ('w', 'p',..) + \param complete_flag whether it's phrases or not + \param rank_type term flags for ranking + \param xpath_use use attribute for X-Path (-1 for no X-path) + \param num_bases number of databases + \param basenames array of databases + \param rset_mem memory for result sets + \param result_sets output result set for each term in list (output) + \param number number of output result sets + \param kc rset key control to be used for created result sets +*/ static ZEBRA_RES term_list_trunc(ZebraHandle zh, Z_AttributesPlusTerm *zapt, - const char *termz_org, + const char *termz, oid_value attributeSet, NMEM stream, int reg_type, int complete_flag, @@ -1538,7 +1518,6 @@ static ZEBRA_RES term_list_trunc(ZebraHandle zh, { char term_dst[IT_MAX_WORD+1]; struct grep_info grep_info; - char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type); const char *termp = termz; int alloc_sets = 0; @@ -1942,7 +1921,7 @@ static ZEBRA_RES rpn_search_APT_numeric(ZebraHandle zh, strlen(term_dst), rank_type, 0 /* preserve position */, zapt->term->which, rset_nmem, - kc, kc->scope); + kc, kc->scope, 0, reg_type); if (!result_sets[num_result_sets]) break; num_result_sets++; @@ -2136,7 +2115,7 @@ static RSET xpath_trunc(ZebraHandle zh, NMEM stream, rset = rset_trunc(zh, grep_info.isam_p_buf, grep_info.isam_p_indx, term, strlen(term), flags, 1, term_type,rset_nmem, - kc, kc->scope); + kc, kc->scope, 0, reg_type); grep_info_delete(&grep_info); return rset; } @@ -2329,14 +2308,23 @@ static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (sort_flag) return rpn_sort_spec(zh, zapt, attributeSet, stream, sort_sequence, rank_type, rset_nmem, rset, kc); + /* consider if an X-Path query is used */ xpath_len = parse_xpath(zh, zapt, attributeSet, xpath, 10, stream); if (xpath_len >= 0) { - xpath_use = 1016; - if (xpath[xpath_len-1].part[0] == '@') - xpath_use = 1015; - } - + xpath_use = 1016; /* searching for element by default */ + if (xpath[xpath_len-1].part[0] == '@') + xpath_use = 1015; /* last step an attribute .. */ + } + + /* search using one of the various search type strategies + termz is our UTF-8 search term + attributeSet is top-level default attribute set + stream is ODR for search + reg_id is the register type + complete_flag is 1 for complete subfield, 0 for incomplete + xpath_use is use-attribute to be used for X-Path search, 0 for none + */ if (!strcmp(search_type, "phrase")) { res = rpn_search_APT_phrase(zh, zapt, termz, attributeSet, stream, @@ -2666,28 +2654,29 @@ void zebra_term_untrans_iconv(ZebraHandle zh, NMEM stream, int reg_type, *dst = nmem_strdup(stream, term_src); } -static void count_set (RSET r, int *count) +static void count_set(ZebraHandle zh, RSET rset, zint *count) { zint psysno = 0; - int kno = 0; struct it_key key; RSFD rfd; yaz_log(YLOG_DEBUG, "count_set"); + rset->hits_limit = zh->approx_limit; + *count = 0; - rfd = rset_open (r, RSETF_READ); - while (rset_read (rfd, &key,0 /* never mind terms */)) + rfd = rset_open(rset, RSETF_READ); + while (rset_read(rfd, &key,0 /* never mind terms */)) { if (key.mem[0] != psysno) { psysno = key.mem[0]; - (*count)++; + if (rfd->counted_items >= rset->hits_limit) + break; } - kno++; } rset_close (rfd); - yaz_log(YLOG_DEBUG, "%d keys, %d records", kno, *count); + *count = rset->hits_count; } ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, @@ -2931,7 +2920,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, rset = rset_trunc(zh, &scan_info_array[j0].list[ptr[j0]].isam_p, 1, glist[lo].term, strlen(glist[lo].term), NULL, 0, zapt->term->which, rset_nmem, - kc, kc->scope); + kc, kc->scope, 0, reg_id); } ptr[j0]++; /* move index for this set .. */ /* get result set for remaining scan terms */ @@ -2952,7 +2941,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, glist[lo].term, strlen(glist[lo].term), NULL, 0, zapt->term->which,rset_nmem, - kc, kc->scope); + kc, kc->scope, 0, reg_id); rset = rsmulti_or_create(rset_nmem, kc, kc->scope, 0 /* termid */, 2, rsets); @@ -2962,6 +2951,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, } if (lo >= 0) { + zint count; /* merge with limit_set if given */ if (limit_set) { @@ -2974,7 +2964,8 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, 2, rsets); } /* count it */ - count_set(rset, &glist[lo].occurrences); + count_set(zh, rset, &count); + glist[lo].occurrences = count; rset_delete(rset); } } @@ -3001,6 +2992,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, const char *tst; RSET rset; int lo = before-1-i; /* offset in result list */ + zint count; for (j = 0; j term->which, rset_nmem, - kc, kc->scope); + kc, kc->scope, 0, reg_id); ptr[j0]++; @@ -3041,7 +3033,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, glist[lo].term, strlen(glist[lo].term), NULL, 0, zapt->term->which, rset_nmem, - kc, kc->scope); + kc, kc->scope, 0, reg_id); rset = rsmulti_or_create(rset_nmem, kc, kc->scope, 0 /* termid */, 2, rsets); @@ -3057,7 +3049,8 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, rset = rsmulti_and_create(rset_nmem, kc, kc->scope, 2, rsets); } - count_set (rset, &glist[lo].occurrences); + count_set(zh, rset, &count); + glist[lo].occurrences = count; rset_delete (rset); } (*kc->dec)(kc);