From 0e898c0c6183c6dd9701286f6a4ac9b734c9bdbb Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Tue, 3 May 2005 09:11:34 +0000 Subject: [PATCH] Extended the result set system. Added support for filtering/limits. on the rsiamb result set class. Re-iactored key control so that it is administrered by a proper "class". --- include/idzebra/api.h | 6 +- include/rset.h | 46 ++++++------ index/Makefile.am | 4 +- index/index.h | 16 +++- index/kcontrol.c | 76 +++++++++++++++++++ index/limit.c | 100 +++++++++++++++++++++++++ index/trunc.c | 18 +++-- index/zebraapi.c | 22 +++++- index/zrpn.c | 194 ++++++++++++++++++++++++++----------------------- rset/rsbetween.c | 22 +++--- rset/rsbool.c | 64 ++++++++-------- rset/rset.c | 9 ++- rset/rsisamb.c | 105 +++++++++++++++++--------- rset/rsisamc.c | 5 +- rset/rsisams.c | 33 +++++---- rset/rsmultiandor.c | 82 +++++++++++---------- rset/rsnull.c | 42 +++++------ rset/rsprox.c | 17 +++-- rset/rstemp.c | 45 ++++++------ test/api/safari1.c | 63 +++++++++++++--- 20 files changed, 639 insertions(+), 330 deletions(-) create mode 100644 index/kcontrol.c create mode 100644 index/limit.c diff --git a/include/idzebra/api.h b/include/idzebra/api.h index cffa896..8982ef2 100644 --- a/include/idzebra/api.h +++ b/include/idzebra/api.h @@ -1,4 +1,4 @@ -/* $Id: api.h,v 1.21 2005-05-01 20:43:11 adam Exp $ +/* $Id: api.h,v 1.22 2005-05-03 09:11:34 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -463,6 +463,10 @@ void zebra_meta_records_destroy(ZebraHandle zh, ZebraMetaRecord *records, YAZ_EXPORT struct BFiles_struct *zebra_get_bfs(ZebraHandle zh); + +YAZ_EXPORT +ZEBRA_RES zebra_set_limit(ZebraHandle zh, int exclude_flag, zint *ids); + YAZ_END_CDECL /** \mainpage Zebra diff --git a/include/rset.h b/include/rset.h index ff86cd9..f9ea485 100644 --- a/include/rset.h +++ b/include/rset.h @@ -1,4 +1,4 @@ -/* $Id: rset.h,v 1.50 2005-04-26 10:09:38 adam Exp $ +/* $Id: rset.h,v 1.51 2005-05-03 09:11:34 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -113,15 +113,20 @@ void rset_get_one_term(RSET ct,TERMID *terms,int maxterms,int *curterm); * all we assume is that all keys are the same size, and they can be * memcpy'd around */ -struct key_control { +struct rset_key_control { + void *context; int key_size; int scope; /* default for what level we operate (book/chapter/verse) on*/ /* usual sysno/seqno is 2 */ - int (*cmp) (const void *p1, const void *p2); + int (*cmp)(const void *p1, const void *p2); void (*key_logdump_txt) (int logmask, const void *p, const char *txt); zint (*getseq)(const void *p); - /* FIXME - Should not need a getseq, it won't make much sense with */ - /* higher-order keys. Use a (generalized) cmp instead, or something */ + int (*filter_func)(const void *p, void *data); + void *filter_data; + void (*inc)(struct rset_key_control *kc); + void (*dec)(struct rset_key_control *kc); + /* FIXME - Should not need a getseq, it won't make much sense with */ + /* higher-order keys. Use a (generalized) cmp instead, or something */ /* FIXME - decode and encode, and lots of other stuff */ }; @@ -134,7 +139,7 @@ struct key_control { typedef struct rset { const struct rset_control *control; - const struct key_control *keycontrol; + struct rset_key_control *keycontrol; int count; /* reference count */ void *priv; /* stuff private to the given type of rset */ NMEM nmem; /* nibble memory for various allocs */ @@ -168,7 +173,7 @@ int rfd_is_last(RSFD rfd); RSET rset_create_base(const struct rset_control *sel, NMEM nmem, - const struct key_control *kcontrol, + struct rset_key_control *kcontrol, int scope, TERMID term); @@ -209,44 +214,43 @@ RSET rset_dup (RSET rs); /** rset_count counts or estimates the keys in it*/ zint rset_count(RSET rs); -RSET rstemp_create(NMEM nmem, const struct key_control *kcontrol, +RSET rstemp_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, const char *temp_path, TERMID term); -RSET rsnull_create(NMEM nmem, const struct key_control *kcontrol); +RSET rsnull_create(NMEM nmem, struct rset_key_control *kcontrol); -RSET rsbool_create_and(NMEM nmem, const struct key_control *kcontrol, +RSET rsbool_create_and(NMEM nmem, struct rset_key_control *kcontrol, int scope, RSET rset_l, RSET rset_r); -RSET rsbool_create_or (NMEM nmem, const struct key_control *kcontrol, - int scope, RSET rset_l, RSET rset_r); +RSET rsbool_create_or(NMEM nmem, struct rset_key_control *kcontrol, + int scope, RSET rset_l, RSET rset_r); -RSET rsbool_create_not(NMEM nmem, const struct key_control *kcontrol, +RSET rsbool_create_not(NMEM nmem, struct rset_key_control *kcontrol, int scope, RSET rset_l, RSET rset_r); -RSET rsbetween_create(NMEM nmem, const struct key_control *kcontrol, +RSET rsbetween_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, RSET rset_l, RSET rset_m, RSET rset_r, RSET rset_attr); -RSET rsmulti_or_create(NMEM nmem, const struct key_control *kcontrol, +RSET rsmulti_or_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, int no_rsets, RSET* rsets); -RSET rsmulti_and_create(NMEM nmem, const struct key_control *kcontrol, +RSET rsmulti_and_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, int no_rsets, RSET* rsets); -RSET rsprox_create(NMEM nmem, const struct key_control *kcontrol, +RSET rsprox_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, int rset_no, RSET *rset, int ordered, int exclusion, int relation, int distance); -RSET rsisamb_create(NMEM nmem, const struct key_control *kcontrol, +RSET rsisamb_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, ISAMB is, ISAM_P pos, TERMID term); -RSET rsisamc_create(NMEM nmem, const struct key_control *kcontrol, +RSET rsisamc_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, ISAMC is, ISAM_P pos, TERMID term); -RSET rsisams_create(NMEM nmem, const struct key_control *kcontrol, +RSET rsisams_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, ISAMS is, ISAM_P pos, TERMID term); - YAZ_END_CDECL #endif diff --git a/index/Makefile.am b/index/Makefile.am index c900054..22c382e 100644 --- a/index/Makefile.am +++ b/index/Makefile.am @@ -1,4 +1,4 @@ -## $Id: Makefile.am,v 1.30 2005-04-01 10:15:13 adam Exp $ +## $Id: Makefile.am,v 1.31 2005-05-03 09:11:34 adam Exp $ noinst_PROGRAMS = apitest kdump @@ -9,7 +9,7 @@ libidzebra_api_la_SOURCES = dir.c dirs.c trav.c kinput.c kcompare.c \ zebraapi.c zinfo.c invstat.c sortidx.c compact.c zsets.c zrpn.c \ rank1.c trunc.c retrieve.c extract.c \ index.h recindex.h recindxp.h \ - zinfo.h zserver.h zvrank.c + zinfo.h zserver.h zvrank.c limit.c kcontrol.c bin_PROGRAMS = zebraidx zebrasrv zebrash diff --git a/index/index.h b/index/index.h index 2c9c981..5957bf6 100644 --- a/index/index.h +++ b/index/index.h @@ -1,4 +1,4 @@ -/* $Id: index.h,v 1.135 2005-04-28 08:20:40 adam Exp $ +/* $Id: index.h,v 1.136 2005-05-03 09:11:34 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -309,6 +309,8 @@ struct zebra_session { void *store_data_buf; size_t store_data_size; + + struct zebra_limit *m_limit; }; struct rank_control { @@ -338,6 +340,16 @@ struct term_set_list { struct term_set_entry *last; }; + +void zebra_limit_destroy(struct zebra_limit *zl); +struct zebra_limit *zebra_limit_create(int exclude_flag, zint *ids); +void zebra_limit_for_rset(struct zebra_limit *zl, + int (**filter_func)(const void *buf, void *data), + void (**filter_destroy)(void *data), + void **filter_data); + +struct rset_key_control *zebra_key_control_create(ZebraHandle zh); + ZEBRA_RES rpn_search_top(ZebraHandle zh, Z_RPNStructure *zs, oid_value attributeSet, NMEM stream, NMEM rset_nmem, @@ -354,7 +366,7 @@ ZEBRA_RES rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, RSET rset_trunc (ZebraHandle zh, ISAM_P *isam_p, int no, const char *term, int length_term, const char *flags, int preserve_position, int term_type, NMEM rset_nmem, - const struct key_control *kctrl, int scope); + struct rset_key_control *kctrl, int scope); void resultSetAddTerm (ZebraHandle zh, ZebraSet s, int reg_type, const char *db, int set, diff --git a/index/kcontrol.c b/index/kcontrol.c new file mode 100644 index 0000000..ad7f81f --- /dev/null +++ b/index/kcontrol.c @@ -0,0 +1,76 @@ +/* $Id: kcontrol.c,v 1.1 2005-05-03 09:11:34 adam Exp $ + Copyright (C) 1995-2005 + Index Data ApS + +This file is part of the Zebra server. + +Zebra is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Zebra is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Zebra; see the file LICENSE.zebra. If not, write to the +Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. +*/ + +#include +#include "index.h" + +struct context_control { + int ref_count; + void (*filter_destroy)(void *data); +}; + +static void my_inc(struct rset_key_control *kc) +{ + struct context_control *cp; + + assert(kc); + cp = kc->context; + (cp->ref_count)++; +} + +static void my_dec(struct rset_key_control *kc) +{ + struct context_control *cp; + + assert(kc); + cp = kc->context; + (cp->ref_count)--; + if (cp->ref_count == 0) + { + if (cp->filter_destroy) + (*cp->filter_destroy)(kc->filter_data); + xfree(cp); + xfree(kc); + } +} + +struct rset_key_control *zebra_key_control_create(ZebraHandle zh) +{ + struct rset_key_control *kc = xmalloc(sizeof(*kc)); + struct context_control *cp = xmalloc(sizeof(*cp)); + + kc->context = cp; + kc->key_size = sizeof(struct it_key); + kc->scope = 2; + kc->cmp = key_compare_it; + kc->key_logdump_txt = key_logdump_txt; + kc->getseq = key_get_seq; + zebra_limit_for_rset(zh->m_limit, + &kc->filter_func, + &cp->filter_destroy, + &kc->filter_data); + kc->inc = my_inc; + kc->dec = my_dec; + cp->ref_count = 1; + return kc; +} + diff --git a/index/limit.c b/index/limit.c new file mode 100644 index 0000000..047a07a --- /dev/null +++ b/index/limit.c @@ -0,0 +1,100 @@ +/* $Id: limit.c,v 1.1 2005-05-03 09:11:34 adam Exp $ + Copyright (C) 1995-2005 + Index Data ApS + +This file is part of the Zebra server. + +Zebra is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Zebra is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Zebra; see the file LICENSE.zebra. If not, write to the +Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. +*/ + +#include +#include + +#include +#include +#include "index.h" + +struct zebra_limit { + int exclude_flag; + zint *ids; +}; + +void zebra_limit_destroy(struct zebra_limit *zl) +{ + if (zl) + { + xfree(zl->ids); + xfree(zl); + } +} + +struct zebra_limit *zebra_limit_create(int exclude_flag, zint *ids) +{ + struct zebra_limit *zl = 0; + size_t i; + for (i = 0; ids && ids[i]; i++) + ; + if (i) + { + zl = xmalloc(sizeof(*zl)); + zl->ids = xmalloc((i+1) * sizeof(*ids)); + memcpy(zl->ids, ids, (i+1) * sizeof(*ids)); + zl->exclude_flag = exclude_flag; + } + return zl; +} + +static int zebra_limit_filter_cb(const void *buf, void *data) +{ + struct zebra_limit *zl = data; + const struct it_key *key = buf; + size_t i; + + if (key->len != 3) + return 1; + for (i = 0; zl->ids[i]; i++) + if (zl->ids[i] == key->mem[1]) + return zl->exclude_flag ? 0 : 1; + return zl->exclude_flag ? 1 : 0; +} + +static void zebra_limit_destroy_cb(void *data) +{ + zebra_limit_destroy(data); +} + +void zebra_limit_for_rset(struct zebra_limit *zl, + int (**filter_func)(const void *buf, void *data), + void (**filter_destroy)(void *data), + void **filter_data) +{ + if (zl && zl->ids) + { + struct zebra_limit *hl; + + hl = zebra_limit_create(zl->exclude_flag, zl->ids); + *filter_data = hl; + *filter_func = zebra_limit_filter_cb; + *filter_destroy = zebra_limit_destroy_cb; + } + else + { + *filter_data = 0; + *filter_func = 0; + *filter_destroy = 0; + } +} + diff --git a/index/trunc.c b/index/trunc.c index c0e5ca1..891f9a7 100644 --- a/index/trunc.c +++ b/index/trunc.c @@ -1,4 +1,4 @@ -/* $Id: trunc.c,v 1.56 2005-04-20 10:21:29 adam Exp $ +/* $Id: trunc.c,v 1.57 2005-05-03 09:11:34 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -127,7 +127,7 @@ static RSET rset_trunc_r(ZebraHandle zi, const char *term, int length, const char *flags, ISAM_P *isam_p, int from, int to, int merge_chunk, int preserve_position, int term_type, NMEM rset_nmem, - const struct key_control *kctrl, int scope, + struct rset_key_control *kctrl, int scope, TERMID termid) { RSET result; @@ -399,14 +399,16 @@ static int isamc_trunc_cmp(const void *p1, const void *p2) RSET rset_trunc(ZebraHandle zi, ISAM_P *isam_p, int no, const char *term, int length, const char *flags, int preserve_position, int term_type, NMEM rset_nmem, - const struct key_control *kctrl, int scope) + struct rset_key_control *kctrl, int scope) { TERMID termid; RSET result; int trunc_chunk; + if (no < 1) - return rsnull_create(rset_nmem,kctrl); - termid = rset_term_create(term, length, flags, term_type,rset_nmem); + return rsnull_create(rset_nmem, kctrl); + + termid = rset_term_create(term, length, flags, term_type, rset_nmem); if (zi->reg->isams) { if (no == 1) @@ -425,7 +427,7 @@ RSET rset_trunc(ZebraHandle zi, ISAM_P *isam_p, int no, { int trunc_limit = atoi(res_get_def(zi->res, "trunclimit", "10000")); if (no == 1) - return rsisamb_create(rset_nmem,kctrl, scope, + return rsisamb_create(rset_nmem, kctrl, scope, zi->reg->isamb, *isam_p, termid); else if (no < trunc_limit) { @@ -448,8 +450,8 @@ RSET rset_trunc(ZebraHandle zi, ISAM_P *isam_p, int no, } trunc_chunk = atoi(res_get_def(zi->res, "truncchunk", "100")); result = rset_trunc_r(zi, term, length, flags, isam_p, 0, no, trunc_chunk, - preserve_position, term_type, rset_nmem, kctrl, scope, - termid); + preserve_position, term_type, rset_nmem, kctrl, + scope, termid); return result; } diff --git a/index/zebraapi.c b/index/zebraapi.c index 0be396f..53ed850 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,4 +1,4 @@ -/* $Id: zebraapi.c,v 1.163 2005-04-28 08:20:40 adam Exp $ +/* $Id: zebraapi.c,v 1.164 2005-05-03 09:11:34 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -147,6 +147,8 @@ ZebraHandle zebra_open (ZebraService zs) zh->store_data_buf = 0; + zh->m_limit = zebra_limit_create(0, 0); + return zh; } @@ -535,6 +537,9 @@ ZEBRA_RES zebra_close (ZebraHandle zh) xfree(zh->reg_name); xfree(zh->user_perm); zh->service = 0; /* more likely to trigger an assert */ + + zebra_limit_destroy(zh->m_limit); + xfree(zh->path_reg); xfree(zh); return ZEBRA_OK; @@ -2165,9 +2170,24 @@ int zebra_sort_by_specstr (ZebraHandle zh, ODR stream, return sort_status; } +/* --------------------------------------------------------------------------- + Get BFS for Zebra system (to make alternative storage methods) +*/ struct BFiles_struct *zebra_get_bfs(ZebraHandle zh) { if (zh && zh->reg) return zh->reg->bfs; return 0; } + + +/* --------------------------------------------------------------------------- + Set limit for search/scan +*/ +ZEBRA_RES zebra_set_limit(ZebraHandle zh, int exclude_flag, zint *ids) +{ + ASSERTZH; + zebra_limit_destroy(zh->m_limit); + zh->m_limit = zebra_limit_create(exclude_flag, ids); + return ZEBRA_OK; +} diff --git a/index/zrpn.c b/index/zrpn.c index 843d68a..0e0a183 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -1,4 +1,4 @@ -/* $Id: zrpn.c,v 1.185 2005-05-02 09:25:12 adam Exp $ +/* $Id: zrpn.c,v 1.186 2005-05-03 09:11:34 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -36,18 +36,6 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include -static const struct key_control it_ctrl = -{ - sizeof(struct it_key), - 2, /* we have sysnos and seqnos in this key, nothing more */ - key_compare_it, - key_logdump_txt, /* FIXME - clean up these functions */ - key_get_seq, -}; - - -const struct key_control *key_it_ctrl = &it_ctrl; - struct rpn_char_map_info { ZebraMaps zm; @@ -969,7 +957,8 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, int num_bases, char **basenames, char *term_dst, int xpath_use); -static ZEBRA_RES term_trunc(ZebraHandle zh, Z_AttributesPlusTerm *zapt, +static ZEBRA_RES term_trunc(ZebraHandle zh, + Z_AttributesPlusTerm *zapt, const char **term_sub, oid_value attributeSet, NMEM stream, struct grep_info *grep_info, @@ -978,7 +967,8 @@ static ZEBRA_RES term_trunc(ZebraHandle zh, Z_AttributesPlusTerm *zapt, char *term_dst, const char *rank_type, int xpath_use, NMEM rset_nmem, - RSET *rset) + RSET *rset, + struct rset_key_control *kc) { ZEBRA_RES res; *rset = 0; @@ -995,7 +985,7 @@ static ZEBRA_RES term_trunc(ZebraHandle zh, Z_AttributesPlusTerm *zapt, grep_info->isam_p_indx, term_dst, strlen(term_dst), rank_type, 1 /* preserve pos */, zapt->term->which, rset_nmem, - key_it_ctrl, key_it_ctrl->scope); + kc, kc->scope); if (!*rset) return ZEBRA_FAIL; return ZEBRA_OK; @@ -1510,7 +1500,8 @@ static ZEBRA_RES term_list_trunc(ZebraHandle zh, const char *rank_type, int xpath_use, int num_bases, char **basenames, NMEM rset_nmem, - RSET **result_sets, int *num_result_sets) + RSET **result_sets, int *num_result_sets, + struct rset_key_control *kc) { char term_dst[IT_MAX_WORD+1]; struct grep_info grep_info; @@ -1542,7 +1533,8 @@ static ZEBRA_RES term_list_trunc(ZebraHandle zh, num_bases, basenames, term_dst, rank_type, xpath_use, rset_nmem, - &(*result_sets)[*num_result_sets]); + &(*result_sets)[*num_result_sets], + kc); if (res != ZEBRA_OK) { int i; @@ -1568,7 +1560,8 @@ static ZEBRA_RES rpn_search_APT_phrase(ZebraHandle zh, const char *rank_type, int xpath_use, int num_bases, char **basenames, NMEM rset_nmem, - RSET *rset) + RSET *rset, + struct rset_key_control *kc) { RSET *result_sets = 0; int num_result_sets = 0; @@ -1578,15 +1571,15 @@ static ZEBRA_RES rpn_search_APT_phrase(ZebraHandle zh, rank_type, xpath_use, num_bases, basenames, rset_nmem, - &result_sets, &num_result_sets); + &result_sets, &num_result_sets, kc); if (res != ZEBRA_OK) return res; if (num_result_sets == 0) - *rset = rsnull_create (rset_nmem, key_it_ctrl); + *rset = rsnull_create (rset_nmem, kc); else if (num_result_sets == 1) *rset = result_sets[0]; else - *rset = rsprox_create(rset_nmem, key_it_ctrl, key_it_ctrl->scope, + *rset = rsprox_create(rset_nmem, kc, kc->scope, num_result_sets, result_sets, 1 /* ordered */, 0 /* exclusion */, 3 /* relation */, 1 /* distance */); @@ -1605,7 +1598,8 @@ static ZEBRA_RES rpn_search_APT_or_list(ZebraHandle zh, int xpath_use, int num_bases, char **basenames, NMEM rset_nmem, - RSET *rset) + RSET *rset, + struct rset_key_control *kc) { RSET *result_sets = 0; int num_result_sets = 0; @@ -1615,15 +1609,15 @@ static ZEBRA_RES rpn_search_APT_or_list(ZebraHandle zh, rank_type, xpath_use, num_bases, basenames, rset_nmem, - &result_sets, &num_result_sets); + &result_sets, &num_result_sets, kc); if (res != ZEBRA_OK) return res; if (num_result_sets == 0) - *rset = rsnull_create (rset_nmem, key_it_ctrl); + *rset = rsnull_create (rset_nmem, kc); else if (num_result_sets == 1) *rset = result_sets[0]; else - *rset = rsmulti_or_create(rset_nmem, key_it_ctrl, key_it_ctrl->scope, + *rset = rsmulti_or_create(rset_nmem, kc, kc->scope, num_result_sets, result_sets); if (!*rset) return ZEBRA_FAIL; @@ -1640,7 +1634,8 @@ static ZEBRA_RES rpn_search_APT_and_list(ZebraHandle zh, int xpath_use, int num_bases, char **basenames, NMEM rset_nmem, - RSET *rset) + RSET *rset, + struct rset_key_control *kc) { RSET *result_sets = 0; int num_result_sets = 0; @@ -1650,15 +1645,16 @@ static ZEBRA_RES rpn_search_APT_and_list(ZebraHandle zh, rank_type, xpath_use, num_bases, basenames, rset_nmem, - &result_sets, &num_result_sets); + &result_sets, &num_result_sets, + kc); if (res != ZEBRA_OK) return res; if (num_result_sets == 0) - *rset = rsnull_create (rset_nmem, key_it_ctrl); + *rset = rsnull_create (rset_nmem, kc); else if (num_result_sets == 1) *rset = result_sets[0]; else - *rset = rsmulti_and_create(rset_nmem, key_it_ctrl, key_it_ctrl->scope, + *rset = rsmulti_and_create(rset_nmem, kc, kc->scope, num_result_sets, result_sets); if (!*rset) return ZEBRA_FAIL; @@ -1875,7 +1871,8 @@ static ZEBRA_RES rpn_search_APT_numeric(ZebraHandle zh, const char *rank_type, int xpath_use, int num_bases, char **basenames, NMEM rset_nmem, - RSET *rset) + RSET *rset, + struct rset_key_control *kc) { char term_dst[IT_MAX_WORD+1]; const char *termp = termz; @@ -1915,7 +1912,7 @@ static ZEBRA_RES rpn_search_APT_numeric(ZebraHandle zh, strlen(term_dst), rank_type, 0 /* preserve position */, zapt->term->which, rset_nmem, - key_it_ctrl,key_it_ctrl->scope); + kc, kc->scope); if (!result_sets[num_result_sets]) break; num_result_sets++; @@ -1929,11 +1926,11 @@ static ZEBRA_RES rpn_search_APT_numeric(ZebraHandle zh, return ZEBRA_FAIL; } if (num_result_sets == 0) - *rset = rsnull_create(rset_nmem, key_it_ctrl); + *rset = rsnull_create(rset_nmem, kc); if (num_result_sets == 1) *rset = result_sets[0]; else - *rset = rsmulti_and_create(rset_nmem, key_it_ctrl, key_it_ctrl->scope, + *rset = rsmulti_and_create(rset_nmem, kc, kc->scope, num_result_sets, result_sets); if (!*rset) return ZEBRA_FAIL; @@ -1946,12 +1943,13 @@ static ZEBRA_RES rpn_search_APT_local(ZebraHandle zh, oid_value attributeSet, NMEM stream, const char *rank_type, NMEM rset_nmem, - RSET *rset) + RSET *rset, + struct rset_key_control *kc) { RSFD rsfd; struct it_key key; int sys; - *rset = rstemp_create(rset_nmem,key_it_ctrl,key_it_ctrl->scope, + *rset = rstemp_create(rset_nmem, kc, kc->scope, res_get (zh->res, "setTmpDir"),0 ); rsfd = rset_open(*rset, RSETF_WRITE); @@ -1970,7 +1968,8 @@ static ZEBRA_RES rpn_sort_spec(ZebraHandle zh, Z_AttributesPlusTerm *zapt, oid_value attributeSet, NMEM stream, Z_SortKeySpecList *sort_sequence, const char *rank_type, - RSET *rset) + RSET *rset, + struct rset_key_control *kc) { int i; int sort_relation_value; @@ -2057,7 +2056,7 @@ static ZEBRA_RES rpn_sort_spec(ZebraHandle zh, Z_AttributesPlusTerm *zapt, sks->which = Z_SortKeySpec_null; sks->u.null = odr_nullval (); sort_sequence->specs[i] = sks; - *rset = rsnull_create (NULL, key_it_ctrl); + *rset = rsnull_create (NULL, kc); return ZEBRA_OK; } @@ -2083,7 +2082,8 @@ static int parse_xpath(ZebraHandle zh, Z_AttributesPlusTerm *zapt, static RSET xpath_trunc(ZebraHandle zh, NMEM stream, int reg_type, const char *term, int use, - oid_value curAttributeSet, NMEM rset_nmem) + oid_value curAttributeSet, NMEM rset_nmem, + struct rset_key_control *kc) { RSET rset; struct grep_info grep_info; @@ -2096,10 +2096,10 @@ static RSET xpath_trunc(ZebraHandle zh, NMEM stream, const char *flags = "void"; if (grep_info_prepare(zh, 0 /* zapt */, &grep_info, '0', stream)) - return rsnull_create (rset_nmem,key_it_ctrl); + return rsnull_create(rset_nmem, kc); if (ord < 0) - return rsnull_create (rset_nmem,key_it_ctrl); + return rsnull_create(rset_nmem, kc); if (prefix_len) term_dict[prefix_len++] = '|'; else @@ -2125,7 +2125,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, - key_it_ctrl, key_it_ctrl->scope); + kc, kc->scope); grep_info_delete(&grep_info); return rset; } @@ -2135,7 +2135,8 @@ static RSET rpn_search_xpath(ZebraHandle zh, int num_bases, char **basenames, NMEM stream, const char *rank_type, RSET rset, int xpath_len, struct xpath_location_step *xpath, - NMEM rset_nmem) + NMEM rset_nmem, + struct rset_key_control *kc) { oid_value curAttributeSet = attributeSet; int base_no; @@ -2245,7 +2246,7 @@ static RSET rpn_search_xpath(ZebraHandle zh, wrbuf_puts(wbuf, ""); rset_attr = xpath_trunc( zh, stream, '0', wrbuf_buf(wbuf), 3, - curAttributeSet,rset_nmem); + curAttributeSet, rset_nmem, kc); wrbuf_free(wbuf, 1); } else @@ -2257,13 +2258,12 @@ static RSET rpn_search_xpath(ZebraHandle zh, if (strlen(xpath_rev)) { rset_start_tag = xpath_trunc(zh, stream, '0', - xpath_rev, 1, curAttributeSet, rset_nmem); + xpath_rev, 1, curAttributeSet, rset_nmem, kc); rset_end_tag = xpath_trunc(zh, stream, '0', - xpath_rev, 2, curAttributeSet, rset_nmem); + xpath_rev, 2, curAttributeSet, rset_nmem, kc); - rset = rsbetween_create(rset_nmem, key_it_ctrl, - key_it_ctrl->scope, + rset = rsbetween_create(rset_nmem, kc, kc->scope, rset_start_tag, rset, rset_end_tag, rset_attr); } @@ -2274,14 +2274,13 @@ static RSET rpn_search_xpath(ZebraHandle zh, return rset; } - - static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt, oid_value attributeSet, NMEM stream, Z_SortKeySpecList *sort_sequence, int num_bases, char **basenames, NMEM rset_nmem, - RSET *rset) + RSET *rset, + struct rset_key_control *kc) { ZEBRA_RES res = ZEBRA_OK; unsigned reg_id; @@ -2312,7 +2311,7 @@ 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); + rank_type, rset, kc); xpath_len = parse_xpath(zh, zapt, attributeSet, xpath, 10, stream); if (xpath_len >= 0) { @@ -2327,7 +2326,7 @@ static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt, reg_id, complete_flag, rank_type, xpath_use, num_bases, basenames, rset_nmem, - rset); + rset, kc); } else if (!strcmp(search_type, "and-list")) { @@ -2335,7 +2334,7 @@ static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt, reg_id, complete_flag, rank_type, xpath_use, num_bases, basenames, rset_nmem, - rset); + rset, kc); } else if (!strcmp(search_type, "or-list")) { @@ -2343,19 +2342,20 @@ static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt, reg_id, complete_flag, rank_type, xpath_use, num_bases, basenames, rset_nmem, - rset); + rset, kc); } else if (!strcmp(search_type, "local")) { res = rpn_search_APT_local(zh, zapt, termz, attributeSet, stream, - rank_type, rset_nmem, rset); + rank_type, rset_nmem, rset, kc); } else if (!strcmp(search_type, "numeric")) { res = rpn_search_APT_numeric(zh, zapt, termz, attributeSet, stream, reg_id, complete_flag, rank_type, xpath_use, - num_bases, basenames, rset_nmem, rset); + num_bases, basenames, rset_nmem, + rset, kc); } else { @@ -2368,7 +2368,7 @@ static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt, return ZEBRA_FAIL; *rset = rpn_search_xpath(zh, attributeSet, num_bases, basenames, stream, rank_type, *rset, - xpath_len, xpath, rset_nmem); + xpath_len, xpath, rset_nmem, kc); if (!*rset) return ZEBRA_FAIL; return ZEBRA_OK; @@ -2380,7 +2380,8 @@ static ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, Z_SortKeySpecList *sort_sequence, int num_bases, char **basenames, RSET **result_sets, int *num_result_sets, - Z_Operator *parent_op); + Z_Operator *parent_op, + struct rset_key_control *kc); ZEBRA_RES rpn_search_top(ZebraHandle zh, Z_RPNStructure *zs, oid_value attributeSet, @@ -2391,12 +2392,16 @@ ZEBRA_RES rpn_search_top(ZebraHandle zh, Z_RPNStructure *zs, { RSET *result_sets = 0; int num_result_sets = 0; - ZEBRA_RES res = rpn_search_structure(zh, zs, attributeSet, - stream, rset_nmem, - sort_sequence, - num_bases, basenames, - &result_sets, &num_result_sets, - 0 /* no op */); + ZEBRA_RES res; + struct rset_key_control *kc = zebra_key_control_create(zh); + + res = rpn_search_structure(zh, zs, attributeSet, + stream, rset_nmem, + sort_sequence, + num_bases, basenames, + &result_sets, &num_result_sets, + 0 /* no parent op */, + kc); if (res != ZEBRA_OK) { int i; @@ -2409,6 +2414,8 @@ ZEBRA_RES rpn_search_top(ZebraHandle zh, Z_RPNStructure *zs, assert(result_sets); assert(*result_sets); *result_set = *result_sets; + + (*kc->dec)(kc); return ZEBRA_OK; } @@ -2418,7 +2425,8 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, Z_SortKeySpecList *sort_sequence, int num_bases, char **basenames, RSET **result_sets, int *num_result_sets, - Z_Operator *parent_op) + Z_Operator *parent_op, + struct rset_key_control *kc) { *num_result_sets = 0; if (zs->which == Z_RPNStructure_complex) @@ -2435,7 +2443,7 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, sort_sequence, num_bases, basenames, &result_sets_l, &num_result_sets_l, - zop); + zop, kc); if (res != ZEBRA_OK) { int i; @@ -2448,7 +2456,7 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, sort_sequence, num_bases, basenames, &result_sets_r, &num_result_sets_r, - zop); + zop, kc); if (res != ZEBRA_OK) { int i; @@ -2478,18 +2486,18 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, switch (zop->which) { case Z_Operator_and: - rset = rsmulti_and_create(rset_nmem, key_it_ctrl, - key_it_ctrl->scope, + rset = rsmulti_and_create(rset_nmem, kc, + kc->scope, *num_result_sets, *result_sets); break; case Z_Operator_or: - rset = rsmulti_or_create(rset_nmem, key_it_ctrl, - key_it_ctrl->scope, + rset = rsmulti_or_create(rset_nmem, kc, + kc->scope, *num_result_sets, *result_sets); break; case Z_Operator_and_not: - rset = rsbool_create_not(rset_nmem, key_it_ctrl, - key_it_ctrl->scope, + rset = rsbool_create_not(rset_nmem, kc, + kc->scope, (*result_sets)[0], (*result_sets)[1]); break; @@ -2509,8 +2517,8 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, } else { - rset = rsprox_create(rset_nmem, key_it_ctrl, - key_it_ctrl->scope, + rset = rsprox_create(rset_nmem, kc, + kc->scope, *num_result_sets, *result_sets, *zop->u.prox->ordered, (!zop->u.prox->exclusion ? @@ -2539,7 +2547,8 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, yaz_log(YLOG_DEBUG, "rpn_search_APT"); res = rpn_search_APT(zh, zs->u.simple->u.attributesPlusTerm, attributeSet, stream, sort_sequence, - num_bases, basenames, rset_nmem, &rset); + num_bases, basenames, rset_nmem, &rset, + kc); if (res != ZEBRA_OK) return res; } @@ -2696,6 +2705,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, int complete_flag; int sort_flag; NMEM rset_nmem = NULL; + struct rset_key_control *kc = 0; *list = 0; *is_partial = 0; @@ -2868,6 +2878,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, odr_malloc(stream, (before+after)*sizeof(*glist)); rset_nmem = nmem_create(); + kc = zebra_key_control_create(zh); /* consider terms after main term */ for (i = 0; i < ord_no; i++) @@ -2905,7 +2916,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, - key_it_ctrl,key_it_ctrl->scope); + kc, kc->scope); } ptr[j0]++; /* move index for this set .. */ /* get result set for remaining scan terms */ @@ -2926,9 +2937,9 @@ 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, - key_it_ctrl, key_it_ctrl->scope); - rset = rsmulti_or_create(rset_nmem, key_it_ctrl, - 2, key_it_ctrl->scope, rsets); + kc, kc->scope); + rset = rsmulti_or_create(rset_nmem, kc, + 2, kc->scope, rsets); } ptr[j]++; } @@ -2942,8 +2953,8 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, rsets[0] = rset; rsets[1] = rset_dup(limit_set); - rset = rsmulti_and_create(rset_nmem, key_it_ctrl, - key_it_ctrl->scope, 2, rsets); + rset = rsmulti_and_create(rset_nmem, kc, + kc->scope, 2, rsets); } /* count it */ count_set(rset, &glist[lo].occurrences); @@ -2956,6 +2967,8 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, *is_partial = 1; if (*num_entries < 0) { + (*kc->dec)(kc); + nmem_destroy(rset_nmem); *num_entries = 0; return ZEBRA_OK; } @@ -2992,7 +3005,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, (zh, &scan_info_array[j0].list[before-1-ptr[j0]].isam_p, 1, glist[lo].term, strlen(glist[lo].term), NULL, 0, zapt->term->which,rset_nmem, - key_it_ctrl,key_it_ctrl->scope); + kc, kc->scope); ptr[j0]++; @@ -3011,9 +3024,9 @@ 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, - key_it_ctrl, key_it_ctrl->scope); - rset = rsmulti_or_create(rset_nmem, key_it_ctrl, - 2, key_it_ctrl->scope, rsets); + kc, kc->scope); + rset = rsmulti_or_create(rset_nmem, kc, + 2, kc->scope, rsets); ptr[j]++; } @@ -3024,12 +3037,14 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, rsets[0] = rset; rsets[1] = rset_dup(limit_set); - rset = rsmulti_and_create(rset_nmem, key_it_ctrl, - key_it_ctrl->scope, 2, rsets); + rset = rsmulti_and_create(rset_nmem, kc, + kc->scope, 2, rsets); } count_set (rset, &glist[lo].occurrences); rset_delete (rset); } + (*kc->dec)(kc); + nmem_destroy(rset_nmem); i = before-i; if (i) { @@ -3043,7 +3058,6 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, } } - nmem_destroy(rset_nmem); *list = glist + i; /* list is set to first 'real' entry */ yaz_log(YLOG_DEBUG, "position = %d, num_entries = %d", diff --git a/rset/rsbetween.c b/rset/rsbetween.c index 28c2554..9078c2f 100644 --- a/rset/rsbetween.c +++ b/rset/rsbetween.c @@ -1,4 +1,4 @@ -/* $Id: rsbetween.c,v 1.37 2005-04-26 10:09:38 adam Exp $ +/* $Id: rsbetween.c,v 1.38 2005-05-03 09:11:35 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -103,9 +103,9 @@ static void checkterm( RSET rs, char *tag, NMEM nmem) } -RSET rsbetween_create( NMEM nmem, const struct key_control *kcontrol, - int scope, - RSET rset_l, RSET rset_m, RSET rset_r, RSET rset_attr) +RSET rsbetween_create(NMEM nmem, struct rset_key_control *kcontrol, + int scope, + RSET rset_l, RSET rset_m, RSET rset_r, RSET rset_attr) { RSET rnew = rset_create_base(&control, nmem, kcontrol, scope,0); struct rset_between_info *info= @@ -210,9 +210,10 @@ static int r_forward(RSFD rfd, void *buf, static void checkattr(RSFD rfd) { - struct rset_between_info *info =(struct rset_between_info *)rfd->rset->priv; - struct rset_between_rfd *p=(struct rset_between_rfd *)rfd->priv; - const struct key_control *kctrl = rfd->rset->keycontrol; + struct rset_between_info *info =(struct rset_between_info *) + rfd->rset->priv; + struct rset_between_rfd *p = (struct rset_between_rfd *)rfd->priv; + const struct rset_key_control *kctrl = rfd->rset->keycontrol; int cmp; if (p->attrdepth) return; /* already found one */ @@ -235,9 +236,10 @@ static void checkattr(RSFD rfd) static int r_read(RSFD rfd, void *buf, TERMID *term) { - struct rset_between_info *info =(struct rset_between_info *)rfd->rset->priv; - struct rset_between_rfd *p=(struct rset_between_rfd *)rfd->priv; - const struct key_control *kctrl = rfd->rset->keycontrol; + struct rset_between_info *info = + (struct rset_between_info *)rfd->rset->priv; + struct rset_between_rfd *p = (struct rset_between_rfd *)rfd->priv; + const struct rset_key_control *kctrl = rfd->rset->keycontrol; int cmp; TERMID dummyterm = 0; yaz_log(log_level,"== read: term=%p",term); diff --git a/rset/rsbool.c b/rset/rsbool.c index 318ac45..520e859 100644 --- a/rset/rsbool.c +++ b/rset/rsbool.c @@ -1,4 +1,4 @@ -/* $Id: rsbool.c,v 1.54 2005-04-26 10:09:38 adam Exp $ +/* $Id: rsbool.c,v 1.55 2005-05-03 09:11:36 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -83,12 +83,12 @@ static const struct rset_control control_not = r_write, }; -struct rset_bool_info { +struct rset_private { RSET rset_l; RSET rset_r; }; -struct rset_bool_rfd { +struct rfd_private { zint hits; RSFD rfd_l; RSFD rfd_r; @@ -102,19 +102,20 @@ struct rset_bool_rfd { }; static RSET rsbool_create_base(const struct rset_control *ctrl, - NMEM nmem, const struct key_control *kcontrol, + NMEM nmem, + struct rset_key_control *kcontrol, int scope, RSET rset_l, RSET rset_r) { - RSET rnew = rset_create_base(ctrl, nmem, kcontrol, scope,0); - struct rset_bool_info *info; - info = (struct rset_bool_info *) nmem_malloc(rnew->nmem,sizeof(*info)); + RSET rnew = rset_create_base(ctrl, nmem, kcontrol, scope, 0); + struct rset_private *info; + info = (struct rset_private *) nmem_malloc(rnew->nmem, sizeof(*info)); info->rset_l = rset_l; info->rset_r = rset_r; rnew->priv = info; return rnew; } -RSET rsbool_create_and( NMEM nmem, const struct key_control *kcontrol, +RSET rsbool_create_and( NMEM nmem, struct rset_key_control *kcontrol, int scope, RSET rset_l, RSET rset_r) { return rsbool_create_base(&control_and, nmem, kcontrol, @@ -122,34 +123,32 @@ RSET rsbool_create_and( NMEM nmem, const struct key_control *kcontrol, rset_l, rset_r); } -RSET rsbool_create_or( NMEM nmem, const struct key_control *kcontrol, - int scope, RSET rset_l, RSET rset_r) +RSET rsbool_create_or(NMEM nmem, struct rset_key_control *kcontrol, + int scope, RSET rset_l, RSET rset_r) { return rsbool_create_base(&control_or, nmem, kcontrol, scope, rset_l, rset_r); } -RSET rsbool_create_not( NMEM nmem, const struct key_control *kcontrol, - int scope, RSET rset_l, RSET rset_r) +RSET rsbool_create_not(NMEM nmem, struct rset_key_control *kcontrol, + int scope, RSET rset_l, RSET rset_r) { return rsbool_create_base(&control_not, nmem, kcontrol, scope, rset_l, rset_r); } -static void r_delete (RSET ct) +static void r_delete(RSET ct) { - struct rset_bool_info *info = (struct rset_bool_info *) ct->priv; + struct rset_private *info = (struct rset_private *) ct->priv; rset_delete (info->rset_l); rset_delete (info->rset_r); } - -static RSFD r_open (RSET ct, int flag) +static RSFD r_open(RSET ct, int flag) { - struct rset_bool_info *info = (struct rset_bool_info *) ct->priv; + struct rset_private *info = (struct rset_private *) ct->priv; RSFD rfd; - struct rset_bool_rfd *p; - + struct rfd_private *p; if (flag & RSETF_WRITE) { @@ -158,7 +157,7 @@ static RSFD r_open (RSET ct, int flag) } rfd = rfd_create_base(ct); if (rfd->priv) - p = (struct rset_bool_rfd *)rfd->priv; + p = (struct rfd_private *)rfd->priv; else { p = nmem_malloc(ct->nmem,sizeof(*p)); rfd->priv = p; @@ -179,21 +178,18 @@ static RSFD r_open (RSET ct, int flag) static void r_close (RSFD rfd) { - /* struct rset_bool_info *info = (struct rset_bool_info*)(rfd->rset->priv); */ - struct rset_bool_rfd *prfd=(struct rset_bool_rfd *)rfd->priv; + struct rfd_private *prfd=(struct rfd_private *)rfd->priv; rset_close (prfd->rfd_l); rset_close (prfd->rfd_r); rfd_delete_base(rfd); } - - static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) { - struct rset_bool_rfd *p = (struct rset_bool_rfd *)rfd->priv; - const struct key_control *kctrl=rfd->rset->keycontrol; + struct rfd_private *p = (struct rfd_private *)rfd->priv; + const struct rset_key_control *kctrl=rfd->rset->keycontrol; if ( p->more_l && ((kctrl->cmp)(untilbuf,p->buf_l)>=rfd->rset->scope) ) p->more_l = rset_forward(p->rfd_l, p->buf_l, &p->term_l, untilbuf); @@ -221,8 +217,8 @@ static int r_forward(RSFD rfd, void *buf, TERMID *term, static int r_read_and(RSFD rfd, void *buf, TERMID *term) { - struct rset_bool_rfd *p=(struct rset_bool_rfd *)rfd->priv; - const struct key_control *kctrl=rfd->rset->keycontrol; + struct rfd_private *p=(struct rfd_private *)rfd->priv; + const struct rset_key_control *kctrl=rfd->rset->keycontrol; while (p->more_l || p->more_r) { @@ -352,8 +348,8 @@ static int r_read_and(RSFD rfd, void *buf, TERMID *term) static int r_read_or (RSFD rfd, void *buf, TERMID *term) { - struct rset_bool_rfd *p = (struct rset_bool_rfd *)rfd->priv; - const struct key_control *kctrl = rfd->rset->keycontrol; + struct rfd_private *p = (struct rfd_private *)rfd->priv; + const struct rset_key_control *kctrl = rfd->rset->keycontrol; while (p->more_l || p->more_r) { @@ -417,8 +413,8 @@ static int r_read_or (RSFD rfd, void *buf, TERMID *term) static int r_read_not(RSFD rfd, void *buf, TERMID *term) { - struct rset_bool_rfd *p = (struct rset_bool_rfd *)rfd->priv; - const struct key_control *kctrl = rfd->rset->keycontrol; + struct rfd_private *p = (struct rfd_private *)rfd->priv; + const struct rset_key_control *kctrl = rfd->rset->keycontrol; while (p->more_l || p->more_r) { @@ -478,7 +474,7 @@ static int r_write(RSFD rfd, const void *buf) static void r_pos(RSFD rfd, double *current, double *total) { - struct rset_bool_rfd *p = (struct rset_bool_rfd *)rfd->priv; + struct rfd_private *p = (struct rfd_private *)rfd->priv; double lcur, ltot; double rcur, rtot; double r; @@ -511,7 +507,7 @@ static void r_pos(RSFD rfd, double *current, double *total) static void r_get_terms(RSET ct, TERMID *terms, int maxterms, int *curterm) { - struct rset_bool_info *info = (struct rset_bool_info *) ct->priv; + struct rset_private *info = (struct rset_private *) ct->priv; rset_getterms(info->rset_l, terms, maxterms, curterm); rset_getterms(info->rset_r, terms, maxterms, curterm); } diff --git a/rset/rset.c b/rset/rset.c index 26ba709..7af05c9 100644 --- a/rset/rset.c +++ b/rset/rset.c @@ -1,4 +1,4 @@ -/* $Id: rset.c,v 1.44 2005-03-30 09:25:24 adam Exp $ +/* $Id: rset.c,v 1.45 2005-05-03 09:11:36 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -51,7 +51,7 @@ RSFD rfd_create_base(RSET rs) else { rnew = nmem_malloc(rs->nmem, sizeof(*rnew)); - rnew->priv = NULL; + rnew->priv = 0; rnew->rset = rs; yaz_log(log_level, "rfd_create_base (new): rfd=%p rs=%p fl=%p priv=%p", rnew, rs, rs->free_list, rnew->priv); @@ -84,7 +84,7 @@ void rfd_delete_base(RSFD rfd) } RSET rset_create_base(const struct rset_control *sel, - NMEM nmem, const struct key_control *kcontrol, + NMEM nmem, struct rset_key_control *kcontrol, int scope, TERMID term) { RSET rnew; @@ -113,6 +113,7 @@ RSET rset_create_base(const struct rset_control *sel, rnew->free_list = NULL; rnew->use_list = NULL; rnew->keycontrol = kcontrol; + (*kcontrol->inc)(kcontrol); rnew->scope = scope; rnew->term = term; if (term) @@ -131,6 +132,7 @@ void rset_delete (RSET rs) yaz_log(YLOG_WARN, "rs_delete(%s) still has RFDs in use", rs->control->desc); (*rs->control->f_delete)(rs); + (*rs->keycontrol->dec)(rs->keycontrol); if (rs->my_nmem) nmem_destroy(rs->nmem); } @@ -148,6 +150,7 @@ RSET rset_dup (RSET rs) (rs->count)++; yaz_log(log_level, "rs_dup(%s), rs=%p, count=%d", rs->control->desc, rs, rs->count); + (*rs->keycontrol->inc)(rs->keycontrol); return rs; } diff --git a/rset/rsisamb.c b/rset/rsisamb.c index 872536f..cbd6cd8 100644 --- a/rset/rsisamb.c +++ b/rset/rsisamb.c @@ -1,4 +1,4 @@ -/* $Id: rsisamb.c,v 1.32 2005-04-26 10:09:38 adam Exp $ +/* $Id: rsisamb.c,v 1.33 2005-05-03 09:11:36 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -26,14 +26,14 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include - -static RSFD r_open (RSET ct, int flag); -static void r_close (RSFD rfd); -static void r_delete (RSET ct); +static RSFD r_open(RSET ct, int flag); +static void r_close(RSFD rfd); +static void r_delete(RSET ct); static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf); -static void r_pos (RSFD rfd, double *current, double *total); -static int r_read (RSFD rfd, void *buf, TERMID *term); -static int r_write (RSFD rfd, const void *buf); +static void r_pos(RSFD rfd, double *current, double *total); +static int r_read(RSFD rfd, void *buf, TERMID *term); +static int r_read_filter(RSFD rfd, void *buf, TERMID *term); +static int r_write(RSFD rfd, const void *buf); static const struct rset_control control = { @@ -48,12 +48,25 @@ static const struct rset_control control = r_write, }; -struct rset_pp_info { +static const struct rset_control control_filter = +{ + "isamb", + r_delete, + rset_get_one_term, + r_open, + r_close, + r_forward, + r_pos, + r_read_filter, + r_write, +}; + +struct rfd_private { ISAMB_PP pt; void *buf; }; -struct rset_isamb_info { +struct rset_private { ISAMB is; ISAM_P pos; }; @@ -61,34 +74,37 @@ struct rset_isamb_info { static int log_level = 0; static int log_level_initialized = 0; -RSET rsisamb_create(NMEM nmem, const struct key_control *kcontrol, int scope, +RSET rsisamb_create(NMEM nmem, struct rset_key_control *kcontrol, + int scope, ISAMB is, ISAM_P pos, TERMID term) { - RSET rnew = rset_create_base(&control, nmem, kcontrol, scope, term); - struct rset_isamb_info *info; + RSET rnew = rset_create_base( + kcontrol->filter_func ? &control_filter : &control, + nmem, kcontrol, scope, term); + struct rset_private *info; if (!log_level_initialized) { log_level = yaz_log_module_level("rsisamb"); log_level_initialized = 1; } - info = (struct rset_isamb_info *) nmem_malloc(rnew->nmem,sizeof(*info)); + info = (struct rset_private *) nmem_malloc(rnew->nmem, sizeof(*info)); info->is = is; info->pos = pos; rnew->priv = info; - yaz_log(log_level,"rsisamb_create"); + yaz_log(log_level, "rsisamb_create"); return rnew; } -static void r_delete (RSET ct) +static void r_delete(RSET ct) { yaz_log(log_level, "rsisamb_delete"); } -RSFD r_open (RSET ct, int flag) +RSFD r_open(RSET ct, int flag) { - struct rset_isamb_info *info = (struct rset_isamb_info *) ct->priv; + struct rset_private *info = (struct rset_private *) ct->priv; RSFD rfd; - struct rset_pp_info *ptinfo; + struct rfd_private *ptinfo; if (flag & RSETF_WRITE) { @@ -97,58 +113,75 @@ RSFD r_open (RSET ct, int flag) } rfd = rfd_create_base(ct); if (rfd->priv) - ptinfo = (struct rset_pp_info *) (rfd->priv); + ptinfo = (struct rfd_private *) (rfd->priv); else { - ptinfo = (struct rset_pp_info *)nmem_malloc(ct->nmem,sizeof(*ptinfo)); - ptinfo->buf = nmem_malloc (ct->nmem,ct->keycontrol->key_size); + ptinfo = (struct rfd_private *) nmem_malloc(ct->nmem,sizeof(*ptinfo)); + ptinfo->buf = nmem_malloc(ct->nmem,ct->keycontrol->key_size); rfd->priv = ptinfo; } - ptinfo->pt = isamb_pp_open (info->is, info->pos, ct->scope ); - yaz_log(log_level,"rsisamb_open"); + ptinfo->pt = isamb_pp_open(info->is, info->pos, ct->scope ); + yaz_log(log_level, "rsisamb_open"); return rfd; } -static void r_close (RSFD rfd) +static void r_close(RSFD rfd) { - struct rset_pp_info *ptinfo = (struct rset_pp_info *)(rfd->priv); + struct rfd_private *ptinfo = (struct rfd_private *)(rfd->priv); isamb_pp_close (ptinfo->pt); rfd_delete_base(rfd); - yaz_log(log_level,"rsisamb_close"); + yaz_log(log_level, "rsisamb_close"); } static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) { - struct rset_pp_info *pinfo = (struct rset_pp_info *)(rfd->priv); + struct rfd_private *pinfo = (struct rfd_private *)(rfd->priv); int rc; rc = isamb_pp_forward(pinfo->pt, buf, untilbuf); if (rc && term) *term = rfd->rset->term; - yaz_log(log_level,"rsisamb_forward"); + yaz_log(log_level, "rsisamb_forward"); return rc; } -static void r_pos (RSFD rfd, double *current, double *total) +static void r_pos(RSFD rfd, double *current, double *total) { - struct rset_pp_info *pinfo = (struct rset_pp_info *)(rfd->priv); + struct rfd_private *pinfo = (struct rfd_private *)(rfd->priv); assert(rfd); isamb_pp_pos(pinfo->pt, current, total); - yaz_log(log_level,"isamb.r_pos returning %0.1f/%0.1f", + yaz_log(log_level, "isamb.r_pos returning %0.1f/%0.1f", *current, *total); } -static int r_read (RSFD rfd, void *buf, TERMID *term) +static int r_read(RSFD rfd, void *buf, TERMID *term) { - struct rset_pp_info *pinfo = (struct rset_pp_info *)(rfd->priv); + struct rfd_private *pinfo = (struct rfd_private *)(rfd->priv); int rc; rc = isamb_pp_read(pinfo->pt, buf); if (rc && term) *term = rfd->rset->term; - yaz_log(log_level,"isamb.r_read "); + yaz_log(log_level, "isamb.r_read "); + return rc; +} + +static int r_read_filter(RSFD rfd, void *buf, TERMID *term) +{ + struct rfd_private *pinfo = (struct rfd_private *)rfd->priv; + const struct rset_key_control *kctrl = rfd->rset->keycontrol; + int rc; + while((rc = isamb_pp_read(pinfo->pt, buf))) + { + int incl = (*kctrl->filter_func)(buf, kctrl->filter_data); + if (incl) + break; + } + if (rc && term) + *term = rfd->rset->term; + yaz_log(log_level, "isamb.r_read_filter"); return rc; } -static int r_write (RSFD rfd, const void *buf) +static int r_write(RSFD rfd, const void *buf) { yaz_log(YLOG_FATAL, "ISAMB set type is read-only"); return -1; diff --git a/rset/rsisamc.c b/rset/rsisamc.c index b60f939..43568eb 100644 --- a/rset/rsisamc.c +++ b/rset/rsisamc.c @@ -1,4 +1,4 @@ -/* $Id: rsisamc.c,v 1.38 2005-04-26 10:09:38 adam Exp $ +/* $Id: rsisamc.c,v 1.39 2005-05-03 09:11:36 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -59,7 +59,8 @@ struct rset_isamc_info { static int log_level = 0; static int log_level_initialized = 0; -RSET rsisamc_create(NMEM nmem, const struct key_control *kcontrol, int scope, +RSET rsisamc_create(NMEM nmem, struct rset_key_control *kcontrol, + int scope, ISAMC is, ISAM_P pos, TERMID term) { RSET rnew = rset_create_base(&control, nmem, kcontrol, scope,term); diff --git a/rset/rsisams.c b/rset/rsisams.c index 95617f4..50b559a 100644 --- a/rset/rsisams.c +++ b/rset/rsisams.c @@ -1,4 +1,4 @@ -/* $Id: rsisams.c,v 1.21 2005-04-26 10:09:38 adam Exp $ +/* $Id: rsisams.c,v 1.22 2005-05-03 09:11:36 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -45,25 +45,26 @@ static const struct rset_control control = r_write, }; -struct rset_pp_info { +struct rfd_private { ISAMS_PP pt; }; -struct rset_isams_info { +struct rset_private { ISAMS is; ISAM_P pos; }; -RSET rsisams_create(NMEM nmem, const struct key_control *kcontrol, int scope, +RSET rsisams_create(NMEM nmem, struct rset_key_control *kcontrol, + int scope, ISAMS is, ISAM_P pos, TERMID term) { - RSET rnew=rset_create_base(&control, nmem, kcontrol, scope, term); - struct rset_isams_info *info; - info = (struct rset_isams_info *) nmem_malloc(rnew->nmem,sizeof(*info)); - rnew->priv=info; - info->is=is; - info->pos=pos; + RSET rnew = rset_create_base(&control, nmem, kcontrol, scope, term); + struct rset_private *info; + info = (struct rset_private *) nmem_malloc(rnew->nmem,sizeof(*info)); + rnew->priv = info; + info->is = is; + info->pos = pos; return rnew; } @@ -76,9 +77,9 @@ static void r_delete (RSET ct) RSFD r_open (RSET ct, int flag) { - struct rset_isams_info *info = (struct rset_isams_info *) ct->priv; + struct rset_private *info = (struct rset_private *) ct->priv; RSFD rfd; - struct rset_pp_info *ptinfo; + struct rfd_private *ptinfo; yaz_log (YLOG_DEBUG, "risams_open"); if (flag & RSETF_WRITE) @@ -88,9 +89,9 @@ RSFD r_open (RSET ct, int flag) } rfd=rfd_create_base(ct); if (rfd->priv) - ptinfo=(struct rset_pp_info *)(rfd->priv); + ptinfo=(struct rfd_private *)(rfd->priv); else { - ptinfo = (struct rset_pp_info *) nmem_malloc(ct->nmem,sizeof(*ptinfo)); + ptinfo = (struct rfd_private *) nmem_malloc(ct->nmem,sizeof(*ptinfo)); ptinfo->pt = isams_pp_open (info->is, info->pos); rfd->priv=ptinfo; } @@ -99,7 +100,7 @@ RSFD r_open (RSET ct, int flag) static void r_close (RSFD rfd) { - struct rset_pp_info *ptinfo=(struct rset_pp_info *)(rfd->priv); + struct rfd_private *ptinfo = (struct rfd_private *)(rfd->priv); isams_pp_close (ptinfo->pt); rfd_delete_base(rfd); @@ -108,7 +109,7 @@ static void r_close (RSFD rfd) static int r_read (RSFD rfd, void *buf, TERMID *term) { - struct rset_pp_info *ptinfo=(struct rset_pp_info *)(rfd->priv); + struct rfd_private *ptinfo = (struct rfd_private *)(rfd->priv); int rc; rc=isams_pp_read(ptinfo->pt, buf); if (rc && term) diff --git a/rset/rsmultiandor.c b/rset/rsmultiandor.c index 06005bd..1af14c6 100644 --- a/rset/rsmultiandor.c +++ b/rset/rsmultiandor.c @@ -1,4 +1,4 @@ -/* $Id: rsmultiandor.c,v 1.16 2005-04-26 10:09:38 adam Exp $ +/* $Id: rsmultiandor.c,v 1.17 2005-05-03 09:11:36 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -101,19 +101,19 @@ struct heap_item { struct heap { int heapnum; int heapmax; - const struct key_control *kctrl; + const struct rset_key_control *kctrl; struct heap_item **heap; /* ptrs to the rfd */ }; typedef struct heap *HEAP; -struct rset_multiandor_info { +struct rset_private { int no_rsets; RSET *rsets; }; -struct rset_multiandor_rfd { +struct rfd_private { int flag; struct heap_item *items; /* we alloc and free them here */ HEAP h; /* and move around here */ @@ -222,7 +222,7 @@ static void heap_insert (HEAP h, struct heap_item *hi) static -HEAP heap_create (NMEM nmem, int size, const struct key_control *kctrl) +HEAP heap_create (NMEM nmem, int size, const struct rset_key_control *kctrl) { HEAP h = (HEAP) nmem_malloc (nmem, sizeof(*h)); @@ -263,18 +263,19 @@ int compare_ands(const void *x, const void *y) /* Creating and deleting rsets ***********************/ -static RSET rsmulti_andor_create( NMEM nmem, const struct key_control *kcontrol, - int scope, int no_rsets, RSET* rsets, - const struct rset_control *ctrl) +static RSET rsmulti_andor_create(NMEM nmem, + struct rset_key_control *kcontrol, + int scope, int no_rsets, RSET* rsets, + const struct rset_control *ctrl) { - RSET rnew = rset_create_base(ctrl, nmem,kcontrol, scope,0); - struct rset_multiandor_info *info; + RSET rnew = rset_create_base(ctrl, nmem, kcontrol, scope,0); + struct rset_private *info; if (!log_level_initialized) { log_level = yaz_log_module_level("rsmultiandor"); log_level_initialized = 1; } - info = (struct rset_multiandor_info *) nmem_malloc(rnew->nmem,sizeof(*info)); + info = (struct rset_private *) nmem_malloc(rnew->nmem,sizeof(*info)); info->no_rsets = no_rsets; info->rsets = (RSET*)nmem_malloc(rnew->nmem, no_rsets*sizeof(*rsets)); memcpy(info->rsets,rsets,no_rsets*sizeof(*rsets)); @@ -282,14 +283,14 @@ static RSET rsmulti_andor_create( NMEM nmem, const struct key_control *kcontrol, return rnew; } -RSET rsmulti_or_create(NMEM nmem, const struct key_control *kcontrol, +RSET rsmulti_or_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, int no_rsets, RSET* rsets) { return rsmulti_andor_create(nmem, kcontrol, scope, no_rsets, rsets, &control_or); } -RSET rsmulti_and_create(NMEM nmem, const struct key_control *kcontrol, +RSET rsmulti_and_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, int no_rsets, RSET* rsets) { return rsmulti_andor_create(nmem, kcontrol, scope, @@ -298,7 +299,7 @@ RSET rsmulti_and_create(NMEM nmem, const struct key_control *kcontrol, static void r_delete (RSET ct) { - struct rset_multiandor_info *info = (struct rset_multiandor_info *) ct->priv; + struct rset_private *info = (struct rset_private *) ct->priv; int i; for(i = 0; ino_rsets; i++) rset_delete(info->rsets[i]); @@ -310,9 +311,9 @@ static void r_delete (RSET ct) static RSFD r_open_andor (RSET ct, int flag, int is_and) { RSFD rfd; - struct rset_multiandor_rfd *p; - struct rset_multiandor_info *info = (struct rset_multiandor_info *) ct->priv; - const struct key_control *kctrl = ct->keycontrol; + struct rfd_private *p; + struct rset_private *info = (struct rset_private *) ct->priv; + const struct rset_key_control *kctrl = ct->keycontrol; int i; if (flag & RSETF_WRITE) @@ -322,14 +323,14 @@ static RSFD r_open_andor (RSET ct, int flag, int is_and) } rfd = rfd_create_base(ct); if (rfd->priv) { - p = (struct rset_multiandor_rfd *)rfd->priv; + p = (struct rfd_private *)rfd->priv; if (!is_and) heap_clear(p->h); assert(p->items); /* all other pointers shouls already be allocated, in right sizes! */ } else { - p = (struct rset_multiandor_rfd *) nmem_malloc (ct->nmem,sizeof(*p)); + p = (struct rfd_private *) nmem_malloc (ct->nmem,sizeof(*p)); rfd->priv = p; p->h = 0; p->tailbits = 0; @@ -339,9 +340,10 @@ static RSFD r_open_andor (RSET ct, int flag, int is_and) p->h = heap_create( ct->nmem, info->no_rsets, kctrl); p->items=(struct heap_item *) nmem_malloc(ct->nmem, info->no_rsets*sizeof(*p->items)); - for (i = 0; ino_rsets; i++){ + for (i = 0; ino_rsets; i++) + { p->items[i].rset = info->rsets[i]; - p->items[i].buf = nmem_malloc(ct->nmem,kctrl->key_size); + p->items[i].buf = nmem_malloc(ct->nmem, kctrl->key_size); } } p->flag = flag; @@ -381,9 +383,9 @@ static RSFD r_open_and (RSET ct, int flag) static void r_close (RSFD rfd) { - struct rset_multiandor_info *info= - (struct rset_multiandor_info *)(rfd->rset->priv); - struct rset_multiandor_rfd *p=(struct rset_multiandor_rfd *)(rfd->priv); + struct rset_private *info= + (struct rset_private *)(rfd->rset->priv); + struct rfd_private *p=(struct rfd_private *)(rfd->priv); int i; if (p->h) @@ -399,8 +401,8 @@ static void r_close (RSFD rfd) static int r_forward_or(RSFD rfd, void *buf, TERMID *term,const void *untilbuf) { /* while heap head behind untilbuf, forward it and rebalance heap */ - struct rset_multiandor_rfd *p = rfd->priv; - const struct key_control *kctrl = rfd->rset->keycontrol; + struct rfd_private *p = rfd->priv; + const struct rset_key_control *kctrl = rfd->rset->keycontrol; if (heap_empty(p->h)) return 0; while ( (*kctrl->cmp)(p->h->heap[1]->buf,untilbuf) < -rfd->rset->scope ) @@ -422,8 +424,8 @@ static int r_forward_or(RSFD rfd, void *buf, static int r_read_or (RSFD rfd, void *buf, TERMID *term) { - struct rset_multiandor_rfd *mrfd = rfd->priv; - const struct key_control *kctrl = rfd->rset->keycontrol; + struct rfd_private *mrfd = rfd->priv; + const struct rset_key_control *kctrl = rfd->rset->keycontrol; struct heap_item *it; int rdres; if (heap_empty(mrfd->h)) @@ -451,9 +453,9 @@ static int r_read_and (RSFD rfd, void *buf, TERMID *term) /* Once a hit has been found, scan all items for the smallest */ /* value. Mark all as being in the tail. Read next from that */ /* item, and if not in the same record, clear its tail bit */ - struct rset_multiandor_rfd *p = rfd->priv; - const struct key_control *kctrl = rfd->rset->keycontrol; - struct rset_multiandor_info *info = rfd->rset->priv; + struct rfd_private *p = rfd->priv; + const struct rset_key_control *kctrl = rfd->rset->keycontrol; + struct rset_private *info = rfd->rset->priv; int i, mintail; int cmp; @@ -531,9 +533,9 @@ static int r_read_and (RSFD rfd, void *buf, TERMID *term) static int r_forward_and(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) { - struct rset_multiandor_rfd *p = rfd->priv; - const struct key_control *kctrl = rfd->rset->keycontrol; - struct rset_multiandor_info *info = rfd->rset->priv; + struct rfd_private *p = rfd->priv; + const struct rset_key_control *kctrl = rfd->rset->keycontrol; + struct rset_private *info = rfd->rset->priv; int i; int cmp; int killtail = 0; @@ -564,10 +566,10 @@ static int r_forward_and(RSFD rfd, void *buf, TERMID *term, static void r_pos (RSFD rfd, double *current, double *total) { - struct rset_multiandor_info *info = - (struct rset_multiandor_info *)(rfd->rset->priv); - struct rset_multiandor_rfd *mrfd = - (struct rset_multiandor_rfd *)(rfd->priv); + struct rset_private *info = + (struct rset_private *)(rfd->rset->priv); + struct rfd_private *mrfd = + (struct rfd_private *)(rfd->priv); double cur, tot; double scur = 0.0, stot = 0.0; int i; @@ -601,8 +603,8 @@ static void r_get_terms(RSET ct, TERMID *terms, int maxterms, int *curterm) /* term. We do not want to duplicate those. Other multiors (and ands) */ /* have different terms under them. Those we want. */ { - struct rset_multiandor_info *info = - (struct rset_multiandor_info *) ct->priv; + struct rset_private *info = + (struct rset_private *) ct->priv; int firstterm= *curterm; int i; for (i = 0; ino_rsets; i++) diff --git a/rset/rsnull.c b/rset/rsnull.c index ef0c49b..09ee8c2 100644 --- a/rset/rsnull.c +++ b/rset/rsnull.c @@ -1,4 +1,4 @@ -/* $Id: rsnull.c,v 1.33 2005-04-26 10:09:38 adam Exp $ +/* $Id: rsnull.c,v 1.34 2005-05-03 09:11:36 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -20,20 +20,17 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - #include #include #include #include - -static RSFD r_open (RSET ct, int flag); -static void r_close (RSFD rfd); -static void r_delete (RSET ct); -static void r_pos (RSFD rfd, double *current, double *total); -static int r_read (RSFD rfd, void *buf, TERMID *term); -static int r_write (RSFD rfd, const void *buf); +static RSFD r_open(RSET ct, int flag); +static void r_close(RSFD rfd); +static void r_delete(RSET ct); +static void r_pos(RSFD rfd, double *current, double *total); +static int r_read(RSFD rfd, void *buf, TERMID *term); +static int r_write(RSFD rfd, const void *buf); static const struct rset_control control = { @@ -48,14 +45,14 @@ static const struct rset_control control = r_write, }; -RSET rsnull_create(NMEM nmem, const struct key_control *kcontrol ) +RSET rsnull_create(NMEM nmem, struct rset_key_control *kcontrol ) { - RSET rnew=rset_create_base(&control, nmem, kcontrol,0,0); - rnew->priv=NULL; + RSET rnew = rset_create_base(&control, nmem, kcontrol, 0, 0); + rnew->priv = 0; return rnew; } -static RSFD r_open (RSET ct, int flag) +static RSFD r_open(RSET ct, int flag) { RSFD rfd; if (flag & RSETF_WRITE) @@ -63,22 +60,21 @@ static RSFD r_open (RSET ct, int flag) yaz_log (YLOG_FATAL, "NULL set type is read-only"); return NULL; } - rfd=rfd_create_base(ct); - rfd->priv=NULL; + rfd = rfd_create_base(ct); + rfd->priv = 0; return rfd; } -static void r_close (RSFD rfd) +static void r_close(RSFD rfd) { rfd_delete_base(rfd); } -static void r_delete (RSET ct) +static void r_delete(RSET ct) { } - -static void r_pos (RSFD rfd, double *current, double *total) +static void r_pos(RSFD rfd, double *current, double *total) { assert(rfd); assert(current); @@ -87,14 +83,14 @@ static void r_pos (RSFD rfd, double *current, double *total) *current=0; } -static int r_read (RSFD rfd, void *buf, TERMID *term) +static int r_read(RSFD rfd, void *buf, TERMID *term) { if (term) - *term=0; /* NULL */ + *term = 0; return 0; } -static int r_write (RSFD rfd, const void *buf) +static int r_write(RSFD rfd, const void *buf) { yaz_log (YLOG_FATAL, "NULL set type is read-only"); return -1; diff --git a/rset/rsprox.c b/rset/rsprox.c index 9525eb9..1a846d0 100644 --- a/rset/rsprox.c +++ b/rset/rsprox.c @@ -1,4 +1,4 @@ -/* $Id: rsprox.c,v 1.27 2005-04-26 10:09:38 adam Exp $ +/* $Id: rsprox.c,v 1.28 2005-05-03 09:11:36 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -72,10 +72,11 @@ struct rset_prox_rfd { }; -RSET rsprox_create( NMEM nmem, const struct key_control *kcontrol, int scope, - int rset_no, RSET *rset, - int ordered, int exclusion, - int relation, int distance) +RSET rsprox_create(NMEM nmem, struct rset_key_control *kcontrol, + int scope, + int rset_no, RSET *rset, + int ordered, int exclusion, + int relation, int distance) { RSET rnew = rset_create_base(&control, nmem, kcontrol, scope,0); struct rset_prox_info *info; @@ -151,11 +152,11 @@ static void r_close (RSFD rfd) rfd_delete_base(rfd); } -static int r_forward (RSFD rfd, void *buf, TERMID *term, const void *untilbuf) +static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) { struct rset_prox_info *info = (struct rset_prox_info *)(rfd->rset->priv); - struct rset_prox_rfd *p=(struct rset_prox_rfd *)(rfd->priv); - const struct key_control *kctrl = rfd->rset->keycontrol; + struct rset_prox_rfd *p = (struct rset_prox_rfd *)(rfd->priv); + const struct rset_key_control *kctrl = rfd->rset->keycontrol; int cmp = 0; int i; diff --git a/rset/rstemp.c b/rset/rstemp.c index 32048c9..c4b1b03 100644 --- a/rset/rstemp.c +++ b/rset/rstemp.c @@ -1,4 +1,4 @@ -/* $Id: rstemp.c,v 1.62 2005-04-26 10:09:38 adam Exp $ +/* $Id: rstemp.c,v 1.63 2005-05-03 09:11:36 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -57,7 +57,7 @@ static const struct rset_control control = r_write, }; -struct rset_temp_info { +struct rset_private { int fd; /* file descriptor for temp file */ char *fname; /* name of temp file */ char *buf_mem; /* window buffer */ @@ -70,7 +70,7 @@ struct rset_temp_info { char *temp_path; }; -struct rset_temp_rfd { +struct rfd_private { void *buf; size_t pos_cur; /* current position in set */ /* FIXME - term pos or what ?? */ @@ -80,17 +80,17 @@ struct rset_temp_rfd { static int log_level = 0; static int log_level_initialized = 0; -RSET rstemp_create(NMEM nmem, const struct key_control *kcontrol, +RSET rstemp_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, const char *temp_path, TERMID term) { - RSET rnew = rset_create_base(&control, nmem, kcontrol, scope,term); - struct rset_temp_info *info; + RSET rnew = rset_create_base(&control, nmem, kcontrol, scope, term); + struct rset_private *info; if (!log_level_initialized) { log_level = yaz_log_module_level("rstemp"); log_level_initialized = 1; } - info = (struct rset_temp_info *) nmem_malloc(rnew->nmem, sizeof(*info)); + info = (struct rset_private *) nmem_malloc(rnew->nmem, sizeof(*info)); info->fd = -1; info->fname = NULL; info->buf_size = 4096; @@ -110,7 +110,7 @@ RSET rstemp_create(NMEM nmem, const struct key_control *kcontrol, static void r_delete(RSET ct) { - struct rset_temp_info *info = (struct rset_temp_info*) ct->priv; + struct rset_private *info = (struct rset_private*) ct->priv; yaz_log(log_level, "r_delete: set size %ld", (long) info->pos_end); if (info->fname) @@ -122,9 +122,9 @@ static void r_delete(RSET ct) static RSFD r_open(RSET ct, int flag) { - struct rset_temp_info *info = (struct rset_temp_info *) ct->priv; + struct rset_private *info = (struct rset_private *) ct->priv; RSFD rfd; - struct rset_temp_rfd *prfd; + struct rfd_private *prfd; if (info->fd == -1 && info->fname) { @@ -141,7 +141,7 @@ static RSFD r_open(RSET ct, int flag) rfd = rfd_create_base(ct); if (!rfd->priv) { - prfd = (struct rset_temp_rfd *) nmem_malloc(ct->nmem, sizeof(*prfd)); + prfd = (struct rfd_private *) nmem_malloc(ct->nmem, sizeof(*prfd)); rfd->priv = (void *)prfd; prfd->buf = nmem_malloc(ct->nmem,ct->keycontrol->key_size); } @@ -160,8 +160,7 @@ static RSFD r_open(RSET ct, int flag) */ static void r_flush(RSFD rfd, int mk) { - /* struct rset_temp_info *info = ((struct rset_temp_rfd*) rfd)->info; */ - struct rset_temp_info *info = rfd->rset->priv; + struct rset_private *info = rfd->rset->priv; if (!info->fname && mk) { @@ -221,8 +220,7 @@ static void r_flush(RSFD rfd, int mk) static void r_close(RSFD rfd) { - /*struct rset_temp_rfd *mrfd = (struct rset_temp_rfd*) rfd->priv; */ - struct rset_temp_info *info = (struct rset_temp_info *)rfd->rset->priv; + struct rset_private *info = (struct rset_private *)rfd->rset->priv; if (rfd_is_last(rfd)) { r_flush(rfd, 0); @@ -242,8 +240,8 @@ static void r_close(RSFD rfd) */ static void r_reread(RSFD rfd) { - struct rset_temp_rfd *mrfd = (struct rset_temp_rfd*) rfd->priv; - struct rset_temp_info *info = (struct rset_temp_info *)rfd->rset->priv; + struct rfd_private *mrfd = (struct rfd_private*) rfd->priv; + struct rset_private *info = (struct rset_private *)rfd->rset->priv; if (info->fname) { @@ -279,8 +277,8 @@ static void r_reread(RSFD rfd) static int r_read(RSFD rfd, void *buf, TERMID *term) { - struct rset_temp_rfd *mrfd = (struct rset_temp_rfd*) rfd->priv; - struct rset_temp_info *info = (struct rset_temp_info *)rfd->rset->priv; + struct rfd_private *mrfd = (struct rfd_private*) rfd->priv; + struct rset_private *info = (struct rset_private *)rfd->rset->priv; size_t nc = mrfd->pos_cur + rfd->rset->keycontrol->key_size; @@ -304,8 +302,8 @@ static int r_read(RSFD rfd, void *buf, TERMID *term) static int r_write(RSFD rfd, const void *buf) { - struct rset_temp_rfd *mrfd = (struct rset_temp_rfd*) rfd->priv; - struct rset_temp_info *info = (struct rset_temp_info *)rfd->rset->priv; + struct rfd_private *mrfd = (struct rfd_private*) rfd->priv; + struct rset_private *info = (struct rset_private *)rfd->rset->priv; size_t nc = mrfd->pos_cur + rfd->rset->keycontrol->key_size; @@ -328,9 +326,8 @@ static int r_write(RSFD rfd, const void *buf) static void r_pos(RSFD rfd, double *current, double *total) { - /* struct rset_temp_rfd *mrfd = (struct rset_temp_rfd*) rfd; */ - struct rset_temp_rfd *mrfd = (struct rset_temp_rfd*) rfd->priv; - struct rset_temp_info *info = (struct rset_temp_info *)rfd->rset->priv; + struct rfd_private *mrfd = (struct rfd_private*) rfd->priv; + struct rset_private *info = (struct rset_private *)rfd->rset->priv; *current = (double) mrfd->cur; *total = (double) info->hits; diff --git a/test/api/safari1.c b/test/api/safari1.c index 1121061..3f3c6da 100644 --- a/test/api/safari1.c +++ b/test/api/safari1.c @@ -1,4 +1,4 @@ -/* $Id: safari1.c,v 1.4 2005-03-05 09:19:16 adam Exp $ +/* $Id: safari1.c,v 1.5 2005-05-03 09:11:37 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -24,39 +24,84 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "testlib.h" -const char *myrec[] = { +const char *myrec[] = +{ "1234\n" /* first record */ "00024338 125060 1 any the\n" "00024338 125060 2 any art\n" "00024338 125060 3 any of\n", - "5678\n" /* other record */ + "5678\n" /* other record - same owner id */ "00024339 125060 1 any den\n" "00024339 125060 2 any gamle\n" "00024339 125060 3 any mand\n", - "5678\n" /* same record identifier as before .. */ + "5678\n" /* same record chunk id as before .. */ "00024339 125060 1 any the\n" "00024339 125060 2 any gamle\n" "00024339 125060 3 any mand\n", - 0}; - + "1000\n" /* separate record */ + "00024339 125061 1 any the\n" + "00024339 125061 2 any gamle\n" + "00024339 125061 3 any mand\n", + + "1001\n" /* separate record */ + "00024340 125062 1 any the\n" + "00024340 125062 2 any gamle\n" + "00024340 125062 3 any mand\n", + + 0 +}; + int main(int argc, char **argv) { - zint ids[2]; + zint ids[3]; + zint limits[3]; ZebraService zs = start_up("safari.cfg", argc, argv); ZebraHandle zh = zebra_open(zs); init_data(zh, myrec); - do_query(__LINE__, zh, "@attr 1=any the", 1); + do_query(__LINE__, zh, "@attr 1=any the", 3); do_query(__LINE__, zh, "@attr 1=any {the art}", 1); do_query(__LINE__, zh, "@attr 1=any {den gamle}", 1); do_query(__LINE__, zh, "@attr 1=any {the of}", 0); + /* verify that we get these records exactly */ ids[0] = 24338; + ids[1] = 24339; + ids[2] = 24340; + meta_query(__LINE__, zh, "@attr 1=any the", 3, ids); + + /* limit to 125061 */ + limits[0] = 125061; + limits[1] = 0; + zebra_set_limit(zh, 0, limits); + ids[0] = 24339; meta_query(__LINE__, zh, "@attr 1=any the", 1, ids); - + + /* limit to 125060, 125061 */ + limits[0] = 125061; + limits[1] = 125060; + limits[2] = 0; + zebra_set_limit(zh, 0, limits); + ids[0] = 24338; + ids[1] = 24339; + meta_query(__LINE__, zh, "@attr 1=any the", 2, ids); + + /* all except 125061 */ + limits[0] = 125061; + limits[1] = 0; + zebra_set_limit(zh, 1, limits); + + ids[0] = 24338; + ids[1] = 24340; + meta_query(__LINE__, zh, "@attr 1=any the", 2, ids); + + /* no limit */ + zebra_set_limit(zh, 1, 0); + do_query(__LINE__, zh, "@attr 1=any the", 3); + return close_down(zh, zs, 0); } -- 1.7.10.4