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

Reply via email to