X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=include%2Frset.h;h=971029a925ce1b7bb08ba15ff93788108102713d;hb=704fd190292cb771df94553b0ed6f9f4b71660a6;hp=23f7d0d5870ee3a6c4c04b9cec8b5dce196b9bd0;hpb=2cb08a89ee65d8ae2646b91dcf27bc3883759691;p=idzebra-moved-to-github.git diff --git a/include/rset.h b/include/rset.h index 23f7d0d..971029a 100644 --- a/include/rset.h +++ b/include/rset.h @@ -1,8 +1,5 @@ -/* $Id: rset.h,v 1.52 2005-05-24 11:35:41 adam Exp $ - Copyright (C) 1995-2005 - Index Data ApS - -This file is part of the Zebra server. +/* This file is part of the Zebra server. + Copyright (C) Index Data 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 @@ -15,9 +12,9 @@ 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. +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ #ifndef RSET_H @@ -26,36 +23,51 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include /* unfortunately we need the isam includes here, for the arguments for */ /* rsisamX_create */ -#include -#include -#include +#include +#include +#include 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); +void ord_list_print(struct ord_list *list); -/** - * rset_term is all we need to know of a term to do ranking etc. +/** + * 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; +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. */ @@ -67,7 +79,7 @@ struct rsfd { /* the stuff common to all rsfd's. */ }; -/** +/** * rset_control has function pointers to all the important functions * of a rset. Each type of rset will have its own control block, pointing * to the functions for that type. They all have their own create function @@ -77,7 +89,7 @@ struct rsfd { /* the stuff common to all rsfd's. */ struct rset_control { /** text description of set type (for debugging) */ - char *desc; + char *desc; /* RSET rs_something_create(const struct rset_control *sel, ...); */ void (*f_delete)(RSET ct); @@ -103,17 +115,10 @@ int rset_default_forward(RSFD rfd, void *buf, TERMID *term, /** rset_default_read implements a generic read */ int rset_default_read(RSFD rfd, void *buf, TERMID *term); -/** 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_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); /** - * key_control contains all there is to know about the keys stored in + * key_control contains all there is to know about the keys stored in * an isam, and therefore operated by the rsets. Other than this info, * all we assume is that all keys are the same size, and they can be * memcpy'd around @@ -126,6 +131,7 @@ struct rset_key_control { 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); + zint (*get_segment)(const void *p); int (*filter_func)(const void *p, void *data); void *filter_data; void (*inc)(struct rset_key_control *kc); @@ -145,23 +151,21 @@ typedef struct rset { const struct rset_control *control; 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 */ - 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 */ - 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 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; + int hits_approx; } rset; -/* rset is a "virtual base class", which will never exist on its own +/* 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 * They keep their own stuff behind the priv pointer. */ @@ -171,8 +175,8 @@ typedef struct rset * In more complex isams we can specify on what level we wish to do the * matching and counting of hits. For example, we can have book / chapter / * verse, and a seqno. Scope 2 means then "give me all verses that match", - * 3 would be chapters, 4 books. - * The resolution tells how much of the occurences we need to return. If we + * 3 would be chapters, 4 books. + * The resolution tells how much of the occurences we need to return. If we * are doing some sort of proximity, we need to get the seqnos of all * occurences, whereas if we are only counting hits, we do not need anything * below the scope. Again 1 is seqnos, 2 sysnos (or verses), 3 books, etc. @@ -181,7 +185,7 @@ typedef struct rset RSFD rfd_create_base(RSET rs); int rfd_is_last(RSFD rfd); -RSET rset_create_base(const struct rset_control *sel, +RSET rset_create_base(const struct rset_control *sel, NMEM nmem, struct rset_key_control *kcontrol, int scope, @@ -221,33 +225,27 @@ void rset_close(RSFD rfd); /** rset_count counts or estimates the keys in it*/ zint rset_count(RSET rs); -RSET rstemp_create(NMEM nmem, struct rset_key_control *kcontrol, - int scope, const char *temp_path, TERMID term); - -RSET rsnull_create(NMEM nmem, struct rset_key_control *kcontrol, TERMID term); +RSET rset_create_temp(NMEM nmem, struct rset_key_control *kcontrol, + int scope, const char *temp_path, TERMID term); -RSET rsbool_create_and(NMEM nmem, struct rset_key_control *kcontrol, - int scope, RSET rset_l, RSET rset_r); +RSET rset_create_null(NMEM nmem, struct rset_key_control *kcontrol, TERMID term); -RSET rsbool_create_or(NMEM nmem, struct rset_key_control *kcontrol, - int scope, RSET rset_l, RSET rset_r); +RSET rset_create_not(NMEM nmem, struct rset_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); +RSET rset_create_between(NMEM nmem, struct rset_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 rset_create_or(NMEM nmem, struct rset_key_control *kcontrol, + int scope, TERMID termid, 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 rset_create_and(NMEM nmem, struct rset_key_control *kcontrol, + int scope, int no_rsets, RSET* rsets); -RSET rsmulti_and_create(NMEM nmem, struct rset_key_control *kcontrol, - int scope, int no_rsets, RSET* rsets); - -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 rset_create_prox(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, struct rset_key_control *kcontrol, int scope, ISAMB is, ISAM_P pos, TERMID term); @@ -260,6 +258,19 @@ RSET rsisams_create(NMEM nmem, struct rset_key_control *kcontrol, void rset_visit(RSET rset, int level); +void rset_set_hits_limit(RSET rs, zint l); + +int rset_no_write(RSFD rfd, const void *buf); + YAZ_END_CDECL #endif +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +