Changeset: 45ea23a3053c for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=45ea23a3053c Modified Files: monetdb5/modules/mal/Tests/mosaic_zone_joins.mal monetdb5/modules/mal/Tests/mosaic_zone_joins.stable.out monetdb5/modules/mal/Tests/mosaic_zone_subselect.mal monetdb5/modules/mal/Tests/mosaic_zone_subselect.stable.out monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.mal monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.stable.out monetdb5/modules/mal/mosaic.c monetdb5/modules/mal/mosaic.h monetdb5/modules/mal/mosaic_zone.c monetdb5/modules/mal/mosaic_zone.h Branch: mosaic Log Message:
Use the correct tests to fix errors diffs (268 lines): diff --git a/monetdb5/modules/mal/Tests/mosaic_zone_joins.mal b/monetdb5/modules/mal/Tests/mosaic_zone_joins.mal --- a/monetdb5/modules/mal/Tests/mosaic_zone_joins.mal +++ b/monetdb5/modules/mal/Tests/mosaic_zone_joins.mal @@ -7,7 +7,7 @@ bat.append(b,9); b:= bat.append(b,b); io.print(b); -x:= mosaic.compress(b,"none"); +x:= mosaic.compress(b,"zone"); c:= bat.new(:oid,:oid); bat.append(c,0@0); diff --git a/monetdb5/modules/mal/Tests/mosaic_zone_joins.stable.out b/monetdb5/modules/mal/Tests/mosaic_zone_joins.stable.out --- a/monetdb5/modules/mal/Tests/mosaic_zone_joins.stable.out +++ b/monetdb5/modules/mal/Tests/mosaic_zone_joins.stable.out @@ -25,7 +25,7 @@ function user.main():void; bat.append(b,9); b := bat.append(b,b); io.print(b); - x := mosaic.compress(b,"none"); + x := mosaic.compress(b,"zone"); c := bat.new(:oid,:oid); bat.append(c,0@0); bat.append(c,2@0); diff --git a/monetdb5/modules/mal/Tests/mosaic_zone_subselect.mal b/monetdb5/modules/mal/Tests/mosaic_zone_subselect.mal --- a/monetdb5/modules/mal/Tests/mosaic_zone_subselect.mal +++ b/monetdb5/modules/mal/Tests/mosaic_zone_subselect.mal @@ -8,7 +8,7 @@ bat.append(b,9); b:= bat.append(b,b); io.print(b); -x:= mosaic.compress(b,"none"); +x:= mosaic.compress(b,"zone"); #mosaic.dump(x); s:= algebra.subselect(b,0,50,false,false,false); io.print(s); diff --git a/monetdb5/modules/mal/Tests/mosaic_zone_subselect.stable.out b/monetdb5/modules/mal/Tests/mosaic_zone_subselect.stable.out --- a/monetdb5/modules/mal/Tests/mosaic_zone_subselect.stable.out +++ b/monetdb5/modules/mal/Tests/mosaic_zone_subselect.stable.out @@ -25,7 +25,7 @@ function user.main():void; bat.append(b,9); b := bat.append(b,b); io.print(b); - x := mosaic.compress(b,"none"); + x := mosaic.compress(b,"zone"); #mosaic.dump(x); s := algebra.subselect(b,0,50,false,false,false); io.print(s); diff --git a/monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.mal b/monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.mal --- a/monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.mal +++ b/monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.mal @@ -7,7 +7,7 @@ bat.append(b,9); b:= bat.append(b,b); io.print(b); -x:= mosaic.compress(b,"none"); +x:= mosaic.compress(b,"zone"); s:= algebra.thetasubselect(b,50,"<"); io.print(s); diff --git a/monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.stable.out b/monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.stable.out --- a/monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.stable.out +++ b/monetdb5/modules/mal/Tests/mosaic_zone_thetasubselect.stable.out @@ -25,7 +25,7 @@ function user.main():void; bat.append(b,9); b := bat.append(b,b); io.print(b); - x := mosaic.compress(b,"none"); + x := mosaic.compress(b,"zone"); s := algebra.thetasubselect(b,50,"<"); io.print(s); xs := mosaic.thetasubselect(x,50,"<"); 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 @@ -311,6 +311,13 @@ MOScompressInternal(Client cntxt, int *r case MOSAIC_ZONE: if( task->blk->cnt == 0) task->dst += 2 * MosaicBlkSize; + if ( task->blk->cnt > MAXZONESIZE){ + MOSupdateHeader(cntxt,task); + MOSadvance_zone(task); + task->dst = ((char*) task->blk)+ MosaicBlkSize; + task->blk->tag = MOSAIC_EOL; + task->blk->cnt = 0; + } MOScompress_zone(cntxt,task); break; default : @@ -588,6 +595,11 @@ MOSsubselect(Client cntxt, MalBlkPtr mb, first += task->blk->cnt; MOSskip_dict(task); break; + case MOSAIC_ZONE: + MOSsubselect_zone(cntxt,task,first,first + task->blk->cnt,low,hgh,li,hi,anti); + first += task->blk->cnt; + MOSskip_zone(task); + break; case MOSAIC_NONE: default: MOSsubselect_none(cntxt,task,first,first + task->blk->cnt,low,hgh,li,hi,anti); @@ -688,6 +700,11 @@ str MOSthetasubselect(Client cntxt, MalB first += task->blk->cnt; MOSskip_dict(task); break; + case MOSAIC_ZONE: + MOSthetasubselect_zone(cntxt,task,first,first + task->blk->cnt,low,*oper); + first += task->blk->cnt; + MOSskip_zone(task); + break; case MOSAIC_NONE: default: MOSthetasubselect_none(cntxt,task,first,first + task->blk->cnt,low,*oper); @@ -785,6 +802,11 @@ str MOSleftfetchjoin(Client cntxt, MalBl first += task->blk->cnt; MOSskip_dict(task); break; + case MOSAIC_ZONE: + MOSleftfetchjoin_zone(cntxt, task, first, first + task->blk->cnt); + first += task->blk->cnt; + MOSskip_zone(task); + break; case MOSAIC_NONE: MOSleftfetchjoin_none(cntxt, task, first, first + task->blk->cnt); first += task->blk->cnt; @@ -888,6 +910,11 @@ MOSjoin(Client cntxt, MalBlkPtr mb, MalS first += (BUN) task->blk->cnt; MOSskip_dict(task); break; + case MOSAIC_ZONE: + MOSjoin_zone(cntxt, task, first, first + task->blk->cnt); + first += (BUN) task->blk->cnt; + MOSskip_zone(task); + break; case MOSAIC_NONE: MOSjoin_none(cntxt, task, first, first + task->blk->cnt); first += (BUN) task->blk->cnt; diff --git a/monetdb5/modules/mal/mosaic.h b/monetdb5/modules/mal/mosaic.h --- a/monetdb5/modules/mal/mosaic.h +++ b/monetdb5/modules/mal/mosaic.h @@ -85,6 +85,8 @@ typedef struct MOSTASK{ BUN elm; // elements left to compress char *src; // read pointer into source + void *min, *max;// space for zones + oid *lb, *rb; // Collected oids from operations oid *cl; // candidate admin lng n; // element count in candidate list diff --git a/monetdb5/modules/mal/mosaic_zone.c b/monetdb5/modules/mal/mosaic_zone.c --- a/monetdb5/modules/mal/mosaic_zone.c +++ b/monetdb5/modules/mal/mosaic_zone.c @@ -98,6 +98,14 @@ MOSestimate_zone(Client cntxt, MOStask t return 2; } +#define ZONEbreak(TPE)\ +{ TPE *min,*max;\ + min = (TPE*)zone_min(blk);\ + max = (TPE*)zone_max(blk);\ + if ( task->min ==0 || *(TPE*)task->min > *min) task->min = (void*) min;\ + if ( task->max ==0 || *(TPE*)task->max < *max ) task->max = (void*) max;\ +} + // rather expensive simple value non-compressed store void MOScompress_zone(Client cntxt, MOStask task) @@ -129,6 +137,25 @@ MOScompress_zone(Client cntxt, MOStask t case TYPE_flt: ZONEcompress(flt); break; case TYPE_dbl: ZONEcompress(dbl); break; } + // maintain a global min-max pair + // break the zone when it covers too many elements + switch(ATOMstorage(task->type)){ + case TYPE_bte: ZONEbreak(bte); break ; + case TYPE_bit: ZONEbreak(bit); break ; + case TYPE_sht: ZONEbreak(sht); break; + case TYPE_int: + { int *min,*max; + min = (int*)zone_min(blk); + max = (int*)zone_max(blk); + if ( task->min ==0 || *(int*)task->min > *min) task->min = (void*) min; + if ( task->max ==0 || *(int*)task->max < *max ) task->max = (void*) max; + } + break; + case TYPE_lng: ZONEbreak(lng); break; + case TYPE_flt: ZONEbreak(flt); break; + case TYPE_dbl: ZONEbreak(dbl); break; + } + MOSdump_zone(cntxt, task); #ifdef _DEBUG_MOSAIC_ #endif @@ -183,7 +210,7 @@ MOSdecompress_zone(Client cntxt, MOStask min = (TPE*)zone_min(task->blk);\ max = (TPE*)zone_max(task->blk);\ if( !*anti){\ - if ( *(int*)low > *max || *(int*) hgh < *min)\ + if ( (*(TPE*)low != TPE##_nil && *(TPE *)low > *max) || (*(TPE *)hgh != TPE##_nil && *(TPE *) hgh < *min))\ break;\ if( *(TPE*) low == TPE##_nil && *(TPE*) hgh == TPE##_nil){\ for( ; first < last; first++){\ @@ -216,7 +243,7 @@ MOSdecompress_zone(Client cntxt, MOStask }\ }\ } else {\ - if ( *(int*)low >= *min && *(int*) hgh <= *max)\ + if ( *(TPE*)low != TPE##_nil && *(TPE*)low >= *min && *(TPE*)hgh != TPE##_nil && *(TPE*) hgh <= *max)\ break;\ if( *(TPE*) low == TPE##_nil && *(TPE*) hgh == TPE##_nil){\ /* nothing is matching */\ @@ -280,7 +307,7 @@ MOSsubselect_zone(Client cntxt, MOStask if( !*anti){ // prefilter based on zone map - if ( *(int*)low > *max || *(int*) hgh < *min) + if ( (*(int*) low != int_nil && *(int*)low > *max) || (*(int*)hgh != int_nil && *(int*) hgh < *min)) break; if( *(int*) low == int_nil && *(int*) hgh == int_nil){ @@ -315,7 +342,7 @@ MOSsubselect_zone(Client cntxt, MOStask } } else { // prefilter based on zone map - if ( *(int*)low >= *min && *(int*) hgh <= *max) + if ( *(int*)low != int_nil && *(int*)low >= *min && *(int*)hgh != int_nil && *(int*) hgh <= *max) break; if( *(int*) low == int_nil && *(int*) hgh == int_nil){ /* nothing is matching */ @@ -446,10 +473,10 @@ MOSsubselect_zone(Client cntxt, MOStask hgh= low= *(TPE*) val;\ } \ if(!anti){\ - if (*min > hgh || low < *max )\ + if ( (hgh != TPE##_nil && *min > hgh) || (low !=TPE##_nil && *max <low) )\ break;\ } else{\ - if (*min >= low && hgh <= *max )\ + if ( low != TPE##_nil && *min >= low && hgh != TPE##_nil && hgh <= *max )\ break;\ }\ v = (TPE*) (((char*)task->blk) + 3 * MosaicBlkSize);\ @@ -514,10 +541,10 @@ MOSthetasubselect_zone(Client cntxt, MO hgh= low= *(int*) val; } if(!anti){ - if (*min > hgh || low < *max ) + if ( (hgh != int_nil && *min > hgh) || (low !=int_nil && *max <low) ) break; } else{ - if (*min >= low && hgh <= *max ) + if ( low != int_nil && *min >= low && hgh != int_nil && hgh <= *max ) break; } v = (int*) (((char*)task->blk) + 3 * MosaicBlkSize); diff --git a/monetdb5/modules/mal/mosaic_zone.h b/monetdb5/modules/mal/mosaic_zone.h --- a/monetdb5/modules/mal/mosaic_zone.h +++ b/monetdb5/modules/mal/mosaic_zone.h @@ -29,6 +29,9 @@ #include "mal_interpreter.h" #include "mal_client.h" +// limit the size of a zone based on count +#define MAXZONESIZE 32*1024 + mosaic_export void MOSdump_zone(Client cntxt, MOStask task); mosaic_export void MOSadvance_zone(MOStask task); mosaic_export void MOSskip_zone(MOStask task); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list