Lbug C++ API
Loading...
Searching...
No Matches
scalar_function.h
Go to the documentation of this file.
1#pragma once
2
5#include "function.h"
9
10namespace lbug {
11namespace function {
12
13// Evaluate function at compile time, e.g. struct_extraction.
15 std::function<void(FunctionBindData*, const std::vector<std::shared_ptr<common::ValueVector>>&,
16 std::shared_ptr<common::ValueVector>&)>;
17// Execute function.
19 std::function<void(const std::vector<std::shared_ptr<common::ValueVector>>&,
20 const std::vector<common::SelectionVector*>&, common::ValueVector&,
22// Execute boolean function and write result to selection vector. Fast path for filter.
23using scalar_func_select_t = std::function<bool(
24 const std::vector<std::shared_ptr<common::ValueVector>>&, common::SelectionVector&, void*)>;
25
30 bool isListLambda = false;
31 bool isVarLength = false;
32
33 ScalarFunction() = default;
34 ScalarFunction(std::string name, std::vector<common::LogicalTypeID> parameterTypeIDs,
37 ScalarFunction(std::string name, std::vector<common::LogicalTypeID> parameterTypeIDs,
40 execFunc{std::move(execFunc)} {}
46
47 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC>
48 static void TernaryExecFunction(const std::vector<std::shared_ptr<common::ValueVector>>& params,
49 const std::vector<common::SelectionVector*>& paramSelVectors, common::ValueVector& result,
50 common::SelectionVector* resultSelVector, void* dataPtr = nullptr) {
51 KU_ASSERT(params.size() == 3);
52 TernaryFunctionExecutor::executeSwitch<A_TYPE, B_TYPE, C_TYPE, RESULT_TYPE, FUNC,
53 TernaryFunctionWrapper>(*params[0], paramSelVectors[0], *params[1], paramSelVectors[1],
54 *params[2], paramSelVectors[2], result, resultSelVector, dataPtr);
55 }
56
57 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC>
59 const std::vector<std::shared_ptr<common::ValueVector>>& params,
60 const std::vector<common::SelectionVector*>& paramSelVectors, common::ValueVector& result,
61 common::SelectionVector* resultSelVector, void* dataPtr = nullptr) {
62 KU_ASSERT(params.size() == 3);
63 TernaryFunctionExecutor::executeSwitch<A_TYPE, B_TYPE, C_TYPE, RESULT_TYPE, FUNC,
64 TernaryStringFunctionWrapper>(*params[0], paramSelVectors[0], *params[1],
65 paramSelVectors[1], *params[2], paramSelVectors[2], result, resultSelVector, dataPtr);
66 }
67
68 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC>
70 const std::vector<std::shared_ptr<common::ValueVector>>& params,
71 const std::vector<common::SelectionVector*>& paramSelVectors, common::ValueVector& result,
72 common::SelectionVector* resultSelVector, void* dataPtr) {
73 TernaryFunctionExecutor::executeSwitch<A_TYPE, B_TYPE, C_TYPE, RESULT_TYPE, FUNC,
74 TernaryRegexFunctionWrapper>(*params[0], paramSelVectors[0], *params[1],
75 paramSelVectors[1], *params[2], paramSelVectors[2], result, resultSelVector, dataPtr);
76 }
77
78 template<typename A_TYPE, typename B_TYPE, typename C_TYPE, typename RESULT_TYPE, typename FUNC>
80 const std::vector<std::shared_ptr<common::ValueVector>>& params,
81 const std::vector<common::SelectionVector*>& paramSelVectors, common::ValueVector& result,
82 common::SelectionVector* resultSelVector, void* dataPtr = nullptr) {
83 KU_ASSERT(params.size() == 3);
84 TernaryFunctionExecutor::executeSwitch<A_TYPE, B_TYPE, C_TYPE, RESULT_TYPE, FUNC,
85 TernaryListFunctionWrapper>(*params[0], paramSelVectors[0], *params[1],
86 paramSelVectors[1], *params[2], paramSelVectors[2], result, resultSelVector, dataPtr);
87 }
88
89 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename RESULT_TYPE, typename FUNC>
90 static void BinaryExecFunction(const std::vector<std::shared_ptr<common::ValueVector>>& params,
91 const std::vector<common::SelectionVector*>& paramSelVectors, common::ValueVector& result,
92 common::SelectionVector* resultSelVector, void* /*dataPtr*/ = nullptr) {
93 KU_ASSERT(params.size() == 2);
95 paramSelVectors[0], *params[1], paramSelVectors[1], result, resultSelVector);
96 }
97
98 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename RESULT_TYPE, typename FUNC>
100 const std::vector<std::shared_ptr<common::ValueVector>>& params,
101 const std::vector<common::SelectionVector*>& paramSelVectors, common::ValueVector& result,
102 common::SelectionVector* resultSelVector, void* dataPtr = nullptr) {
103 KU_ASSERT(params.size() == 2);
104 BinaryFunctionExecutor::executeSwitch<LEFT_TYPE, RIGHT_TYPE, RESULT_TYPE, FUNC,
105 BinaryStringFunctionWrapper>(*params[0], paramSelVectors[0], *params[1],
106 paramSelVectors[1], result, resultSelVector, dataPtr);
107 }
108
109 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename RESULT_TYPE, typename FUNC>
111 const std::vector<std::shared_ptr<common::ValueVector>>& params,
112 const std::vector<common::SelectionVector*>& paramSelVectors, common::ValueVector& result,
113 common::SelectionVector* resultSelVector, void* dataPtr = nullptr) {
114 KU_ASSERT(params.size() == 2);
115 BinaryFunctionExecutor::executeSwitch<LEFT_TYPE, RIGHT_TYPE, RESULT_TYPE, FUNC,
116 BinaryListStructFunctionWrapper>(*params[0], paramSelVectors[0], *params[1],
117 paramSelVectors[1], result, resultSelVector, dataPtr);
118 }
119
120 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename RESULT_TYPE, typename FUNC>
122 const std::vector<std::shared_ptr<common::ValueVector>>& params,
123 const std::vector<common::SelectionVector*>& paramSelVectors, common::ValueVector& result,
124 common::SelectionVector* resultSelVector, void* dataPtr) {
125 KU_ASSERT(params.size() == 2);
126 BinaryFunctionExecutor::executeSwitch<LEFT_TYPE, RIGHT_TYPE, RESULT_TYPE, FUNC,
127 BinaryMapCreationFunctionWrapper>(*params[0], paramSelVectors[0], *params[1],
128 paramSelVectors[1], result, resultSelVector, dataPtr);
129 }
130
131 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename FUNC>
133 const std::vector<std::shared_ptr<common::ValueVector>>& params,
134 common::SelectionVector& selVector, void* dataPtr) {
135 KU_ASSERT(params.size() == 2);
137 selVector, dataPtr);
138 }
139
140 template<typename LEFT_TYPE, typename RIGHT_TYPE, typename FUNC>
142 const std::vector<std::shared_ptr<common::ValueVector>>& params,
143 common::SelectionVector& selVector, void* dataPtr) {
144 KU_ASSERT(params.size() == 2);
145 return BinaryFunctionExecutor::select<LEFT_TYPE, RIGHT_TYPE, FUNC,
146 BinarySelectWithBindDataWrapper>(*params[0], *params[1], selVector, dataPtr);
147 }
148
149 template<typename OPERAND_TYPE, typename RESULT_TYPE, typename FUNC,
150 typename EXECUTOR = UnaryFunctionExecutor>
151 static void UnaryExecFunction(const std::vector<std::shared_ptr<common::ValueVector>>& params,
152 const std::vector<common::SelectionVector*>& paramSelVectors, common::ValueVector& result,
153 common::SelectionVector* resultSelVector, void* dataPtr) {
154 KU_ASSERT(params.size() == 1);
155 EXECUTOR::template executeSwitch<OPERAND_TYPE, RESULT_TYPE, FUNC, UnaryFunctionWrapper>(
156 *params[0], paramSelVectors[0], result, resultSelVector, dataPtr);
157 }
158
159 template<typename OPERAND_TYPE, typename RESULT_TYPE, typename FUNC>
161 const std::vector<std::shared_ptr<common::ValueVector>>& params,
162 const std::vector<common::SelectionVector*>& paramSelVectors, common::ValueVector& result,
163 common::SelectionVector* resultSelVector, void* dataPtr) {
164 KU_ASSERT(params.size() == 1);
166 paramSelVectors[0], result, resultSelVector, dataPtr);
167 }
168
169 template<typename OPERAND_TYPE, typename RESULT_TYPE, typename FUNC>
171 const std::vector<std::shared_ptr<common::ValueVector>>& params,
172 const std::vector<common::SelectionVector*>& paramSelVectors, common::ValueVector& result,
173 common::SelectionVector* resultSelVector, void* /*dataPtr*/ = nullptr) {
174 KU_ASSERT(params.size() == 1);
175 UnaryFunctionExecutor::executeSwitch<OPERAND_TYPE, RESULT_TYPE, FUNC,
176 UnaryStringFunctionWrapper>(*params[0], paramSelVectors[0], result, resultSelVector,
177 nullptr /* dataPtr */);
178 }
179
180 template<typename OPERAND_TYPE, typename RESULT_TYPE, typename FUNC,
181 typename EXECUTOR = UnaryFunctionExecutor>
183 const std::vector<std::shared_ptr<common::ValueVector>>& params,
184 const std::vector<common::SelectionVector*>& paramSelVectors, common::ValueVector& result,
185 common::SelectionVector* resultSelVector, void* dataPtr) {
186 KU_ASSERT(params.size() == 1);
187 EXECUTOR::template executeSwitch<OPERAND_TYPE, RESULT_TYPE, FUNC,
188 UnaryCastStringFunctionWrapper>(*params[0], paramSelVectors[0], result, resultSelVector,
189 dataPtr);
190 }
191
192 template<typename OPERAND_TYPE, typename RESULT_TYPE, typename FUNC,
193 typename EXECUTOR = UnaryFunctionExecutor, typename WRAPPER = UnaryCastFunctionWrapper>
195 const std::vector<std::shared_ptr<common::ValueVector>>& params,
196 const std::vector<common::SelectionVector*>& paramSelVectors, common::ValueVector& result,
197 common::SelectionVector* resultSelVector, void* dataPtr) {
198 KU_ASSERT(params.size() == 1);
199 EXECUTOR::template executeSwitch<OPERAND_TYPE, RESULT_TYPE, FUNC, WRAPPER>(*params[0],
200 paramSelVectors[0], result, resultSelVector, dataPtr);
201 }
202
203 template<typename OPERAND_TYPE, typename RESULT_TYPE, typename FUNC,
204 typename EXECUTOR = UnaryFunctionExecutor>
206 const std::vector<std::shared_ptr<common::ValueVector>>& params,
207 const std::vector<common::SelectionVector*>& paramSelVectors, common::ValueVector& result,
208 common::SelectionVector* resultSelVector, void* dataPtr) {
209 KU_ASSERT(params.size() == 1);
210 EXECUTOR::template executeSwitch<OPERAND_TYPE, RESULT_TYPE, FUNC,
211 UnaryNestedTypeFunctionWrapper>(*params[0], paramSelVectors[0], result, resultSelVector,
212 dataPtr);
213 }
214
215 template<typename OPERAND_TYPE, typename RESULT_TYPE, typename FUNC,
216 typename EXECUTOR = UnaryFunctionExecutor>
218 const std::vector<std::shared_ptr<common::ValueVector>>& params,
219 const std::vector<common::SelectionVector*>& paramSelVectors, common::ValueVector& result,
220 common::SelectionVector* resultSelVector, void* dataPtr) {
221 KU_ASSERT(params.size() == 1);
222 EXECUTOR::template executeSwitch<OPERAND_TYPE, RESULT_TYPE, FUNC, SetSeedFunctionWrapper>(
223 *params[0], paramSelVectors[0], result, resultSelVector, dataPtr);
224 }
225
226 template<typename RESULT_TYPE, typename FUNC>
228 [[maybe_unused]] const std::vector<std::shared_ptr<common::ValueVector>>& params,
229 [[maybe_unused]] const std::vector<common::SelectionVector*>& paramSelVectors,
230 common::ValueVector& result, common::SelectionVector* resultSelVector,
231 void* /*dataPtr*/ = nullptr) {
232 KU_ASSERT(params.empty() && paramSelVectors.empty());
234 }
235
236 template<typename RESULT_TYPE, typename FUNC>
238 [[maybe_unused]] const std::vector<std::shared_ptr<common::ValueVector>>& params,
239 [[maybe_unused]] const std::vector<common::SelectionVector*>& paramSelVectors,
240 common::ValueVector& result, common::SelectionVector* resultSelVector, void* dataPtr) {
241 KU_ASSERT(params.empty() && paramSelVectors.empty());
242 PointerFunctionExecutor::execute<RESULT_TYPE, FUNC>(result, *resultSelVector, dataPtr);
243 }
244
245 virtual std::unique_ptr<ScalarFunction> copy() const {
246 return std::make_unique<ScalarFunction>(*this);
247 }
248};
249
250} // namespace function
251} // namespace lbug
#define LBUG_API
Definition api.h:25
#define KU_ASSERT(condition)
Definition assert.h:24
Definition sel_vector.h:96
Definition value_vector.h:21
LogicalTypeID
Definition types.h:184
Definition binary_function_executor.h:6
std::function< void(const std::vector< std::shared_ptr< common::ValueVector > > &, const std::vector< common::SelectionVector * > &, common::ValueVector &, common::SelectionVector *, void *)> scalar_func_exec_t
Definition scalar_function.h:18
std::function< void(FunctionBindData *, const std::vector< std::shared_ptr< common::ValueVector > > &, std::shared_ptr< common::ValueVector > &)> scalar_func_compile_exec_t
Definition scalar_function.h:14
std::function< bool( const std::vector< std::shared_ptr< common::ValueVector > > &, common::SelectionVector &, void *)> scalar_func_select_t
Definition scalar_function.h:23
Definition array_utils.h:7
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
Definition binary_function_executor.h:22
Definition binary_function_executor.h:31
Definition binary_function_executor.h:78
Definition binary_function_executor.h:51
static void execute(common::ValueVector &result, common::SelectionVector &sel)
Definition const_function_executor.h:11
Definition function.h:14
std::vector< common::LogicalTypeID > parameterTypeIDs
Definition function.h:63
std::string name
Definition function.h:62
static void execute(common::ValueVector &result, common::SelectionVector &sel, void *dataPtr)
Definition pointer_function_executor.h:10
static void NullaryAuxilaryExecFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition scalar_function.h:237
static void BinaryExecWithBindData(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition scalar_function.h:121
static void UnaryStringExecFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *=nullptr)
Definition scalar_function.h:170
static void BinaryStringExecFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr=nullptr)
Definition scalar_function.h:99
scalar_func_select_t selectFunc
Definition scalar_function.h:28
virtual std::unique_ptr< ScalarFunction > copy() const
Definition scalar_function.h:245
ScalarFunction(std::string name, std::vector< common::LogicalTypeID > parameterTypeIDs, common::LogicalTypeID returnTypeID, scalar_func_exec_t execFunc)
Definition scalar_function.h:37
ScalarFunction(std::string name, std::vector< common::LogicalTypeID > parameterTypeIDs, common::LogicalTypeID returnTypeID, scalar_func_exec_t execFunc, scalar_func_select_t selectFunc)
Definition scalar_function.h:41
static void UnarySequenceExecFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition scalar_function.h:160
bool isVarLength
Definition scalar_function.h:31
static void TernaryRegexExecFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition scalar_function.h:69
static void BinaryExecFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *=nullptr)
Definition scalar_function.h:90
ScalarFunction(std::string name, std::vector< common::LogicalTypeID > parameterTypeIDs, common::LogicalTypeID returnTypeID)
Definition scalar_function.h:34
static void UnarySetSeedFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition scalar_function.h:217
static void NullaryExecFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *=nullptr)
Definition scalar_function.h:227
static void UnaryExecNestedTypeFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition scalar_function.h:205
static void TernaryStringExecFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr=nullptr)
Definition scalar_function.h:58
static bool BinarySelectFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, common::SelectionVector &selVector, void *dataPtr)
Definition scalar_function.h:132
scalar_func_exec_t execFunc
Definition scalar_function.h:27
static bool BinarySelectWithBindData(const std::vector< std::shared_ptr< common::ValueVector > > &params, common::SelectionVector &selVector, void *dataPtr)
Definition scalar_function.h:141
static void UnaryExecFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition scalar_function.h:151
static void UnaryCastExecFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition scalar_function.h:194
static void BinaryExecListStructFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr=nullptr)
Definition scalar_function.h:110
bool isListLambda
Definition scalar_function.h:30
static void TernaryExecListStructFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr=nullptr)
Definition scalar_function.h:79
static void UnaryCastStringExecFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition scalar_function.h:182
scalar_func_compile_exec_t compileFunc
Definition scalar_function.h:29
static void TernaryExecFunction(const std::vector< std::shared_ptr< common::ValueVector > > &params, const std::vector< common::SelectionVector * > &paramSelVectors, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr=nullptr)
Definition scalar_function.h:48
ScalarOrAggregateFunction()
Definition function.h:91
common::LogicalTypeID returnTypeID
Definition function.h:88
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
Definition ternary_function_executor.h:8
Definition ternary_function_executor.h:32
Definition ternary_function_executor.h:24
Definition ternary_function_executor.h:16
Definition unary_function_executor.h:82
Definition unary_function_executor.h:46
Definition unary_function_executor.h:114
static void executeSequence(common::ValueVector &operand, common::SelectionVector *operandSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition unary_function_executor.h:186
static void executeSwitch(common::ValueVector &operand, common::SelectionVector *operandSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition unary_function_executor.h:160
Definition unary_function_executor.h:60
Definition unary_function_executor.h:35