X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=include%2Frset.h;h=7c331163c60c1cea6eba6d36ac2d8c2c624fcfff;hb=c944571888712854653be0d2debf903b8651c8e2;hp=ec09bad60c88e6971e028f9509ffc7844456f82a;hpb=98912d364cb21abf4c2f3229d5578e2a3159f616;p=idzebra-moved-to-github.git diff --git a/include/rset.h b/include/rset.h index ec09bad..7c33116 100644 --- a/include/rset.h +++ b/include/rset.h @@ -1,4 +1,4 @@ -/* $Id: rset.h,v 1.45 2005-01-15 20:47:15 adam Exp $ +/* $Id: rset.h,v 1.57 2005-06-22 19:42:37 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -23,8 +23,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #ifndef RSET_H #define RSET_H -#include - +#include /* unfortunately we need the isam includes here, for the arguments for */ /* rsisamX_create */ #include @@ -33,38 +32,52 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA YAZ_BEGIN_CDECL -typedef struct rsfd *RSFD; /* Rset "file descriptor" */ -typedef struct rset *RSET; /* Result set */ +typedef struct rsfd *RSFD; +typedef struct rset *RSET; + +struct ord_list { + int ord; + struct ord_list *next; +}; +struct ord_list *ord_list_create(NMEM nmem); +struct ord_list *ord_list_append(NMEM nmem, struct ord_list *list, int ord); +struct ord_list *ord_list_dup(NMEM nmem, struct ord_list *list); /** * rset_term is all we need to know of a term to do ranking etc. * As far as the rsets are concerned, it is just a dummy pointer to * be passed around. */ - struct rset_term { - /** the term itself */ - char *name; - char *flags; - int type; - /** the rset corresponding to this term */ - RSET rset; - /** private stuff for the ranking algorithm */ - void *rankpriv; + char *name; /** the term itself in internal encoding (UTF-8/raw) */ + char *flags; /** flags for rank method */ + int type; /** Term_type from RPN Query. Actually this + is Z_Term_general, Z_Term_numeric, + Z_Term_characterString, .. + This info is used to return encoded term back for + search-result-1 . + */ + int reg_type; /** register type */ + RSET rset; /** the rset corresponding to this term */ + void *rankpriv;/** private stuff for the ranking algorithm */ + zint hits_limit;/** limit for hits if > 0 */ + char *ref_id; /** reference for this term */ + struct ord_list *ol; }; typedef struct rset_term *TERMID; TERMID rset_term_create (const char *name, int length, const char *flags, - int type, NMEM nmem); - - + int type, NMEM nmem, struct ord_list *ol, + int reg_type, zint hits_limit, const char *ref_id); /** rsfd is a "file descriptor" for reading from a rset */ struct rsfd { /* the stuff common to all rsfd's. */ RSET rset; /* ptr to the rset this FD is opened to */ void *priv; /* private parameters for this type */ RSFD next; /* to keep lists of used/free rsfd's */ + zint counted_items; + char *counted_buf; }; @@ -101,13 +114,9 @@ struct rset_control int rset_default_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf); -/** rset_get_no_terms is a getterms function for those that don't have any */ -void rset_get_no_terms(RSET ct, TERMID *terms, int maxterms, int *curterm); +/** rset_default_read implements a generic read */ +int rset_default_read(RSFD rfd, void *buf, TERMID *term); -/** - * rset_get_one_term is a getterms function for those rsets that have - * exactly one term, like all rsisamX types. - */ void rset_get_one_term(RSET ct,TERMID *terms,int maxterms,int *curterm); /** @@ -116,15 +125,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 */ }; @@ -137,15 +151,20 @@ struct key_control { typedef struct rset { const struct rset_control *control; - const struct key_control *keycontrol; - int count; /* reference count */ - void *priv; /* stuff private to the given type of rset */ - NMEM nmem; /* nibble memory for various allocs */ - char my_nmem; /* Should the nmem be destroyed with the rset? */ - /* 1 if created with it, 0 if passed from above */ - RSFD free_list; /* all rfd's allocated but not currently in use */ - int scope; /* On what level do we count hits and compare them? */ - TERMID term; /* the term thing for ranking etc */ + struct rset_key_control *keycontrol; + int refcount; /* reference count */ + void *priv; /* stuff private to the given type of rset */ + NMEM nmem; /* nibble memory for various allocs */ + RSFD free_list; /* all rfd's allocated but not currently in use */ + RSFD use_list; /* all rfd's in use */ + int scope; /* On what level do we count hits and compare them? */ + TERMID term; /* the term thing for ranking etc */ + int no_children; + RSET *children; + zint hits_limit; + zint hits_count; + zint hits_round; + int hits_approx; } rset; /* rset is a "virtual base class", which will never exist on its own * all instances are rsets of some specific type, like rsisamb, or rsbool @@ -165,29 +184,27 @@ typedef struct rset */ RSFD rfd_create_base(RSET rs); -void rfd_delete_base(RSFD rfd); +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); + TERMID term, + int no_children, RSET *children); void rset_delete(RSET rs); RSET rset_dup (RSET rs); - +void rset_close(RSFD rfd); #define RSETF_READ 0 #define RSETF_WRITE 1 /* RSFD rset_open(RSET rs, int wflag); */ #define rset_open(rs, wflag) (*(rs)->control->f_open)((rs), (wflag)) -/* void rset_close(RSFD rfd); */ -#define rset_close(rfd) (*(rfd)->rset->control->f_close)(rfd) - /* int rset_forward(RSFD rfd, void *buf, TERMID term, void *untilbuf); */ #define rset_forward(rfd, buf, term, untilbuf) \ - (*(rfd)->rset->control->f_forward)((rfd),(buf),(term),(untilbuf)) + rset_default_forward((rfd), (buf), (term), (untilbuf)) /* void rset_getterms(RSET ct, TERMID *terms, int maxterms, int *curterm); */ #define rset_getterms(ct, terms, maxterms, curterm) \ @@ -198,8 +215,7 @@ RSET rset_dup (RSET rs); (*(rfd)->rset->control->f_pos)((rfd),(cur),(tot)) /* int rset_read(RSFD rfd, void *buf, TERMID term); */ -#define rset_read(rfd, buf, term) \ - (*(rfd)->rset->control->f_read)((rfd), (buf), (term)) +#define rset_read(rfd, buf, term) rset_default_read((rfd), (buf), (term)) /* int rset_write(RSFD rfd, const void *buf); */ #define rset_write(rfd, buf) (*(rfd)->rset->control->f_write)((rfd), (buf)) @@ -210,44 +226,44 @@ 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, - int scope, - const char *temp_path, TERMID term); +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, TERMID term); -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, - int scope, int no_rsets, RSET* rsets); +RSET rsmulti_or_create(NMEM nmem, struct rset_key_control *kcontrol, + int scope, TERMID termid, 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, - int scope, ISAMB is, ISAMB_P pos, TERMID term); +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, - int scope, ISAMC is, ISAMC_P pos, TERMID term); +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, - int scope, ISAMS is, ISAMS_P pos, TERMID term); +RSET rsisams_create(NMEM nmem, struct rset_key_control *kcontrol, + int scope, ISAMS is, ISAM_P pos, TERMID term); +void rset_visit(RSET rset, int level); YAZ_END_CDECL