X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=index%2Flimit.c;h=16476008afd968793dd084150b5e257cf53c6d57;hp=047a07a4d66a2e2e6a4430fd53e4d44a5b41be04;hb=ba0720e26f508ba3396e232d2f82037c0e701698;hpb=0e898c0c6183c6dd9701286f6a4ac9b734c9bdbb diff --git a/index/limit.c b/index/limit.c index 047a07a..1647600 100644 --- a/index/limit.c +++ b/index/limit.c @@ -1,8 +1,5 @@ -/* $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. +/* This file is part of the Zebra server. + Copyright (C) 1994-2011 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,11 +12,14 @@ 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 + */ +#if HAVE_CONFIG_H +#include +#endif #include #include @@ -27,8 +27,10 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include "index.h" +#define ZEBRA_LIMIT_DEBUG 0 + struct zebra_limit { - int exclude_flag; + int complement_flag; zint *ids; }; @@ -41,18 +43,18 @@ void zebra_limit_destroy(struct zebra_limit *zl) } } -struct zebra_limit *zebra_limit_create(int exclude_flag, zint *ids) +struct zebra_limit *zebra_limit_create(int complement_flag, zint *ids) { struct zebra_limit *zl = 0; size_t i; - for (i = 0; ids && ids[i]; i++) - ; - if (i) + if (ids) { + for (i = 0; ids[i]; 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; + zl->complement_flag = complement_flag; } return zl; } @@ -63,12 +65,27 @@ static int zebra_limit_filter_cb(const void *buf, void *data) const struct it_key *key = buf; size_t i; - if (key->len != 3) - return 1; +#if ZEBRA_LIMIT_DEBUG + yaz_log(YLOG_LOG, "zebra_limit_filter_cb zl=%p key->len=%d", zl, key->len); +#endif for (i = 0; zl->ids[i]; i++) + { +#if ZEBRA_LIMIT_DEBUG + yaz_log(YLOG_LOG, " i=%d ids=" ZINT_FORMAT " mem=" ZINT_FORMAT, + i, zl->ids[i], key->mem[1]); +#endif if (zl->ids[i] == key->mem[1]) - return zl->exclude_flag ? 0 : 1; - return zl->exclude_flag ? 1 : 0; + { +#if ZEBRA_LIMIT_DEBUG + yaz_log(YLOG_LOG, " match. Ret=%d", zl->complement_flag ? 0:1); +#endif + return zl->complement_flag ? 0 : 1; + } + } +#if ZEBRA_LIMIT_DEBUG + yaz_log(YLOG_LOG, " no match. Ret=%d", zl->complement_flag ? 1:0); +#endif + return zl->complement_flag ? 1 : 0; } static void zebra_limit_destroy_cb(void *data) @@ -81,11 +98,17 @@ void zebra_limit_for_rset(struct zebra_limit *zl, void (**filter_destroy)(void *data), void **filter_data) { +#if ZEBRA_LIMIT_DEBUG + yaz_log(YLOG_LOG, "zebra_limit_for_rset debug enabled zl=%p", zl); +#endif if (zl && zl->ids) { struct zebra_limit *hl; - hl = zebra_limit_create(zl->exclude_flag, zl->ids); +#if ZEBRA_LIMIT_DEBUG + yaz_log(YLOG_LOG, "enable limit"); +#endif + hl = zebra_limit_create(zl->complement_flag, zl->ids); *filter_data = hl; *filter_func = zebra_limit_filter_cb; *filter_destroy = zebra_limit_destroy_cb; @@ -98,3 +121,12 @@ void zebra_limit_for_rset(struct zebra_limit *zl, } } +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +