X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzrpn.c;h=f7a233084e789b0ebfb08a6dd4723e4c24b074ce;hb=062978fe7432da086bd0cb468149d88d1b6414cf;hp=a8ce682f55d08319003aed5d77534b83b5dbc49c;hpb=d23f1adde49e76cfda218d7f50ba886c16d1a044;p=idzebra-moved-to-github.git diff --git a/index/zrpn.c b/index/zrpn.c index a8ce682..f7a2330 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -4,7 +4,21 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zrpn.c,v $ - * Revision 1.37 1995-12-06 15:05:28 adam + * Revision 1.40 1996-02-02 13:44:44 adam + * The public dictionary functions simply use char instead of Dict_char + * to represent search strings. Dict_char is used internally only. + * + * Revision 1.39 1996/01/03 16:22:13 quinn + * operator->roperator + * + * Revision 1.38 1995/12/11 09:12:55 adam + * The rec_get function returns NULL if record doesn't exist - will + * happen in the server if the result set records have been deleted since + * the creation of the set (i.e. the search). + * The server saves a result temporarily if it is 'volatile', i.e. the + * set is register dependent. + * + * Revision 1.37 1995/12/06 15:05:28 adam * More verbose in count_set. * * Revision 1.36 1995/12/06 12:41:27 adam @@ -484,7 +498,7 @@ static void add_isam_p (const char *info, struct grep_info *p) (p->isam_p_indx)++; } -static int grep_handle (Dict_char *name, const char *info, void *p) +static int grep_handle (char *name, const char *info, void *p) { logf (LOG_DEBUG, "dict name: %s", name); add_isam_p (info, p); @@ -1116,12 +1130,15 @@ static RSET rpn_search_structure (ZServerInfo *zi, Z_RPNStructure *zs, if (zs->which == Z_RPNStructure_complex) { rset_bool_parms bool_parms; + int soft = 0; bool_parms.rset_l = rpn_search_structure (zi, zs->u.complex->s1, attributeSet, num_bases, basenames); if (bool_parms.rset_l == NULL) return NULL; + if (rset_is_ranked(bool_parms.rset_l)) + soft = 1; bool_parms.rset_r = rpn_search_structure (zi, zs->u.complex->s2, attributeSet, num_bases, basenames); @@ -1130,19 +1147,21 @@ static RSET rpn_search_structure (ZServerInfo *zi, Z_RPNStructure *zs, rset_delete (bool_parms.rset_l); return NULL; } + if (rset_is_ranked(bool_parms.rset_r)) + soft = 1; bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare; - switch (zs->u.complex->operator->which) + switch (zs->u.complex->roperator->which) { case Z_Operator_and: - r = rset_create (rset_kind_and, &bool_parms); + r = rset_create (soft ? rset_kind_sand:rset_kind_and, &bool_parms); break; case Z_Operator_or: - r = rset_create (rset_kind_or, &bool_parms); + r = rset_create (soft ? rset_kind_sor:rset_kind_or, &bool_parms); break; case Z_Operator_and_not: - r = rset_create (rset_kind_not, &bool_parms); + r = rset_create (soft ? rset_kind_snot:rset_kind_not, &bool_parms); break; default: assert (0); @@ -1173,6 +1192,38 @@ static RSET rpn_search_structure (ZServerInfo *zi, Z_RPNStructure *zs, return r; } +void count_set_save (RSET *r, int *count) +{ + int psysno = 0; + int kno = 0; + struct it_key key; + RSFD rfd, wfd; + RSET w; + rset_temp_parms parms; + + logf (LOG_DEBUG, "count_set_save"); + *count = 0; + parms.key_size = sizeof(struct it_key); + w = rset_create (rset_kind_temp, &parms); + wfd = rset_open (w, RSETF_WRITE|RSETF_SORT_SYSNO); + rfd = rset_open (*r, RSETF_READ|RSETF_SORT_SYSNO); + while (rset_read (*r, rfd, &key)) + { + if (key.sysno != psysno) + { + rset_write (w, wfd, &key); + psysno = key.sysno; + (*count)++; + } + kno++; + } + rset_close (*r, rfd); + rset_delete (*r); + rset_close (w, wfd); + *r = w; + logf (LOG_DEBUG, "%d keys, %d distinct sysnos", kno, *count); +} + static void count_set (RSET r, int *count) { int psysno = 0; @@ -1180,7 +1231,7 @@ static void count_set (RSET r, int *count) struct it_key key; RSFD rfd; - logf (LOG_DEBUG, "rpn_save_set"); + logf (LOG_DEBUG, "count_set"); *count = 0; rfd = rset_open (r, RSETF_READ|RSETF_SORT_SYSNO); while (rset_read (r, rfd, &key)) @@ -1215,7 +1266,10 @@ int rpn_search (ZServerInfo *zi, num_bases, basenames); if (!rset) return zi->errCode; - count_set (rset, hits); + if (rset_is_volatile(rset)) + count_set_save(&rset,hits); + else + count_set (rset, hits); resultSetAdd (zi, setname, 1, rset); if (zi->errCode) logf (LOG_DEBUG, "search error: %d", zi->errCode); @@ -1230,8 +1284,7 @@ struct scan_info { char prefix[20]; }; -static int scan_handle (Dict_char *name, const char *info, int pos, - void *client) +static int scan_handle (char *name, const char *info, int pos, void *client) { int len_prefix, idx; ISAM_P isam_p; @@ -1266,7 +1319,7 @@ static int scan_handle (Dict_char *name, const char *info, int pos, } -static int dummy_handle (Dict_char *name, const char *info, void *p) +static int dummy_handle (char *name, const char *info, void *p) { return 0; }