OmniSciDB  06b3bd477c
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ExtensionFunctionsWhitelist Class Reference

#include <ExtensionFunctionsWhitelist.h>

Static Public Member Functions

static void add (const std::string &json_func_sigs)
 
static void addUdfs (const std::string &json_func_sigs)
 
static void clearRTUdfs ()
 
static void addRTUdfs (const std::string &json_func_sigs)
 
static std::vector
< ExtensionFunction > * 
get (const std::string &name)
 
static std::vector
< ExtensionFunction > * 
get_udf (const std::string &name)
 
static std::vector
< ExtensionFunction
get_ext_funcs (const std::string &name)
 
static std::vector
< ExtensionFunction
get_ext_funcs (const std::string &name, size_t arity)
 
static std::vector
< ExtensionFunction
get_ext_funcs (const std::string &name, size_t arity, const SQLTypeInfo &rtype)
 
static std::string toString (const std::vector< ExtensionFunction > &ext_funcs, std::string tab="")
 
static std::string toString (const std::vector< SQLTypeInfo > &arg_types)
 
static std::string toString (const std::vector< ExtArgumentType > &sig_types)
 
static std::string toString (const ExtArgumentType &sig_type)
 
static std::vector< std::string > getLLVMDeclarations (const std::unordered_set< std::string > &udf_decls)
 

Static Private Member Functions

static void addCommon (std::unordered_map< std::string, std::vector< ExtensionFunction >> &sigs, const std::string &json_func_sigs)
 

Static Private Attributes

static std::unordered_map
< std::string, std::vector
< ExtensionFunction > > 
functions_
 
static std::unordered_map
< std::string, std::vector
< ExtensionFunction > > 
udf_functions_
 
static std::unordered_map
< std::string, std::vector
< ExtensionFunction > > 
rt_udf_functions_
 

Detailed Description

Definition at line 94 of file ExtensionFunctionsWhitelist.h.

Member Function Documentation

void ExtensionFunctionsWhitelist::add ( const std::string &  json_func_sigs)
static

Definition at line 506 of file ExtensionFunctionsWhitelist.cpp.

References addCommon(), and functions_.

Referenced by QueryRunner::QueryRunner::QueryRunner().

506  {
507  // Valid json_func_sigs example:
508  // [
509  // {
510  // "name":"sum",
511  // "ret":"i32",
512  // "args":[
513  // "i32",
514  // "i32"
515  // ]
516  // }
517  // ]
518 
519  addCommon(functions_, json_func_sigs);
520 }
static std::unordered_map< std::string, std::vector< ExtensionFunction > > functions_
static void addCommon(std::unordered_map< std::string, std::vector< ExtensionFunction >> &sigs, const std::string &json_func_sigs)

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void ExtensionFunctionsWhitelist::addCommon ( std::unordered_map< std::string, std::vector< ExtensionFunction >> &  sigs,
const std::string &  json_func_sigs 
)
staticprivate

Definition at line 480 of file ExtensionFunctionsWhitelist.cpp.

References run_benchmark_import::args, CHECK(), anonymous_namespace{ExtensionFunctionsWhitelist.cpp}::deserialize_type(), anonymous_namespace{ExtensionFunctionsWhitelist.cpp}::drop_suffix(), field(), json_str(), and to_upper().

Referenced by add(), addRTUdfs(), and addUdfs().

481  {
482  rapidjson::Document func_sigs;
483  func_sigs.Parse(json_func_sigs.c_str());
484  CHECK(func_sigs.IsArray());
485  for (auto func_sigs_it = func_sigs.Begin(); func_sigs_it != func_sigs.End();
486  ++func_sigs_it) {
487  CHECK(func_sigs_it->IsObject());
488  const auto name = json_str(field(*func_sigs_it, "name"));
489  const auto ret = deserialize_type(json_str(field(*func_sigs_it, "ret")));
490  std::vector<ExtArgumentType> args;
491  const auto& args_serialized = field(*func_sigs_it, "args");
492  CHECK(args_serialized.IsArray());
493  for (auto args_serialized_it = args_serialized.Begin();
494  args_serialized_it != args_serialized.End();
495  ++args_serialized_it) {
496  args.push_back(deserialize_type(json_str(*args_serialized_it)));
497  }
498  signatures[to_upper(drop_suffix(name))].emplace_back(name, args, ret);
499  }
500 }
const std::string json_str(const rapidjson::Value &obj) noexcept
Definition: JsonAccessors.h:44
const rapidjson::Value & field(const rapidjson::Value &obj, const char field[]) noexcept
Definition: JsonAccessors.h:31
CHECK(cgen_state)
ExtArgumentType deserialize_type(const std::string &type_name)
std::string to_upper(const std::string &str)

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void ExtensionFunctionsWhitelist::addRTUdfs ( const std::string &  json_func_sigs)
static

