Changeset: 2a2b8d910463 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2a2b8d910463 Modified Files: monetdb5/modules/mosaic/mosaic.h monetdb5/modules/mosaic/mosaic_dict.c monetdb5/modules/mosaic/mosaic_dict256.c monetdb5/modules/mosaic/mosaic_dictionary.h monetdb5/modules/mosaic/mosaic_dictionary_impl.h monetdb5/modules/mosaic/mosaic_utility.h Branch: mosaic Log Message:
Refactor macro-wised functions to template functions. diffs (truncated from 406 to 300 lines): diff --git a/monetdb5/modules/mosaic/mosaic.h b/monetdb5/modules/mosaic/mosaic.h --- a/monetdb5/modules/mosaic/mosaic.h +++ b/monetdb5/modules/mosaic/mosaic.h @@ -61,10 +61,6 @@ typedef struct { */ typedef Heap *mosaic; // compressed data is stored on a heap. - -#define IS_NIL(TPE, VAL) is_##TPE##_nil(VAL) -#define ARE_EQUAL(v, w, HAS_NIL, TPE) ((v == w || (HAS_NIL && IS_NIL(TPE, v) && IS_NIL(TPE, w)) ) ) - /* For compression MOSmethods based on value differences, we need the storage type */ #define Deltabte uint8_t #define Deltasht uint16_t diff --git a/monetdb5/modules/mosaic/mosaic_dict.c b/monetdb5/modules/mosaic/mosaic_dict.c --- a/monetdb5/modules/mosaic/mosaic_dict.c +++ b/monetdb5/modules/mosaic/mosaic_dict.c @@ -45,38 +45,10 @@ bool MOStypes_dict(BAT* b) { return false; } -#define MOSadvance_DEF(TPE)\ -MOSadvance_SIGNATURE(dict, TPE) advance_dictionary(dict, TPE) - -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 - #define MOSgetDictFreq(DICTIONARY, KEY) ((BUN*)(((char*) DICTIONARY) + wordaligned(sizeof(DICTIONARY), BUN))[KEY]) #define CONDITIONAL_INSERT_dict(INFO, VAL, TPE) (true) -#define DictionaryClass(TPE) \ -find_value_DEF(TPE)\ -merge_delta_Into_dictionary_DEF(TPE)\ -decompress_dictionary_DEF(TPE) - -DictionaryClass(bte) -DictionaryClass(sht) -DictionaryClass(int) -DictionaryClass(lng) -DictionaryClass(flt) -DictionaryClass(dbl) -#ifdef HAVE_HGE -DictionaryClass(hge) -#endif - void MOSlayout_dict_hdr(MOStask* task, BAT *btech, BAT *bcount, BAT *binput, BAT *boutput, BAT *bproperties) { @@ -142,38 +114,6 @@ MOSlayout_dict(MOStask* task, BAT *btech #endif #undef NAME -#define MOSpostEstimate_DEF(TPE)\ -MOSpostEstimate_SIGNATURE(dict, TPE)\ -{\ - merge_delta_Into_dictionary_##TPE( task->dict_info);\ -} - -MOSpostEstimate_DEF(bte) -MOSpostEstimate_DEF(sht) -MOSpostEstimate_DEF(int) -MOSpostEstimate_DEF(lng) -MOSpostEstimate_DEF(flt) -MOSpostEstimate_DEF(dbl) -#ifdef HAVE_HGE -MOSpostEstimate_DEF(hge) -#endif - -#define MOSdecompress_DEF(TPE) \ -MOSdecompress_SIGNATURE(dict, TPE)\ -{\ - DICTdecompress(dict, TPE);\ -} - -MOSdecompress_DEF(bte) -MOSdecompress_DEF(sht) -MOSdecompress_DEF(int) -MOSdecompress_DEF(lng) -MOSdecompress_DEF(flt) -MOSdecompress_DEF(dbl) -#ifdef HAVE_HGE -MOSdecompress_DEF(hge) -#endif - #define scan_loop_dict(TPE, CI_NEXT, TEST) \ scan_loop_dictionary(dict, TPE, CI_NEXT, TEST) diff --git a/monetdb5/modules/mosaic/mosaic_dict256.c b/monetdb5/modules/mosaic/mosaic_dict256.c --- a/monetdb5/modules/mosaic/mosaic_dict256.c +++ b/monetdb5/modules/mosaic/mosaic_dict256.c @@ -70,34 +70,6 @@ typedef struct _CappedParameters_t { MosaicBlkRec base; } MosaicBlkHeader_dict256_t; -#define DictionaryClass(TPE) \ -find_value_DEF(TPE)\ -merge_delta_Into_dictionary_DEF(TPE)\ -decompress_dictionary_DEF(TPE) - -DictionaryClass(bte) -DictionaryClass(sht) -DictionaryClass(int) -DictionaryClass(lng) -DictionaryClass(flt) -DictionaryClass(dbl) -#ifdef HAVE_HGE -DictionaryClass(hge) -#endif - -#define MOSadvance_DEF(TPE)\ -MOSadvance_SIGNATURE(dict256, TPE) advance_dictionary(dict256, TPE) - -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 MOSlayout_dict256_hdr(MOStask* task, BAT *btech, BAT *bcount, BAT *binput, BAT *boutput, BAT *bproperties) { @@ -163,40 +135,9 @@ MOSlayout_dict256(MOStask* task, BAT *bt #include "mosaic_dictionary_impl.h" #undef TPE #endif +#undef MOS_CUT_OFF_SIZE #undef NAME -#define MOSpostEstimate_DEF(TPE)\ -MOSpostEstimate_SIGNATURE(dict256, TPE)\ -{\ - merge_delta_Into_dictionary_##TPE( task->dict256_info);\ -} - -MOSpostEstimate_DEF(bte) -MOSpostEstimate_DEF(sht) -MOSpostEstimate_DEF(int) -MOSpostEstimate_DEF(lng) -MOSpostEstimate_DEF(flt) -MOSpostEstimate_DEF(dbl) -#ifdef HAVE_HGE -MOSpostEstimate_DEF(hge) -#endif - -#define MOSdecompress_DEF(TPE) \ -MOSdecompress_SIGNATURE(dict256, TPE)\ -{\ - DICTdecompress(dict256, TPE);\ -} - -MOSdecompress_DEF(bte) -MOSdecompress_DEF(sht) -MOSdecompress_DEF(int) -MOSdecompress_DEF(lng) -MOSdecompress_DEF(flt) -MOSdecompress_DEF(dbl) -#ifdef HAVE_HGE -MOSdecompress_DEF(hge) -#endif - #define scan_loop_dict256(TPE, CI_NEXT, TEST) \ scan_loop_dictionary(dict256, TPE, CI_NEXT, TEST) 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 @@ -63,58 +63,6 @@ typedef struct _GlobalDictionaryInfo { #define GET_FINAL_BITS(task, NAME) ((task)->hdr->CONCAT2(bits_, NAME)) #define GET_FINAL_DICT_COUNT(task, NAME) ((task)->hdr->CONCAT2(length_, NAME)) -#define find_value_DEF(TPE) \ -static inline \ -BUN find_value_##TPE(TPE* dict, BUN dict_count, TPE val) {\ - BUN m, f= 0, l = dict_count, offset = 0;\ - /* This function assumes that the implementation of a dictionary*/\ - /* is that of a sorted array with nils starting first.*/\ - if (IS_NIL(TPE, val)) return 0;\ - if (dict_count > 0 && IS_NIL(TPE, dict[0])) {\ - /*If the dictionary starts with a nil,*/\ - /*the actual sorted dictionary starts an array entry later.*/\ - dict++;\ - offset++;\ - l--;\ - }\ - while( l-f > 0 ) {\ - m = f + (l-f)/2;\ - if ( val < dict[m]) l=m-1; else f= m;\ - if ( val > dict[m]) f=m+1; else l= m;\ - }\ - return f + offset;\ -} - -#define merge_delta_Into_dictionary_DEF(TPE) \ -static \ -void merge_delta_Into_dictionary_##TPE(GlobalDictionaryInfo* info) {\ -\ - MosaicBlkRec* bytevector = Tloc(info->admin, 0);\ -\ - BUN delta_count = 0;\ -\ - BUN i;\ - for (i = 0; i < BATcount(info->admin); i++) {\ - if (!bytevector[i].tag && bytevector[i].cnt) {\ - bytevector[i].tag = 1;\ - delta_count++;\ - bytevector[i].cnt = 0;\ - }\ - }\ - info->count += delta_count;\ - GET_BITS(info) = GET_BITS_EXTENDED(info);\ -} - -#define decompress_dictionary_DEF(TPE) \ -static void \ -decompress_dictionary_##TPE(TPE* dict, bte bits, BitVector base, BUN limit, TPE** dest) {\ - for(BUN i = 0; i < limit; i++){\ - BUN key = getBitVector(base,i,(int) bits);\ - (*dest)[i] = dict[key];\ - }\ - *dest += limit;\ -} - #define MosaicBlkHeader_DEF_dictionary(NAME, TPE)\ typedef struct {\ MosaicBlkRec rec;\ @@ -128,48 +76,6 @@ typedef struct {\ #define MOScodevectorDict(task, NAME, TPE) ((BitVector) &((DICTBlockHeaderTpe(NAME, TPE)*) (task)->blk)->bitvector) -#define advance_dictionary(NAME, TPE)\ -{\ - BUN cnt = MOSgetCnt(task->blk);\ -\ - assert(cnt > 0);\ - task->start += (oid) cnt;\ -\ - char* blk = (char*)task->blk;\ - blk += sizeof(MOSBlockHeaderTpe(NAME, TPE));\ - blk += BitVectorSize(cnt, GET_FINAL_BITS(task, NAME));\ - blk += GET_PADDING(task->blk, NAME, TPE);\ -\ - task->blk = (MosaicBlk) blk;\ -} - -// insert a series of values into the compressor block using dictionary -#define DICTcompress(NAME, TPE)\ -{\ - ALIGN_BLOCK_HEADER(task, NAME, TPE);\ -\ - TPE *val = getSrc(TPE, (task));\ - BUN cnt = estimate->cnt;\ - BitVector base = MOScodevectorDict(task, NAME, TPE);\ - BUN i;\ - TPE* dict = GET_FINAL_DICT(task, NAME, TPE);\ - BUN dict_size = GET_FINAL_DICT_COUNT(task, NAME);\ - bte bits = GET_FINAL_BITS(task, NAME);\ - compress_dictionary_##TPE(dict, dict_size, &i, val, cnt, base, bits);\ - MOSsetCnt(task->blk, i);\ -} - -// the inverse operator, extend the src -#define DICTdecompress(NAME, TPE)\ -{ BUN cnt = MOSgetCnt((task)->blk);\ - BitVector base = MOScodevectorDict(task, NAME, TPE);\ - bte bits = GET_FINAL_BITS(task, NAME);\ - TPE* dict = GET_FINAL_DICT(task, NAME, TPE);\ - TPE* dest = (TPE*) (task)->src;\ - decompress_dictionary_##TPE(dict, bits, base, cnt, &dest);\ - (task)->src = (char*) dest;\ -} - #define scan_loop_dictionary(NAME, TPE, CANDITER_NEXT, TEST) {\ TPE* dict = GET_FINAL_DICT(task, NAME, TPE);\ BitVector base = MOScodevectorDict(task, NAME, TPE);\ diff --git a/monetdb5/modules/mosaic/mosaic_dictionary_impl.h b/monetdb5/modules/mosaic/mosaic_dictionary_impl.h --- a/monetdb5/modules/mosaic/mosaic_dictionary_impl.h +++ b/monetdb5/modules/mosaic/mosaic_dictionary_impl.h @@ -173,6 +173,24 @@ MOSestimate_SIGNATURE(NAME, TPE) { return MAL_SUCCEED; } +MOSpostEstimate_SIGNATURE(NAME, TPE) { + GlobalDictionaryInfo* info = task->CONCAT2(NAME, _info); + MosaicBlkRec* bytevector = Tloc(info->admin, 0); + + BUN delta_count = 0; + + BUN i; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list