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