Changeset: ce2d6440ccf2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ce2d6440ccf2
Modified Files:
        monetdb5/modules/mal/bitcandidates.c
Branch: compressedcandidates
Log Message:

Add the compression for a Clist


diffs (111 lines):

diff --git a/monetdb5/modules/mal/bitcandidates.c 
b/monetdb5/modules/mal/bitcandidates.c
--- a/monetdb5/modules/mal/bitcandidates.c
+++ b/monetdb5/modules/mal/bitcandidates.c
@@ -11,19 +11,57 @@
 #include "mal.h"
 #include "mal_instruction.h"
 #include "mal_interpreter.h"
+#include "sys/param.h"
+
+#define bits 64                /* using OIDs to represent the bitvector */
 
 str
 BCLcompress(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
     bat *ret = getArgReference_bat(stk,pci,0);
     bat *val = getArgReference_bat(stk,pci,1);
-       BAT *b;
+       BAT *b, *bn;
+       oid *p,*q, base, first, last, *o, comp;
+
     (void) cntxt;
     (void) mb;
        b = BATdescriptor(*val);
        if( b == NULL)
                throw(MAL,"compress",INTERNAL_BAT_ACCESS);
-    BBPkeepref(*ret = *val);
+       if ( b->ttype == TYPE_void || isVIEW(b) || BATcount(b) == 0){
+               BBPkeepref(*ret = *val);
+               return MAL_SUCCEED;
+       }
+       p = (oid *) Tloc(b,0);
+       q = (oid *) Tloc(b,BUNlast(b));
+
+       base = b->tseqbase;
+       first = *(p);
+       last = *(q-1);
+       comp = (last-first)/bits +1;
+       fprintf(stderr,"# BLCcompress base "BUNFMT" first "BUNFMT" range " 
BUNFMT" count "BUNFMT" vector " BUNFMT"\n", base, first, last, BATcount(b), 
comp);
+
+       bn = COLnew(0, TYPE_oid, comp, TRANSIENT);
+       if( bn == NULL)
+               throw(MAL,"compress",MAL_MALLOC_FAIL);
+       /* zap the bitvector */
+       o = (oid *) Tloc(bn,0);
+       memset(o, 0, sizeof(oid) * comp);
+       for( ; p < q; p++){
+               setbit(o, (*p -first));
+               fprintf(stderr,"# set value " BUNFMT" bit "BUNFMT"\n", *p,  (*p 
-first));
+       }
+       BATsetcount(bn,(last-first)/ bits + 1);
+       bn->hseqbase = b->hseqbase;
+       bn->tseqbase = first;
+       bn->tsorted = b->tsorted;
+       bn->trevsorted = b->trevsorted;
+       bn->tkey = b->tkey;
+       bn->tnil = b->tnil;
+       bn->tnonil = b->tnonil;
+       fprintf(stderr,"#compress %d base "OIDFMT","OIDFMT"\n", bn->batCacheid, 
bn->hseqbase,bn->tseqbase);
+       BBPkeepref(*ret = bn->batCacheid);
+       BBPunfix(*val);
        return MAL_SUCCEED;
 }
 
@@ -32,12 +70,45 @@ BCLdecompress(Client cntxt, MalBlkPtr mb
 {
     bat *ret = getArgReference_bat(stk,pci,0);
     bat *val = getArgReference_bat(stk,pci,1);
-       BAT *b;
+       BAT *b, *bn;
+       oid o = 0, *p;
+       BUN i, limit;
+       char *vect;
+
     (void) cntxt;
     (void) mb;
        b = BATdescriptor(*val);
        if( b == NULL)
                throw(MAL,"decompress",INTERNAL_BAT_ACCESS);
-    BBPkeepref(*ret = *val);
+       if ( b->ttype == TYPE_void || isVIEW(b) || BATcount(b) == 0){
+               BBPkeepref(*ret = *val);
+               return MAL_SUCCEED;
+       }
+       vect = (char*) Tloc(b,0);
+       fprintf(stderr,"#decompress %d base "OIDFMT","OIDFMT"\n", 
b->batCacheid, b->hseqbase,b->tseqbase);
+
+       bn = COLnew(0, TYPE_oid, BATcount(b), TRANSIENT);
+       if ( bn == 0)
+               throw(MAL,"decompress",MAL_MALLOC_FAIL);
+       p = (oid*) Tloc(bn,0);
+       limit= BATcount(b) * bits;
+       o = b->tseqbase;
+       for ( i = 0; i < limit; i++, o++)
+       if( isset( vect, i) ){
+               fprintf(stderr,"#test "BUNFMT" oid "BUNFMT"\n", i,o);
+               *p++ = o;
+       }
+       BATsetcount(bn,p - (oid*) Tloc(bn,0));
+       fprintf(stderr,"#decompress %d base "OIDFMT","OIDFMT" cnt "BUNFMT"\n", 
bn->batCacheid, b->hseqbase,b->tseqbase, BATcount(bn));
+       bn->hseqbase = b->hseqbase;
+       bn->tseqbase = 0;
+       bn->tsorted = b->tsorted;
+       bn->trevsorted = b->trevsorted;
+       bn->tkey = b->tkey;
+       bn->tnil = b->tnil;
+       bn->tnonil = b->tnonil;
+
+       BBPkeepref(*ret = bn->batCacheid);
+       BBPunfix(b->batCacheid);
        return MAL_SUCCEED;
 }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to