Changeset: 2bae7964bc2c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2bae7964bc2c
Modified Files:
monetdb5/modules/mosaic/mosaic_dictionary_templates.h
monetdb5/modules/mosaic/mosaic_select_template.h
Branch: mosaic
Log Message:
Support compressed execution on dict compression.
diffs (203 lines):
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
@@ -491,6 +491,110 @@ MOSlayout_SIGNATURE(METHOD, TPE)
#endif /*def COMPRESSION_DEFINITION*/
#ifdef SCAN_LOOP_DEFINITION
+
+#ifdef _TEST_ALWAYS_TRUE
+#define NORMALIZE_TEST_ALWAYS_TRUE(METHOD) {}
+#endif
+
+#ifdef _TEST_IS_NIL
+#define NORMALIZE_TEST_IS_NIL(METHOD) {}
+#undef _TEST_IS_NIL
+#define _TEST_IS_NIL (j == 0 && IS_NIL(TPE, dict[0]))
+#endif
+
+#ifdef _TEST_IS_NOT_NIL
+#define NORMALIZE_TEST_IS_NOT_NIL(METHOD) {}
+#undef _TEST_IS_NOT_NIL
+#define _TEST_IS_NOT_NIL (j != 0 || !IS_NIL(TPE, dict[0]))
+#endif
+
+#ifdef _TEST_UPPER_BOUND
+#define NORMALIZE_TEST_UPPER_BOUND(METHOD) \
+{\
+ thk = CONCAT2(find_value_, TPE) (dict, dict_size, th);\
+ if ( thk == dict_size ) { \
+ /*thk is bigger then max(dict) set thk to biggest value*/\
+ hi = true;\
+ thk = dict_size - 1;\
+ }\
+ else if ( th < dict[thk]) {\
+ hi = false;\
+ /* can now be shortcutted if anti */\
+ }\
+ else {\
+ assert(th == dict[thk]);\
+ }\
+}
+#undef _TEST_UPPER_BOUND
+#define _TEST_UPPER_BOUND (!(has_nil && j == 0 && IS_NIL(TPE, dict[0]))
&& (((hi && j <= thk ) || (!hi && j < thk )) == !anti))
+#endif
+
+#ifdef _TEST_LOWER_BOUND
+#define NORMALIZE_TEST_LOWER_BOUND(METHOD) \
+{\
+ tlk = CONCAT2(find_value_, TPE) (dict, dict_size, tl);\
+ if (tlk == dict_size ) { \
+ /*tlk is bigger then max(dict) set tlk to biggest value*/\
+ li = false;\
+ tlk = dict_size - 1;\
+ }\
+ else if (tl < dict[tlk]) {\
+ li = true;\
+ /* can now be shortcutted if anti */\
+ }\
+ else {\
+ assert(tl == dict[tlk]);\
+ }\
+}
+#undef _TEST_LOWER_BOUND
+#define _TEST_LOWER_BOUND !(has_nil && j == 0 && IS_NIL(TPE, dict[0])) &&
(((li && j >= tlk ) || (!li && j > tlk )) == !anti)
+#endif
+
+#ifdef _TEST_EQUAL
+#define NORMALIZE_TEST_EQUAL(METHOD) \
+{\
+ thk = CONCAT2(find_value_, TPE) (dict, dict_size, th);\
+ nomatch = (thk == dict_size || dict[thk] != th);\
+}
+#undef _TEST_EQUAL
+#define _TEST_EQUAL !(has_nil && j == 0 && IS_NIL(TPE,
dict[0])) && ((!nomatch && hi && j == thk) == !anti)
+#endif
+
+#ifdef _TEST_RANGE
+#define NORMALIZE_TEST_RANGE(METHOD) \
+{\
+ tlk = CONCAT2(find_value_, TPE) (dict, dict_size, tl);\
+ if (tlk == dict_size ) { \
+ /*tlk is bigger then max(dict) set tlk to biggest value*/\
+ li = false;\
+ tlk = dict_size - 1;\
+ }\
+ else if (tl < dict[tlk]) {\
+ li = true;\
+ /* can now be shortcutted if anti */\
+ }\
+ else {\
+ assert(tl == dict[tlk]);\
+ }\
+ thk = CONCAT2(find_value_, TPE) (dict, dict_size, th);\
+ if ( thk == dict_size ) { \
+ /*thk is bigger then max(dict) set thk to biggest value*/\
+ hi = true;\
+ thk = dict_size - 1;\
+ }\
+ else if ( th < dict[thk]) {\
+ hi = false;\
+ /* can now be shortcutted if anti */\
+ }\
+ else {\
+ assert(th == dict[thk]);\
+ }\
+}
+
+#undef _TEST_RANGE
+#define _TEST_RANGE !(has_nil && j == 0 && IS_NIL(TPE, dict[0])) &&
(((li && j >= tlk ) || (!li && j > tlk )) && ((hi && j <= thk ) || (!hi && j <
thk ))) == !anti
+#endif
+
MOSscanLoop_SIGNATURE(METHOD, TPE, CAND_ITER, TEST)
{
(void) has_nil;
@@ -501,9 +605,20 @@ MOSscanLoop_SIGNATURE(METHOD, TPE, CAND_
(void) li;
(void) hi;
+ BUN tlk;
+ BUN thk;
+ bool nomatch;
+
+ (void) tlk;
+ (void) thk;
+ (void) nomatch;
+
oid* o = task->lb;
TPE* dict = GET_FINAL_DICT(task, METHOD, TPE);
+ BUN dict_size = GET_FINAL_DICT_COUNT(task, METHOD);
+ (void) dict_size;
BitVector base = MOScodevectorDict(task, METHOD, TPE);
+ CONCAT2(NORMALIZE_, TEST)(METHOD);
bte bits = GET_FINAL_BITS(task, METHOD);
for (oid c = canditer_peekprev(task->ci); !is_oid_nil(c) && c < last; c =
CAND_ITER(task->ci)) {
BUN i = (BUN) (c - first);
diff --git a/monetdb5/modules/mosaic/mosaic_select_template.h
b/monetdb5/modules/mosaic/mosaic_select_template.h
--- a/monetdb5/modules/mosaic/mosaic_select_template.h
+++ b/monetdb5/modules/mosaic/mosaic_select_template.h
@@ -89,36 +89,50 @@ MOSselect_SIGNATURE(METHOD, TPE) {
#else
+#define SCAN_LOOP_DEFINITION
+
+#define TEST TEST_ALWAYS_TRUE
#define _TEST_ALWAYS_TRUE true
-#define _TEST_IS_NIL IS_NIL(TPE,v)
+#include METHOD_TEMPLATES_INCLUDE
+#undef _TEST_ALWAYS_TRUE
+#undef TEST
+
+#define TEST TEST_IS_NIL
+#define _TEST_IS_NIL IS_NIL(TPE,v)
+#include METHOD_TEMPLATES_INCLUDE
+#undef _TEST_IS_NIL
+#undef TEST
+
+#define TEST TEST_IS_NOT_NIL
#define _TEST_IS_NOT_NIL !IS_NIL(TPE,v)
-#define _TEST_UPPER_BOUND !(has_nil && IS_NIL(TPE, v)) && (((hi && v <=
th ) || (!hi && v < th )) == !anti)
-#define _TEST_LOWER_BOUND !(has_nil && IS_NIL(TPE, v)) && (((li && v >=
tl ) || (!li && v > tl )) == !anti)
-#define _TEST_EQUAL !(has_nil && IS_NIL(TPE, v)) && ((hi &&
v == th) == !anti)
-#define _TEST_RANGE !(has_nil && IS_NIL(TPE, v)) && ((((hi
&& v <= th ) || (!hi && v < th )) && ((li && v >= tl ) || (!li && v > tl )))
== !anti)
-
-#define SCAN_LOOP_DEFINITION
-#define TEST TEST_ALWAYS_TRUE
#include METHOD_TEMPLATES_INCLUDE
-#undef TEST
-#define TEST TEST_IS_NIL
-#include METHOD_TEMPLATES_INCLUDE
+#undef _TEST_IS_NOT_NIL
#undef TEST
-#define TEST TEST_IS_NOT_NIL
-#include METHOD_TEMPLATES_INCLUDE
-#undef TEST
+
#define TEST TEST_UPPER_BOUND
+#define _TEST_UPPER_BOUND !(has_nil && IS_NIL(TPE, v)) && (((hi && v <=
th ) || (!hi && v < th )) == !anti)
#include METHOD_TEMPLATES_INCLUDE
+#undef _TEST_UPPER_BOUND
#undef TEST
+
#define TEST TEST_LOWER_BOUND
+#define _TEST_LOWER_BOUND !(has_nil && IS_NIL(TPE, v)) && (((li && v >=
tl ) || (!li && v > tl )) == !anti)
#include METHOD_TEMPLATES_INCLUDE
+#undef _TEST_LOWER_BOUND
#undef TEST
+
#define TEST TEST_EQUAL
+#define _TEST_EQUAL !(has_nil && IS_NIL(TPE, v)) && ((hi && v == th) ==
!anti)
#include METHOD_TEMPLATES_INCLUDE
+#undef _TEST_EQUAL
#undef TEST
+
#define TEST TEST_RANGE
+#define _TEST_RANGE !(has_nil && IS_NIL(TPE, v)) && ((((hi && v <= th ) ||
(!hi && v < th )) && ((li && v >= tl ) || (!li && v > tl ))) == !anti)
#include METHOD_TEMPLATES_INCLUDE
+#undef _TEST_RANGE
#undef TEST
+
#undef SCAN_LOOP_DEFINITION
#define SCAN_LOOP(TEST) MOSscanLoop_ID(METHOD, TPE, CAND_ITER, TEST)(has_nil,
anti, task, first, last, tl, th, li, hi)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list