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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list