1 | /* | |
2 | * Copyright OpenSearch Contributors | |
3 | * SPDX-License-Identifier: Apache-2.0 | |
4 | */ | |
5 | ||
6 | package org.opensearch.sql.expression.function; | |
7 | ||
8 | import com.google.common.collect.ImmutableMap; | |
9 | import java.util.Locale; | |
10 | import java.util.Map; | |
11 | import java.util.Optional; | |
12 | import lombok.Getter; | |
13 | import lombok.RequiredArgsConstructor; | |
14 | ||
15 | /** | |
16 | * Builtin Function Name. | |
17 | */ | |
18 | @Getter | |
19 | @RequiredArgsConstructor | |
20 | public enum BuiltinFunctionName { | |
21 | /** | |
22 | * Mathematical Functions. | |
23 | */ | |
24 | ABS(FunctionName.of("abs")), | |
25 | CEIL(FunctionName.of("ceil")), | |
26 | CEILING(FunctionName.of("ceiling")), | |
27 | CONV(FunctionName.of("conv")), | |
28 | CRC32(FunctionName.of("crc32")), | |
29 | E(FunctionName.of("e")), | |
30 | EXP(FunctionName.of("exp")), | |
31 | FLOOR(FunctionName.of("floor")), | |
32 | LN(FunctionName.of("ln")), | |
33 | LOG(FunctionName.of("log")), | |
34 | LOG10(FunctionName.of("log10")), | |
35 | LOG2(FunctionName.of("log2")), | |
36 | MOD(FunctionName.of("mod")), | |
37 | PI(FunctionName.of("pi")), | |
38 | POW(FunctionName.of("pow")), | |
39 | POWER(FunctionName.of("power")), | |
40 | RAND(FunctionName.of("rand")), | |
41 | ROUND(FunctionName.of("round")), | |
42 | SIGN(FunctionName.of("sign")), | |
43 | SQRT(FunctionName.of("sqrt")), | |
44 | TRUNCATE(FunctionName.of("truncate")), | |
45 | ||
46 | ACOS(FunctionName.of("acos")), | |
47 | ASIN(FunctionName.of("asin")), | |
48 | ATAN(FunctionName.of("atan")), | |
49 | ATAN2(FunctionName.of("atan2")), | |
50 | COS(FunctionName.of("cos")), | |
51 | COT(FunctionName.of("cot")), | |
52 | DEGREES(FunctionName.of("degrees")), | |
53 | RADIANS(FunctionName.of("radians")), | |
54 | SIN(FunctionName.of("sin")), | |
55 | TAN(FunctionName.of("tan")), | |
56 | ||
57 | /** | |
58 | * Date and Time Functions. | |
59 | */ | |
60 | ADDDATE(FunctionName.of("adddate")), | |
61 | CONVERT_TZ(FunctionName.of("convert_tz")), | |
62 | DATE(FunctionName.of("date")), | |
63 | DATETIME(FunctionName.of("datetime")), | |
64 | DATE_ADD(FunctionName.of("date_add")), | |
65 | DATE_SUB(FunctionName.of("date_sub")), | |
66 | DAY(FunctionName.of("day")), | |
67 | DAYNAME(FunctionName.of("dayname")), | |
68 | DAYOFMONTH(FunctionName.of("dayofmonth")), | |
69 | DAYOFWEEK(FunctionName.of("dayofweek")), | |
70 | DAYOFYEAR(FunctionName.of("dayofyear")), | |
71 | FROM_DAYS(FunctionName.of("from_days")), | |
72 | FROM_UNIXTIME(FunctionName.of("from_unixtime")), | |
73 | HOUR(FunctionName.of("hour")), | |
74 | MAKEDATE(FunctionName.of("makedate")), | |
75 | MAKETIME(FunctionName.of("maketime")), | |
76 | MICROSECOND(FunctionName.of("microsecond")), | |
77 | MINUTE(FunctionName.of("minute")), | |
78 | MONTH(FunctionName.of("month")), | |
79 | MONTHNAME(FunctionName.of("monthname")), | |
80 | PERIOD_ADD(FunctionName.of("period_add")), | |
81 | PERIOD_DIFF(FunctionName.of("period_diff")), | |
82 | QUARTER(FunctionName.of("quarter")), | |
83 | SECOND(FunctionName.of("second")), | |
84 | SUBDATE(FunctionName.of("subdate")), | |
85 | TIME(FunctionName.of("time")), | |
86 | TIME_TO_SEC(FunctionName.of("time_to_sec")), | |
87 | TIMESTAMP(FunctionName.of("timestamp")), | |
88 | DATE_FORMAT(FunctionName.of("date_format")), | |
89 | TO_DAYS(FunctionName.of("to_days")), | |
90 | UNIX_TIMESTAMP(FunctionName.of("unix_timestamp")), | |
91 | WEEK(FunctionName.of("week")), | |
92 | YEAR(FunctionName.of("year")), | |
93 | // `now`-like functions | |
94 | NOW(FunctionName.of("now")), | |
95 | CURDATE(FunctionName.of("curdate")), | |
96 | CURRENT_DATE(FunctionName.of("current_date")), | |
97 | CURTIME(FunctionName.of("curtime")), | |
98 | CURRENT_TIME(FunctionName.of("current_time")), | |
99 | LOCALTIME(FunctionName.of("localtime")), | |
100 | CURRENT_TIMESTAMP(FunctionName.of("current_timestamp")), | |
101 | LOCALTIMESTAMP(FunctionName.of("localtimestamp")), | |
102 | SYSDATE(FunctionName.of("sysdate")), | |
103 | /** | |
104 | * Text Functions. | |
105 | */ | |
106 | TOSTRING(FunctionName.of("tostring")), | |
107 | ||
108 | /** | |
109 | * Arithmetic Operators. | |
110 | */ | |
111 | ADD(FunctionName.of("+")), | |
112 | SUBTRACT(FunctionName.of("-")), | |
113 | MULTIPLY(FunctionName.of("*")), | |
114 | DIVIDE(FunctionName.of("/")), | |
115 | MODULES(FunctionName.of("%")), | |
116 | ||
117 | /** | |
118 | * Boolean Operators. | |
119 | */ | |
120 | AND(FunctionName.of("and")), | |
121 | OR(FunctionName.of("or")), | |
122 | XOR(FunctionName.of("xor")), | |
123 | NOT(FunctionName.of("not")), | |
124 | EQUAL(FunctionName.of("=")), | |
125 | NOTEQUAL(FunctionName.of("!=")), | |
126 | LESS(FunctionName.of("<")), | |
127 | LTE(FunctionName.of("<=")), | |
128 | GREATER(FunctionName.of(">")), | |
129 | GTE(FunctionName.of(">=")), | |
130 | LIKE(FunctionName.of("like")), | |
131 | NOT_LIKE(FunctionName.of("not like")), | |
132 | ||
133 | /** | |
134 | * Aggregation Function. | |
135 | */ | |
136 | AVG(FunctionName.of("avg")), | |
137 | SUM(FunctionName.of("sum")), | |
138 | COUNT(FunctionName.of("count")), | |
139 | MIN(FunctionName.of("min")), | |
140 | MAX(FunctionName.of("max")), | |
141 | // sample variance | |
142 | VARSAMP(FunctionName.of("var_samp")), | |
143 | // population standard variance | |
144 | VARPOP(FunctionName.of("var_pop")), | |
145 | // sample standard deviation. | |
146 | STDDEV_SAMP(FunctionName.of("stddev_samp")), | |
147 | // population standard deviation. | |
148 | STDDEV_POP(FunctionName.of("stddev_pop")), | |
149 | // take top documents from aggregation bucket. | |
150 | TAKE(FunctionName.of("take")), | |
151 | ||
152 | /** | |
153 | * Text Functions. | |
154 | */ | |
155 | SUBSTR(FunctionName.of("substr")), | |
156 | SUBSTRING(FunctionName.of("substring")), | |
157 | RTRIM(FunctionName.of("rtrim")), | |
158 | LTRIM(FunctionName.of("ltrim")), | |
159 | TRIM(FunctionName.of("trim")), | |
160 | UPPER(FunctionName.of("upper")), | |
161 | LOWER(FunctionName.of("lower")), | |
162 | REGEXP(FunctionName.of("regexp")), | |
163 | CONCAT(FunctionName.of("concat")), | |
164 | CONCAT_WS(FunctionName.of("concat_ws")), | |
165 | LENGTH(FunctionName.of("length")), | |
166 | STRCMP(FunctionName.of("strcmp")), | |
167 | RIGHT(FunctionName.of("right")), | |
168 | LEFT(FunctionName.of("left")), | |
169 | ASCII(FunctionName.of("ascii")), | |
170 | LOCATE(FunctionName.of("locate")), | |
171 | REPLACE(FunctionName.of("replace")), | |
172 | ||
173 | /** | |
174 | * NULL Test. | |
175 | */ | |
176 | IS_NULL(FunctionName.of("is null")), | |
177 | IS_NOT_NULL(FunctionName.of("is not null")), | |
178 | IFNULL(FunctionName.of("ifnull")), | |
179 | IF(FunctionName.of("if")), | |
180 | NULLIF(FunctionName.of("nullif")), | |
181 | ISNULL(FunctionName.of("isnull")), | |
182 | ||
183 | ROW_NUMBER(FunctionName.of("row_number")), | |
184 | RANK(FunctionName.of("rank")), | |
185 | DENSE_RANK(FunctionName.of("dense_rank")), | |
186 | ||
187 | INTERVAL(FunctionName.of("interval")), | |
188 | ||
189 | /** | |
190 | * Data Type Convert Function. | |
191 | */ | |
192 | CAST_TO_STRING(FunctionName.of("cast_to_string")), | |
193 | CAST_TO_BYTE(FunctionName.of("cast_to_byte")), | |
194 | CAST_TO_SHORT(FunctionName.of("cast_to_short")), | |
195 | CAST_TO_INT(FunctionName.of("cast_to_int")), | |
196 | CAST_TO_LONG(FunctionName.of("cast_to_long")), | |
197 | CAST_TO_FLOAT(FunctionName.of("cast_to_float")), | |
198 | CAST_TO_DOUBLE(FunctionName.of("cast_to_double")), | |
199 | CAST_TO_BOOLEAN(FunctionName.of("cast_to_boolean")), | |
200 | CAST_TO_DATE(FunctionName.of("cast_to_date")), | |
201 | CAST_TO_TIME(FunctionName.of("cast_to_time")), | |
202 | CAST_TO_TIMESTAMP(FunctionName.of("cast_to_timestamp")), | |
203 | CAST_TO_DATETIME(FunctionName.of("cast_to_datetime")), | |
204 | TYPEOF(FunctionName.of("typeof")), | |
205 | ||
206 | /** | |
207 | * Relevance Function. | |
208 | */ | |
209 | MATCH(FunctionName.of("match")), | |
210 | SIMPLE_QUERY_STRING(FunctionName.of("simple_query_string")), | |
211 | MATCH_PHRASE(FunctionName.of("match_phrase")), | |
212 | MATCHPHRASE(FunctionName.of("matchphrase")), | |
213 | QUERY_STRING(FunctionName.of("query_string")), | |
214 | MATCH_BOOL_PREFIX(FunctionName.of("match_bool_prefix")), | |
215 | HIGHLIGHT(FunctionName.of("highlight")), | |
216 | MATCH_PHRASE_PREFIX(FunctionName.of("match_phrase_prefix")), | |
217 | /** | |
218 | * Legacy Relevance Function. | |
219 | */ | |
220 | QUERY(FunctionName.of("query")), | |
221 | MATCH_QUERY(FunctionName.of("match_query")), | |
222 | MATCHQUERY(FunctionName.of("matchquery")), | |
223 | MULTI_MATCH(FunctionName.of("multi_match")); | |
224 | ||
225 | private final FunctionName name; | |
226 | ||
227 | private static final Map<FunctionName, BuiltinFunctionName> ALL_NATIVE_FUNCTIONS; | |
228 | ||
229 | static { | |
230 | ImmutableMap.Builder<FunctionName, BuiltinFunctionName> builder = new ImmutableMap.Builder<>(); | |
231 | for (BuiltinFunctionName func : BuiltinFunctionName.values()) { | |
232 | builder.put(func.getName(), func); | |
233 | } | |
234 | ALL_NATIVE_FUNCTIONS = builder.build(); | |
235 | } | |
236 | ||
237 | private static final Map<String, BuiltinFunctionName> AGGREGATION_FUNC_MAPPING = | |
238 | new ImmutableMap.Builder<String, BuiltinFunctionName>() | |
239 | .put("max", BuiltinFunctionName.MAX) | |
240 | .put("min", BuiltinFunctionName.MIN) | |
241 | .put("avg", BuiltinFunctionName.AVG) | |
242 | .put("count", BuiltinFunctionName.COUNT) | |
243 | .put("sum", BuiltinFunctionName.SUM) | |
244 | .put("var_pop", BuiltinFunctionName.VARPOP) | |
245 | .put("var_samp", BuiltinFunctionName.VARSAMP) | |
246 | .put("variance", BuiltinFunctionName.VARPOP) | |
247 | .put("std", BuiltinFunctionName.STDDEV_POP) | |
248 | .put("stddev", BuiltinFunctionName.STDDEV_POP) | |
249 | .put("stddev_pop", BuiltinFunctionName.STDDEV_POP) | |
250 | .put("stddev_samp", BuiltinFunctionName.STDDEV_SAMP) | |
251 | .put("take", BuiltinFunctionName.TAKE) | |
252 | .build(); | |
253 | ||
254 | public static Optional<BuiltinFunctionName> of(String str) { | |
255 |
1
1. of : replaced return value with Optional.empty for org/opensearch/sql/expression/function/BuiltinFunctionName::of → KILLED |
return Optional.ofNullable(ALL_NATIVE_FUNCTIONS.getOrDefault(FunctionName.of(str), null)); |
256 | } | |
257 | ||
258 | public static Optional<BuiltinFunctionName> ofAggregation(String functionName) { | |
259 |
1
1. ofAggregation : replaced return value with Optional.empty for org/opensearch/sql/expression/function/BuiltinFunctionName::ofAggregation → KILLED |
return Optional.ofNullable( |
260 | AGGREGATION_FUNC_MAPPING.getOrDefault(functionName.toLowerCase(Locale.ROOT), null)); | |
261 | } | |
262 | } | |
Mutations | ||
255 |
1.1 |
|
259 |
1.1 |