19 #include <boost/algorithm/string/join.hpp>
28 const std::string& name) {
36 const std::string& name) {
45 const std::string& name) {
46 std::vector<ExtensionFunction> ext_funcs = {};
49 for (
auto funcs : collections) {
50 const auto it = funcs->find(uname);
51 if (it == funcs->end()) {
54 auto ext_func_sigs = it->second;
55 std::copy(ext_func_sigs.begin(), ext_func_sigs.end(), std::back_inserter(ext_funcs));
61 const std::string& name,
63 std::vector<ExtensionFunction> ext_funcs = {};
66 for (
auto funcs : collections) {
67 const auto it = funcs->find(uname);
68 if (it == funcs->end()) {
71 auto ext_func_sigs = it->second;
72 std::copy_if(ext_func_sigs.begin(),
74 std::back_inserter(ext_funcs),
75 [arity](
auto sig) {
return arity == sig.getArgs().size(); });
81 const std::string& name,
84 std::vector<ExtensionFunction> ext_funcs = {};
87 for (
auto funcs : collections) {
88 const auto it = funcs->find(uname);
89 if (it == funcs->end()) {
92 auto ext_func_sigs = it->second;
93 std::copy_if(ext_func_sigs.begin(),
95 std::back_inserter(ext_funcs),
96 [arity, rtype](
auto sig) {
103 if (arity > sig.getArgs().size()) {
156 return "array_float";
158 return "array_double";
162 return "geo_linestring";
164 return "geo_polygon";
180 switch (ext_arg_type) {
197 <<
"` cannot be converted to SQLTypeInfo. Returning nulltype.";
203 const std::vector<ExtensionFunction>& ext_funcs,
206 for (
auto sig : ext_funcs) {
207 r += tab + sig.toString() +
"\n";
213 const std::vector<SQLTypeInfo>& arg_types) {
215 for (
auto sig = arg_types.begin(); sig != arg_types.end();) {
216 r += sig->get_type_name();
218 if (sig != arg_types.end()) {
226 const std::vector<ExtArgumentType>& sig_types) {
228 for (
auto t = sig_types.begin(); t != sig_types.end();) {
231 if (t != sig_types.end()) {
245 const std::unordered_set<std::string>& udf_decls) {
246 std::vector<std::string> declarations;
248 const auto& signatures = kv.second;
249 CHECK(!signatures.empty());
250 for (
const auto& signature : kv.second) {
253 if (!udf_decls.empty() && udf_decls.find(signature.getName()) != udf_decls.end()) {
257 std::string decl_prefix{
"declare " +
serialize_type(signature.getRet()) +
" @" +
258 signature.getName()};
259 std::vector<std::string> arg_strs;
260 for (
const auto arg : signature.getArgs()) {
269 if (kv.second.isRuntime()) {
275 std::vector<std::string> arg_strs;
276 for (
const auto arg : kv.second.getArgs()) {
288 if (type_name ==
"bool" || type_name ==
"i1") {
291 if (type_name ==
"i8") {
294 if (type_name ==
"i16") {
297 if (type_name ==
"i32") {
300 if (type_name ==
"i64") {
303 if (type_name ==
"float") {
306 if (type_name ==
"double") {
309 if (type_name ==
"void") {
312 if (type_name ==
"i8*") {
315 if (type_name ==
"i16*") {
318 if (type_name ==
"i32*") {
321 if (type_name ==
"i64*") {
324 if (type_name ==
"float*") {
327 if (type_name ==
"double*") {
330 if (type_name ==
"array_i8") {
333 if (type_name ==
"array_i16") {
336 if (type_name ==
"array_i32") {
339 if (type_name ==
"array_i64") {
342 if (type_name ==
"array_float") {
345 if (type_name ==
"array_double") {
348 if (type_name ==
"geo_point") {
351 if (type_name ==
"geo_linestring") {
354 if (type_name ==
"geo_polygon") {
357 if (type_name ==
"cursor") {
366 const auto idx = str.find(
"__");
367 if (idx == std::string::npos) {
370 CHECK_GT(idx, std::string::size_type(0));
371 return str.substr(0, idx);
376 using SignatureMap = std::unordered_map<std::string, std::vector<ExtensionFunction>>;
379 const std::string& json_func_sigs) {
380 rapidjson::Document func_sigs;
381 func_sigs.Parse(json_func_sigs.c_str());
382 CHECK(func_sigs.IsArray());
383 for (
auto func_sigs_it = func_sigs.Begin(); func_sigs_it != func_sigs.End();
385 CHECK(func_sigs_it->IsObject());
388 std::vector<ExtArgumentType>
args;
389 const auto& args_serialized =
field(*func_sigs_it,
"args");
390 CHECK(args_serialized.IsArray());
391 for (
auto args_serialized_it = args_serialized.Begin();
392 args_serialized_it != args_serialized.End();
393 ++args_serialized_it) {
421 if (!json_func_sigs.empty()) {
431 if (!json_func_sigs.empty()) {
436 std::unordered_map<std::string, std::vector<ExtensionFunction>>
439 std::unordered_map<std::string, std::vector<ExtensionFunction>>
442 std::unordered_map<std::string, std::vector<ExtensionFunction>>
static void addUdfs(const std::string &json_func_sigs)
std::string drop_suffix(const std::string &str)
const std::vector< ExtArgumentType > & getArgs() const
const std::string & getName() const
static std::vector< ExtensionFunction > get_ext_funcs(const std::string &name)
static std::unordered_map< std::string, std::vector< ExtensionFunction > > udf_functions_
const ExtArgumentType getRet() const
static std::vector< ExtensionFunction > * get(const std::string &name)
static void clearRTUdfs()
const std::string json_str(const rapidjson::Value &obj) noexcept
static std::unordered_map< std::string, std::vector< ExtensionFunction > > rt_udf_functions_
static void add(const std::string &json_func_sigs)
std::unordered_map< std::string, std::vector< ExtensionFunction >> SignatureMap
std::string serialize_type(const ExtArgumentType type)
std::string toString() const
static std::unordered_map< std::string, std::vector< ExtensionFunction > > functions_
const rapidjson::Value & field(const rapidjson::Value &obj, const char field[]) noexcept
static std::vector< ExtensionFunction > * get_udf(const std::string &name)
ExtArgumentType deserialize_type(const std::string &type_name)
HOST DEVICE SQLTypes get_type() const
static void addCommon(std::unordered_map< std::string, std::vector< ExtensionFunction >> &sigs, const std::string &json_func_sigs)
SQLTypeInfoCore< ArrayContextTypeSizer, ExecutorTypePackaging, DateTimeFacilities > SQLTypeInfo
static std::string toString(const std::vector< ExtensionFunction > &ext_funcs, std::string tab="")
static std::vector< std::string > getLLVMDeclarations(const std::unordered_set< std::string > &udf_decls)
static std::unordered_map< std::string, TableFunction > functions_
SQLTypeInfo ext_arg_type_to_type_info(const ExtArgumentType ext_arg_type)
static void addRTUdfs(const std::string &json_func_sigs)