Changeset: 6b7e79475873 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6b7e79475873 Modified Files: monetdb5/modules/mosaic/TODO_MOSAIC.txt monetdb5/modules/mosaic/mosaic_capped.c monetdb5/modules/mosaic/mosaic_delta.c monetdb5/modules/mosaic/mosaic_delta.h monetdb5/modules/mosaic/mosaic_dictionary.h monetdb5/modules/mosaic/mosaic_frame.c monetdb5/modules/mosaic/mosaic_frame.h monetdb5/modules/mosaic/mosaic_join.h monetdb5/modules/mosaic/mosaic_linear.c monetdb5/modules/mosaic/mosaic_linear.h monetdb5/modules/mosaic/mosaic_prefix.c monetdb5/modules/mosaic/mosaic_prefix.h monetdb5/modules/mosaic/mosaic_projection.h monetdb5/modules/mosaic/mosaic_raw.c monetdb5/modules/mosaic/mosaic_raw.h monetdb5/modules/mosaic/mosaic_runlength.c monetdb5/modules/mosaic/mosaic_runlength.h monetdb5/modules/mosaic/mosaic_select.h monetdb5/modules/mosaic/mosaic_utility.h monetdb5/modules/mosaic/mosaic_var.c Branch: mosaic Log Message:
Create type-specific versions of MOSadvance_*. diffs (truncated from 579 to 300 lines): diff --git a/monetdb5/modules/mosaic/TODO_MOSAIC.txt b/monetdb5/modules/mosaic/TODO_MOSAIC.txt --- a/monetdb5/modules/mosaic/TODO_MOSAIC.txt +++ b/monetdb5/modules/mosaic/TODO_MOSAIC.txt @@ -1,6 +1,6 @@ ####technical depth#### -Split the MOSadvance-like functions to type specific variant and remove the MOSskip functions. -See if decompress can be refactored similar to the algebraic operators. +Split the MOSadvance-like functions to type specific variant. +See if compress, decompress and layout can be refactored similar to the algebraic operators. Factor out boilerplate code mosaic code: resulting mosaic boilerplate is for testing purposes. Create test for swapped join. Add lots of tests with candidate lists for all diff --git a/monetdb5/modules/mosaic/mosaic_capped.c b/monetdb5/modules/mosaic/mosaic_capped.c --- a/monetdb5/modules/mosaic/mosaic_capped.c +++ b/monetdb5/modules/mosaic/mosaic_capped.c @@ -111,17 +111,34 @@ DictionaryClass(hge) #define GetTypeWidth(INFO) ((INFO)->dict->twidth) #define GetSizeInBytes(INFO) (BATcount((INFO)->dict) * GetTypeWidth(INFO)) +#define MOSadvance_DEF(TPE)\ +MOSadvance_SIGNATURE(capped, TPE) advance_dictionary(capped) + +MOSadvance_DEF(bte) +MOSadvance_DEF(sht) +MOSadvance_DEF(int) +MOSadvance_DEF(lng) +MOSadvance_DEF(flt) +MOSadvance_DEF(dbl) +#ifdef HAVE_HGE +MOSadvance_DEF(hge) +#endif + void MOSadvance_capped(MOStask task) { - int *dst = (int*) MOScodevectorDict(task); - BUN cnt = MOSgetCnt(task->blk); - BUN bytes; - - assert(cnt > 0); - task->start += (oid) cnt; - bytes = (cnt * GET_FINAL_BITS(task, capped))/8 + (((cnt * GET_FINAL_BITS(task, capped)) %8) != 0); - task->blk = (MosaicBlk) (((char*) dst) + wordaligned(bytes, BitVectorChunk)); + // TODO: Not strictly necessary to split on type here since the logic remains the same. + switch(ATOMbasetype(task->type)){ + case TYPE_bte: MOSadvance_capped_bte(task); break; + case TYPE_sht: MOSadvance_capped_sht(task); break; + case TYPE_int: MOSadvance_capped_int(task); break; + case TYPE_lng: MOSadvance_capped_lng(task); break; + case TYPE_flt: MOSadvance_capped_flt(task); break; + case TYPE_dbl: MOSadvance_capped_dbl(task); break; +#ifdef HAVE_HGE + case TYPE_hge: MOSadvance_capped_hge(task); break; +#endif + } } void diff --git a/monetdb5/modules/mosaic/mosaic_delta.c b/monetdb5/modules/mosaic/mosaic_delta.c --- a/monetdb5/modules/mosaic/mosaic_delta.c +++ b/monetdb5/modules/mosaic/mosaic_delta.c @@ -40,20 +40,42 @@ bool MOStypes_delta(BAT* b) { } #define toEndOfBitVector(CNT, BITS) wordaligned(((CNT) * (BITS) / CHAR_BIT) + ( ((CNT) * (BITS)) % CHAR_BIT != 0 ), BitVectorChunk) +#define MOSadvance_DEF(TPE)\ +MOSadvance_SIGNATURE(delta, TPE)\ +{\ + MosaicBlkHeader_delta_t* parameters = (MosaicBlkHeader_delta_t*) (task)->blk;\ + int *dst = (int*) (((char*) task->blk) + wordaligned(sizeof(MosaicBlkHeader_delta_t), BitVectorChunk));\ + long cnt = parameters->base.cnt;\ + long bytes = toEndOfBitVector(cnt, parameters->bits);\ +\ + assert(cnt > 0);\ + task->start += (oid) cnt;\ + task->blk = (MosaicBlk) (((char*) dst) + bytes);\ +} + +MOSadvance_DEF(bte) +MOSadvance_DEF(sht) +MOSadvance_DEF(int) +MOSadvance_DEF(lng) +#ifdef HAVE_HGE +MOSadvance_DEF(hge) +#endif + void MOSadvance_delta(MOStask task) { - MosaicBlkHeader_delta_t* parameters = (MosaicBlkHeader_delta_t*) (task)->blk; - int *dst = (int*) (((char*) task->blk) + wordaligned(sizeof(MosaicBlkHeader_delta_t), BitVectorChunk)); - long cnt = parameters->base.cnt; - long bytes = toEndOfBitVector(cnt, parameters->bits); - - assert(cnt > 0); - task->start += (oid) cnt; - task->blk = (MosaicBlk) (((char*) dst) + bytes); + // TODO: Not strictly necessary to split on type here since the logic remains the same. + switch(ATOMbasetype(task->type)){ + case TYPE_bte: MOSadvance_delta_bte(task); break; + case TYPE_sht: MOSadvance_delta_sht(task); break; + case TYPE_int: MOSadvance_delta_int(task); break; + case TYPE_lng: MOSadvance_delta_lng(task); break; +#ifdef HAVE_HGE + case TYPE_hge: MOSadvance_delta_hge(task); break; +#endif + } } - void MOSlayout_delta(MOStask task, BAT *btech, BAT *bcount, BAT *binput, BAT *boutput, BAT *bproperties) { diff --git a/monetdb5/modules/mosaic/mosaic_delta.h b/monetdb5/modules/mosaic/mosaic_delta.h --- a/monetdb5/modules/mosaic/mosaic_delta.h +++ b/monetdb5/modules/mosaic/mosaic_delta.h @@ -71,7 +71,6 @@ typedef struct _DeltaParameters_t { }\ IF_EQUAL_APPEND_RESULT(HAS_NIL, TPE);\ }\ - MOSadvance_delta(task);\ } #endif /* _MOSAIC_DELTA_ */ diff --git a/monetdb5/modules/mosaic/mosaic_dictionary.h b/monetdb5/modules/mosaic/mosaic_dictionary.h --- a/monetdb5/modules/mosaic/mosaic_dictionary.h +++ b/monetdb5/modules/mosaic/mosaic_dictionary.h @@ -164,6 +164,19 @@ typedef struct { // MOStask object dependent macro's + +#define advance_dictionary(NAME)\ +{\ + int *dst = (int*) MOScodevectorDict(task);\ + BUN cnt = MOSgetCnt(task->blk);\ + BUN bytes;\ +\ + assert(cnt > 0);\ + task->start += (oid) cnt;\ + bytes = (cnt * GET_FINAL_BITS(task, NAME))/8 + (((cnt * GET_FINAL_BITS(task, NAME)) %8) != 0);\ + task->blk = (MosaicBlk) (((char*) dst) + wordaligned(bytes, BitVectorChunk));\ +} + #define MOScodevectorDict(Task) (((char*) (Task)->blk) + wordaligned(sizeof(MOSBlkHdr_dictionary_t), BitVectorChunk)) // insert a series of values into the compressor block using dictionary @@ -244,7 +257,6 @@ typedef struct { TPE rval = dict[j];\ IF_EQUAL_APPEND_RESULT(HAS_NIL, TPE);\ }\ - MOSadvance_##NAME(task);\ } #endif /* _MOSAIC_DICTIONARY_ */ diff --git a/monetdb5/modules/mosaic/mosaic_frame.c b/monetdb5/modules/mosaic/mosaic_frame.c --- a/monetdb5/modules/mosaic/mosaic_frame.c +++ b/monetdb5/modules/mosaic/mosaic_frame.c @@ -49,17 +49,40 @@ bool MOStypes_frame(BAT* b) { #define toEndOfBitVector(CNT, BITS) wordaligned(((CNT) * (BITS) / CHAR_BIT) + ( ((CNT) * (BITS)) % CHAR_BIT != 0 ), lng) +#define MOSadvance_DEF(TPE)\ +MOSadvance_SIGNATURE(frame, TPE)\ +{\ + MosaicBlkHeader_frame_t* parameters = (MosaicBlkHeader_frame_t*) (task)->blk;\ + int *dst = (int*) (((char*) task->blk) + wordaligned(sizeof(MosaicBlkHeader_frame_t), BitVectorChunk));\ + long cnt = parameters->base.cnt;\ + long bytes = toEndOfBitVector(cnt, parameters->bits);\ +\ + assert(cnt > 0);\ + task->start += (oid) cnt;\ + task->blk = (MosaicBlk) (((char*) dst) + bytes);\ +} + +MOSadvance_DEF(bte) +MOSadvance_DEF(sht) +MOSadvance_DEF(int) +MOSadvance_DEF(lng) +#ifdef HAVE_HGE +MOSadvance_DEF(hge) +#endif + void MOSadvance_frame(MOStask task) { - MosaicBlkHeader_frame_t* parameters = (MosaicBlkHeader_frame_t*) (task)->blk; - int *dst = (int*) (((char*) task->blk) + wordaligned(sizeof(MosaicBlkHeader_frame_t), BitVectorChunk)); - long cnt = parameters->base.cnt; - long bytes = toEndOfBitVector(cnt, parameters->bits); - - assert(cnt > 0); - task->start += (oid) cnt; - task->blk = (MosaicBlk) (((char*) dst) + bytes); + // TODO: Not strictly necessary to split on type here since the logic remains the same. + switch(ATOMbasetype(task->type)){ + case TYPE_bte: MOSadvance_frame_bte(task); break; + case TYPE_sht: MOSadvance_frame_sht(task); break; + case TYPE_int: MOSadvance_frame_int(task); break; + case TYPE_lng: MOSadvance_frame_lng(task); break; +#ifdef HAVE_HGE + case TYPE_hge: MOSadvance_frame_hge(task); break; +#endif + } } void diff --git a/monetdb5/modules/mosaic/mosaic_frame.h b/monetdb5/modules/mosaic/mosaic_frame.h --- a/monetdb5/modules/mosaic/mosaic_frame.h +++ b/monetdb5/modules/mosaic/mosaic_frame.h @@ -69,7 +69,6 @@ typedef struct _FrameParameters_t { TPE rval = ADD_DELTA(TPE, min, getBitVector(base, i, bits));\ IF_EQUAL_APPEND_RESULT(HAS_NIL, TPE);\ }\ - MOSadvance_frame(task);\ } #endif /* _MOSAIC_FRAME_ */ diff --git a/monetdb5/modules/mosaic/mosaic_join.h b/monetdb5/modules/mosaic/mosaic_join.h --- a/monetdb5/modules/mosaic/mosaic_join.h +++ b/monetdb5/modules/mosaic/mosaic_join.h @@ -87,7 +87,7 @@ MOSjoin_COUI_SIGNATURE(NAME, TPE)\ (void) canditer_prev(lci);\ }\ \ - MOSadvance_##NAME(task);\ + MOSadvance_##NAME##_##TPE(task);\ return MAL_SUCCEED;\ } @@ -163,7 +163,10 @@ static str MOSjoin_COUI_##TPE(MOStask ta */ #define do_join_inner_loop(NAME, TPE, HAS_NIL, RIGHT_CI_NEXT)\ -join_inner_loop_##NAME(TPE, HAS_NIL, RIGHT_CI_NEXT) +{\ + join_inner_loop_##NAME(TPE, HAS_NIL, RIGHT_CI_NEXT);\ + MOSadvance_##NAME##_##TPE(task);\ +} #define IF_EQUAL_APPEND_RESULT(HAS_NIL, TPE)\ {\ diff --git a/monetdb5/modules/mosaic/mosaic_linear.c b/monetdb5/modules/mosaic/mosaic_linear.c --- a/monetdb5/modules/mosaic/mosaic_linear.c +++ b/monetdb5/modules/mosaic/mosaic_linear.c @@ -62,18 +62,32 @@ MOSlayout_linear(MOStask task, BAT *btec return; } +#define MOSadvance_DEF(TPE)\ +MOSadvance_SIGNATURE(linear, TPE)\ +{\ + task->start += MOSgetCnt(task->blk);\ + task->blk = (MosaicBlk)( ((char*)task->blk) + wordaligned( MosaicBlkSize + 2 * sizeof(TPE),TPE));\ +} + +MOSadvance_DEF(bte) +MOSadvance_DEF(sht) +MOSadvance_DEF(int) +MOSadvance_DEF(lng) +#ifdef HAVE_HGE +MOSadvance_DEF(hge) +#endif + void MOSadvance_linear(MOStask task) { - task->start += MOSgetCnt(task->blk); + // TODO: Not strictly necessary to split on type here since the logic remains the same. switch(ATOMbasetype(task->type)){ - case TYPE_bte: task->blk = (MosaicBlk)( ((char*)task->blk) + wordaligned( MosaicBlkSize + 2 * sizeof(bte),bte)); break; - case TYPE_sht: task->blk = (MosaicBlk)( ((char*)task->blk) + wordaligned( MosaicBlkSize + 2 * sizeof(sht),sht)); break; - case TYPE_int: task->blk = (MosaicBlk)( ((char*)task->blk) + wordaligned( MosaicBlkSize + 2 * sizeof(int),int)); break; - case TYPE_oid: task->blk = (MosaicBlk)( ((char*)task->blk) + wordaligned( MosaicBlkSize + 2 * sizeof(oid),oid)); break; - case TYPE_lng: task->blk = (MosaicBlk)( ((char*)task->blk) + wordaligned( MosaicBlkSize + 2 * sizeof(lng),lng)); break; + case TYPE_bte: MOSadvance_linear_bte(task); break; + case TYPE_sht: MOSadvance_linear_sht(task); break; + case TYPE_int: MOSadvance_linear_int(task); break; + case TYPE_lng: MOSadvance_linear_lng(task); break; #ifdef HAVE_HGE - case TYPE_hge: task->blk = (MosaicBlk)( ((char*)task->blk) + wordaligned( MosaicBlkSize + 2 * sizeof(hge),hge)); break; + case TYPE_hge: MOSadvance_linear_hge(task); break; #endif } } diff --git a/monetdb5/modules/mosaic/mosaic_linear.h b/monetdb5/modules/mosaic/mosaic_linear.h --- a/monetdb5/modules/mosaic/mosaic_linear.h +++ b/monetdb5/modules/mosaic/mosaic_linear.h @@ -40,7 +40,6 @@ ALGEBRA_INTERFACES_INTEGERS_ONLY(linear) TPE rval = (TPE) (offset + (i * step));\ IF_EQUAL_APPEND_RESULT(HAS_NIL, TPE);\ }\ - MOSadvance_linear(task);\ } #endif /* _MOSAIC_LINEAR_ */ 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 @@ -102,17 +102,40 @@ MOSlayout_prefix(MOStask task, BAT *btec _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list