Changeset: f08478227a2c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f08478227a2c
Modified Files:
        monetdb5/modules/mosaic/mosaic.c
        monetdb5/modules/mosaic/mosaic_prefix.c
        monetdb5/modules/mosaic/mosaic_prefix.h
        sql/test/mosaic/Tests/All
Branch: mosaic
Log Message:

Simplify prefix code


diffs (truncated from 327 to 300 lines):

diff --git a/monetdb5/modules/mosaic/mosaic.c b/monetdb5/modules/mosaic/mosaic.c
--- a/monetdb5/modules/mosaic/mosaic.c
+++ b/monetdb5/modules/mosaic/mosaic.c
@@ -589,10 +589,16 @@ MOSdecompressInternal(Client cntxt, bat 
                throw(MAL, "mosaic.decompress", INTERNAL_BAT_ACCESS);
 
        if (BATcheckmosaic(bsrc) == 0 ){
+#ifdef _DEBUG_MOSAIC_
+               mnstr_printf(cntxt->fdout,"#decompress checkmosaic\n");
+#endif
                BBPunfix(bsrc->batCacheid);
                return MAL_SUCCEED;
        }
        if (!bsrc->tmosaic) {
+#ifdef _DEBUG_MOSAIC_
+               mnstr_printf(cntxt->fdout,"#decompress tmosaic == 0\n");
+#endif
                BBPunfix(bsrc->batCacheid);
                return MAL_SUCCEED;
        }
diff --git a/monetdb5/modules/mosaic/mosaic_prefix.c 
b/monetdb5/modules/mosaic/mosaic_prefix.c
--- a/monetdb5/modules/mosaic/mosaic_prefix.c
+++ b/monetdb5/modules/mosaic/mosaic_prefix.c
@@ -231,6 +231,10 @@ MOSestimate_prefix(Client cntxt, MOStask
                        if( prefixbits == 0)
                                break;
 
+#ifdef _DEBUG_PREFIX_
+            mnstr_printf(cntxt->fdout,"#prefix  estimate 1 %o %o val %d bits 
%d mask %o\n",
+                *v,*w, val, prefixbits, mask);
+#endif
                        if( task->range[MOSAIC_PREFIX] > task->start +1 /* need 
at least two*/){
                                bits = (task->range[MOSAIC_PREFIX] - 
task->start) * (8-prefixbits);
                                store = wordaligned(2 * sizeof(unsigned 
char),int);
@@ -272,6 +276,10 @@ MOSestimate_prefix(Client cntxt, MOStask
                        Prefix(prefixbits, mask, val, val2, 16);
                        if( prefixbits == 0)
                                break;
+#ifdef _DEBUG_PREFIX_
+            mnstr_printf(cntxt->fdout,"#prefix  estimate 2 %o %o elm "BUNFMT" 
val %d bits %d mask %o\n",
+                *v,*w, i,val, prefixbits, mask);
+#endif
 
                        if( task->range[MOSAIC_PREFIX] > task->start + 1){
                                bits = (task->range[MOSAIC_PREFIX] - 
task->start) * (16-prefixbits);
@@ -314,6 +322,10 @@ MOSestimate_prefix(Client cntxt, MOStask
                        if( prefixbits == 0)
                                break;
 
+#ifdef _DEBUG_PREFIX_
+            mnstr_printf(cntxt->fdout,"#prefix estimate 4 %o %o elm "BUNFMT" 
val %d bits %d mask %o\n",
+                *v,*w, i, val, prefixbits, mask);
+#endif
                        if( task->range[MOSAIC_PREFIX] > task->start + 1){
                                bits = (task->range[MOSAIC_PREFIX] - 
task->start) * (32-prefixbits);
                                store = wordaligned(2 * sizeof(unsigned 
int),int);
@@ -345,7 +357,7 @@ MOSestimate_prefix(Client cntxt, MOStask
        case 8:
                {       ulng *v = ((ulng*) task->src) + task->start, *w= v+1, 
val= *v,val2= *w, mask;
                        // search first non-identical value
-                       for(i = 0;i < limit-1 ;i++, w++)
+                       for(i = 0; i < limit-1 ;i++, w++)
                        if( *v != *w ){
                                val2 = *w;
                                break;
@@ -395,7 +407,7 @@ MOSestimate_prefix(Client cntxt, MOStask
 void
 MOScompress_prefix(Client cntxt, MOStask task)
 {
-       BUN limit, i, j =0 ;
+       BUN limit,  j =0 ;
        int prefixbits, bits; 
        lng size;
        BitVector base;
@@ -412,35 +424,35 @@ MOScompress_prefix(Client cntxt, MOStask
        if( task->elm >=2 )
        switch(size){
        case 1:
-               {       unsigned char *v = ((unsigned char*) task->src) + 
task->start, *w= v+1, val = *v, val2 = *w, mask;
+               {       unsigned char *v = ((unsigned char*) task->src) + 
task->start, *w= v+1, *wlimit= v + limit, val1 = *v, val2 = *w, mask;
                        unsigned char *dst = (unsigned char*) 
MOScodevector(task);
                        // search first non-identical value
-                       for(i = 0;i < limit;i++, w++)
-                       if( *v != *w ){
-                               val2 = *w;
-                               break;
-                       }
-                       w = v+1;
-                       Prefix(prefixbits, mask, val, val2, 8);
+                       for(; w < wlimit; w++)
+                               if( *v != *w )
+                                       break;
+                       val1 = *v;
+                       val2 = *w;
+                       Prefix(prefixbits, mask, val1, val2, 8);
                        bits = 8-prefixbits;
                        base = (BitVector)( ((char*)dst) + wordaligned(2 * 
sizeof(unsigned char),int));
                        *dst++ = mask;
-                       val = *v & mask;        //reference value
-                       *dst = val;
-                       *dst = *dst | bits; // bits outside mask
-                       dst++;
+                       val1 = *v & mask;       //reference value
+                       *dst++ = val1 | bits; // bits outside mask
                        base  = (BitVector) dst; // start of bit vector
                        
 #ifdef _DEBUG_PREFIX_
-                       mnstr_printf(cntxt->fdout,"#prefix 1 compress %o %o val 
%d bits (%d, %d) mask %o",
-                               *v,*w,val, prefixbits, bits,mask);
+                       mnstr_printf(cntxt->fdout,"#prefix 1 compress %o %o val 
%d bits (%d, %d) mask %o\n",
+                               *v,*w, val1, prefixbits, bits,mask);
 #endif
-                       if( i < limit)
-                       for(j=0, w = v, i = 0; i < limit; w++, i++, j++){
-                               if ( val  != (*w & mask) )
+                       if( w < wlimit)
+                       for(j=0  ; v < w; v++, j++){
+                               if ( val1  != (*v & mask) )
                                        break;
-                               compress(base, j, bits, (int)( *w & (~mask))); 
// bits
-                               hdr->checksum.sumbte += val;
+                               compress(base, j, bits, (int) (*v & (~mask))); 
+#ifdef _DEBUG_PREFIX_
+                               mnstr_printf(cntxt->fdout,"#compress %d store 
%d\n", *v,  (int) (*v & (~mask)));
+#endif
+                               hdr->checksum.sumbte += val1;
                        }
 #ifdef _DEBUG_PREFIX_
                        mnstr_printf(cntxt->fdout," blk "BUNFMT"\n",j);
@@ -449,36 +461,36 @@ MOScompress_prefix(Client cntxt, MOStask
                }
                break;
        case 2:
-               {       unsigned short *v = ((unsigned short*) task->src) + 
task->start, *w= v+1, val = *v, val2 = *w, mask;
+               {       unsigned short *v = ((unsigned short*) task->src) + 
task->start, *w= v+1, *wlimit= v + limit, val1 = *v, val2 = *w, mask;
                        unsigned short *dst = (unsigned short*) 
MOScodevector(task);
 
                        // search first non-identical value
-                       for(i = 0;i < limit;i++, w++)
-                       if( *v != *w ){
-                               val2 = *w;
-                               break;
-                       }
-                       w = v+1;
-                       Prefix(prefixbits, mask, val, val2, 16);
+                       for(; w < wlimit; w++)
+                               if( *v != *w )
+                                       break;
+                       val1 = *v;
+                       val2 = *w;
+                       Prefix(prefixbits, mask, val1, val2, 16);
                        bits = 16-prefixbits;
                        base = (BitVector)( ((char*)dst) + wordaligned(2 * 
sizeof(unsigned short),int));
                        *dst++ = mask;
-                       val = *v & mask;        //reference value
-                       *dst = val;
-                       *dst = *dst | bits; // bits outside mask
-                       dst++;
+                       val1 = *v & mask;       //reference value
+                       *dst++ = val1 | bits; // bits outside mask
                        base  = (BitVector) dst; // start of bit vector
                        
 #ifdef _DEBUG_PREFIX_
-                       mnstr_printf(cntxt->fdout,"#prefix 2 compress %o %o val 
%d bits (%d, %d) mask %o",
-                               *v,*w,val,prefixbits, bits,mask);
+                       mnstr_printf(cntxt->fdout,"#prefix 2 compress %o %o val 
%d bits (%d, %d) mask %o\n",
+                               *v,*w,val1, prefixbits, bits,mask);
 #endif
-                       if( i < limit)
-                       for(j=0, w = v, i = 0; i < limit; w++, i++, j++){
-                               if ( val  != (*w & mask) )
+                       if( w < wlimit)
+                       for(j=0  ; v < w; v++, j++){
+                               if ( val1  != (*v & mask) )
                                        break;
-                               compress(base,j,bits, (int)( *w & (~mask))); 
-                               hdr->checksum.sumsht += val;
+                               compress(base, j, bits, (int) (*v & (~mask))); 
+#ifdef _DEBUG_PREFIX_
+                               mnstr_printf(cntxt->fdout,"#compress %d store 
%d\n", *v,  (int) (*v & (~mask)));
+#endif
+                               hdr->checksum.sumsht += val1;
                        }
 #ifdef _DEBUG_PREFIX_
                        mnstr_printf(cntxt->fdout," blk "BUNFMT"\n",j);
@@ -487,39 +499,34 @@ MOScompress_prefix(Client cntxt, MOStask
                }
                break;
        case 4:
-               {       unsigned int *v = ((unsigned int*) task->src) + 
task->start, *w= v+1, val = *v, val2 = *w, mask;
+               {       unsigned int *v = ((unsigned int*) task->src) + 
task->start, *w= v+1, *wlimit=  v + limit, val1, val2, mask;
                        unsigned int *dst = (unsigned int*)  
MOScodevector(task);
 
                        // search first non-identical value
-                       for(i = 0;i < limit;i++, w++)
-                       if( *v != *w ){
-                               val2 = *w;
-                               break;
-                       }
-                       w = v+1;
-                       Prefix(prefixbits, mask, val, val2, 32);
+                       for(; w < wlimit; w++)
+                               if( *v != *w )
+                                       break;
+                       val1 = *v;
+                       val2 = *w;
+                       Prefix(prefixbits, mask, val1, val2, 32);
                        bits = 32-prefixbits;
                        base = (BitVector)(((char*)dst) + wordaligned(2 * 
sizeof(unsigned int),int));
                        *dst++ = mask;
-                       val = *v & mask;        //reference value
-                       *dst = val;
-                       *dst = *dst | bits; // bits outside mask
-                       dst++;
+                       val1 = *v & mask ;              //reference value 
+                       *dst++ = val1 | bits;   // and keep bits
                        
 #ifdef _DEBUG_PREFIX_
-                       mnstr_printf(cntxt->fdout,"#prefix 4 compress %o %o val 
%d bits (%d, %d) mask %o",
-                               *v,*w, val, prefixbits, bits,mask);
+                       mnstr_printf(cntxt->fdout,"#prefix 4 compress %o %o val 
%d bits (%d, %d) mask %o\n",
+                               *v,*w, val1, prefixbits, bits, mask);
 #endif
-                       if( i < limit)
-                       for(j=0, w = v, i = 0; i < limit; w++, i++, j++){
-                               if ( val  != (*w & mask) )
+                       for(j=0  ; v < w; v++, j++){
+                               if ( val1  != (*v & mask) )
                                        break;
+                               compress(base, j, bits, (int) (*v & (~mask))); 
 #ifdef _DEBUG_PREFIX_
-                       mnstr_printf(cntxt->fdout,"#compress %d %d %d  diff 
%d\n",
-                               *v,*w, val, (int) (*w & (~mask)));
+                       mnstr_printf(cntxt->fdout,"#compress %d store %d\n", 
*v,  (int) (*v & (~mask)));
 #endif
-                               compress(base,j,bits, (int) (*w & (~mask))); // 
bits
-                               hdr->checksum.sumint += val;
+                               hdr->checksum.sumint += val1;
                        }
 #ifdef _DEBUG_PREFIX_
                        mnstr_printf(cntxt->fdout," blk "BUNFMT"\n",j);
@@ -528,37 +535,34 @@ MOScompress_prefix(Client cntxt, MOStask
                }
                break;
        case 8:
-               {       ulng *v = ((ulng*) task->src) + task->start, *w= v+1, 
val = *v, val2 = *w, mask;
+               {       ulng *v = ((ulng*) task->src) + task->start, *w= v+1, 
*wlimit = v + limit,  val1 = *v, val2 = *w, mask;
                        ulng *dst = (ulng*)  MOScodevector(task);
 
                        // search first non-identical value
-                       for(i = 0;i < limit;i++, w++)
-                       if( *v != *w ){
-                               val2 = *w;
-                               break;
-                       }
-                       w = v+1;
-                       Prefix(prefixbits, mask, val, val2, 32);
+                       for(; w < wlimit; w++)
+                               if( *v != *w )
+                                       break;
+                       val1 = *v;
+                       val2 = *w;
+                       Prefix(prefixbits, mask, val1, val2, 32);
                        bits = 64-prefixbits;
                        base = (BitVector)(((char*)dst) + wordaligned(2 * 
sizeof(ulng),int));
                        if (bits <= 32){
                                *dst++ = mask;
-                               val = *v & mask;        //reference value
-                               *dst = val;
-                               *dst = *dst | bits; // bits outside mask
-                               dst++;
+                               val1 = *v & mask;       //reference value
+                               *dst++ = val1 | bits; // bits outside mask
                                base  = (BitVector) dst; // start of bit vector
                                
 #ifdef _DEBUG_PREFIX_
                                mnstr_printf(cntxt->fdout,"#prefix 8 compress 
%o %o val "LLFMT" bits (%d, %d) mask %o\n",
-                                       (int) *v,(int) *w, (lng)val,prefixbits, 
bits, (int)mask);
+                                       (int) *v, (int) *w, (lng)val1, 
prefixbits, bits, (int)mask);
 #endif
-                               if( i < limit)
-                               for(j=0, w = v, i = 0; i < limit; w++, i++,j++){
-                                       if ( val  != (*w & mask) )
+                               if( w < wlimit)
+                               for(j=0 ; v < w ; w++, j++){
+                                       if ( val1  != (*v & mask) )
                                                break;
-                                       compress(base,j,bits, (int)(*w & 
(~mask))); // bits
-                                       hdr->checksum.sumlng += val;
+                                       compress(base,j,bits, (int)(*v & 
(~mask))); // bits
+                                       hdr->checksum.sumlng += val1;
                                }
                        }
 #ifdef _DEBUG_PREFIX_
@@ -588,6 +592,9 @@ MOSdecompress_prefix(Client cntxt, MOSta
        if( ATOMstorage(task->type == TYPE_str))
                        size =task->bsrc->twidth;
        lim= MOSgetCnt(blk);
+#ifdef _DEBUG_PREFIX_
+       mnstr_printf(cntxt->fdout,"#decompress prefix blk "BUNFMT"\n",lim);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to