Changeset: aad07033f66f for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=aad07033f66f Modified Files: monetdb5/modules/mal/mosaic.c monetdb5/modules/mal/mosaic.h sql/backends/monet5/sql.c sql/backends/monet5/sql.mal sql/scripts/76_compression.sql Branch: mosaic Log Message:
Allow for compression list The analysis command can be given a list of optional compression schemes to use. diffs (149 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 @@ -1323,24 +1323,31 @@ MOSjoin(Client cntxt, MalBlkPtr mb, MalS #define STEP MOSAIC_METHODS static int -makepatterns(int *patterns, int size) +makepatterns(int *patterns, int size, str compressions) { int i,j,k, idx, bit=1, step = MOSAIC_METHODS - 1; int lim= 8*7*6*5*4*3*2; - - for(k=0, i=0; i<lim && k <size; i++){ + int candidate[MOSAIC_METHODS]= {0}; + + for( i = 0; i < MOSAIC_METHODS; i++) + candidate[i] = strstr(compressions,MOSfiltername[i]) != 0; + + for( k=0, i=0; i<lim && k <size; i++){ patterns[k]=0; idx =i; while(idx > 0) { - if( idx % step ) + if( idx % step && candidate[ idx % step]) patterns[k] |= 1 <<(idx % step); idx /= step; } + + // weed out duplicates for( j=0; j< k; j++) if(patterns[k] == patterns[j]) break; if( j < k ) continue; #ifdef _MOSAIC_DEBUG_ + mnstr_printf(GDKout,"#"); for(j=0, bit=1; j < MOSAIC_METHODS-1; j++){ mnstr_printf(GDKout,"%d", (patterns[k] & bit) > 0); bit *=2; @@ -1421,7 +1428,7 @@ MOSanalyseInternal(Client cntxt, int thr #define CANDIDATES 256 /* all three combinations */ void -MOSanalyseReport(Client cntxt, BAT *b, BAT *btech, BAT *boutput, BAT *bfactor, lng sample) +MOSanalyseReport(Client cntxt, BAT *b, BAT *btech, BAT *boutput, BAT *bfactor, str compressions) { int i,j,k,cases, bit=1, ret, bid= b->batCacheid; BUN cnt= BATcount(b); @@ -1431,7 +1438,7 @@ MOSanalyseReport(Client cntxt, BAT *b, B char technique[CANDIDATES]={0}, *t = technique; dbl xf[CANDIDATES], factor; - cases = makepatterns(pattern,CANDIDATES); + cases = makepatterns(pattern,CANDIDATES, compressions); task = (MOStask) GDKzalloc(sizeof(*task)); if( task == NULL) return; @@ -1447,7 +1454,7 @@ MOSanalyseReport(Client cntxt, BAT *b, B task->filter[j]= (pattern[i] & bit)>0; bit *=2; } - MOScompressInternal(cntxt, &ret, &bid, task, sample, 0); + MOScompressInternal(cntxt, &ret, &bid, task, 0, 0); // analyse result to detect a new combination for(k=0, j=0, bit=1; j < MOSAIC_METHODS-1; j++){ @@ -1654,7 +1661,7 @@ MOSoptimize(Client cntxt, MalBlkPtr mb, (void) mb; - cases = makepatterns(pattern,CANDIDATES); + cases = makepatterns(pattern,CANDIDATES,NULL); task= (MOStask) GDKzalloc(sizeof(*task)); if( task == NULL) throw(MAL, "mosaic.mosaic", MAL_MALLOC_FAIL); 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 @@ -220,7 +220,7 @@ mosaic_export str MOSdump(Client cntxt, mosaic_export str MOSlayout(Client cntxt, BAT *b, BAT *btech, BAT *bcount, BAT *binput, BAT *boutput, BAT *bproperties); mosaic_export str MOSsliceInternal(Client cntxt, bat *slices, BUN size, BAT *b); mosaic_export int MOSanalyseInternal(Client cntxt, int threshold, MOStask task, bat bid); -mosaic_export void MOSanalyseReport(Client cntxt, BAT *b, BAT *btech, BAT *output, BAT *factor, lng sample); +mosaic_export void MOSanalyseReport(Client cntxt, BAT *b, BAT *btech, BAT *output, BAT *factor, str compressions); mosaic_export str MOSoptimize(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); mosaic_export str MOSslice(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); mosaic_export void MOSblk(MosaicBlk blk); diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -586,7 +586,7 @@ alter_table(Client cntxt, mvc *sql, char return msg; // TODO check:allocate_delta(sql->session->tr, nc); d = nc->data; - assert(nc->base.allocated == 1); + //assert(nc->base.allocated == 1); nc->base.rtime = nc->base.wtime = sql->session->tr->wtime; d->bid = bid; mvc_storage(sql, nc, c->storage_type); @@ -4812,12 +4812,14 @@ sql_storage(Client cntxt, MalBlkPtr mb, /* just take a sample */ if (cnt1 > 512) cnt1 = cnt2 = 512; - BATloop(bn, p, q) { - str s = BUNtail(bi, p); - if (s != NULL && strcmp(s, str_nil)) - sum += (int) strlen(s); - if (--cnt1 <= 0) - break; + if (BATcount(bn)){ + BATloop(bn, p, q) { + str s = BUNtail(bi, p); + if (s != NULL && strcmp(s, str_nil)) + sum += (int) strlen(s); + if (--cnt1 <= 0) + break; + } } if (cnt2) w = (int) (sum / cnt2); diff --git a/sql/backends/monet5/sql.mal b/sql/backends/monet5/sql.mal --- a/sql/backends/monet5/sql.mal +++ b/sql/backends/monet5/sql.mal @@ -486,6 +486,11 @@ pattern mosaicLayout(sch:str,tbl:str,col address sql_mosaicLayout comment "Return a table with detailed compression information "; +pattern mosaicAnalysis(sch:str,tbl:str,col:str,compression:str)( + technique:bat[:oid,:str], + outputsize:bat[:oid,:lng], + factor:bat[:oid,:dbl]) +address sql_mosaicAnalysis; pattern mosaicAnalysis(sch:str,tbl:str,col:str)( technique:bat[:oid,:str], outputsize:bat[:oid,:lng], diff --git a/sql/scripts/76_compression.sql b/sql/scripts/76_compression.sql --- a/sql/scripts/76_compression.sql +++ b/sql/scripts/76_compression.sql @@ -38,3 +38,10 @@ returns table( outputsize bigint, -- after compression factor double -- compression factor ) external name sql."mosaicAnalysis"; + +create function mosaic.analysis(sch string, tbl string, col string, compressions string) +returns table( + technique string, -- compression techniques being used + outputsize bigint, -- after compression + factor double -- compression factor +) external name sql."mosaicAnalysis"; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list