Kuzu 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 kuzu {
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 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) {
92 result, aPos, bPos, i, i, dataPtr);
93 }
94 } else {
95 for (auto i = 0u; i < cSelVector->getSelSize(); ++i) {
96 auto pos = (*cSelVector)[i];
98 result, aPos, bPos, pos, pos, dataPtr);
99 }
100 }
101 } else {
102 if (cSelVector->isUnfiltered()) {
103 for (auto i = 0u; i < cSelVector->getSelSize(); ++i) {
104 result.setNull(i, c.isNull(i));
105 if (!result.isNull(i)) {
107 c, result, aPos, bPos, i, i, dataPtr);
108 }
109 }
110 } else {
111 for (auto i = 0u; i < cSelVector->getSelSize(); ++i) {
112 auto pos = (*cSelVector)[i];
113 result.setNull(pos, c.isNull(pos));
114 if (!result.isNull(pos)) {
116 c, result, aPos, bPos, pos, pos, dataPtr);
117 }
118 }
119 }
120 }
121 }
122
123 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
124 typename OP_WRAPPER>
127 [[maybe_unused]] common::SelectionVector* cSelVector, common::ValueVector& result,
128 common::SelectionVector*, void* dataPtr) {
129 KU_ASSERT(bSelVector == cSelVector);
130 auto aPos = (*aSelVector)[0];
131 if (a.isNull(aPos)) {
132 result.setAllNull();
133 } else if (b.hasNoNullsGuarantee() && c.hasNoNullsGuarantee()) {
134 if (bSelVector->isUnfiltered()) {
135 for (auto i = 0u; i < bSelVector->getSelSize(); ++i) {
137 result, aPos, i, i, i, dataPtr);
138 }
139 } else {
140 for (auto i = 0u; i < bSelVector->getSelSize(); ++i) {
141 auto pos = (*bSelVector)[i];
143 result, aPos, pos, pos, pos, dataPtr);
144 }
145 }
146 } else {
147 if (bSelVector->isUnfiltered()) {
148 for (auto i = 0u; i < bSelVector->getSelSize(); ++i) {
149 result.setNull(i, b.isNull(i) || c.isNull(i));
150 if (!result.isNull(i)) {
152 c, result, aPos, i, i, i, dataPtr);
153 }
154 }
155 } else {
156 for (auto i = 0u; i < bSelVector->getSelSize(); ++i) {
157 auto pos = (*bSelVector)[i];
158 result.setNull(pos, b.isNull(pos) || c.isNull(pos));
159 if (!result.isNull(pos)) {
161 c, result, aPos, pos, pos, pos, dataPtr);
162 }
163 }
164 }
165 }
166 }
167
168 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
169 typename OP_WRAPPER>
173 void* dataPtr) {
174 auto aPos = (*aSelVector)[0];
175 auto cPos = (*cSelVector)[0];
176 if (a.isNull(aPos) || c.isNull(cPos)) {
177 result.setAllNull();
178 } else if (b.hasNoNullsGuarantee()) {
179 if (bSelVector->isUnfiltered()) {
180 for (auto i = 0u; i < bSelVector->getSelSize(); ++i) {
182 result, aPos, i, cPos, i, dataPtr);
183 }
184 } else {
185 for (auto i = 0u; i < bSelVector->getSelSize(); ++i) {
186 auto pos = (*bSelVector)[i];
188 result, aPos, pos, cPos, pos, dataPtr);
189 }
190 }
191 } else {
192 if (bSelVector->isUnfiltered()) {
193 for (auto i = 0u; i < bSelVector->getSelSize(); ++i) {
194 result.setNull(i, b.isNull(i));
195 if (!result.isNull(i)) {
197 c, result, aPos, i, cPos, i, dataPtr);
198 }
199 }
200 } else {
201 for (auto i = 0u; i < bSelVector->getSelSize(); ++i) {
202 auto pos = (*bSelVector)[i];
203 result.setNull(pos, b.isNull(pos));
204 if (!result.isNull(pos)) {
206 c, result, aPos, pos, cPos, pos, dataPtr);
207 }
208 }
209 }
210 }
211 }
212
213 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
214 typename OP_WRAPPER>
216 common::ValueVector& b, [[maybe_unused]] common::SelectionVector* bSelVector,
217 common::ValueVector& c, [[maybe_unused]] common::SelectionVector* cSelVector,
218 common::ValueVector& result, common::SelectionVector*, void* dataPtr) {
219 KU_ASSERT(aSelVector == bSelVector && bSelVector == cSelVector);
221 if (aSelVector->isUnfiltered()) {
222 for (uint64_t i = 0; i < aSelVector->getSelSize(); i++) {
224 result, i, i, i, i, dataPtr);
225 }
226 } else {
227 for (uint64_t i = 0; i < aSelVector->getSelSize(); i++) {
228 auto pos = (*aSelVector)[i];
230 result, pos, pos, pos, pos, dataPtr);
231 }
232 }
233 } else {
234 if (aSelVector->isUnfiltered()) {
235 for (uint64_t i = 0; i < aSelVector->getSelSize(); i++) {
236 result.setNull(i, a.isNull(i) || b.isNull(i) || c.isNull(i));
237 if (!result.isNull(i)) {
239 c, result, i, i, i, i, dataPtr);
240 }
241 }
242 } else {
243 for (uint64_t i = 0; i < aSelVector->getSelSize(); i++) {
244 auto pos = (*aSelVector)[i];
245 result.setNull(pos, a.isNull(pos) || b.isNull(pos) || c.isNull(pos));
246 if (!result.isNull(pos)) {
248 c, result, pos, pos, pos, pos, dataPtr);
249 }
250 }
251 }
252 }
253 }
254
255 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
256 typename OP_WRAPPER>
260 void* dataPtr) {
261 auto bPos = (*bSelVector)[0];
262 auto cPos = (*cSelVector)[0];
263 if (b.isNull(bPos) || c.isNull(cPos)) {
264 result.setAllNull();
265 } else if (a.hasNoNullsGuarantee()) {
266 if (aSelVector->isUnfiltered()) {
267 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
269 result, i, bPos, cPos, i, dataPtr);
270 }
271 } else {
272 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
273 auto pos = (*aSelVector)[i];
275 result, pos, bPos, cPos, pos, dataPtr);
276 }
277 }
278 } else {
279 if (aSelVector->isUnfiltered()) {
280 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
281 result.setNull(i, a.isNull(i));
282 if (!result.isNull(i)) {
284 c, result, i, bPos, cPos, i, dataPtr);
285 }
286 }
287 } else {
288 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
289 auto pos = (*aSelVector)[i];
290 result.setNull(pos, a.isNull(pos));
291 if (!result.isNull(pos)) {
293 c, result, pos, bPos, cPos, pos, dataPtr);
294 }
295 }
296 }
297 }
298 }
299
300 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
301 typename OP_WRAPPER>
304 [[maybe_unused]] common::SelectionVector* cSelVector, common::ValueVector& result,
305 common::SelectionVector*, void* dataPtr) {
306 KU_ASSERT(aSelVector == cSelVector);
307 auto bPos = (*bSelVector)[0];
308 if (b.isNull(bPos)) {
309 result.setAllNull();
310 } else if (a.hasNoNullsGuarantee() && c.hasNoNullsGuarantee()) {
311 if (aSelVector->isUnfiltered()) {
312 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
314 result, i, bPos, i, i, dataPtr);
315 }
316 } else {
317 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
318 auto pos = (*aSelVector)[i];
320 result, pos, bPos, pos, pos, dataPtr);
321 }
322 }
323 } else {
324 if (aSelVector->isUnfiltered()) {
325 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
326 result.setNull(i, a.isNull(i) || c.isNull(i));
327 if (!result.isNull(i)) {
329 c, result, i, bPos, i, i, dataPtr);
330 }
331 }
332 } else {
333 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
334 auto pos = (*bSelVector)[i];
335 result.setNull(pos, a.isNull(pos) || c.isNull(pos));
336 if (!result.isNull(pos)) {
338 c, result, pos, bPos, pos, pos, dataPtr);
339 }
340 }
341 }
342 }
343 }
344
345 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
346 typename OP_WRAPPER>
348 common::ValueVector& b, [[maybe_unused]] common::SelectionVector* bSelVector,
350 common::SelectionVector*, void* dataPtr) {
351 KU_ASSERT(aSelVector == bSelVector);
352 auto cPos = (*cSelVector)[0];
353 if (c.isNull(cPos)) {
354 result.setAllNull();
355 } else if (a.hasNoNullsGuarantee() && b.hasNoNullsGuarantee()) {
356 if (aSelVector->isUnfiltered()) {
357 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
359 result, i, i, cPos, i, dataPtr);
360 }
361 } else {
362 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
363 auto pos = (*aSelVector)[i];
365 result, pos, pos, cPos, pos, dataPtr);
366 }
367 }
368 } else {
369 if (aSelVector->isUnfiltered()) {
370 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
371 result.setNull(i, a.isNull(i) || b.isNull(i));
372 if (!result.isNull(i)) {
374 c, result, i, i, cPos, i, dataPtr);
375 }
376 }
377 } else {
378 for (auto i = 0u; i < aSelVector->getSelSize(); ++i) {
379 auto pos = (*aSelVector)[i];
380 result.setNull(pos, a.isNull(pos) || b.isNull(pos));
381 if (!result.isNull(pos)) {
383 c, result, pos, pos, cPos, pos, dataPtr);
384 }
385 }
386 }
387 }
388 }
389
390 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC,
391 typename OP_WRAPPER>
394 common::SelectionVector* cSelVector, common::ValueVector& result,
395 common::SelectionVector* resultSelVector, void* dataPtr) {
396 result.resetAuxiliaryBuffer();
397 if (a.state->isFlat() && b.state->isFlat() && c.state->isFlat()) {
399 bSelVector, c, cSelVector, result, resultSelVector, dataPtr);
400 } else if (a.state->isFlat() && b.state->isFlat() && !c.state->isFlat()) {
402 aSelVector, b, bSelVector, c, cSelVector, result, resultSelVector, dataPtr);
403 } else if (a.state->isFlat() && !b.state->isFlat() && !c.state->isFlat()) {
405 aSelVector, b, bSelVector, c, cSelVector, result, resultSelVector, dataPtr);
406 } else if (a.state->isFlat() && !b.state->isFlat() && c.state->isFlat()) {
408 aSelVector, b, bSelVector, c, cSelVector, result, resultSelVector, dataPtr);
409 } else if (!a.state->isFlat() && !b.state->isFlat() && !c.state->isFlat()) {
411 b, bSelVector, c, cSelVector, result, resultSelVector, dataPtr);
412 } else if (!a.state->isFlat() && !b.state->isFlat() && c.state->isFlat()) {
414 aSelVector, b, bSelVector, c, cSelVector, result, resultSelVector, dataPtr);
415 } else if (!a.state->isFlat() && b.state->isFlat() && c.state->isFlat()) {
417 aSelVector, b, bSelVector, c, cSelVector, result, resultSelVector, dataPtr);
418 } else if (!a.state->isFlat() && b.state->isFlat() && !c.state->isFlat()) {
420 aSelVector, b, bSelVector, c, cSelVector, result, resultSelVector, dataPtr);
421 } else {
422 KU_ASSERT(false);
423 }
424 }
425};
426
427} // namespace function
428} // namespace kuzu
#define KU_ASSERT(condition)
Definition assert.h:19
Definition sel_vector.h:98
sel_t getSelSize() const
Definition sel_vector.h:68
bool isUnfiltered() const
Definition sel_vector.h:75
Definition value_vector.h:21
uint8_t * getData() const
Definition value_vector.h:119
uint8_t isNull(uint32_t pos) const
Definition value_vector.h:84
bool hasNoNullsGuarantee() const
Definition value_vector.h:78
void setAllNull()
Definition value_vector.h:75
void setNull(uint32_t pos, bool isNull)
std::shared_ptr< DataChunkState > state
Definition value_vector.h:146
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 *, void *dataPtr)
Definition ternary_function_executor.h:80
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 *, void *dataPtr)
Definition ternary_function_executor.h:257
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 *, void *dataPtr)
Definition ternary_function_executor.h:215
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 executeFlatUnflatFlat(common::ValueVector &a, common::SelectionVector *aSelVector, common::ValueVector &b, common::SelectionVector *bSelVector, common::ValueVector &c, common::SelectionVector *cSelVector, common::ValueVector &result, common::SelectionVector *, void *dataPtr)
Definition ternary_function_executor.h:170
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 executeUnflatFlatUnflat(common::ValueVector &a, common::SelectionVector *aSelVector, common::ValueVector &b, common::SelectionVector *bSelVector, common::ValueVector &c, common::SelectionVector *cSelVector, common::ValueVector &result, common::SelectionVector *, void *dataPtr)
Definition ternary_function_executor.h:302
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 *, void *dataPtr)
Definition ternary_function_executor.h:347
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 *, void *dataPtr)
Definition ternary_function_executor.h:125
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:392
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