OmniSciDB  8a228a1076
ExtensionFunctionsWhitelist.h
Go to the documentation of this file.
1 /*
2  * Copyright 2017 MapD Technologies, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /*
18  * @file ExtensionFunctionsWhitelist.h
19  * @author Alex Suhan <alex@mapd.com>
20  * @brief Supported runtime functions management and retrieval.
21  *
22  * Copyright (c) 2016 MapD Technologies, Inc. All rights reserved.
23  */
24 
25 #ifndef QUERYENGINE_EXTENSIONFUNCTIONSWHITELIST_H
26 #define QUERYENGINE_EXTENSIONFUNCTIONSWHITELIST_H
27 
28 #include <string>
29 #include <unordered_map>
30 #include <unordered_set>
31 #include <vector>
32 
33 #include "../Shared/sqltypes.h"
34 
35 enum class ExtArgumentType {
36  Int8,
37  Int16,
38  Int32,
39  Int64,
40  Float,
41  Double,
42  Void,
43  PInt8,
44  PInt16,
45  PInt32,
46  PInt64,
47  PFloat,
48  PDouble,
49  PBool,
50  Bool,
51  ArrayInt8,
52  ArrayInt16,
53  ArrayInt32,
54  ArrayInt64,
55  ArrayFloat,
57  ArrayBool,
58  GeoPoint,
60  Cursor,
61  GeoPolygon,
63  ColumnInt8,
70 };
71 
73 
75  public:
76  ExtensionFunction(const std::string& name,
77  const std::vector<ExtArgumentType>& args,
78  const ExtArgumentType ret)
79  : name_(name), args_(args), ret_(ret) {}
80 
81  const std::string& getName() const { return name_; }
82 
83  const std::vector<ExtArgumentType>& getArgs() const { return args_; }
84 
85  const ExtArgumentType getRet() const { return ret_; }
86  std::string toString() const;
87 
88  private:
89  const std::string name_;
90  const std::vector<ExtArgumentType> args_;
92 };
93 
95  public:
96  static void add(const std::string& json_func_sigs);
97 
98  static void addUdfs(const std::string& json_func_sigs);
99 
100  static void clearRTUdfs();
101  static void addRTUdfs(const std::string& json_func_sigs);
102 
103  static std::vector<ExtensionFunction>* get(const std::string& name);
104 
105  static std::vector<ExtensionFunction>* get_udf(const std::string& name);
106 
107  static std::vector<ExtensionFunction> get_ext_funcs(const std::string& name);
108 
109  static std::vector<ExtensionFunction> get_ext_funcs(const std::string& name,
110  size_t arity);
111 
112  static std::vector<ExtensionFunction> get_ext_funcs(const std::string& name,
113  size_t arity,
114  const SQLTypeInfo& rtype);
115 
116  static std::string toString(const std::vector<ExtensionFunction>& ext_funcs,
117  std::string tab = "");
118  static std::string toString(const std::vector<SQLTypeInfo>& arg_types);
119  static std::string toString(const std::vector<ExtArgumentType>& sig_types);
120  static std::string toString(const ExtArgumentType& sig_type);
121 
122  static std::vector<std::string> getLLVMDeclarations(
123  const std::unordered_set<std::string>& udf_decls);
124 
125  private:
126  static void addCommon(
127  std::unordered_map<std::string, std::vector<ExtensionFunction>>& sigs,
128  const std::string& json_func_sigs);
129 
130  private:
131  // Function overloading not supported, they're uniquely identified by name.
132  static std::unordered_map<std::string, std::vector<ExtensionFunction>> functions_;
133  static std::unordered_map<std::string, std::vector<ExtensionFunction>> udf_functions_;
134  static std::unordered_map<std::string, std::vector<ExtensionFunction>>
136 };
137 
138 #endif // QUERYENGINE_EXTENSIONFUNCTIONSWHITELIST_H
static std::unordered_map< std::string, std::vector< ExtensionFunction > > udf_functions_
static std::unordered_map< std::string, std::vector< ExtensionFunction > > rt_udf_functions_
const std::vector< ExtArgumentType > args_
const ExtArgumentType getRet() const
const std::string & getName() const
static std::unordered_map< std::string, std::vector< ExtensionFunction > > functions_
const std::vector< ExtArgumentType > & getArgs() const
ExtensionFunction(const std::string &name, const std::vector< ExtArgumentType > &args, const ExtArgumentType ret)
const ExtArgumentType ret_
SQLTypeInfo ext_arg_type_to_type_info(const ExtArgumentType ext_arg_type)