Changeset: d33c8025c3fd for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d33c8025c3fd
Added Files:
monetdb5/modules/mosaic/mosaic_select.h
Branch: mosaic
Log Message:
Forgot to add new file.
diffs (246 lines):
diff --git a/monetdb5/modules/mosaic/mosaic_select.h
b/monetdb5/modules/mosaic/mosaic_select.h
new file mode 100644
--- /dev/null
+++ b/monetdb5/modules/mosaic/mosaic_select.h
@@ -0,0 +1,241 @@
+#ifndef _MOSAIC_SELECT_
+#define _MOSAIC_SELECT_
+
+#include "mosaic.h"
+
+/* generic range select
+ *
+ * This macro is based on the combined behavior of ALGselect2 and BATselect.
+ * It should return the same output on the same input.
+ *
+ * A complete breakdown of the various arguments follows. Here, v, v1
+ * and v2 are values from the appropriate domain, and
+ * v != nil, v1 != nil, v2 != nil, v1 < v2.
+ * tl th li hi anti result list of OIDs for values
+ * -----------------------------------------------------------------
+ * nil nil true true false x == nil (only way to get nil)
+ * nil nil true true true x != nil
+ * nil nil A* B* false x != nil *it
must hold that A && B == false.
+ * nil nil A* B* true NOTHING *it
must hold that A && B == false.
+ * v v A* B* true x != nil *it
must hold that A && B == false.
+ * v v A* B* false NOTHING *it
must hold that A && B == false.
+ * v2 v1 ignored ignored false NOTHING
+ * v2 v1 ignored ignored true x != nil
+ * nil v ignored false false x < v
+ * nil v ignored true false x <= v
+ * nil v ignored false true x >= v
+ * nil v ignored true true x > v
+ * v nil false ignored false x > v
+ * v nil true ignored false x >= v
+ * v nil false ignored true x <= v
+ * v nil true ignored true x < v
+ * v v true true false x == v
+ * v v true true true x != v
+ * v1 v2 false false false v1 < x < v2
+ * v1 v2 true false false v1 <= x < v2
+ * v1 v2 false true false v1 < x <= v2
+ * v1 v2 true true false v1 <= x <= v2
+ * v1 v2 false false true x <= v1 or x >= v2
+ * v1 v2 true false true x < v1 or x >= v2
+ * v1 v2 false true true x <= v1 or x > v2
+ */
+#define select_general(HAS_NIL, ANTI, TPE, canditer_next, SCAN_LOOP)\
+do {\
+ if ( IS_NIL(TPE, tl) && IS_NIL(TPE, th) && li && hi &&
!ANTI) {\
+ if(HAS_NIL) {\
+ SCAN_LOOP(TPE, canditer_next, is_##TPE##_nil(v)); \
+ }\
+ /*else*/\
+ /*Empty result set.*/\
+ }\
+ else if ( IS_NIL(TPE, tl) && IS_NIL(TPE, th) && li && hi && ANTI) {\
+ if(HAS_NIL) {\
+ SCAN_LOOP(TPE, canditer_next, !is_##TPE##_nil(v)); \
+ }\
+ else SCAN_LOOP(TPE, canditer_next, true);\
+ }\
+ else if ( IS_NIL(TPE, tl) && IS_NIL(TPE, th) && !(li && hi) && !ANTI)
{\
+ if(HAS_NIL) {\
+ SCAN_LOOP(TPE, canditer_next, !is_##TPE##_nil(v)); \
+ }\
+ else SCAN_LOOP(TPE, canditer_next, true);\
+ }\
+ else if ( IS_NIL(TPE, tl) && IS_NIL(TPE, th) && !(li && hi) && ANTI) {\
+ /*Empty result set.*/\
+ }\
+ else if ( !IS_NIL(TPE, tl) && !IS_NIL(TPE, th) && tl == th && !(li &&
hi) && ANTI) {\
+ if(HAS_NIL) {\
+ SCAN_LOOP(TPE, canditer_next, !is_##TPE##_nil(v)); \
+ }\
+ else SCAN_LOOP(TPE, canditer_next, true);\
+ }\
+ else if ( !IS_NIL(TPE, tl) && !IS_NIL(TPE, th) && tl == th && !(li &&
hi) && !ANTI) {\
+ /*Empty result set.*/\
+ }\
+ else if ( !IS_NIL(TPE, tl) && !IS_NIL(TPE, th) && tl > th && !ANTI) {\
+ /*Empty result set.*/\
+ }\
+ else if ( !IS_NIL(TPE, tl) && !IS_NIL(TPE, th) && tl > th && ANTI) {\
+ if(HAS_NIL) {\
+ SCAN_LOOP(TPE, canditer_next, !is_##TPE##_nil(v)); \
+ }\
+ else SCAN_LOOP(TPE, canditer_next, true);\
+ }\
+ else {\
+ /*normal cases.*/\
+ if( IS_NIL(TPE, tl) ){\
+ SCAN_LOOP(TPE, canditer_next,\
+ !(HAS_NIL && IS_NIL(TPE, v)) &&\
+ (((hi && v <= th ) || (!hi && v < th )) ==
!ANTI));\
+ } else\
+ if( IS_NIL(TPE, th) ){\
+ SCAN_LOOP(TPE, canditer_next,\
+ !(HAS_NIL && IS_NIL(TPE, v)) &&\
+ (((li && v >= tl ) || (!li && v > tl )) ==
!ANTI));\
+ } else\
+ if (tl == th){\
+ SCAN_LOOP(TPE, canditer_next,\
+ !(HAS_NIL && IS_NIL(TPE, v)) && \
+ ((hi && v == th) == !ANTI));\
+ }\
+ else{\
+ SCAN_LOOP(TPE, canditer_next,\
+ !(HAS_NIL && IS_NIL(TPE, v)) && \
+ ((((hi && v <= th ) || (!hi && v < th )) &&\
+ ((li && v >= tl ) || (!li && v > tl ))) ==
!ANTI));\
+ }\
+ }\
+} while (0)
+
+#define MOSselect_SIGNATURE(NAME, TPE) \
+str \
+MOSselect_##NAME##_##TPE(MOStask task, \
+ TPE tl, TPE th, bool li, bool hi, \
+ bool anti) \
+
+/* definition of type-specific core scan select function */
+#define MOSselect_DEF(NAME, TPE)\
+MOSselect_SIGNATURE(NAME, TPE) {\
+ oid *o;\
+ BUN first,last;\
+ TPE v;\
+ (void) v;\
+\
+ /* set the oid range covered and advance scan range*/\
+ first = task->start;\
+ last = first + MOSgetCnt(task->blk);\
+ bool nil = !task->bsrc->tnonil;\
+ o = task->lb;\
+\
+ /* Advance the candidate iterator to the first element within
+ * the oid range of the current block.
+ */\
+ oid c = canditer_next(task->ci);\
+ while (!is_oid_nil(c) && c < first ) {\
+ c = canditer_next(task->ci);\
+ }\
+\
+ if (is_oid_nil(c)) {\
+ /* Nothing left to scan.
+ * So we can signal the generic select function to stop now.
+ */\
+ return MAL_SUCCEED;\
+ }\
+ else if ( nil && anti){\
+ if (task->ci->tpe == cand_dense)\
+ select_general(true, true, TPE, canditer_next_dense,
scan_loop_##NAME);\
+ else\
+ select_general(true, true, TPE, canditer_next,
scan_loop_##NAME);\
+ }\
+ else if ( !nil && anti){\
+ if (task->ci->tpe == cand_dense)\
+ select_general(false, true, TPE, canditer_next_dense,
scan_loop_##NAME);\
+ else\
+ select_general(false, true, TPE, canditer_next,
scan_loop_##NAME);\
+ }\
+ else if ( nil && !anti){\
+ if (task->ci->tpe == cand_dense)\
+ select_general(true, false, TPE, canditer_next_dense,
scan_loop_##NAME);\
+ else\
+ select_general(true, false, TPE, canditer_next,
scan_loop_##NAME);\
+ }\
+ else if ( !nil && !anti){\
+ if (task->ci->tpe == cand_dense)\
+ select_general(false, false, TPE, canditer_next_dense,
scan_loop_##NAME);\
+ else\
+ select_general(false, false, TPE, canditer_next,
scan_loop_##NAME);\
+ }\
+\
+ if ((c = canditer_peekprev(task->ci)) >= last) {\
+ /*Restore iterator if it went pass the end*/\
+ (void) canditer_prev(task->ci);\
+ }\
+\
+ MOSskip_##NAME(task);\
+ task->lb = o;\
+ return MAL_SUCCEED;\
+}
+
+#define do_select(NAME, TPE) \
+ MOSselect_##NAME##_##TPE(\
+ task,\
+ *(TPE*) low,\
+ *(TPE*) hgh,\
+ *li,\
+ *hi,\
+ *anti)
+
+#define MOSselect_generic_DEF(TPE) \
+static str MOSselect_##TPE(\
+MOStask task, void* low, void* hgh, bit* li, bit* hi, bit* anti)\
+{\
+ while(task->start < task->stop ){\
+ switch(MOSgetTag(task->blk)){\
+ case MOSAIC_RLE:\
+ ALGODEBUG mnstr_printf(GDKstdout,
"MOSselect_runlength\n");\
+ SELECT_RUNLENGTH(TPE);\
+ break;\
+ case MOSAIC_CAPPED:\
+ ALGODEBUG mnstr_printf(GDKstdout,
"MOSselect_capped\n");\
+ SELECT_CAPPED(TPE);\
+ break;\
+ case MOSAIC_VAR:\
+ ALGODEBUG mnstr_printf(GDKstdout, "MOSselect_var\n");\
+ SELECT_VAR(TPE);\
+ break;\
+ case MOSAIC_FRAME:\
+ ALGODEBUG mnstr_printf(GDKstdout, "MOSselect_frame\n");\
+ SELECT_FRAME(TPE);\
+ break;\
+ case MOSAIC_DELTA:\
+ ALGODEBUG mnstr_printf(GDKstdout, "MOSselect_delta\n");\
+ SELECT_DELTA(TPE);\
+ break;\
+ case MOSAIC_PREFIX:\
+ ALGODEBUG mnstr_printf(GDKstdout,
"MOSselect_prefix\n");\
+ SELECT_PREFIX(TPE);\
+ break;\
+ case MOSAIC_LINEAR:\
+ ALGODEBUG mnstr_printf(GDKstdout,
"MOSselect_linear\n");\
+ SELECT_LINEAR(TPE);\
+ break;\
+ case MOSAIC_RAW:\
+ ALGODEBUG mnstr_printf(GDKstdout, "MOSselect_raw\n");\
+ SELECT_RAW(TPE);\
+ break;\
+ }\
+\
+ if (task->ci->next == task->ci->ncand) {\
+ /* We are at the end of the candidate list.
+ * So we can stop now.
+ */\
+ return MAL_SUCCEED;\
+ }\
+ }\
+\
+ assert(task->blk == NULL);\
+\
+ return MAL_SUCCEED;\
+}
+
+#endif /* _MOSAIC_SELECT_ */
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list