Definition at line 532 of file ExtensionFunctionsWhitelist.cpp.

References addCommon(), and rt_udf_functions_.

532  {
533  if (!json_func_sigs.empty()) {
534  addCommon(rt_udf_functions_, json_func_sigs);
535  }
536 }
static std::unordered_map< std::string, std::vector< ExtensionFunction > > rt_udf_functions_
static void addCommon(std::unordered_map< std::string, std::vector< ExtensionFunction >> &sigs, const std::string &json_func_sigs)

+ Here is the call graph for this function:

void ExtensionFunctionsWhitelist::addUdfs ( const std::string &  json_func_sigs)
static

Definition at line 522 of file ExtensionFunctionsWhitelist.cpp.

References addCommon(), and udf_functions_.

Referenced by QueryRunner::QueryRunner::QueryRunner().

522  {
523  if (!json_func_sigs.empty()) {
524  addCommon(udf_functions_, json_func_sigs);
525  }
526 }
static std::unordered_map< std::string, std::vector< ExtensionFunction > > udf_functions_
static void addCommon(std::unordered_map< std::string, std::vector< ExtensionFunction >> &sigs, const std::string &json_func_sigs)

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void ExtensionFunctionsWhitelist::clearRTUdfs ( )
static

Definition at line 528 of file ExtensionFunctionsWhitelist.cpp.

References rt_udf_functions_.

528  {
529  rt_udf_functions_.clear();
530 }
static std::unordered_map< std::string, std::vector< ExtensionFunction > > rt_udf_functions_
std::vector< ExtensionFunction > * ExtensionFunctionsWhitelist::get ( const std::string &  name)
static

Definition at line 28 of file ExtensionFunctionsWhitelist.cpp.

References functions_, and to_upper().

29  {
30  const auto it = functions_.find(to_upper(name));
31  if (it == functions_.end()) {
32  return nullptr;
33  }
34  return &it->second;
35 }
static std::unordered_map< std::string, std::vector< ExtensionFunction > > functions_
std::string to_upper(const std::string &str)

+ Here is the call graph for this function:

std::vector< ExtensionFunction > ExtensionFunctionsWhitelist::get_ext_funcs ( const std::string &  name)
static

Definition at line 45 of file ExtensionFunctionsWhitelist.cpp.

References functions_, rt_udf_functions_, to_upper(), and udf_functions_.

Referenced by bind_function().

46  {
47  std::vector<ExtensionFunction> ext_funcs = {};
48  const auto collections = {&functions_, &udf_functions_, &rt_udf_functions_};
49  const auto uname = to_upper(name);
50  for (auto funcs : collections) {
51  const auto it = funcs->find(uname);
52  if (it == funcs->end()) {
53  continue;
54  }
55  auto ext_func_sigs = it->second;
56  std::copy(ext_func_sigs.begin(), ext_func_sigs.end(), std::back_inserter(ext_funcs));
57  }
58  return ext_funcs;
59 }
static std::unordered_map< std::string, std::vector< ExtensionFunction > > udf_functions_
static std::unordered_map< std::string, std::vector< ExtensionFunction > > rt_udf_functions_
static std::unordered_map< std::string, std::vector< ExtensionFunction > > functions_
std::string to_upper(const std::string &str)

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

std::vector< ExtensionFunction > ExtensionFunctionsWhitelist::get_ext_funcs ( const std::string &  name,
size_t  arity 
)
static

Definition at line 61 of file ExtensionFunctionsWhitelist.cpp.

References functions_, rt_udf_functions_, to_upper(), and udf_functions_.

