Kuzu C++ API
Loading...
Searching...
No Matches
binary_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
12
14 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename RESULT_TYPE, typename OP>
15 static inline void operation(LEFT_TYPE& left, RIGHT_TYPE& right, RESULT_TYPE& result,
16 common::ValueVector* /*leftValueVector*/, common::ValueVector* /*rightValueVector*/,
17 common::ValueVector* /*resultValueVector*/, uint64_t /*resultPos*/, void* /*dataPtr*/) {
18 OP::operation(left, right, result);
19 }
20};
21
23 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename RESULT_TYPE, typename OP>
24 static void operation(LEFT_TYPE& left, RIGHT_TYPE& right, RESULT_TYPE& result,
25 common::ValueVector* leftValueVector, common::ValueVector* rightValueVector,
26 common::ValueVector* resultValueVector, uint64_t /*resultPos*/, void* /*dataPtr*/) {
27 OP::operation(left, right, result, *leftValueVector, *rightValueVector, *resultValueVector);
28 }
29};
30
32 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename RESULT_TYPE, typename OP>
33 static void operation(LEFT_TYPE& left, RIGHT_TYPE& right, RESULT_TYPE& result,
34 common::ValueVector* leftValueVector, common::ValueVector* rightValueVector,
35 common::ValueVector* resultValueVector, uint64_t /*resultPos*/, void* dataPtr) {
36 OP::operation(left, right, result, *leftValueVector, *rightValueVector, *resultValueVector,
37 dataPtr);
38 }
39};
40
42 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename RESULT_TYPE, typename OP>
43 static inline void operation(LEFT_TYPE& left, RIGHT_TYPE& right, RESULT_TYPE& result,
44 common::ValueVector* leftValueVector, common::ValueVector* rightValueVector,
45 common::ValueVector* resultValueVector, uint64_t resultPos, void* /*dataPtr*/) {
46 OP::operation(left, right, result, *leftValueVector, *rightValueVector, *resultValueVector,
47 resultPos);
48 }
49};
50
52 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename RESULT_TYPE, typename OP>
53 static inline void operation(LEFT_TYPE& left, RIGHT_TYPE& right, RESULT_TYPE& result,
54 common::ValueVector* /*leftValueVector*/, common::ValueVector* /*rightValueVector*/,
55 common::ValueVector* resultValueVector, uint64_t /*resultPos*/, void* /*dataPtr*/) {
56 OP::operation(left, right, result, *resultValueVector);
57 }
58};
59
61 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename RESULT_TYPE, typename OP>
62 static inline void operation(LEFT_TYPE& left, RIGHT_TYPE& right, RESULT_TYPE& result,
63 common::ValueVector* leftValueVector, common::ValueVector* rightValueVector,
64 common::ValueVector* /*resultValueVector*/, uint64_t /*resultPos*/, void* /*dataPtr*/) {
65 OP::operation(left, right, result, leftValueVector, rightValueVector);
66 }
67};
68
70 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename RESULT_TYPE, typename OP>
71 static inline void operation(LEFT_TYPE& left, RIGHT_TYPE& right, RESULT_TYPE& result,
72 common::ValueVector* /*leftValueVector*/, common::ValueVector* /*rightValueVector*/,
73 common::ValueVector* /*resultValueVector*/, uint64_t /*resultPos*/, void* dataPtr) {
74 OP::operation(left, right, result, dataPtr);
75 }
76};
77
79 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename OP>
80 static void operation(LEFT_TYPE& left, RIGHT_TYPE& right, uint8_t& result,
81 common::ValueVector* leftValueVector, common::ValueVector* rightValueVector,
82 void* dataPtr) {
83 OP::operation(left, right, result, *leftValueVector, *rightValueVector, *leftValueVector,
84 dataPtr);
85 }
86};
87
89
90 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename RESULT_TYPE, typename FUNC,
91 typename OP_WRAPPER>
92 static inline void executeOnValue(common::ValueVector& left, common::ValueVector& right,
93 common::ValueVector& resultValueVector, uint64_t lPos, uint64_t rPos, uint64_t resPos,
94 void* dataPtr) {
95 OP_WRAPPER::template operation<LEFT_TYPE, RIGHT_TYPE, RESULT_TYPE, FUNC>(
96 ((LEFT_TYPE*)left.getData())[lPos], ((RIGHT_TYPE*)right.getData())[rPos],
97 ((RESULT_TYPE*)resultValueVector.getData())[resPos], &left, &right, &resultValueVector,
98 resPos, dataPtr);
99 }
100
101 static inline std::tuple<common::sel_t, common::sel_t, common::sel_t> getSelectedPositions(
102 common::SelectionVector* leftSelVector, common::SelectionVector* rightSelVector,
103 common::SelectionVector* resultSelVector, common::sel_t selPos, bool leftFlat,
104 bool rightFlat) {
105 common::sel_t lPos = (*leftSelVector)[leftFlat ? 0 : selPos];
106 common::sel_t rPos = (*rightSelVector)[rightFlat ? 0 : selPos];
107 common::sel_t resPos = (*resultSelVector)[leftFlat && rightFlat ? 0 : selPos];
108 return {lPos, rPos, resPos};
109 }
110
111 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename RESULT_TYPE, typename FUNC,
112 typename OP_WRAPPER>
114 common::SelectionVector* leftSelVector, common::ValueVector& right,
115 common::SelectionVector* rightSelVector, common::ValueVector& result,
116 common::SelectionVector* resultSelVector, void* dataPtr) {
117 const bool leftFlat = left.state->isFlat();
118 const bool rightFlat = right.state->isFlat();
119
120 const bool allNullsGuaranteed = (rightFlat && right.isNull((*rightSelVector)[0])) ||
121 (leftFlat && left.isNull((*leftSelVector)[0]));
122 if (allNullsGuaranteed) {
123 result.setAllNull();
124 } else {
125 const bool noNullsGuaranteed = (leftFlat || left.hasNoNullsGuarantee()) &&
126 (rightFlat || right.hasNoNullsGuarantee());
127 if (noNullsGuaranteed) {
128 result.setAllNonNull();
129 }
130
131 const auto numSelectedValues =
132 leftFlat ? rightSelVector->getSelSize() : leftSelVector->getSelSize();
133 for (common::sel_t selPos = 0; selPos < numSelectedValues; ++selPos) {
134 auto [lPos, rPos, resPos] = getSelectedPositions(leftSelVector, rightSelVector,
135 resultSelVector, selPos, leftFlat, rightFlat);
136 if (noNullsGuaranteed) {
138 right, result, lPos, rPos, resPos, dataPtr);
139 } else {
140 result.setNull(resPos, left.isNull(lPos) || right.isNull(rPos));
141 if (!result.isNull(resPos)) {
143 right, result, lPos, rPos, resPos, dataPtr);
144 }
145 }
146 }
147 }
148 }
149
150 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename RESULT_TYPE, typename FUNC,
151 typename OP_WRAPPER>
153 common::ValueVector& right, common::SelectionVector* rightSelVector,
154 common::ValueVector& result, common::SelectionVector* resultSelVector, void* dataPtr) {
155 result.resetAuxiliaryBuffer();
157 leftSelVector, right, rightSelVector, result, resultSelVector, dataPtr);
158 }
159
160 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename RESULT_TYPE, typename FUNC>
161 static void execute(common::ValueVector& left, common::SelectionVector* leftSelVector,
162 common::ValueVector& right, common::SelectionVector* rightSelVector,
163 common::ValueVector& result, common::SelectionVector* resultSelVector) {
165 leftSelVector, right, rightSelVector, result, resultSelVector, nullptr /* dataPtr */);
166 }
167
169 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename OP>
170 static inline void operation(LEFT_TYPE& left, RIGHT_TYPE& right, uint8_t& result,
171 common::ValueVector* /*leftValueVector*/, common::ValueVector* /*rightValueVector*/,
172 void* /*dataPtr*/) {
173 OP::operation(left, right, result);
174 }
175 };
176
178 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename OP>
179 static inline void operation(LEFT_TYPE& left, RIGHT_TYPE& right, uint8_t& result,
180 common::ValueVector* leftValueVector, common::ValueVector* rightValueVector,
181 void* /*dataPtr*/) {
182 OP::operation(left, right, result, leftValueVector, rightValueVector);
183 }
184 };
185
186 template<class LEFT_TYPE, class RIGHT_TYPE, class FUNC, typename SELECT_WRAPPER>
187 static void selectOnValue(common::ValueVector& left, common::ValueVector& right, uint64_t lPos,
188 uint64_t rPos, uint64_t resPos, uint64_t& numSelectedValues,
189 std::span<common::sel_t> selectedPositionsBuffer, void* dataPtr) {
190 uint8_t resultValue = 0;
191 SELECT_WRAPPER::template operation<LEFT_TYPE, RIGHT_TYPE, FUNC>(
192 ((LEFT_TYPE*)left.getData())[lPos], ((RIGHT_TYPE*)right.getData())[rPos], resultValue,
193 &left, &right, dataPtr);
194 selectedPositionsBuffer[numSelectedValues] = resPos;
195 numSelectedValues += (resultValue == true);
196 }
197
198 template<class LEFT_TYPE, class RIGHT_TYPE, class FUNC, typename SELECT_WRAPPER>
200 void* dataPtr) {
201 auto lPos = left.state->getSelVector()[0];
202 auto rPos = right.state->getSelVector()[0];
203 uint8_t resultValue = 0;
204 if (!left.isNull(lPos) && !right.isNull(rPos)) {
205 SELECT_WRAPPER::template operation<LEFT_TYPE, RIGHT_TYPE, FUNC>(
206 ((LEFT_TYPE*)left.getData())[lPos], ((RIGHT_TYPE*)right.getData())[rPos],
207 resultValue, &left, &right, dataPtr);
208 }
209 return resultValue == true;
210 }
211
212 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename FUNC, typename SELECT_WRAPPER>
214 common::SelectionVector& selVector, void* dataPtr) {
215 auto lPos = left.state->getSelVector()[0];
216 uint64_t numSelectedValues = 0;
217 auto selectedPositionsBuffer = selVector.getMutableBuffer();
218 auto& rightSelVector = right.state->getSelVector();
219 if (left.isNull(lPos)) {
220 return numSelectedValues;
221 } else if (right.hasNoNullsGuarantee()) {
222 rightSelVector.forEach([&](auto i) {
224 numSelectedValues, selectedPositionsBuffer, dataPtr);
225 });
226 } else {
227 rightSelVector.forEach([&](auto i) {
228 if (!right.isNull(i)) {
230 i, numSelectedValues, selectedPositionsBuffer, dataPtr);
231 }
232 });
233 }
234 selVector.setSelSize(numSelectedValues);
235 return numSelectedValues > 0;
236 }
237
238 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename FUNC, typename SELECT_WRAPPER>
240 common::SelectionVector& selVector, void* dataPtr) {
241 auto rPos = right.state->getSelVector()[0];
242 uint64_t numSelectedValues = 0;
243 auto selectedPositionsBuffer = selVector.getMutableBuffer();
244 auto& leftSelVector = left.state->getSelVector();
245 if (right.isNull(rPos)) {
246 return numSelectedValues;
247 } else if (left.hasNoNullsGuarantee()) {
248 leftSelVector.forEach([&](auto i) {
250 numSelectedValues, selectedPositionsBuffer, dataPtr);
251 });
252 } else {
253 leftSelVector.forEach([&](auto i) {
254 if (!left.isNull(i)) {
256 i, numSelectedValues, selectedPositionsBuffer, dataPtr);
257 }
258 });
259 }
260 selVector.setSelSize(numSelectedValues);
261 return numSelectedValues > 0;
262 }
263
264 // Right, left, and result vectors share the same selectedPositions.
265 template<class LEFT_TYPE, class RIGHT_TYPE, class FUNC, typename SELECT_WRAPPER>
267 common::SelectionVector& selVector, void* dataPtr) {
268 uint64_t numSelectedValues = 0;
269 auto selectedPositionsBuffer = selVector.getMutableBuffer();
270 auto& leftSelVector = left.state->getSelVector();
271 if (left.hasNoNullsGuarantee() && right.hasNoNullsGuarantee()) {
272 leftSelVector.forEach([&](auto i) {
274 numSelectedValues, selectedPositionsBuffer, dataPtr);
275 });
276 } else {
277 leftSelVector.forEach([&](auto i) {
278 auto isNull = left.isNull(i) || right.isNull(i);
279 if (!isNull) {
281 numSelectedValues, selectedPositionsBuffer, dataPtr);
282 }
283 });
284 }
285 selVector.setSelSize(numSelectedValues);
286 return numSelectedValues > 0;
287 }
288
289 // BOOLEAN (AND, OR, XOR)
290 template<class LEFT_TYPE, class RIGHT_TYPE, class FUNC,
291 typename OP_WRAPPER = BinarySelectWrapper>
293 common::SelectionVector& selVector, void* dataPtr) {
294 if (left.state->isFlat() && right.state->isFlat()) {
296 } else if (left.state->isFlat() && !right.state->isFlat()) {
298 dataPtr);
299 } else if (!left.state->isFlat() && right.state->isFlat()) {
301 dataPtr);
302 } else {
304 dataPtr);
305 }
306 }
307
308 // COMPARISON (GT, GTE, LT, LTE, EQ, NEQ)
309 template<class LEFT_TYPE, class RIGHT_TYPE, class FUNC>
311 common::SelectionVector& selVector, void* dataPtr) {
312 if (left.state->isFlat() && right.state->isFlat()) {
314 right, dataPtr);
315 } else if (left.state->isFlat() && !right.state->isFlat()) {
317 left, right, selVector, dataPtr);
318 } else if (!left.state->isFlat() && right.state->isFlat()) {
320 left, right, selVector, dataPtr);
321 } else {
323 left, right, selVector, dataPtr);
324 }
325 }
326};
327
328} // namespace function
329} // namespace kuzu
Definition sel_vector.h:98
std::span< sel_t > getMutableBuffer() const
Definition sel_vector.h:145
void setSelSize(sel_t size)
Definition sel_vector.h:149
sel_t getSelSize() const
Definition sel_vector.h:68
Definition value_vector.h:21
uint8_t * getData() const
Definition value_vector.h:119
void setAllNonNull()
Definition value_vector.h:76
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
uint64_t sel_t
Definition types.h:30
Definition binary_function_executor.h:6
Definition array_utils.h:7
Definition binary_function_executor.h:60
static void operation(LEFT_TYPE &left, RIGHT_TYPE &right, RESULT_TYPE &result, common::ValueVector *leftValueVector, common::ValueVector *rightValueVector, common::ValueVector *, uint64_t, void *)
Definition binary_function_executor.h:62
static void operation(LEFT_TYPE &left, RIGHT_TYPE &right, uint8_t &result, common::ValueVector *leftValueVector, common::ValueVector *rightValueVector, void *)
Definition binary_function_executor.h:179
Definition binary_function_executor.h:168
static void operation(LEFT_TYPE &left, RIGHT_TYPE &right, uint8_t &result, common::ValueVector *, common::ValueVector *, void *)
Definition binary_function_executor.h:170
Definition binary_function_executor.h:88
static void executeOnSelectedValues(common::ValueVector &left, common::SelectionVector *leftSelVector, common::ValueVector &right, common::SelectionVector *rightSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition binary_function_executor.h:113
static void executeOnValue(common::ValueVector &left, common::ValueVector &right, common::ValueVector &resultValueVector, uint64_t lPos, uint64_t rPos, uint64_t resPos, void *dataPtr)
Definition binary_function_executor.h:92
static void selectOnValue(common::ValueVector &left, common::ValueVector &right, uint64_t lPos, uint64_t rPos, uint64_t resPos, uint64_t &numSelectedValues, std::span< common::sel_t > selectedPositionsBuffer, void *dataPtr)
Definition binary_function_executor.h:187
static uint64_t selectBothFlat(common::ValueVector &left, common::ValueVector &right, void *dataPtr)
Definition binary_function_executor.h:199
static bool selectUnFlatFlat(common::ValueVector &left, common::ValueVector &right, common::SelectionVector &selVector, void *dataPtr)
Definition binary_function_executor.h:239
static void executeSwitch(common::ValueVector &left, common::SelectionVector *leftSelVector, common::ValueVector &right, common::SelectionVector *rightSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition binary_function_executor.h:152
static bool select(common::ValueVector &left, common::ValueVector &right, common::SelectionVector &selVector, void *dataPtr)
Definition binary_function_executor.h:292
static void execute(common::ValueVector &left, common::SelectionVector *leftSelVector, common::ValueVector &right, common::SelectionVector *rightSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector)
Definition binary_function_executor.h:161
static bool selectFlatUnFlat(common::ValueVector &left, common::ValueVector &right, common::SelectionVector &selVector, void *dataPtr)
Definition binary_function_executor.h:213
static bool selectBothUnFlat(common::ValueVector &left, common::ValueVector &right, common::SelectionVector &selVector, void *dataPtr)
Definition binary_function_executor.h:266
static std::tuple< common::sel_t, common::sel_t, common::sel_t > getSelectedPositions(common::SelectionVector *leftSelVector, common::SelectionVector *rightSelVector, common::SelectionVector *resultSelVector, common::sel_t selPos, bool leftFlat, bool rightFlat)
Definition binary_function_executor.h:101
static bool selectComparison(common::ValueVector &left, common::ValueVector &right, common::SelectionVector &selVector, void *dataPtr)
Definition binary_function_executor.h:310
Definition binary_function_executor.h:13
static void operation(LEFT_TYPE &left, RIGHT_TYPE &right, RESULT_TYPE &result, common::ValueVector *, common::ValueVector *, common::ValueVector *, uint64_t, void *)
Definition binary_function_executor.h:15
Definition binary_function_executor.h:41
static void operation(LEFT_TYPE &left, RIGHT_TYPE &right, RESULT_TYPE &result, common::ValueVector *leftValueVector, common::ValueVector *rightValueVector, common::ValueVector *resultValueVector, uint64_t resultPos, void *)
Definition binary_function_executor.h:43
Definition binary_function_executor.h:22
static void operation(LEFT_TYPE &left, RIGHT_TYPE &right, RESULT_TYPE &result, common::ValueVector *leftValueVector, common::ValueVector *rightValueVector, common::ValueVector *resultValueVector, uint64_t, void *)
Definition binary_function_executor.h:24
Definition binary_function_executor.h:31
static void operation(LEFT_TYPE &left, RIGHT_TYPE &right, RESULT_TYPE &result, common::ValueVector *leftValueVector, common::ValueVector *rightValueVector, common::ValueVector *resultValueVector, uint64_t, void *dataPtr)
Definition binary_function_executor.h:33
Definition binary_function_executor.h:78
static void operation(LEFT_TYPE &left, RIGHT_TYPE &right, uint8_t &result, common::ValueVector *leftValueVector, common::ValueVector *rightValueVector, void *dataPtr)
Definition binary_function_executor.h:80
Definition binary_function_executor.h:51
static void operation(LEFT_TYPE &left, RIGHT_TYPE &right, RESULT_TYPE &result, common::ValueVector *, common::ValueVector *, common::ValueVector *resultValueVector, uint64_t, void *)
Definition binary_function_executor.h:53
Definition binary_function_executor.h:69
static void operation(LEFT_TYPE &left, RIGHT_TYPE &right, RESULT_TYPE &result, common::ValueVector *, common::ValueVector *, common::ValueVector *, uint64_t, void *dataPtr)
Definition binary_function_executor.h:71