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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list