X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=index%2Fzsets.c;h=313a868b978b2ca589db023076bbe07f0ca26f34;hb=e36276b23b7a9c64fbb8c4296859c95f0e02c9be;hp=6db021b8f3fe4f1559dc83217ed900bb0b23d4b2;hpb=896c0427df9d8eff5de6a1735dcd992e067df844;p=idzebra-moved-to-github.git diff --git a/index/zsets.c b/index/zsets.c index 6db021b..313a868 100644 --- a/index/zsets.c +++ b/index/zsets.c @@ -1,5 +1,5 @@ -/* $Id: zsets.c,v 1.38 2002-08-02 19:26:56 adam Exp $ - Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 +/* $Id: zsets.c,v 1.49.2.3 2005-01-21 11:35:49 adam Exp $ + Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005 Index Data Aps This file is part of the Zebra server. @@ -55,6 +55,10 @@ struct zebra_set { int term_entries_max; struct zebra_set *next; int locked; + + int cache_position; /* last position */ + RSFD cache_rfd; /* rfd (NULL if not existing) */ + int cache_psysno; }; struct zset_sort_entry { @@ -70,7 +74,7 @@ struct zset_sort_info { struct zset_sort_entry **entries; }; -ZebraSet resultSetAddRPN (ZebraHandle zh, ODR input, ODR output, +ZebraSet resultSetAddRPN (ZebraHandle zh, NMEM m, Z_RPNQuery *rpn, int num_bases, char **basenames, const char *setname) @@ -87,8 +91,8 @@ ZebraSet resultSetAddRPN (ZebraHandle zh, ODR input, ODR output, return 0; zebraSet->locked = 1; zebraSet->rpn = 0; - zebraSet->nmem = nmem_create (); - + zebraSet->nmem = m; + zebraSet->num_bases = num_bases; zebraSet->basenames = nmem_malloc (zebraSet->nmem, num_bases * sizeof(*zebraSet->basenames)); @@ -96,7 +100,7 @@ ZebraSet resultSetAddRPN (ZebraHandle zh, ODR input, ODR output, zebraSet->basenames[i] = nmem_strdup (zebraSet->nmem, basenames[i]); - zebraSet->rset = rpn_search (zh, output->mem, rpn, + zebraSet->rset = rpn_search (zh, zebraSet->nmem, rpn, zebraSet->num_bases, zebraSet->basenames, zebraSet->name, zebraSet); @@ -160,13 +164,13 @@ int zebra_resultSetTerms (ZebraHandle zh, const char *setname, size_t inleft = strlen(inbuf); size_t outleft = *len - 1; int converted = 0; -#if HAVE_ICONV_H - if (zh->iconv_from_utf8 != (iconv_t)(-1)) + + if (zh->iconv_from_utf8 != 0) { char *outbuf = out; size_t ret; - ret = iconv(zh->iconv_from_utf8, &inbuf, &inleft, + ret = yaz_iconv(zh->iconv_from_utf8, &inbuf, &inleft, &outbuf, &outleft); if (ret == (size_t)(-1)) *len = 0; @@ -174,7 +178,6 @@ int zebra_resultSetTerms (ZebraHandle zh, const char *setname, *len = outbuf - out; converted = 1; } -#endif if (!converted) { if (inleft > outleft) @@ -198,17 +201,23 @@ ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov) break; if (s) { - logf (LOG_DEBUG, "updating result set %s", name); + yaz_log (LOG_DEBUG, "updating result set %s", name); if (!ov || s->locked) return NULL; if (s->rset) + { + if (s->cache_rfd) + rset_close(s->rset, s->cache_rfd); rset_delete (s->rset); + } if (s->nmem) nmem_destroy (s->nmem); } else { - logf (LOG_DEBUG, "adding result set %s", name); + const char *sort_max_str = zebra_get_resource(zh, "sortmax", "1000"); + + yaz_log (LOG_DEBUG, "adding result set %s", name); s = (ZebraSet) xmalloc (sizeof(*s)); s->next = zh->sets; zh->sets = s; @@ -217,7 +226,10 @@ ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov) s->sort_info = (struct zset_sort_info *) xmalloc (sizeof(*s->sort_info)); - s->sort_info->max_entries = 1000; + s->sort_info->max_entries = atoi(sort_max_str); + if (s->sort_info->max_entries < 2) + s->sort_info->max_entries = 2; + s->sort_info->entries = (struct zset_sort_entry **) xmalloc (sizeof(*s->sort_info->entries) * s->sort_info->max_entries); @@ -233,6 +245,8 @@ ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov) s->rset = 0; s->nmem = 0; s->rpn = 0; + s->cache_position = 0; + s->cache_rfd = 0; return s; } @@ -264,8 +278,14 @@ void resultSetInvalidate (ZebraHandle zh) for (; s; s = s->next) { if (s->rset) + { + if (s->cache_rfd) + rset_close(s->rset, s->cache_rfd); rset_delete (s->rset); + } s->rset = 0; + s->cache_rfd = 0; + s->cache_position = 0; } } @@ -305,7 +325,11 @@ void resultSetDestroy (ZebraHandle zh, int num, char **names,int *statuses) if (s->nmem) nmem_destroy (s->nmem); if (s->rset) + { + if (s->cache_rfd) + rset_close (s->rset, s->cache_rfd); rset_delete (s->rset); + } xfree (s->name); xfree (s); } @@ -364,7 +388,7 @@ ZebraPosSet zebraPosSetCreate (ZebraHandle zh, const char *name, position = positions[i]; if (position > 0 && position <= sort_info->num_entries) { - logf (LOG_DEBUG, "got pos=%d (sorted)", position); + yaz_log (LOG_DEBUG, "got pos=%d (sorted)", position); sr[i].sysno = sort_info->entries[position-1]->sysno; sr[i].score = sort_info->entries[position-1]->score; } @@ -389,7 +413,20 @@ ZebraPosSet zebraPosSetCreate (ZebraHandle zh, const char *name, position = sort_info->num_entries; while (num_i < num && positions[num_i] < position) num_i++; - rfd = rset_open (rset, RSETF_READ); + + if (sset->cache_rfd && + num_i < num && positions[num_i] > sset->cache_position) + { + position = sset->cache_position; + rfd = sset->cache_rfd; + psysno = sset->cache_psysno; + } + else + { + if (sset->cache_rfd) + rset_close(rset, sset->cache_rfd); + rfd = rset_open (rset, RSETF_READ); + } while (num_i < num && rset_read (rset, rfd, &key, &term_index)) { if (key.sysno != psysno) @@ -409,13 +446,15 @@ ZebraPosSet zebraPosSetCreate (ZebraHandle zh, const char *name, if (position == positions[num_i]) { sr[num_i].sysno = psysno; - logf (LOG_DEBUG, "got pos=%d (unsorted)", position); + yaz_log (LOG_DEBUG, "got pos=%d (unsorted)", position); sr[num_i].score = -1; num_i++; } } } - rset_close (rset, rfd); + sset->cache_position = position; + sset->cache_psysno = psysno; + sset->cache_rfd = rfd; } } return sr; @@ -507,8 +546,8 @@ void resultSetInsertSort (ZebraHandle zh, ZebraSet sset, new_entry->score = -1; } -void resultSetInsertRank (ZebraHandle zh, struct zset_sort_info *sort_info, - int sysno, int score, int relation) +void resultSetInsertRank(ZebraHandle zh, struct zset_sort_info *sort_info, + int sysno, int score, int relation) { struct zset_sort_entry *new_entry = NULL; int i, j; @@ -571,7 +610,7 @@ void resultSetSort (ZebraHandle zh, NMEM nmem, zh->errCode = 230; return; } - logf (LOG_DEBUG, "result set sort input=%s output=%s", + yaz_log (LOG_DEBUG, "result set sort input=%s output=%s", *input_setnames, output_setname); sset = resultSetGet (zh, input_setnames[0]); if (!sset) @@ -599,6 +638,7 @@ void resultSetSortSingle (ZebraHandle zh, NMEM nmem, ZebraSet sset, RSET rset, Z_SortKeySpecList *sort_sequence, int *sort_status) { + int kno = 0; int i, psysno = 0; struct it_key key; struct sortKeyInfo sort_criteria[3]; @@ -606,7 +646,6 @@ void resultSetSortSingle (ZebraHandle zh, NMEM nmem, int term_index; RSFD rfd; - logf (LOG_LOG, "resultSetSortSingle start"); sset->sort_info->num_entries = 0; sset->hits = 0; @@ -618,9 +657,9 @@ void resultSetSortSingle (ZebraHandle zh, NMEM nmem, Z_SortKeySpec *sks = sort_sequence->specs[i]; Z_SortKey *sk; - if (*sks->sortRelation == Z_SortRelation_ascending) + if (*sks->sortRelation == Z_SortKeySpec_ascending) sort_criteria[i].relation = 'A'; - else if (*sks->sortRelation == Z_SortRelation_descending) + else if (*sks->sortRelation == Z_SortKeySpec_descending) sort_criteria[i].relation = 'D'; else { @@ -641,20 +680,20 @@ void resultSetSortSingle (ZebraHandle zh, NMEM nmem, switch (sk->which) { case Z_SortKey_sortField: - logf (LOG_DEBUG, "Sort: key %d is of type sortField", i+1); + yaz_log (LOG_DEBUG, "Sort: key %d is of type sortField", i+1); zh->errCode = 207; return; case Z_SortKey_elementSpec: - logf (LOG_DEBUG, "Sort: key %d is of type elementSpec", i+1); + yaz_log (LOG_DEBUG, "Sort: key %d is of type elementSpec", i+1); zh->errCode = 207; return; case Z_SortKey_sortAttributes: - logf (LOG_DEBUG, "Sort: key %d is of type sortAttributes", i+1); + yaz_log (LOG_DEBUG, "Sort: key %d is of type sortAttributes", i+1); sort_criteria[i].attrUse = zebra_maps_sort (zh->reg->zebra_maps, sk->u.sortAttributes, &sort_criteria[i].numerical); - logf (LOG_DEBUG, "use value = %d", sort_criteria[i].attrUse); + yaz_log (LOG_DEBUG, "use value = %d", sort_criteria[i].attrUse); if (sort_criteria[i].attrUse == -1) { zh->errCode = 116; @@ -671,6 +710,7 @@ void resultSetSortSingle (ZebraHandle zh, NMEM nmem, rfd = rset_open (rset, RSETF_READ); while (rset_read (rset, rfd, &key, &term_index)) { + kno++; if (key.sysno != psysno) { (sset->hits)++; @@ -681,6 +721,7 @@ void resultSetSortSingle (ZebraHandle zh, NMEM nmem, } rset_close (rset, rfd); + yaz_log (LOG_LOG, "%d keys, %d sysnos, sort", kno, sset->hits); for (i = 0; i < rset->no_rset_terms; i++) yaz_log (LOG_LOG, "term=\"%s\" nn=%d type=%s count=%d", rset->rset_terms[i]->name, @@ -688,11 +729,10 @@ void resultSetSortSingle (ZebraHandle zh, NMEM nmem, rset->rset_terms[i]->flags, rset->rset_terms[i]->count); - *sort_status = Z_SortStatus_success; - logf (LOG_LOG, "resultSetSortSingle end"); + *sort_status = Z_SortResponse_success; } -RSET resultSetRef (ZebraHandle zh, Z_ResultSetId *resultSetId) +RSET resultSetRef (ZebraHandle zh, const char *resultSetId) { ZebraSet s; @@ -710,15 +750,19 @@ void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset) ZebraRankClass rank_class; struct rank_control *rc; struct zset_sort_info *sort_info; + const char *rank_handler_name = res_get_def(zh->res, "rank", "rank-1"); sort_info = zebraSet->sort_info; sort_info->num_entries = 0; zebraSet->hits = 0; rfd = rset_open (rset, RSETF_READ); - yaz_log (LOG_LOG, "resultSetRank"); - - rank_class = zebraRankLookup (zh, "rank-1"); + rank_class = zebraRankLookup (zh, rank_handler_name); + if (!rank_class) + { + yaz_log (LOG_WARN, "No such rank handler: %s", rank_handler_name); + return; + } rc = rank_class->control; if (rset_read (rset, rfd, &key, &term_index)) @@ -748,6 +792,7 @@ void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset) } rset_close (rset, rfd); + yaz_log (LOG_LOG, "%d keys, %d sysnos, rank", kno, zebraSet->hits); for (i = 0; i < rset->no_rset_terms; i++) yaz_log (LOG_LOG, "term=\"%s\" nn=%d type=%s count=%d", rset->rset_terms[i]->name, @@ -755,7 +800,6 @@ void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset) rset->rset_terms[i]->flags, rset->rset_terms[i]->count); - yaz_log (LOG_LOG, "%d keys, %d distinct sysnos", kno, zebraSet->hits); } ZebraRankClass zebraRankLookup (ZebraHandle zh, const char *name) @@ -766,7 +810,7 @@ ZebraRankClass zebraRankLookup (ZebraHandle zh, const char *name) if (p && !p->init_flag) { if (p->control->create) - p->class_handle = (*p->control->create)(zh->reg); + p->class_handle = (*p->control->create)(zh); p->init_flag = 1; } return p;