Changeset: 01c3e874f76d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=01c3e874f76d Added Files: monetdb5/modules/mosaic/mosaic_join_templates.h Modified Files: monetdb5/modules/mosaic/mosaic.c monetdb5/modules/mosaic/mosaic_delta.h monetdb5/modules/mosaic/mosaic_delta_templates.h monetdb5/modules/mosaic/mosaic_dict.h monetdb5/modules/mosaic/mosaic_dict256.h monetdb5/modules/mosaic/mosaic_dictionary.h monetdb5/modules/mosaic/mosaic_dictionary_templates.h monetdb5/modules/mosaic/mosaic_frame.h monetdb5/modules/mosaic/mosaic_frame_templates.h monetdb5/modules/mosaic/mosaic_join.h monetdb5/modules/mosaic/mosaic_linear.h monetdb5/modules/mosaic/mosaic_linear_templates.h monetdb5/modules/mosaic/mosaic_prefix.h monetdb5/modules/mosaic/mosaic_prefix_templates.h monetdb5/modules/mosaic/mosaic_raw.h monetdb5/modules/mosaic/mosaic_raw_templates.h monetdb5/modules/mosaic/mosaic_runlength.h monetdb5/modules/mosaic/mosaic_runlength_templates.h monetdb5/modules/mosaic/mosaic_utility.h Branch: mosaic Log Message:
Refactored (regular) mosaic.join to templates. diffs (truncated from 849 to 300 lines): diff --git a/monetdb5/modules/mosaic/mosaic.c b/monetdb5/modules/mosaic/mosaic.c --- a/monetdb5/modules/mosaic/mosaic.c +++ b/monetdb5/modules/mosaic/mosaic.c @@ -1049,6 +1049,30 @@ str MOSprojection(Client cntxt, MalBlkPt return msg; } +#define TPE bte +#include "mosaic_join_templates.h" +#undef TPE +#define TPE sht +#include "mosaic_join_templates.h" +#undef TPE +#define TPE int +#include "mosaic_join_templates.h" +#undef TPE +#define TPE lng +#include "mosaic_join_templates.h" +#undef TPE +#define TPE flt +#include "mosaic_join_templates.h" +#undef TPE +#define TPE dbl +#include "mosaic_join_templates.h" +#undef TPE +#ifdef HAVE_HGE +#define TPE hge +#include "mosaic_join_templates.h" +#undef TPE +#endif + MOSjoin_generic_COUI_DEF(bte) MOSjoin_generic_COUI_DEF(sht) MOSjoin_generic_COUI_DEF(int) @@ -1059,16 +1083,6 @@ MOSjoin_generic_COUI_DEF(dbl) MOSjoin_generic_COUI_DEF(hge) #endif -MOSjoin_generic_DEF(bte) -MOSjoin_generic_DEF(sht) -MOSjoin_generic_DEF(int) -MOSjoin_generic_DEF(lng) -MOSjoin_generic_DEF(flt) -MOSjoin_generic_DEF(dbl) -#ifdef HAVE_HGE -MOSjoin_generic_DEF(hge) -#endif - /* A mosaic join operator that works when either the left or the right side is compressed. * Furthermore if both sides are in possesion of a mosaic index, * the operator implementation currently only uses the mosaic index of the left side. 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 @@ -31,6 +31,7 @@ typedef struct {\ } MOSBlockHeader_delta_##TPE; ALGEBRA_INTERFACES_INTEGERS_ONLY(delta); +#define TYPE_IS_SUPPORTED_delta(TPE) INTEGERS_ONLY(TPE) #define DO_OPERATION_ON_delta(OPERATION, TPE, ...) DO_OPERATION_ON_INTEGERS_ONLY(OPERATION, delta, TPE, __VA_ARGS__) #define MOScodevectorDelta(task, TPE) ((BitVector) &((MOSBlockHeaderTpe(delta, TPE)*) (task)->blk)->bitvector) @@ -44,23 +45,4 @@ ALGEBRA_INTERFACES_INTEGERS_ONLY(delta); )\ ) -#define join_inner_loop_delta(TPE, HAS_NIL, RIGHT_CI_NEXT)\ -{\ - MOSBlockHeaderTpe(delta, TPE)* parameters = (MOSBlockHeaderTpe(delta, TPE)*) task->blk;\ - BitVector base = MOScodevectorDelta(task, TPE);\ - DeltaTpe(TPE) acc = (DeltaTpe(TPE)) parameters->init; /*previous value*/\ - const bte bits = parameters->bits;\ - DeltaTpe(TPE) sign_mask = (DeltaTpe(TPE)) ((IPTpe(TPE)) 1) << (bits - 1);\ - TPE rval = (TPE) acc;\ - BUN j = 0;\ - for (oid ro = canditer_peekprev(task->ci); !is_oid_nil(ro) && ro < last; ro = RIGHT_CI_NEXT(task->ci)) {\ - BUN i = (BUN) (ro - first);\ - for (;j <= i; j++) {\ - TPE delta = getBitVector(base, j, bits);\ - rval = ACCUMULATE(acc, delta, sign_mask, TPE);\ - }\ - IF_EQUAL_APPEND_RESULT(HAS_NIL, TPE);\ - }\ -} - #endif /* _MOSAIC_DELTA_ */ diff --git a/monetdb5/modules/mosaic/mosaic_delta_templates.h b/monetdb5/modules/mosaic/mosaic_delta_templates.h --- a/monetdb5/modules/mosaic/mosaic_delta_templates.h +++ b/monetdb5/modules/mosaic/mosaic_delta_templates.h @@ -240,3 +240,32 @@ MOSprojectionloop_SIGNATURE(METHOD, TPE, task->src = (char*) bt; } #endif + +#ifdef INNER_COMPRESSED_JOIN_LOOP + +MOSjoin_inner_loop_SIGNATURE(delta, TPE, NIL, RIGHT_CI_NEXT) +{ + MOSBlockHeaderTpe(delta, TPE)* parameters = (MOSBlockHeaderTpe(delta, TPE)*) task->blk; + BitVector base = MOScodevectorDelta(task, TPE); + DeltaTpe(TPE) acc = (DeltaTpe(TPE)) parameters->init; /*previous value*/ + const bte bits = parameters->bits; + DeltaTpe(TPE) sign_mask = (DeltaTpe(TPE)) ((IPTpe(TPE)) 1) << (bits - 1); + TPE rval = (TPE) acc; + BUN j = 0; + BUN first = task->start; + BUN last = first + MOSgetCnt(task->blk); + for (oid ro = canditer_peekprev(task->ci); !is_oid_nil(ro) && ro < last; ro = RIGHT_CI_NEXT(task->ci)) { + BUN i = (BUN) (ro - first); + for (;j <= i; j++) { + TPE delta = getBitVector(base, j, bits); + rval = ACCUMULATE(acc, delta, sign_mask, TPE); + } + #ifdef HAS_NIL + IF_EQUAL_APPEND_RESULT(true, TPE); + #else + IF_EQUAL_APPEND_RESULT(false, TPE); + #endif + } + return MAL_SUCCEED; +} +#endif // #ifdef INNER_COMPRESSED_JOIN_LOOP diff --git a/monetdb5/modules/mosaic/mosaic_dict.h b/monetdb5/modules/mosaic/mosaic_dict.h --- a/monetdb5/modules/mosaic/mosaic_dict.h +++ b/monetdb5/modules/mosaic/mosaic_dict.h @@ -28,9 +28,8 @@ mal_export void MOScreatevar(MOStask* ta #define MosaicBlkHeader_DEF_dict(TPE) MosaicBlkHeader_DEF_dictionary(dict, TPE) ALGEBRA_INTERFACES_ALL_TYPES_WITH_DICTIONARY(dict); +#define TYPE_IS_SUPPORTED_dict(TPE) ALL_TYPES_SUPPORTED(TPE) #define DO_OPERATION_ON_dict(OPERATION, TPE, ...) DO_OPERATION_ON_ALL_TYPES(OPERATION, dict, TPE, __VA_ARGS__) -#define join_inner_loop_dict(TPE, HAS_NIL, RIGHT_CI_NEXT) join_inner_loop_dictionary(dict, TPE, HAS_NIL, RIGHT_CI_NEXT) - #endif /* _MOSAIC_VAR_ */ diff --git a/monetdb5/modules/mosaic/mosaic_dict256.h b/monetdb5/modules/mosaic/mosaic_dict256.h --- a/monetdb5/modules/mosaic/mosaic_dict256.h +++ b/monetdb5/modules/mosaic/mosaic_dict256.h @@ -28,9 +28,8 @@ mal_export str MOScreateCappedInfo(MOSta #define MosaicBlkHeader_DEF_dict256(TPE) MosaicBlkHeader_DEF_dictionary(dict256, TPE) ALGEBRA_INTERFACES_ALL_TYPES_WITH_DICTIONARY(dict256); +#define TYPE_IS_SUPPORTED_dict256(TPE) ALL_TYPES_SUPPORTED(TPE) #define DO_OPERATION_ON_dict256(OPERATION, TPE, ...) DO_OPERATION_ON_ALL_TYPES(OPERATION, dict256, TPE, __VA_ARGS__) -#define join_inner_loop_dict256(TPE, HAS_NIL, RIGHT_CI_NEXT) join_inner_loop_dictionary(dict256, TPE, HAS_NIL, RIGHT_CI_NEXT) - #endif /* _MOSAIC_DICT256_ */ 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 @@ -92,17 +92,4 @@ typedef struct {\ }\ } -#define join_inner_loop_dictionary(METHOD, TPE, HAS_NIL, RIGHT_CI_NEXT)\ -{\ - bte bits = GET_FINAL_BITS(task, METHOD);\ - TPE* dict = GET_FINAL_DICT(task, METHOD, TPE);\ - BitVector base = MOScodevectorDict(task, METHOD, TPE);\ - for (oid ro = canditer_peekprev(task->ci); !is_oid_nil(ro) && ro < last; ro = RIGHT_CI_NEXT(task->ci)) {\ - BUN i = (BUN) (ro - first);\ - BitVectorChunk j= getBitVector(base,i,bits);\ - TPE rval = dict[j];\ - IF_EQUAL_APPEND_RESULT(HAS_NIL, TPE);\ - }\ -} - #endif /* _MOSAIC_DICTIONARY_ */ diff --git a/monetdb5/modules/mosaic/mosaic_dictionary_templates.h b/monetdb5/modules/mosaic/mosaic_dictionary_templates.h --- a/monetdb5/modules/mosaic/mosaic_dictionary_templates.h +++ b/monetdb5/modules/mosaic/mosaic_dictionary_templates.h @@ -539,3 +539,25 @@ MOSprojectionloop_SIGNATURE(METHOD, TPE, task->src = (char*) bt; } #endif + +#ifdef INNER_COMPRESSED_JOIN_LOOP +MOSjoin_inner_loop_SIGNATURE(METHOD, TPE, NIL, RIGHT_CI_NEXT) +{ + bte bits = GET_FINAL_BITS(task, METHOD); + TPE* dict = GET_FINAL_DICT(task, METHOD, TPE); + BitVector base = MOScodevectorDict(task, METHOD, TPE); + BUN first = task->start; + BUN last = first + MOSgetCnt(task->blk); + for (oid ro = canditer_peekprev(task->ci); !is_oid_nil(ro) && ro < last; ro = RIGHT_CI_NEXT(task->ci)) { + BUN i = (BUN) (ro - first); + BitVectorChunk j= getBitVector(base,i,bits); + TPE rval = dict[j]; + #ifdef HAS_NIL + IF_EQUAL_APPEND_RESULT(true, TPE); + #else + IF_EQUAL_APPEND_RESULT(false, TPE); + #endif + } + return MAL_SUCCEED; +} +#endif // #ifdef INNER_COMPRESSED_JOIN_LOOP 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 @@ -31,21 +31,9 @@ typedef struct {\ } MOSBlockHeader_frame_##TPE; ALGEBRA_INTERFACES_INTEGERS_ONLY(frame); +#define TYPE_IS_SUPPORTED_frame(TPE) INTEGERS_ONLY(TPE) #define DO_OPERATION_ON_frame(OPERATION, TPE, ...) DO_OPERATION_ON_INTEGERS_ONLY(OPERATION, frame, TPE, __VA_ARGS__) #define MOScodevectorFrame(task, TPE) ((BitVector) &((MOSBlockHeaderTpe(frame, TPE)*) (task)->blk)->bitvector) -#define join_inner_loop_frame(TPE, HAS_NIL, RIGHT_CI_NEXT)\ -{\ - MOSBlockHeaderTpe(frame, TPE)* parameters = (MOSBlockHeaderTpe(frame, TPE)*) ((task))->blk;\ - const TPE min = parameters->min;\ - const BitVector base = MOScodevectorFrame(task, TPE);\ - const bte bits = parameters->bits;\ - for (oid ro = canditer_peekprev(task->ci); !is_oid_nil(ro) && ro < last; ro = RIGHT_CI_NEXT(task->ci)) {\ - BUN i = (BUN) (ro - first);\ - TPE rval = ADD_DELTA(TPE, min, getBitVector(base, i, bits));\ - IF_EQUAL_APPEND_RESULT(HAS_NIL, TPE);\ - }\ -} - #endif /* _MOSAIC_FRAME_ */ diff --git a/monetdb5/modules/mosaic/mosaic_frame_templates.h b/monetdb5/modules/mosaic/mosaic_frame_templates.h --- a/monetdb5/modules/mosaic/mosaic_frame_templates.h +++ b/monetdb5/modules/mosaic/mosaic_frame_templates.h @@ -219,3 +219,26 @@ MOSprojectionloop_SIGNATURE(METHOD, TPE, task->src = (char*) bt; } #endif + +#ifdef INNER_COMPRESSED_JOIN_LOOP + +MOSjoin_inner_loop_SIGNATURE(frame, TPE, NIL, RIGHT_CI_NEXT) +{ + MOSBlockHeaderTpe(frame, TPE)* parameters = (MOSBlockHeaderTpe(frame, TPE)*) ((task))->blk; + const TPE min = parameters->min; + const BitVector base = MOScodevectorFrame(task, TPE); + const bte bits = parameters->bits; + BUN first = task->start; + BUN last = first + MOSgetCnt(task->blk); + for (oid ro = canditer_peekprev(task->ci); !is_oid_nil(ro) && ro < last; ro = RIGHT_CI_NEXT(task->ci)) { + BUN i = (BUN) (ro - first); + TPE rval = ADD_DELTA(TPE, min, getBitVector(base, i, bits)); + #ifdef HAS_NIL + IF_EQUAL_APPEND_RESULT(true, TPE); + #else + IF_EQUAL_APPEND_RESULT(false, TPE); + #endif + } + return MAL_SUCCEED; +} +#endif // #ifdef INNER_COMPRESSED_JOIN_LOOP 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 @@ -171,16 +171,6 @@ static str MOSjoin_COUI_##TPE(MOStask* t return MAL_SUCCEED;\ } -/* Nested loop join with the left uncompressed side in the outer loop - * and the right compressed side in the inner loop. - */ - -#define join_inner_loop(METHOD, TPE, HAS_NIL, RIGHT_CI_NEXT)\ -{\ - join_inner_loop_##METHOD(TPE, HAS_NIL, RIGHT_CI_NEXT);\ - MOSadvance_##METHOD##_##TPE(task);\ -} - #define IF_EQUAL_APPEND_RESULT(HAS_NIL, TPE)\ {\ if (ARE_EQUAL(lval, rval, HAS_NIL, TPE)){\ @@ -189,90 +179,4 @@ static str MOSjoin_COUI_##TPE(MOStask* t }\ } -#define OUTER_LOOP_UNCOMPRESSED(HAS_NIL, NIL_MATCHES, TPE, LEFT_CI_NEXT, RIGHT_CI_NEXT) \ -{\ - str msg = MAL_SUCCEED;\ -\ - TPE* vl = (TPE*) Tloc(l, 0);\ - for (BUN li = 0; li < lci->ncand; li++, MOSinitializeScan(task, task->bsrc), canditer_reset(rci)) {\ - oid lo = LEFT_CI_NEXT(lci);\ - TPE lval = vl[lo-l->hseqbase];\ - if (HAS_NIL && !NIL_MATCHES) {\ - if ((IS_NIL(TPE, lval))) {continue;};\ - }\ -\ - while(task->start < task->stop ){\ - BUN first = task->start;\ - BUN last = first + MOSgetCnt(task->blk);\ -\ - oid c = canditer_next(rci);\ - while (!is_oid_nil(c) && c < first ) {\ - c = canditer_next(rci);\ - }\ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list