63  {
64  std::vector<ExtensionFunction> ext_funcs = {};
65  const auto collections = {&functions_, &udf_functions_, &rt_udf_functions_};
66  const auto uname = to_upper(name);
67  for (auto funcs : collections) {
68  const auto it = funcs->find(uname);
69  if (it == funcs->end()) {
70  continue;
71  }
72  auto ext_func_sigs = it->second;
73  std::copy_if(ext_func_sigs.begin(),
74  ext_func_sigs.end(),
75  std::back_inserter(ext_funcs),
76  [arity](auto sig) { return arity == sig.getArgs().size(); });
77  }
78  return ext_funcs;
79 }
static std::unordered_map< std::string, std::vector< ExtensionFunction > > udf_functions_
static std::unordered_map< std::string, std::vector< ExtensionFunction > > rt_udf_functions_
static std::unordered_map< std::string, std::vector< ExtensionFunction > > functions_
std::string to_upper(const std::string &str)

+ Here is the call graph for this function:

std::vector< ExtensionFunction > ExtensionFunctionsWhitelist::get_ext_funcs ( const std::string &  name,
size_t  arity,
const SQLTypeInfo rtype 
)
static

Definition at line 81 of file ExtensionFunctionsWhitelist.cpp.

References ext_arg_type_to_type_info(), functions_, SQLTypeInfo::get_type(), kBOOLEAN, kTINYINT, rt_udf_functions_, to_upper(), and udf_functions_.

84  {
85  std::vector<ExtensionFunction> ext_funcs = {};
86  const auto collections = {&functions_, &udf_functions_, &rt_udf_functions_};
87  const auto uname = to_upper(name);
88  for (auto funcs : collections) {
89  const auto it = funcs->find(uname);
90  if (it == funcs->end()) {
91  continue;
92  }
93  auto ext_func_sigs = it->second;
94  std::copy_if(ext_func_sigs.begin(),
95  ext_func_sigs.end(),
96  std::back_inserter(ext_funcs),
97  [arity, rtype](auto sig) {
98  // Ideally, arity should be equal to the number of
99  // sig arguments but there seems to be many cases
100  // where some sig arguments will be represented
101  // with multiple arguments, for instance, array
102  // argument is translated to data pointer and array
103  // size arguments.
104  if (arity > sig.getArgs().size()) {
105  return false;
106  }
107  auto rt = rtype.get_type();
108  auto st = ext_arg_type_to_type_info(sig.getRet()).get_type();
109  return (st == rt || (st == kTINYINT && rt == kBOOLEAN));
110  });
111  }
112  return ext_funcs;
113 }
static std::unordered_map< std::string, std::vector< ExtensionFunction > > udf_functions_
static std::unordered_map< std::string, std::vector< ExtensionFunction > > rt_udf_functions_
HOST DEVICE SQLTypes get_type() const
Definition: sqltypes.h:258
static std::unordered_map< std::string, std::vector< ExtensionFunction > > functions_
std::string to_upper(const std::string &str)
SQLTypeInfo ext_arg_type_to_type_info(const ExtArgumentType ext_arg_type)

+ Here is the call graph for this function:

std::vector< ExtensionFunction > * ExtensionFunctionsWhitelist::get_udf ( const std::string &  name)
static

Definition at line 36 of file ExtensionFunctionsWhitelist.cpp.

References to_upper(), and udf_functions_.

37  {
38  const auto it = udf_functions_.find(to_upper(name));
39  if (it == udf_functions_.end()) {
40  return nullptr;
41  }
42  return &it->second;
43 }
static std::unordered_map< std::string, std::vector< ExtensionFunction > > udf_functions_
std::string to_upper(const std::string &str)

+ Here is the call graph for this function:

std::vector< std::string > ExtensionFunctionsWhitelist::getLLVMDeclarations ( const std::unordered_set< std::string > &  udf_decls)
static

Definition at line 310 of file ExtensionFunctionsWhitelist.cpp.

References CHECK(), table_functions::TableFunctionsFactory::functions_, functions_, Int32, is_ext_arg_type_array(), join(), and anonymous_namespace{ExtensionFunctionsWhitelist.cpp}::serialize_type().

