From 2d6227440bb26674cab2091b3d79c1934995b762 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Tue, 22 Sep 1998 10:03:38 +0000 Subject: [PATCH] Changed result sets to be persistent in the sense that they can be re-searched if needed. Fixed memory leak in rsm_or. --- CHANGELOG | 3 + doc/zebra.sgml | 33 +++++++--- index/extract.c | 16 +++-- index/zebraapi.c | 13 +++- index/zrpn.c | 87 +++++++++++++++----------- index/zserver.h | 22 +++++-- index/zsets.c | 182 +++++++++++++++++++++++++++++++++++++----------------- rset/rsm_or.c | 11 +++- tab/default.idx | 4 +- 9 files changed, 251 insertions(+), 120 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 8805c64..3e12954 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +Fixed bug in Sort that caused it NOT to use character mapping as +it should. + Zebra now uses GNU configure to generate Makefile(s). Added un-optimised support for left and left/right truncation attributes. diff --git a/doc/zebra.sgml b/doc/zebra.sgml index 4a78a1d..6ca296d 100644 --- a/doc/zebra.sgml +++ b/doc/zebra.sgml @@ -1,14 +1,14 @@
Zebra Server - Administrators's Guide and Reference <author><htmlurl url="http://www.indexdata.dk/" name="Index Data">, <tt><htmlurl url="mailto:info@indexdata.dk" name="info@indexdata.dk"></> -<date>$Revision: 1.41 $ +<date>$Revision: 1.42 $ <abstract> The Zebra information server combines a versatile fielded/free-text search engine with a Z39.50-1995 frontend to provide a powerful and flexible @@ -192,15 +192,34 @@ An ANSI C compiler is required to compile the Zebra server system — <tt/gcc/ works fine if your own system doesn't provide an adequate compiler. -Unpack the distribution archive. In some cases, you may want to edit -the top-level <tt/Makefile/, eg. to select a different C compiler, or -to specify machine-specific libraries in the <bf/ELIBS/ variable. +Unpack the distribution archive. The <tt>configure</tt> shell script +attempts to guess correct values for various system-dependent variables +used during compilation. It uses those values to create a 'Makefile' in +each directory of Zebra. -When you are done editing the <tt>Makefile</tt> type: +To run the configure script type: <tscreen><verb> -$ make + ./configure </verb></tscreen> +The configure script attempts to use C compiler specified by +the <tt>CC</tt> environment variable. If not set, <tt>cc</tt> +will be used. The <tt>CFLAGS</tt> environment variable holds +options to be passed to the C compiler. If you're using a Bourne-shell +compatible shell you may pass something like this: +<tscreen><verb> + CC=/opt/ccs/bin/cc CFLAGS=-O ./configure +</verb></tscreen> + +When configured build the software by typing: +<tscreen><verb> + make +</verb></tscreen> + +As an option you may type <tt>make depend</tt> to create +source file dependencies for the package. This is only needed, +however, if you alter the source. + If successful, two executables have been created in the sub-directory <tt/index/. <descrip> diff --git a/index/extract.c b/index/extract.c index f0f3d12..dfde4a2 100644 --- a/index/extract.c +++ b/index/extract.c @@ -1,10 +1,15 @@ /* - * Copyright (C) 1994-1998, Index Data I/S + * Copyright (C) 1994-1998, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: extract.c,v $ - * Revision 1.84 1998-06-11 15:42:22 adam + * Revision 1.85 1998-09-22 10:03:41 adam + * Changed result sets to be persistent in the sense that they can + * be re-searched if needed. + * Fixed memory leak in rsm_or. + * + * Revision 1.84 1998/06/11 15:42:22 adam * Changed the way use attributes are specified in the recordId * specification. * @@ -682,9 +687,10 @@ static void addSortString (RecWord *p, const char *string, int length) sk->next = sortKeys; sortKeys = sk; - sk->string = xmalloc (p->length); - sk->length = p->length; - memcpy (sk->string, p->string, p->length); + sk->string = xmalloc (length); + sk->length = length; + memcpy (sk->string, string, length); + sk->attrSet = p->attrSet; sk->attrUse = p->attrUse; } diff --git a/index/zebraapi.c b/index/zebraapi.c index 54e01a5..6f56a05 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -4,7 +4,12 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zebraapi.c,v $ - * Revision 1.9 1998-09-02 13:53:17 adam + * Revision 1.10 1998-09-22 10:03:42 adam + * Changed result sets to be persistent in the sense that they can + * be re-searched if needed. + * Fixed memory leak in rsm_or. + * + * Revision 1.9 1998/09/02 13:53:17 adam * Extra parameter decode added to search routines to implement * persistent queries. * @@ -230,7 +235,9 @@ void zebra_search_rpn (ZebraHandle zh, ODR stream, ODR decode, zh->errCode = 0; zh->errString = NULL; zh->hits = 0; - rpn_search (zh, stream, decode, query, num_bases, basenames, setname); + + resultSetAddRPN (zh, stream, decode, query, num_bases, basenames, setname); + zebra_register_unlock (zh); } @@ -305,7 +312,7 @@ void zebra_sort (ZebraHandle zh, ODR stream, zh->errCode = 0; zh->errString = NULL; zebra_register_lock (zh); - resultSetSort (zh, stream, num_input_setnames, input_setnames, + resultSetSort (zh, stream->mem, num_input_setnames, input_setnames, output_setname, sort_sequence, sort_status); zebra_register_unlock (zh); } diff --git a/index/zrpn.c b/index/zrpn.c index a97e265..280b167 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -4,7 +4,12 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zrpn.c,v $ - * Revision 1.84 1998-09-18 12:41:00 adam + * Revision 1.85 1998-09-22 10:03:43 adam + * Changed result sets to be persistent in the sense that they can + * be re-searched if needed. + * Fixed memory leak in rsm_or. + * + * Revision 1.84 1998/09/18 12:41:00 adam * Fixed bug with numerical relations. * * Revision 1.83 1998/09/02 13:53:19 adam @@ -1755,7 +1760,7 @@ static RSET rpn_search_APT_local (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, - oid_value attributeSet, ODR stream, + oid_value attributeSet, NMEM stream, Z_SortKeySpecList *sort_sequence, const char *rank_type) { @@ -1780,8 +1785,8 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (!sort_sequence->specs) { sort_sequence->num_specs = 10; - sort_sequence->specs = odr_malloc (stream, sort_sequence->num_specs * - sizeof(*sort_sequence->specs)); + sort_sequence->specs = nmem_malloc (stream, sort_sequence->num_specs * + sizeof(*sort_sequence->specs)); for (i = 0; i<sort_sequence->num_specs; i++) sort_sequence->specs[i] = 0; } @@ -1798,29 +1803,29 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (!oid_ent_to_oid (&oe, oid)) return 0; - sks = odr_malloc (stream, sizeof(*sks)); - sks->sortElement = odr_malloc (stream, sizeof(*sks->sortElement)); + sks = nmem_malloc (stream, sizeof(*sks)); + sks->sortElement = nmem_malloc (stream, sizeof(*sks->sortElement)); sks->sortElement->which = Z_SortElement_generic; - sk = sks->sortElement->u.generic = odr_malloc (stream, sizeof(*sk)); + sk = sks->sortElement->u.generic = nmem_malloc (stream, sizeof(*sk)); sk->which = Z_SortKey_sortAttributes; - sk->u.sortAttributes = odr_malloc (stream, sizeof(*sk->u.sortAttributes)); + sk->u.sortAttributes = nmem_malloc (stream, sizeof(*sk->u.sortAttributes)); sk->u.sortAttributes->id = oid; sk->u.sortAttributes->list = - odr_malloc (stream, sizeof(*sk->u.sortAttributes->list)); + nmem_malloc (stream, sizeof(*sk->u.sortAttributes->list)); sk->u.sortAttributes->list->num_attributes = 1; sk->u.sortAttributes->list->attributes = - odr_malloc (stream, sizeof(*sk->u.sortAttributes->list->attributes)); + nmem_malloc (stream, sizeof(*sk->u.sortAttributes->list->attributes)); ae = *sk->u.sortAttributes->list->attributes = - odr_malloc (stream, sizeof(**sk->u.sortAttributes->list->attributes)); + nmem_malloc (stream, sizeof(**sk->u.sortAttributes->list->attributes)); ae->attributeSet = 0; - ae->attributeType = odr_malloc (stream, sizeof(*ae->attributeType)); + ae->attributeType = nmem_malloc (stream, sizeof(*ae->attributeType)); *ae->attributeType = 1; ae->which = Z_AttributeValue_numeric; - ae->value.numeric = odr_malloc (stream, sizeof(*ae->value.numeric)); + ae->value.numeric = nmem_malloc (stream, sizeof(*ae->value.numeric)); *ae->value.numeric = use_value; - sks->sortRelation = odr_malloc (stream, sizeof(*sks->sortRelation)); + sks->sortRelation = nmem_malloc (stream, sizeof(*sks->sortRelation)); if (sort_relation_value == 1) *sks->sortRelation = Z_SortRelation_ascending; else if (sort_relation_value == 2) @@ -1828,7 +1833,7 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, else *sks->sortRelation = Z_SortRelation_ascending; - sks->caseSensitivity = odr_malloc (stream, sizeof(*sks->caseSensitivity)); + sks->caseSensitivity = nmem_malloc (stream, sizeof(*sks->caseSensitivity)); *sks->caseSensitivity = 0; sks->missingValueAction = 0; @@ -1841,7 +1846,7 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, - oid_value attributeSet, ODR stream, + oid_value attributeSet, NMEM stream, Z_SortKeySpecList *sort_sequence, int num_bases, char **basenames) { @@ -1905,7 +1910,7 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, - oid_value attributeSet, ODR stream, + oid_value attributeSet, NMEM stream, Z_SortKeySpecList *sort_sequence, int num_bases, char **basenames) { @@ -1962,7 +1967,7 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, #ifdef ASN_COMPILED if (*zop->u.prox->u.known != Z_ProxUnit_word) { - char *val = odr_malloc (stream, 16); + char *val = nmem_malloc (stream, 16); zh->errCode = 132; zh->errString = val; sprintf (val, "%d", *zop->u.prox->u.known); @@ -1971,7 +1976,7 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, #else if (*zop->u.prox->proximityUnitCode != Z_ProxUnit_word) { - char *val = odr_malloc (stream, 16); + char *val = nmem_malloc (stream, 16); zh->errCode = 132; zh->errString = val; sprintf (val, "%d", *zop->u.prox->proximityUnitCode); @@ -2020,9 +2025,11 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, return r; } -void rpn_search (ZebraHandle zh, ODR stream, ODR decode, + +RSET rpn_search (ZebraHandle zh, NMEM nmem, Z_RPNQuery *rpn, int num_bases, char **basenames, - const char *setname) + const char *setname, + ZebraSet sset) { RSET rset; oident *attrset; @@ -2036,31 +2043,39 @@ void rpn_search (ZebraHandle zh, ODR stream, ODR decode, zh->errString = NULL; zh->hits = 0; - sort_sequence = odr_malloc (stream, sizeof(*sort_sequence)); + sort_sequence = nmem_malloc (nmem, sizeof(*sort_sequence)); sort_sequence->num_specs = 10; - sort_sequence->specs = odr_malloc (stream, sort_sequence->num_specs * + sort_sequence->specs = nmem_malloc (nmem, sort_sequence->num_specs * sizeof(*sort_sequence->specs)); for (i = 0; i<sort_sequence->num_specs; i++) sort_sequence->specs[i] = 0; attrset = oid_getentbyoid (rpn->attributeSetId); attributeSet = attrset->value; - rset = rpn_search_structure (zh, rpn->RPNStructure, attributeSet, stream, - sort_sequence, - num_bases, basenames); + rset = rpn_search_structure (zh, rpn->RPNStructure, attributeSet, + nmem, sort_sequence, num_bases, basenames); if (!rset) - return; + return 0; - resultSetAdd (zh, setname, 1, rset, &zh->hits); if (zh->errCode) logf (LOG_DEBUG, "search error: %d", zh->errCode); - + for (i = 0; sort_sequence->specs[i]; i++) ; sort_sequence->num_specs = i; - if (i) - resultSetSort (zh, stream, 1, &setname, setname, sort_sequence, - &sort_status); + if (!i) + resultSetRank (zh, sset, rset); + else + { + logf (LOG_DEBUG, "resultSetSortSingle in rpn_search"); + resultSetSortSingle (zh, nmem, sset, rset, + sort_sequence, &sort_status); + if (zh->errCode) + { + logf (LOG_DEBUG, "resultSetSortSingle status = %d", zh->errCode); + } + } + return rset; } struct scan_info_entry { @@ -2095,14 +2110,14 @@ static int scan_handle (char *name, const char *info, int pos, void *client) return 0; } -static void scan_term_untrans (ZebraHandle zh, ODR stream, int reg_type, +static void scan_term_untrans (ZebraHandle zh, NMEM stream, int reg_type, char **dst, const char *src) { char term_dst[1024]; term_untrans (zh, reg_type, term_dst, src); - *dst = odr_malloc (stream, strlen(term_dst)+1); + *dst = nmem_malloc (stream, strlen(term_dst)+1); strcpy (*dst, term_dst); } @@ -2270,7 +2285,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, } if (j0 == -1) break; - scan_term_untrans (zh, stream, reg_id, + scan_term_untrans (zh, stream->mem, reg_id, &glist[i+before].term, mterm); rset = rset_trunc (zh, &scan_info_array[j0].list[ptr[j0]].isam_p, 1, glist[i+before].term, strlen(glist[i+before].term), @@ -2334,7 +2349,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, if (j0 == -1) break; - scan_term_untrans (zh, stream, reg_id, + scan_term_untrans (zh, stream->mem, reg_id, &glist[before-1-i].term, mterm); rset = rset_trunc diff --git a/index/zserver.h b/index/zserver.h index eab2450..7bebbad 100644 --- a/index/zserver.h +++ b/index/zserver.h @@ -4,7 +4,12 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: zserver.h,v $ - * Revision 1.37 1998-09-02 13:53:22 adam + * Revision 1.38 1998-09-22 10:03:44 adam + * Changed result sets to be persistent in the sense that they can + * be re-searched if needed. + * Fixed memory leak in rsm_or. + * + * Revision 1.37 1998/09/02 13:53:22 adam * Extra parameter decode added to search routines to implement * persistent queries. * @@ -208,9 +213,9 @@ struct rank_control { void (*add)(void *set_handle, int seqno, int term_index); }; -void rpn_search (ZebraHandle zh, ODR stream, ODR decode, +RSET rpn_search (ZebraHandle zh, NMEM mem, Z_RPNQuery *rpn, int num_bases, char **basenames, - const char *setname); + const char *setname, ZebraSet sset); void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, @@ -222,9 +227,10 @@ void 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); -ZebraSet resultSetAdd (ZebraHandle zh, const char *name, - int ov, RSET rset, int *hits); +ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov); ZebraSet resultSetGet (ZebraHandle zh, const char *name); +ZebraSet resultSetAddRPN (ZebraHandle zh, ODR stream, ODR decode, Z_RPNQuery *rpn, int num_bases, char **basenames, + const char *setname); RSET resultSetRef (ZebraHandle zh, Z_ResultSetId *resultSetId); void resultSetDestroy (ZebraHandle zh); @@ -232,10 +238,14 @@ ZebraPosSet zebraPosSetCreate (ZebraHandle zh, const char *name, int num, int *positions); void zebraPosSetDestroy (ZebraHandle zh, ZebraPosSet records, int num); -void resultSetSort (ZebraHandle zh, ODR stream, +void resultSetSort (ZebraHandle zh, NMEM nmem, int num_input_setnames, const char **input_setnames, const char *output_setname, Z_SortKeySpecList *sort_sequence, int *sort_status); +void resultSetSortSingle (ZebraHandle zh, NMEM nmem, + ZebraSet sset, RSET rset, + Z_SortKeySpecList *sort_sequence, int *sort_status); +void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset); void zebra_sort (ZebraHandle zh, ODR stream, int num_input_setnames, const char **input_setnames, diff --git a/index/zsets.c b/index/zsets.c index 4b4c25f..09d6d4e 100644 --- a/index/zsets.c +++ b/index/zsets.c @@ -1,10 +1,15 @@ /* - * Copyright (C) 1994-1998, Index Data I/S + * Copyright (C) 1994-1998, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: zsets.c,v $ - * Revision 1.17 1998-06-23 15:33:36 adam + * Revision 1.18 1998-09-22 10:03:45 adam + * Changed result sets to be persistent in the sense that they can + * be re-searched if needed. + * Fixed memory leak in rsm_or. + * + * Revision 1.17 1998/06/23 15:33:36 adam * Added feature to specify sort criteria in query (type 7 specifies * sort flags). * @@ -82,7 +87,11 @@ struct zebra_set { char *name; RSET rset; - int size; + NMEM nmem; + int hits; + int num_bases; + char **basenames; + Z_RPNQuery *rpn; struct zset_sort_info *sort_info; struct zebra_set *next; }; @@ -100,43 +109,76 @@ struct zset_sort_info { struct zset_sort_entry **entries; }; -void resultSetRank (ZebraHandle zh, struct zset_sort_info *si, - RSET rset, int *hits); +ZebraSet resultSetAddRPN (ZebraHandle zh, ODR stream, ODR decode, + Z_RPNQuery *rpn, int num_bases, char **basenames, + const char *setname) +{ + ZebraSet zebraSet; + + zlog_rpn (rpn); + + zh->errCode = 0; + zh->errString = NULL; + zh->hits = 0; + + zebraSet = resultSetAdd (zh, setname, 1); + if (!zebraSet) + return 0; + zebraSet->rpn = 0; + zebraSet->num_bases = num_bases; + zebraSet->basenames = basenames; + zebraSet->nmem = odr_extract_mem (decode); + + zebraSet->rset = rpn_search (zh, stream->mem, rpn, + zebraSet->num_bases, + zebraSet->basenames, zebraSet->name, + zebraSet); + zh->hits = zebraSet->hits; + if (zebraSet->rset) + zebraSet->rpn = rpn; + return zebraSet; +} -ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov, - RSET rset, int *hits) +ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov) { ZebraSet s; int i; for (s = zh->sets; s; s = s->next) if (!strcmp (s->name, name)) - { - logf (LOG_DEBUG, "updating result set %s", name); - if (!ov) - return NULL; - rset_delete (s->rset); - s->rset = rset; - resultSetRank (zh, s->sort_info, rset, hits); - return s; - } - logf (LOG_DEBUG, "adding result set %s", name); - s = xmalloc (sizeof(*s)); - s->next = zh->sets; - zh->sets = s; - s->name = xmalloc (strlen(name)+1); - strcpy (s->name, name); - s->rset = rset; - - s->sort_info = xmalloc (sizeof(*s->sort_info)); - s->sort_info->max_entries = 1000; - s->sort_info->entries = xmalloc (sizeof(*s->sort_info->entries) * - s->sort_info->max_entries); - s->sort_info->all_entries = xmalloc (sizeof(*s->sort_info->all_entries) * - s->sort_info->max_entries); - for (i = 0; i < s->sort_info->max_entries; i++) - s->sort_info->entries[i] = s->sort_info->all_entries + i; - resultSetRank (zh, s->sort_info, rset, hits); + break; + if (s) + { + logf (LOG_DEBUG, "updating result set %s", name); + if (!ov) + return NULL; + if (s->rset) + rset_delete (s->rset); + if (s->nmem) + nmem_destroy (s->nmem); + } + else + { + logf (LOG_DEBUG, "adding result set %s", name); + s = xmalloc (sizeof(*s)); + s->next = zh->sets; + zh->sets = s; + s->name = xmalloc (strlen(name)+1); + strcpy (s->name, name); + + s->sort_info = xmalloc (sizeof(*s->sort_info)); + s->sort_info->max_entries = 1000; + s->sort_info->entries = + xmalloc (sizeof(*s->sort_info->entries) * + s->sort_info->max_entries); + s->sort_info->all_entries = + xmalloc (sizeof(*s->sort_info->all_entries) * + s->sort_info->max_entries); + for (i = 0; i < s->sort_info->max_entries; i++) + s->sort_info->entries[i] = s->sort_info->all_entries + i; + } + s->rset = 0; + s->nmem = 0; return s; } @@ -146,7 +188,18 @@ ZebraSet resultSetGet (ZebraHandle zh, const char *name) for (s = zh->sets; s; s = s->next) if (!strcmp (s->name, name)) + { + if (!s->rset && s->rpn) + { + NMEM nmem = nmem_create (); + s->rset = + rpn_search (zh, nmem, s->rpn, s->num_bases, + s->basenames, s->name, s); + nmem_destroy (nmem); + + } return s; + } return NULL; } @@ -163,6 +216,8 @@ void resultSetDestroy (ZebraHandle zh) xfree (s->sort_info->entries); xfree (s->sort_info); + if (s->nmem) + nmem_destroy (s->nmem); rset_delete (s->rset); xfree (s->name); xfree (s); @@ -366,19 +421,13 @@ void resultSetInsertRank (ZebraHandle zh, struct zset_sort_info *sort_info, new_entry->score = score; } -void resultSetSort (ZebraHandle zh, ODR stream, +void resultSetSort (ZebraHandle zh, NMEM nmem, int num_input_setnames, const char **input_setnames, const char *output_setname, Z_SortKeySpecList *sort_sequence, int *sort_status) { ZebraSet sset; RSET rset; - int i, psysno = 0; - struct it_key key; - struct sortKey sort_criteria[3]; - int num_criteria; - int term_index; - RSFD rfd; if (num_input_setnames == 0) { @@ -396,15 +445,39 @@ void resultSetSort (ZebraHandle zh, ODR stream, if (!sset) { zh->errCode = 30; - zh->errString = nmem_strdup (stream->mem, input_setnames[0]); + zh->errString = nmem_strdup (nmem, input_setnames[0]); return; } if (!(rset = sset->rset)) { zh->errCode = 30; - zh->errString = nmem_strdup (stream->mem, input_setnames[0]); + zh->errString = nmem_strdup (nmem, input_setnames[0]); return; } + if (strcmp (output_setname, input_setnames[0])) + { + rset = rset_dup (rset); + sset = resultSetAdd (zh, output_setname, 1); + sset->rset = rset; + } + resultSetSortSingle (zh, nmem, sset, rset, sort_sequence, sort_status); +} + +void resultSetSortSingle (ZebraHandle zh, NMEM nmem, + ZebraSet sset, RSET rset, + Z_SortKeySpecList *sort_sequence, int *sort_status) +{ + int i, psysno = 0; + struct it_key key; + struct sortKey sort_criteria[3]; + int num_criteria; + int term_index; + RSFD rfd; + + logf (LOG_DEBUG, "resultSetSortSingle start"); + sset->sort_info->num_entries = 0; + + sset->hits = 0; num_criteria = sort_sequence->num_specs; if (num_criteria > 3) num_criteria = 3; @@ -461,19 +534,12 @@ void resultSetSort (ZebraHandle zh, ODR stream, break; } } - if (strcmp (output_setname, input_setnames[0])) - { - int hits; - rset = rset_dup (rset); - sset = resultSetAdd (zh, output_setname, 1, rset, &hits); - } - sset->sort_info->num_entries = 0; - rfd = rset_open (rset, RSETF_READ); while (rset_read (rset, rfd, &key, &term_index)) { if (key.sysno != psysno) { + (sset->hits)++; psysno = key.sysno; resultSetInsertSort (zh, sset, sort_criteria, num_criteria, psysno); @@ -483,8 +549,7 @@ void resultSetSort (ZebraHandle zh, ODR stream, zh->errCode = 0; *sort_status = Z_SortStatus_success; - - return; + logf (LOG_DEBUG, "resultSetSortSingle end"); } RSET resultSetRef (ZebraHandle zh, Z_ResultSetId *resultSetId) @@ -496,8 +561,7 @@ RSET resultSetRef (ZebraHandle zh, Z_ResultSetId *resultSetId) return NULL; } -void resultSetRank (ZebraHandle zh, struct zset_sort_info *sort_info, - RSET rset, int *hits) +void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset) { int kno = 0; struct it_key key; @@ -505,9 +569,11 @@ void resultSetRank (ZebraHandle zh, struct zset_sort_info *sort_info, int term_index, i; ZebraRankClass rank_class; struct rank_control *rc; + struct zset_sort_info *sort_info; + sort_info = zebraSet->sort_info; sort_info->num_entries = 0; - *hits = 0; + zebraSet->hits = 0; rfd = rset_open (rset, RSETF_READ); logf (LOG_DEBUG, "resultSetRank"); @@ -526,7 +592,7 @@ void resultSetRank (ZebraHandle zh, struct zset_sort_info *sort_info, int score; void *handle = (*rc->begin) (zh, rank_class->class_handle, rset); - (*hits)++; + (zebraSet->hits)++; do { kno++; @@ -535,7 +601,7 @@ void resultSetRank (ZebraHandle zh, struct zset_sort_info *sort_info, score = (*rc->calc) (handle, psysno); resultSetInsertRank (zh, sort_info, psysno, score, 'A'); - (*hits)++; + (zebraSet->hits)++; psysno = key.sysno; } (*rc->add) (handle, key.seqno, term_index); @@ -546,7 +612,7 @@ void resultSetRank (ZebraHandle zh, struct zset_sort_info *sort_info, (*rc->end) (zh, handle); } rset_close (rset, rfd); - logf (LOG_DEBUG, "%d keys, %d distinct sysnos", kno, *hits); + logf (LOG_DEBUG, "%d keys, %d distinct sysnos", kno, zebraSet->hits); } ZebraRankClass zebraRankLookup (ZebraHandle zh, const char *name) diff --git a/rset/rsm_or.c b/rset/rsm_or.c index 72f09fa..2683029 100644 --- a/rset/rsm_or.c +++ b/rset/rsm_or.c @@ -1,10 +1,15 @@ /* - * Copyright (C) 1994-1998, Index Data I/S + * Copyright (C) 1994-1998, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: rsm_or.c,v $ - * Revision 1.6 1998-03-05 08:36:28 adam + * Revision 1.7 1998-09-22 10:03:46 adam + * Changed result sets to be persistent in the sense that they can + * be re-searched if needed. + * Fixed memory leak in rsm_or. + * + * Revision 1.6 1998/03/05 08:36:28 adam * New result set model. * * Revision 1.5 1997/12/18 10:54:25 adam @@ -200,7 +205,7 @@ static void *r_create (RSET ct, const struct rset_control *sel, void *parms) ct->no_rset_terms = 1; ct->rset_terms = xmalloc (sizeof(*ct->rset_terms)); - ct->rset_terms[0] = rset_term_dup (r_parms->rset_term); + ct->rset_terms[0] = r_parms->rset_term; return info; } diff --git a/tab/default.idx b/tab/default.idx index bb142cf..49bff34 100644 --- a/tab/default.idx +++ b/tab/default.idx @@ -1,5 +1,5 @@ # Zebra indexes as referred to from the *.abs-files. -# $Id: default.idx,v 1.4 1998-02-10 12:03:06 adam Exp $ +# $Id: default.idx,v 1.5 1998-09-22 10:03:47 adam Exp $ # # Traditional word index index w @@ -29,4 +29,4 @@ charmap @ # Sort register (no mapping at all) sort s completeness 1 -charmap @ +charmap string.chr -- 1.7.10.4