Lbug C++ API
Loading...
Searching...
No Matches
ternary_function_executor.h
Go to the documentation of this file.
1#pragma once
2
3#include "value_vector.h"
4
5namespace lbug {
6namespace function {
7
9 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename OP>
10 static inline void operation(A_TYPE& a, B_TYPE& b, C_TYPE& c, RESULT_TYPE& result,
11 void* /*aValueVector*/, void* /*resultValueVector*/, void* /*dataPtr*/) {
12 OP::operation(a, b, c, result);
13 }
14};
15
17 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename OP>
18 static inline void operation(A_TYPE& a, B_TYPE& b, C_TYPE& c, RESULT_TYPE& result,
19 void* /*aValueVector*/, void* resultValueVector, void* /*dataPtr*/) {
20 OP::operation(a, b, c, result, *(common::ValueVector*)resultValueVector);
21 }
22};
23
25 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename OP>
26 static inline void operation(A_TYPE& a, B_TYPE& b, C_TYPE& c, RESULT_TYPE& result,
27 void* /*aValueVector*/, void* resultValueVector, void* dataPtr) {
28 OP::operation(a, b, c, result, *(common::ValueVector*)resultValueVector, dataPtr);
29 }
30};
31
33 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename OP>
34 static inline void operation(A_TYPE& a, B_TYPE& b, C_TYPE& c, RESULT_TYPE& result,
35 void* aValueVector, void* resultValueVector, void* /*dataPtr*/) {
36 OP::operation(a, b, c, result, *(common::ValueVector*)aValueVector,
37 *(common::ValueVector*)resultValueVector);
38 }
39};
40
42 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename OP>
43 static inline void operation(A_TYPE& a, B_TYPE& b, C_TYPE& c, RESULT_TYPE& result,
44 void* /*aValueVector*/, void* /*resultValueVector*/, void* dataPtr) {
45 OP::operation(a, b, c, result, dataPtr);
46 }
47};
48
50 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
51 typename OP_WRAPPER>
53 common::ValueVector& c, common::ValueVector& result, uint64_t aPos, uint64_t bPos,
54 uint64_t cPos, uint64_t resPos, void* dataPtr) {
55 auto resValues = (RESULT_TYPE*)result.getData();
56 OP_WRAPPER::template operation<A_TYPE, B_TYPE, C_TYPE, RESULT_TYPE, FUNC>(
57 ((A_TYPE*)a.getData())[aPos], ((B_TYPE*)b.getData())[bPos],
58 ((C_TYPE*)c.getData())[cPos], resValues[resPos], (void*)&a, (void*)&result, dataPtr);
59 }
60
61 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
62 typename OP_WRAPPER>
66 common::SelectionVector* resultSelVector, void* dataPtr) {
67 auto aPos = (*aSelVector)[0];
68 auto bPos = (*bSelVector)[0];
69 auto cPos = (*cSelVector)[0];
70 auto resPos = (*resultSelVector)[0];
71 result.setNull(resPos, a.isNull(aPos) || b.isNull(bPos) || c.isNull(cPos));
72 if (!result.isNull(resPos)) {
74 aPos, bPos, cPos, resPos, dataPtr);
75 }
76 }
77
78 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
79 typename OP_WRAPPER>
83 common::SelectionVector* resultSelVector, void* dataPtr) {
84 auto aPos = (*aSelVector)[0];
85 auto bPos = (*bSelVector)[0];
86 if (a.isNull(aPos) || b.isNull(bPos)) {
87 result.setAllNull();
88 } else if (c.hasNoNullsGuarantee()) {
89 if (cSelVector->isUnfiltered()) {
90 for (auto i = 0u; i < cSelVector->getSelSize(); ++i) {
91 auto rPos = (*resultSelVector)[i];
93 result, aPos, bPos, i, rPos, dataPtr);
94 }
95 } else {
96 for (auto i = 0u; i < cSelVector->getSelSize(); ++i) {
97 auto pos = (*cSelVector)[i];
98 auto rPos = (*resultSelVector)[i];
100 result, aPos, bPos, pos, rPos, dataPtr);
101 }
102 }
103 } else {
104 if (cSelVector->isUnfiltered()) {
105 for (auto i = 0u; i < cSelVector->getSelSize(); ++i) {
106 result.setNull(i, c.isNull(i));
107 if (!result.isNull(i)) {
108 auto rPos = (*resultSelVector)[i];
110 c, result, aPos, bPos, i, rPos, dataPtr);
111 }
112 }
113 } else {
114 for (auto i = 0u; i < cSelVector->getSelSize(); ++i) {
115 auto pos = (*cSelVector)[i];
116 result.setNull(pos, c.isNull(pos));
117 if (!result.isNull(pos)) {
118 auto rPos = (*resultSelVector)[i];
120 c, result, aPos, bPos, pos, rPos, dataPtr);
121 }
122 }
123 }
124 }
125 }
126
127 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
128 typename OP_WRAPPER>
131 [[maybe_unused]] common::SelectionVector* cSelVector, common::ValueVector& result,
132 common::SelectionVector* resultSelVector, void* dataPtr) {
133 KU_ASSERT(bSelVector == cSelVector);
134 auto aPos = (*aSelVector)[0];
135 if (a.isNull(aPos)) {
136 result.setAllNull();
137 } else if (b.hasNoNullsGuarantee() && c.hasNoNullsGuarantee()) {
138 if (bSelVector->isUnfiltered()) {
139 for (auto i = 0u; i < bSelVector->getSelSize(); ++i) {
141 result, aPos, i, i, i, dataPtr);
142 }
143 } else {
144 for (auto i = 0u; i < bSelVector->getSelSize(); ++i) {
145 auto pos = (*bSelVector)[i];
146 auto rPos = (*resultSelVector)[i];
148 result, aPos, pos, pos, rPos, dataPtr);
149 }
150 }
151 } else {
152 if (bSelVector->isUnfiltered()) {
153 for (auto i = 0u; i < bSelVector->getSelSize(); ++i) {
154 result.setNull(i, b.isNull(i) || c.isNull(i));
155 if (!result.isNull(i)) {
156 auto rPos = (*resultSelVector)[i];
158 c, result, aPos, i, i, rPos, dataPtr);
159 }
160 }
161 } else {
162 for (auto i = 0u; i < bSelVector->getSelSize(); ++i) {
163 auto pos = (*bSelVector)[i];
164 result.setNull(pos, b.isNull(pos) || c.isNull(pos));
165 if (!result.isNull(pos)) {
166 auto rPos = (*resultSelVector)[i];
168 c, result, aPos, pos, pos, rPos, dataPtr);
169 }
170 }
171 }
172 }
173 }
174
175 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
176 typename OP_WRAPPER>
179 common::SelectionVector* cSelVector, common::ValueVector& result,
180 common::SelectionVector* resultSelVector, void* dataPtr) {
181 auto aPos = (*aSelVector)[0];
182 auto cPos = (*cSelVector)[0];
183 if (a.isNull(aPos) || c.isNull(cPos)) {
184 result.setAllNull();
185 } else if (b.hasNoNullsGuarantee()) {
186 if (bSelVector->isUnfiltered()) {
187 for (auto i = 0u; i < bSelVector->getSelSize(); ++i) {
188 auto rPos = (*resultSelVector)[i];
190 result, aPos, i, cPos, rPos, dataPtr);
191 }
192 } else {
193 for (auto i = 0u; i < bSelVector->getSelSize(); ++i) {
194 auto pos = (*bSelVector)[i];
195 auto rPos = (*resultSelVector)[i];
197 result, aPos, pos, cPos, rPos, dataPtr);
198 }
199 }
200 } else {
201 if (bSelVector->isUnfiltered()) {
202 for (auto i = 0u; i < bSelVector->getSelSize(); ++i) {
203 result.setNull(i, b.isNull(i));
204 if (!result.isNull(i)) {
205 auto rPos = (*resultSelVector)[i];
207 c, result, aPos, i, cPos, rPos, dataPtr);
208 }
209 }
210 } else {
211 for (auto i = 0u; i < bSelVector->getSelSize(); ++i) {
212 auto pos = (*bSelVector)[i];
213 result.setNull(pos, b.isNull(pos));
214 if (!result.isNull(pos)) {
215 auto rPos = (*resultSelVector)[i];
217 c, result, aPos, pos, cPos, rPos, dataPtr);
218 }
219 }
220 }
221 }
222 }
223
224 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
225 typename OP_WRAPPER>
227 common::ValueVector& b, [[maybe_unused]] common::SelectionVector* bSelVector,
228 common::ValueVector& c, [[maybe_unused]] common::SelectionVector* cSelVector,
229 common::ValueVector& result, common::SelectionVector* resultSelVector, void* dataPtr) {
230 KU_ASSERT(aSelVector == bSelVector && bSelVector == cSelVector);
232 if (aSelVector->isUnfiltered()) {
233 for (uint64_t i = 0; i < aSelVector->getSelSize(); i++) {
234 auto rPos = (*resultSelVector)[i];
236 result, i, i, i, rPos, dataPtr);
237 }
238 } else {
239 for (uint64_t i = 0; i < aSelVector->getSelSize(); i++) {
240 auto pos = (*aSelVector)[i];
241 auto rPos = (*resultSelVector)[i];
243 result, pos, pos, pos, rPos, dataPtr);
244 }
245 }
246 } else {
247 if (aSelVector->isUnfiltered()) {
248 for (uint64_t i = 0; i < aSelVector->getSelSize(); i++) {
249 result.setNull(i, a.isNull(i) || b.isNull(i) || c.isNull(i));
250 if (!result.isNull(i)) {
251 auto rPos = (*resultSelVector)[i];
253 c, result, i, i, i, rPos, dataPtr);
254 }
255 }
256 } else {
257 for (uint64_t i = 0; i < aSelVector->getSelSize(); i++) {
258 auto pos = (*aSelVector)[i];
259 result.setNull(pos, a.isNull(pos) || b.isNull(pos) || c.isNull(pos));
260 if (!result.isNull(pos)) {
261 auto rPos = (*resultSelVector)[i];
263 c, result, pos, pos, pos, rPos, dataPtr);
264 }
265 }
266 }
267 }
268 }
269
270 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
271 typename OP_WRAPPER>
274 common::SelectionVector* cSelVector, common::ValueVector& result,
275 common::SelectionVector* resultSelVector, void* dataPtr) {
276 auto bPos = (*bSelVector)[0];
277 auto cPos = (*cSelVector)[0];
278 if (b.isNull(bPos) || c.isNull(cPos)) {
279 result.setAllNull();
280 } else if (a.hasNoNullsGuarantee()) {
281 if (aSelVector->isUnfiltered()) {
282 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
283 auto rPos = (*resultSelVector)[i];
285 result, i, bPos, cPos, rPos, dataPtr);
286 }
287 } else {
288 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
289 auto pos = (*aSelVector)[i];
290 auto rPos = (*resultSelVector)[i];
292 result, pos, bPos, cPos, rPos, dataPtr);
293 }
294 }
295 } else {
296 if (aSelVector->isUnfiltered()) {
297 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
298 result.setNull(i, a.isNull(i));
299 if (!result.isNull(i)) {
300 auto rPos = (*resultSelVector)[i];
302 c, result, i, bPos, cPos, rPos, dataPtr);
303 }
304 }
305 } else {
306 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
307 auto pos = (*aSelVector)[i];
308 result.setNull(pos, a.isNull(pos));
309 if (!result.isNull(pos)) {
310 auto rPos = (*resultSelVector)[i];
312 c, result, pos, bPos, cPos, rPos, dataPtr);
313 }
314 }
315 }
316 }
317 }
318
319 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
320 typename OP_WRAPPER>
323 [[maybe_unused]] common::SelectionVector* cSelVector, common::ValueVector& result,
324 common::SelectionVector* resultSelVector, void* dataPtr) {
325 KU_ASSERT(aSelVector == cSelVector);
326 auto bPos = (*bSelVector)[0];
327 if (b.isNull(bPos)) {
328 result.setAllNull();
329 } else if (a.hasNoNullsGuarantee() && c.hasNoNullsGuarantee()) {
330 if (aSelVector->isUnfiltered()) {
331 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
332 auto rPos = (*resultSelVector)[i];
334 result, i, bPos, i, rPos, dataPtr);
335 }
336 } else {
337 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
338 auto pos = (*aSelVector)[i];
339 auto rPos = (*resultSelVector)[i];
341 result, pos, bPos, pos, rPos, dataPtr);
342 }
343 }
344 } else {
345 if (aSelVector->isUnfiltered()) {
346 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
347 result.setNull(i, a.isNull(i) || c.isNull(i));
348 if (!result.isNull(i)) {
349 auto rPos = (*resultSelVector)[i];
351 c, result, i, bPos, i, rPos, dataPtr);
352 }
353 }
354 } else {
355 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
356 auto pos = (*bSelVector)[i];
357 result.setNull(pos, a.isNull(pos) || c.isNull(pos));
358 if (!result.isNull(pos)) {
359 auto rPos = (*resultSelVector)[i];
361 c, result, pos, bPos, pos, rPos, dataPtr);
362 }
363 }
364 }
365 }
366 }
367
368 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
369 typename OP_WRAPPER>
371 common::ValueVector& b, [[maybe_unused]] common::SelectionVector* bSelVector,
373 common::SelectionVector* resultSelVector, void* dataPtr) {
374 KU_ASSERT(aSelVector == bSelVector);
375 auto cPos = (*cSelVector)[0];
376 if (c.isNull(cPos)) {
377 result.setAllNull();
378 } else if (a.hasNoNullsGuarantee() && b.hasNoNullsGuarantee()) {
379 if (aSelVector->isUnfiltered()) {
380 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
381 auto rPos = (*resultSelVector)[i];
383 result, i, i, cPos, rPos, dataPtr);
384 }
385 } else {
386 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
387 auto pos = (*aSelVector)[i];
388 auto rPos = (*resultSelVector)[i];
390 result, pos, pos, cPos, rPos, dataPtr);
391 }
392 }
393 } else {
394 if (aSelVector->isUnfiltered()) {
395 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
396 result.setNull(i, a.isNull(i) || b.isNull(i));
397 if (!result.isNull(i)) {
398 auto rPos = (*resultSelVector)[i];
400 c, result, i, i, cPos, rPos, dataPtr);
401 }
402 }
403 } else {
404 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
405 auto pos = (*aSelVector)[i];
406 result.setNull(pos, a.isNull(pos) || b.isNull(pos));
407 if (!result.isNull(pos)) {
408 auto rPos = (*resultSelVector)[i];
410 c, result, pos, pos, cPos, rPos, dataPtr);
411 }
412 }
413 }
414 }
415 }
416
417 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
418 typename OP_WRAPPER>
421 common::SelectionVector* cSelVector, common::ValueVector& result,
422 common::SelectionVector* resultSelVector, void* dataPtr) {
423 result.resetAuxiliaryBuffer();
424 if (a.state->isFlat() && b.state->isFlat() && c.state->isFlat()) {
426 bSelVector, c, cSelVector, result, resultSelVector, dataPtr);
427 } else if (a.state->isFlat() && b.state->isFlat() && !c.state->isFlat()) {
429 aSelVector, b, bSelVector, c, cSelVector, result, resultSelVector, dataPtr);
430 } else if (a.state->isFlat() && !b.state->isFlat() && !c.state->isFlat()) {
432 aSelVector, b, bSelVector, c, cSelVector, result, resultSelVector, dataPtr);
433 } else if (a.state->isFlat() && !b.state->isFlat() && c.state->isFlat()) {
435 aSelVector, b, bSelVector, c, cSelVector, result, resultSelVector, dataPtr);
436 } else if (!a.state->isFlat() && !b.state->isFlat() && !c.state->isFlat()) {
438 b, bSelVector, c, cSelVector, result, resultSelVector, dataPtr);
439 } else if (!a.state->isFlat() && !b.state->isFlat() && c.state->isFlat()) {
441 aSelVector, b, bSelVector, c, cSelVector, result, resultSelVector, dataPtr);
442 } else if (!a.state->isFlat() && b.state->isFlat() && c.state->isFlat()) {
444 aSelVector, b, bSelVector, c, cSelVector, result, resultSelVector, dataPtr);
445 } else if (!a.state->isFlat() && b.state->isFlat() && !c.state->isFlat()) {
447 aSelVector, b, bSelVector, c, cSelVector, result, resultSelVector, dataPtr);
448 } else {
449 KU_ASSERT(false);
450 }
451 }
452};
453
454} // namespace function
455} // namespace lbug
#define KU_ASSERT(condition)
Definition assert.h:24
Definition sel_vector.h:96
bool isUnfiltered() const
Definition sel_vector.h:73
sel_t getSelSize() const
Definition sel_vector.h:66
Definition value_vector.h:21
std::shared_ptr< DataChunkState > state
Definition value_vector.h:146
void setAllNull()
Definition value_vector.h:75
void setNull(uint32_t pos, bool isNull)
uint8_t isNull(uint32_t pos) const
Definition value_vector.h:84
uint8_t * getData() const
Definition value_vector.h:119
bool hasNoNullsGuarantee() const
Definition value_vector.h:78
Definition binary_function_executor.h:6
Definition array_utils.h:7
Definition ternary_function_executor.h:49
static void executeFlatFlatUnflat(common::ValueVector &a, common::SelectionVector *aSelVector, common::ValueVector &b, common::SelectionVector *bSelVector, common::ValueVector &c, common::SelectionVector *cSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition ternary_function_executor.h:80
static void executeFlatUnflatFlat(common::ValueVector &a, common::SelectionVector *aSelVector, common::ValueVector &b, common::SelectionVector *bSelVector, common::ValueVector &c, common::SelectionVector *cSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition ternary_function_executor.h:177
static void executeFlatUnflatUnflat(common::ValueVector &a, common::SelectionVector *aSelVector, common::ValueVector &b, common::SelectionVector *bSelVector, common::ValueVector &c, common::SelectionVector *cSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition ternary_function_executor.h:129
static void executeUnflatFlatUnflat(common::ValueVector &a, common::SelectionVector *aSelVector, common::ValueVector &b, common::SelectionVector *bSelVector, common::ValueVector &c, common::SelectionVector *cSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition ternary_function_executor.h:321
static void executeUnflatUnFlatFlat(common::ValueVector &a, common::SelectionVector *aSelVector, common::ValueVector &b, common::SelectionVector *bSelVector, common::ValueVector &c, common::SelectionVector *cSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition ternary_function_executor.h:370
static void executeOnValue(common::ValueVector &a, common::ValueVector &b, common::ValueVector &c, common::ValueVector &result, uint64_t aPos, uint64_t bPos, uint64_t cPos, uint64_t resPos, void *dataPtr)
Definition ternary_function_executor.h:52
static void executeAllFlat(common::ValueVector &a, common::SelectionVector *aSelVector, common::ValueVector &b, common::SelectionVector *bSelVector, common::ValueVector &c, common::SelectionVector *cSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition ternary_function_executor.h:63
static void executeAllUnFlat(common::ValueVector &a, common::SelectionVector *aSelVector, common::ValueVector &b, common::SelectionVector *bSelVector, common::ValueVector &c, common::SelectionVector *cSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition ternary_function_executor.h:226
static void executeSwitch(common::ValueVector &a, common::SelectionVector *aSelVector, common::ValueVector &b, common::SelectionVector *bSelVector, common::ValueVector &c, common::SelectionVector *cSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition ternary_function_executor.h:419
static void executeUnflatFlatFlat(common::ValueVector &a, common::SelectionVector *aSelVector, common::ValueVector &b, common::SelectionVector *bSelVector, common::ValueVector &c, common::SelectionVector *cSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition ternary_function_executor.h:272
Definition ternary_function_executor.h:8
static void operation(A_TYPE &a, B_TYPE &b, C_TYPE &c, RESULT_TYPE &result, void *, void *, void *)
Definition ternary_function_executor.h:10
Definition ternary_function_executor.h:32
static void operation(A_TYPE &a, B_TYPE &b, C_TYPE &c, RESULT_TYPE &result, void *aValueVector, void *resultValueVector, void *)
Definition ternary_function_executor.h:34
Definition ternary_function_executor.h:24
static void operation(A_TYPE &a, B_TYPE &b, C_TYPE &c, RESULT_TYPE &result, void *, void *resultValueVector, void *dataPtr)
Definition ternary_function_executor.h:26
Definition ternary_function_executor.h:16
static void operation(A_TYPE &a, B_TYPE &b, C_TYPE &c, RESULT_TYPE &result, void *, void *resultValueVector, void *)
Definition ternary_function_executor.h:18
Definition ternary_function_executor.h:41
static void operation(A_TYPE &a, B_TYPE &b, C_TYPE &c, RESULT_TYPE &result, void *, void *, void *dataPtr)
Definition ternary_function_executor.h:43