X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Ftrunc.c;h=19ba2293a22e6438d63e026f5c60649a48219971;hb=3335cd5f7e7af06ac6ed943859c473e092d559a1;hp=261685e0b991ad3177f099294d3520b251a0943a;hpb=f7e93f016e75e43d037b5c3e89aeb27b7176513a;p=idzebra-moved-to-github.git diff --git a/index/trunc.c b/index/trunc.c index 261685e..19ba229 100644 --- a/index/trunc.c +++ b/index/trunc.c @@ -1,4 +1,4 @@ -/* $Id: trunc.c,v 1.31 2004-08-06 13:14:46 adam Exp $ +/* $Id: trunc.c,v 1.35 2004-08-19 12:49:14 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -35,6 +35,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #if NEW_TRUNC #include #endif +#include struct trunc_info { int *ptr; @@ -326,11 +327,13 @@ static RSET rset_trunc_r (ZebraHandle zi, const char *term, int length, key_compare_it); for (i = to-from; --i >= 0; ) { - ispt[i] = isamb_pp_open (zi->reg->isamb, isam_p[from+i]); - if (isamb_pp_read (ispt[i], ti->tmpbuf)) - heap_insert (ti, ti->tmpbuf, i); - else - isamb_pp_close (ispt[i]); + if (isam_p[from+i]) { + ispt[i] = isamb_pp_open (zi->reg->isamb, isam_p[from+i]); + if (isamb_pp_read (ispt[i], ti->tmpbuf)) + heap_insert (ti, ti->tmpbuf, i); + else + isamb_pp_close (ispt[i]); + } } while (ti->heapnum) { @@ -393,12 +396,11 @@ static int isamc_trunc_cmp (const void *p1, const void *p2) { ISAMC_P i1 = *(ISAMC_P*) p1; ISAMC_P i2 = *(ISAMC_P*) p2; - int d; + zint d; - d = (int) (isc_type (i1) - isc_type (i2)); - if (d) - return d; - d = isc_block (i1) - isc_block (i2); + d = (isc_type (i1) - isc_type (i2)); + if (d == 0) + d = isc_block (i1) - isc_block (i2); if (d > 0) return 1; else if (d < 0) @@ -468,15 +470,41 @@ RSET rset_trunc (ZebraHandle zi, ISAMS_P *isam_p, int no, if (no == 1) { rset_isamb_parms parms; - parms.key_size = sizeof(struct it_key); parms.cmp = key_compare_it; parms.pos = *isam_p; parms.is = zi->reg->isamb; - parms.rset_term = rset_term_create (term, length, flags, + parms.rset_term = rset_term_create (term, length, flags, term_type); return rset_create (rset_kind_isamb, &parms); } +#if 1 + else if (no <10000 ) /* FIXME - hardcoded number */ + { + rset_multior_parms m_parms; + rset_isamb_parms b_parms; + int i; + m_parms.key_size = sizeof(struct it_key); + m_parms.cmp = key_compare_it; + m_parms.no_rsets=no; + m_parms.rsets=xmalloc(sizeof(*m_parms.rsets)*no); + m_parms.rset_term = rset_term_create (term, length, flags, + term_type); + b_parms.key_size = sizeof(struct it_key); + b_parms.cmp = key_compare_it; + b_parms.is = zi->reg->isamb; + /* FIXME - make it so that we can pass a null ptr to term */ + /* needs changes in all rsets, here and there! */ + for (i=0;i