Changeset: 9a4fc945faab for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9a4fc945faab
Modified Files:
        monetdb5/modules/mal/mosaic.c
        monetdb5/modules/mal/mosaic_delta.c
        monetdb5/modules/mal/mosaic_prefix.c
Branch: mosaic
Log Message:

Bit prefix up to 4bytes done
Operations still needs attention.


diffs (201 lines):

diff --git a/monetdb5/modules/mal/mosaic.c b/monetdb5/modules/mal/mosaic.c
--- a/monetdb5/modules/mal/mosaic.c
+++ b/monetdb5/modules/mal/mosaic.c
@@ -263,6 +263,8 @@ MOScompressInternal(Client cntxt, int *r
                bsrc = BATcopy(bcompress, bcompress->htype, bcompress->ttype, 
TRUE,TRANSIENT);
        if( !inplace)
                bsrc = BATextend(bsrc, BATgrows(bsrc)+MosaicHdrSize);
+       else
+               bcompress = BATextend(bcompress, 
BATgrows(bcompress)+MosaicHdrSize);
 
        if (bsrc == NULL) {
                BBPreleaseref(bcompress->batCacheid);
diff --git a/monetdb5/modules/mal/mosaic_delta.c 
b/monetdb5/modules/mal/mosaic_delta.c
--- a/monetdb5/modules/mal/mosaic_delta.c
+++ b/monetdb5/modules/mal/mosaic_delta.c
@@ -79,7 +79,7 @@ MOSskip_delta(Client cntxt, MOStask task
 
 // append a series of values into the non-compressed block
 #define Estimate_delta(TYPE, EXPR)\
-{      TYPE *w = (TYPE*)task->src, val= *w, delta;\
+{      TYPE *w = (TYPE*)task->src, val= *w, delta = 0;\
        for(w++,i =1; i<task->elm; i++,w++){\
                delta = *w -val;\
                if ( EXPR)\
diff --git a/monetdb5/modules/mal/mosaic_prefix.c 
b/monetdb5/modules/mal/mosaic_prefix.c
--- a/monetdb5/modules/mal/mosaic_prefix.c
+++ b/monetdb5/modules/mal/mosaic_prefix.c
@@ -72,10 +72,24 @@ void
 MOSadvance_prefix(Client cntxt, MOStask task)
 {
        int bits, bytes;
+       int size;
        (void) cntxt;
 
+       size = ATOMsize(task->type);
+       if( ATOMstorage(task->type == TYPE_str))
+                       size =task->b->T->width;
        task->start += MOSgetCnt(task->blk);
-       switch(ATOMsize(task->type)){
+       switch(size){
+       case 1:
+               { bte *dst = (sht*)  (((char*) task->blk) + MosaicBlkSize);
+                 bte mask = *dst++;
+                 bte val = *dst++;
+                       bits = val & (~mask);
+                       bytes = (MOSgetCnt(task->blk) * bits)/8 + 
((MOSgetCnt(task->blk) %8) != 0);
+                       task->blk = (MosaicBlk) (((char*) dst)  + 
wordaligned(bytes,sht)); 
+                       //mnstr_printf(cntxt->fdout,"advance mask width %d 
bytes %d %d \n",bits,bytes,(int)wordaligned(bytes,int));
+               }
+               break;
        case 2:
                { sht *dst = (sht*)  (((char*) task->blk) + MosaicBlkSize);
                  sht mask = *dst++;
@@ -118,21 +132,6 @@ MOSskip_prefix(Client cntxt, MOStask tas
 } 
 
 
-#define Estimate(TYPE)\
-{      TYPE *v = (TYPE*) task->src, *w= v+1, val= *v, val2= *w,  mask;\
-       Prefix(bits, mask, val, val2, 8 * sizeof(TYPE));\
-       val = *v & mask;\
-       for(i = 1; i < task->elm; w++, i++){\
-               if ( val != (*w & mask) )\
-                       break;\
-       }\
-       if ( i > MOSlimit() ) i = MOSlimit();\
-       bits = i * (8* sizeof(TYPE) -bits);\
-       store = bits/8 + ((bits % 8) >0);\
-       store = MosaicBlkSize + 2 * sizeof(int) + wordaligned( store,TYPE);\
-       factor = ( (flt)i * sizeof(TYPE))/ store;\
-}
-
 // calculate the expected reduction 
 flt
 MOSestimate_prefix(Client cntxt, MOStask task)
@@ -148,6 +147,21 @@ MOSestimate_prefix(Client cntxt, MOStask
                        size =task->b->T->width;
        if( task->elm >= 2)
        switch(size){
+       case 1:
+               {       bte *v = (bte*) task->src, *w= v+1, val= *v,val2= *w, 
mask;
+                       Prefix(bits, mask, val, val2, 8);
+                       val = *v & mask;
+                       for(i = 0; i < task->elm; w++, i++){
+                               if ( val != (*w & mask) )
+                                       break;
+                       }
+                       if ( i > MOSlimit() ) i = MOSlimit();
+                       bits = i * (32 -bits);
+                       store = bits/8 + ((bits % 8) >0);
+                       store = MosaicBlkSize + 2 * sizeof(int) + wordaligned( 
store,int);
+                       factor = ( (flt)i * sizeof(int))/ store;
+               }
+               break;
        case 2:
                {       sht *v = (sht*) task->src, *w= v+1, val= *v,val2= *w, 
mask;
                        Prefix(bits, mask, val, val2, 16);
@@ -213,14 +227,14 @@ MOScompress_prefix(Client cntxt, MOStask
                        size =task->b->T->width;
        if( task->elm >=2 )
        switch(size){
-       case 2:
-               {       sht *v = (sht*) task->src, *w= v+1, val = *v, val2 = 
*w, mask;
-                       sht *dst = (sht*)  (((char*) blk) + MosaicBlkSize);
+       case 1:
+               {       bte *v = (bte*) task->src, *w= v+1, val = *v, val2 = 
*w, mask;
+                       bte *dst = (sht*)  (((char*) blk) + MosaicBlkSize);
                        BUN limit = task->elm > MOSlimit()? MOSlimit(): 
task->elm;
                        unsigned int m;
 
-                       Prefix(bits, mask, val, val2, 16);
-                       rbits = 32-bits;
+                       Prefix(bits, mask, val, val2, 8);
+                       rbits = 8-bits;
                        *dst++ = mask;
                        *dst = *v & mask;
                        *dst = *dst | rbits; // bits outside mask
@@ -229,23 +243,53 @@ MOScompress_prefix(Client cntxt, MOStask
                        *base = 0;
                        
                        val = *v & mask;        //reference value
-//mnstr_printf(cntxt->fdout,"compress %o %o val %d bits %d, %d mask 
%o\n",*v,*w,val,bits, rbits,mask);
                        for(w = v, i = 0; i < limit; w++, i++){
                                if ( val  != (*w & mask) )
                                        break;
                                m = (unsigned int)( *w & (~mask)); // residu
-//mnstr_printf(cntxt->fdout,"compress %d residu %d %o\n",*w,m,m);
 {      cell = (i * rbits)/32;
        lshift= 32 -((i * rbits) % 32) ;
        if ( lshift > rbits){
                base[cell]= base[cell] | (m << (lshift-rbits));
-               //mnstr_printf(cntxt->fdout,"[%d] shift %d rbits %d cell 
%o\n",cell, lshift, rbits, base[cell]);
        }else{ 
                rshift= 32 -  ((i+1) * rbits) % 32;
                base[cell]= base[cell] | (m >> (rbits-lshift));
                base[cell+1]= 0 | (m  << rshift);
-               //mnstr_printf(cntxt->fdout,"[%d] shift %d %d cell %o %o val %o 
%o\n", cell, lshift, rshift,
-                       //base[cell],base[cell+1], (m >> (rbits-lshift)),  (m 
<<rshift));
+       }
+}
+                       }
+                       MOSincCnt(blk,i);
+                       task->src += i * sizeof(int);
+               }
+               break;
+       case 2:
+               {       sht *v = (sht*) task->src, *w= v+1, val = *v, val2 = 
*w, mask;
+                       sht *dst = (sht*)  (((char*) blk) + MosaicBlkSize);
+                       BUN limit = task->elm > MOSlimit()? MOSlimit(): 
task->elm;
+                       unsigned int m;
+
+                       Prefix(bits, mask, val, val2, 16);
+                       rbits = 16-bits;
+                       *dst++ = mask;
+                       *dst = *v & mask;
+                       *dst = *dst | rbits; // bits outside mask
+                       dst++;
+                       base  = (unsigned int*) dst; // start of bit vector
+                       *base = 0;
+                       
+                       val = *v & mask;        //reference value
+                       for(w = v, i = 0; i < limit; w++, i++){
+                               if ( val  != (*w & mask) )
+                                       break;
+                               m = (unsigned int)( *w & (~mask)); // residu
+{      cell = (i * rbits)/32;
+       lshift= 32 -((i * rbits) % 32) ;
+       if ( lshift > rbits){
+               base[cell]= base[cell] | (m << (lshift-rbits));
+       }else{ 
+               rshift= 32 -  ((i+1) * rbits) % 32;
+               base[cell]= base[cell] | (m >> (rbits-lshift));
+               base[cell+1]= 0 | (m  << rshift);
        }
 }
                        }
@@ -326,6 +370,24 @@ MOSdecompress_prefix(Client cntxt, MOSta
        if( ATOMstorage(task->type == TYPE_str))
                        size =task->b->T->width;
        switch(size){
+       case 1:
+               {       bte *dst =  (sht*)  (((char*) blk) + MosaicBlkSize);
+                       bte mask = *dst++, val  =  *dst++, v;
+                       bte m,m1,m2;
+                       BUN lim= MOSgetCnt(blk);
+                       rbits = val & (~mask);
+                       for(m=1, i=1; i < (BUN) rbits; i++)
+                               m= (m << 1) | 1;
+                       base = (unsigned int*) dst;
+                       val = val & mask;
+                       //mnstr_printf(cntxt->fdout,"decompress rbits %d mask 
%o val %d\n",rbits,m,val);
+                       for(i = 0; i < lim; i++){
+                               decompress();
+                               ((int*)task->src)[i] = v;
+                       }
+                       task->src += i * sizeof(int);
+               }
+               break;
        case 2:
                {       sht *dst =  (sht*)  (((char*) blk) + MosaicBlkSize);
                        sht mask = *dst++, val  =  *dst++, v;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to