311  {
312  std::vector<std::string> declarations;
313  for (const auto& kv : functions_) {
314  const auto& signatures = kv.second;
315  CHECK(!signatures.empty());
316  for (const auto& signature : kv.second) {
317  // If there is a udf function declaration matching an extension function signature
318  // do not emit a duplicate declaration.
319  if (!udf_decls.empty() && udf_decls.find(signature.getName()) != udf_decls.end()) {
320  continue;
321  }
322 
323  std::string decl_prefix;
324  std::vector<std::string> arg_strs;
325 
326  if (is_ext_arg_type_array(signature.getRet())) {
327  decl_prefix = "declare void @" + signature.getName();
328  arg_strs.emplace_back(serialize_type(signature.getRet()));
329  } else {
330  decl_prefix =
331  "declare " + serialize_type(signature.getRet()) + " @" + signature.getName();
332  }
333  for (const auto arg : signature.getArgs()) {
334  arg_strs.push_back(serialize_type(arg));
335  }
336  declarations.push_back(decl_prefix + "(" + boost::algorithm::join(arg_strs, ", ") +
337  ");");
338  }
339  }
340 
342  if (kv.second.isRuntime()) {
343  // Runtime UDTFs are defined in LLVM/NVVM IR module
344  continue;
345  }
346  std::string decl_prefix{"declare " + serialize_type(ExtArgumentType::Int32) + " @" +
347  kv.first};
348  std::vector<std::string> arg_strs;
349  for (const auto arg : kv.second.getArgs()) {
350  arg_strs.push_back(serialize_type(arg));
351  }
352  declarations.push_back(decl_prefix + "(" + boost::algorithm::join(arg_strs, ", ") +
353  ");");
354  }
355  return declarations;
356 }
std::string join(T const &container, std::string const &delim)
static std::unordered_map< std::string, std::vector< ExtensionFunction > > functions_
CHECK(cgen_state)
bool is_ext_arg_type_array(const ExtArgumentType ext_arg_type)
static std::unordered_map< std::string, TableFunction > functions_

+ Here is the call graph for this function:

std::string ExtensionFunctionsWhitelist::toString ( const std::vector< ExtensionFunction > &  ext_funcs,
std::string  tab = "" 
)
static

Definition at line 264 of file ExtensionFunctionsWhitelist.cpp.

Referenced by bind_function(), anonymous_namespace{ExtensionFunctionsBinding.cpp}::match_arguments(), table_functions::TableFunction::toString(), and ExtensionFunction::toString().

266  {
267  std::string r = "";
268  for (auto sig : ext_funcs) {
269  r += tab + sig.toString() + "\n";
270  }
271  return r;
272 }

+ Here is the caller graph for this function:

std::string ExtensionFunctionsWhitelist::toString ( const std::vector< SQLTypeInfo > &  arg_types)
static

Definition at line 274 of file ExtensionFunctionsWhitelist.cpp.

275  {
276  std::string r = "";
277  for (auto sig = arg_types.begin(); sig != arg_types.end();) {
278  r += sig->get_type_name();
279  sig++;
280  if (sig != arg_types.end()) {
281  r += ", ";
282  }
283  }
284  return r;
285 }
std::string ExtensionFunctionsWhitelist::toString ( const std::vector< ExtArgumentType > &  sig_types)
static

Definition at line 287 of file ExtensionFunctionsWhitelist.cpp.

References anonymous_namespace{ExtensionFunctionsWhitelist.cpp}::serialize_type().

288  {
289  std::string r = "";
290  for (auto t = sig_types.begin(); t != sig_types.end();) {
291  r += serialize_type(*t);
292  t++;
293  if (t != sig_types.end()) {
294  r += ", ";
295  }
296  }
297  return r;
298 }

+ Here is the call graph for this function:

std::string ExtensionFunctionsWhitelist::toString ( const ExtArgumentType sig_type)
static

Definition at line 300 of file ExtensionFunctionsWhitelist.cpp.

References anonymous_namespace{ExtensionFunctionsWhitelist.cpp}::serialize_type().

300  {
301  return serialize_type(sig_type);
302 }

+ Here is the call graph for this function:

Member Data Documentation

std::unordered_map< std::string, std::vector< ExtensionFunction > > ExtensionFunctionsWhitelist::functions_
staticprivate

Definition at line 132 of file ExtensionFunctionsWhitelist.h.

Referenced by add(), get(), get_ext_funcs(), and getLLVMDeclarations().

std::unordered_map< std::string, std::vector< ExtensionFunction > > ExtensionFunctionsWhitelist::rt_udf_functions_
staticprivate

Definition at line 135 of file ExtensionFunctionsWhitelist.h.

Referenced by addRTUdfs(), clearRTUdfs(), and get_ext_funcs().

std::unordered_map< std::string, std::vector< ExtensionFunction > > ExtensionFunctionsWhitelist::udf_functions_
staticprivate

Definition at line 133 of file ExtensionFunctionsWhitelist.h.

Referenced by addUdfs(), get_ext_funcs(), and get_udf().


The documentation for this class was generated from the following files: