1use nodedb_types::columnar::ColumnType;
10
11use super::registry::ArgTypeSpec;
12
13const ANY: &[ColumnType] = &[];
16
17const NUMERIC: &[ColumnType] = &[
18 ColumnType::Int64,
19 ColumnType::Float64,
20 ColumnType::Decimal(None),
21];
22
23const TEXT: &[ColumnType] = &[ColumnType::String];
24
25const FLOAT64_ONLY: &[ColumnType] = &[ColumnType::Float64];
26
27const INT64_ONLY: &[ColumnType] = &[ColumnType::Int64];
28
29const VECTOR_ONLY: &[ColumnType] = &[ColumnType::Vector(0)];
30
31const TIMESTAMP_TYPES: &[ColumnType] = &[ColumnType::Timestamp, ColumnType::Timestamptz];
32
33const ARRAY_ONLY: &[ColumnType] = &[ColumnType::Array];
34
35pub(super) const fn any(name: &'static str) -> ArgTypeSpec {
38 ArgTypeSpec {
39 name,
40 accepted: ANY,
41 variadic: false,
42 }
43}
44
45pub(super) const fn any_variadic(name: &'static str) -> ArgTypeSpec {
46 ArgTypeSpec {
47 name,
48 accepted: ANY,
49 variadic: true,
50 }
51}
52
53pub(super) const fn typed(name: &'static str, accepted: &'static [ColumnType]) -> ArgTypeSpec {
54 ArgTypeSpec {
55 name,
56 accepted,
57 variadic: false,
58 }
59}
60
61pub(super) const fn typed_variadic(
62 name: &'static str,
63 accepted: &'static [ColumnType],
64) -> ArgTypeSpec {
65 ArgTypeSpec {
66 name,
67 accepted,
68 variadic: true,
69 }
70}
71
72pub static COUNT_ARGS: &[ArgTypeSpec] = &[any_variadic("expr")];
76
77pub static SUM_ARGS: &[ArgTypeSpec] = &[typed("expr", NUMERIC)];
78
79pub static AVG_ARGS: &[ArgTypeSpec] = &[typed("expr", NUMERIC)];
80
81pub static DISPERSION_ARGS: &[ArgTypeSpec] = &[typed("expr", NUMERIC)];
83
84pub static MIN_ARGS: &[ArgTypeSpec] = &[any("expr")];
85
86pub static MAX_ARGS: &[ArgTypeSpec] = &[any("expr")];
87
88pub static NO_ARGS: &[ArgTypeSpec] = &[];
91
92pub static LAG_LEAD_ARGS: &[ArgTypeSpec] =
93 &[any("expr"), typed("offset", INT64_ONLY), any("default")];
94
95pub static FIRST_LAST_VALUE_ARGS: &[ArgTypeSpec] = &[any("expr")];
96
97pub static NTH_VALUE_ARGS: &[ArgTypeSpec] = &[any("expr"), typed("n", INT64_ONLY)];
98
99pub static NTILE_ARGS: &[ArgTypeSpec] = &[typed("buckets", INT64_ONLY)];
100
101pub static VECTOR_DISTANCE_ARGS: &[ArgTypeSpec] = &[
104 typed("column", VECTOR_ONLY),
105 typed("query", VECTOR_ONLY),
106 any("metric"),
107];
108
109pub static MULTI_VECTOR_SEARCH_ARGS: &[ArgTypeSpec] = &[any("query"), any("options")];
110
111pub static MULTI_VECTOR_SCORE_ARGS: &[ArgTypeSpec] =
112 &[any("col1"), any("col2"), typed("query", VECTOR_ONLY)];
113
114pub static SPARSE_SCORE_ARGS: &[ArgTypeSpec] =
115 &[any("col"), any("query"), typed("boost", FLOAT64_ONLY)];
116
117pub static BM25_SCORE_ARGS: &[ArgTypeSpec] = &[any("column"), typed("query", TEXT)];
120
121pub static SEARCH_SCORE_ARGS: &[ArgTypeSpec] = &[any("column"), typed("query", TEXT)];
122
123pub static TEXT_MATCH_ARGS: &[ArgTypeSpec] = &[any("column"), typed("query", TEXT)];
124
125pub static RRF_SCORE_ARGS: &[ArgTypeSpec] = &[any("rank1"), any("rank2"), any("k1"), any("k2")];
130
131pub static RRF_SCORE_TRIPLE_ARGS: &[ArgTypeSpec] = &[
134 any("rank1"),
135 any("rank2"),
136 any("rank3"),
137 any("k1"),
138 any("k2"),
139 any("k3"),
140];
141
142pub static GRAPH_SCORE_ARGS: &[ArgTypeSpec] =
150 &[any("node_id_col"), any("seed_id"), any_variadic("options")];
151
152pub static TIME_BUCKET_ARGS: &[ArgTypeSpec] = &[any("interval"), typed("ts", TIMESTAMP_TYPES)];
155
156pub static TS_PERCENTILE_ARGS: &[ArgTypeSpec] = &[any("expr"), typed("percentile", FLOAT64_ONLY)];
157
158pub static TS_STDDEV_ARGS: &[ArgTypeSpec] = &[any("expr")];
159
160pub static TS_CORRELATE_ARGS: &[ArgTypeSpec] = &[any("col1"), any("col2")];
161
162pub static TS_WINDOW_1_ARGS: &[ArgTypeSpec] = &[any("expr")];
163
164pub static TS_MOVING_AVG_ARGS: &[ArgTypeSpec] = &[any("expr"), typed("window", INT64_ONLY)];
165
166pub static TS_EMA_ARGS: &[ArgTypeSpec] = &[any("expr"), typed("alpha", FLOAT64_ONLY)];
167
168pub static TS_LAG_LEAD_ARGS: &[ArgTypeSpec] =
169 &[any("expr"), typed("offset", INT64_ONLY), any("default")];
170
171pub static APPROX_COUNT_DISTINCT_ARGS: &[ArgTypeSpec] = &[any("expr")];
174
175pub static APPROX_PERCENTILE_ARGS: &[ArgTypeSpec] =
176 &[any("expr"), typed("percentile", FLOAT64_ONLY)];
177
178pub static APPROX_TOPK_ARGS: &[ArgTypeSpec] = &[any("expr"), typed("k", INT64_ONLY)];
179
180pub static APPROX_COUNT_ARGS: &[ArgTypeSpec] = &[any("expr")];
181
182pub static GROUPING_ARGS: &[ArgTypeSpec] = &[any_variadic("col")];
186
187pub static DOC_GET_ARGS: &[ArgTypeSpec] = &[any("doc"), typed("path", TEXT), any("default")];
190
191pub static DOC_EXISTS_ARGS: &[ArgTypeSpec] = &[any("doc"), typed("path", TEXT)];
192
193pub static DOC_ARRAY_CONTAINS_ARGS: &[ArgTypeSpec] =
194 &[any("doc"), typed("path", TEXT), any("value")];
195
196pub static NAV_ARGS: &[ArgTypeSpec] = &[any("doc"), typed("path", TEXT)];
197
198pub static NDB_CHUNK_TEXT_ARGS: &[ArgTypeSpec] = &[
201 typed("text", TEXT),
202 typed("chunk_size", INT64_ONLY),
203 typed("overlap", INT64_ONLY),
204];
205
206pub static COALESCE_ARGS: &[ArgTypeSpec] = &[any_variadic("expr")];
209
210pub static NULLIF_ARGS: &[ArgTypeSpec] = &[any("expr1"), any("expr2")];
211
212pub static MATH_1_ARGS: &[ArgTypeSpec] = &[typed("expr", NUMERIC)];
213
214pub static MATH_2_ARGS: &[ArgTypeSpec] = &[typed("left", NUMERIC), typed("right", NUMERIC)];
217
218pub static ROUND_ARGS: &[ArgTypeSpec] = &[typed("expr", NUMERIC), typed("scale", INT64_ONLY)];
219
220pub static GREATEST_LEAST_ARGS: &[ArgTypeSpec] = &[any_variadic("expr")];
223
224pub static TYPEOF_ARGS: &[ArgTypeSpec] = &[any("expr")];
226
227pub static STRING_1_ARGS: &[ArgTypeSpec] = &[typed("expr", TEXT)];
228
229pub static LENGTH_ARGS: &[ArgTypeSpec] = &[typed("expr", TEXT)];
230
231pub static SUBSTRING_ARGS: &[ArgTypeSpec] = &[
232 typed("expr", TEXT),
233 typed("start", INT64_ONLY),
234 typed("length", INT64_ONLY),
235];
236
237pub static CONCAT_ARGS: &[ArgTypeSpec] = &[typed_variadic("expr", TEXT)];
238
239pub static REPLACE_ARGS: &[ArgTypeSpec] =
240 &[typed("expr", TEXT), typed("from", TEXT), typed("to", TEXT)];
241
242pub static MAKE_ARRAY_ARGS: &[ArgTypeSpec] = &[any_variadic("expr")];
243
244pub static PG_CATALOG_2_ARGS: &[ArgTypeSpec] = &[any("value"), any("context")];
245
246pub static PG_JSON_2_ARGS: &[ArgTypeSpec] = &[any("json_col"), any("key")];
249
250pub static PG_JSON_BOOL_2_ARGS: &[ArgTypeSpec] = &[any("json_col"), any("operand")];
251
252pub static JSON_VALUE_ARGS: &[ArgTypeSpec] = &[any("json_col"), typed("path", TEXT)];
255
256pub static JSON_QUERY_ARGS: &[ArgTypeSpec] = &[any("json_col"), typed("path", TEXT)];
257
258pub static JSON_EXISTS_ARGS: &[ArgTypeSpec] = &[any("json_col"), typed("path", TEXT)];
259
260pub static PG_FTS_MATCH_ARGS: &[ArgTypeSpec] = &[any("tsvector"), any("tsquery")];
263
264pub static PG_TO_TSVECTOR_ARGS: &[ArgTypeSpec] = &[typed("config", TEXT), typed("document", TEXT)];
265
266pub static PG_TO_TSQUERY_ARGS: &[ArgTypeSpec] = &[typed("config", TEXT), typed("query", TEXT)];
267
268pub static PG_TS_RANK_ARGS: &[ArgTypeSpec] = &[
269 any("tsvector"),
270 any("tsquery"),
271 typed("weights", FLOAT64_ONLY),
272 typed("normalization", INT64_ONLY),
273];
274
275pub static PG_TS_HEADLINE_ARGS: &[ArgTypeSpec] = &[
276 typed("config", TEXT),
277 any("document"),
278 any("tsquery"),
279 typed("options", TEXT),
280];
281
282pub static ARRAY_SLICE_ARGS: &[ArgTypeSpec] = &[
285 typed("name", TEXT),
286 any("slice_obj"),
287 any("attrs"),
288 typed("limit", INT64_ONLY),
289];
290
291pub static ARRAY_PROJECT_ARGS: &[ArgTypeSpec] = &[typed("name", TEXT), any("attrs")];
292
293pub static ARRAY_AGG_ARGS: &[ArgTypeSpec] = &[
294 typed("name", TEXT),
295 typed("attr", TEXT),
296 typed("reducer", TEXT),
297 typed("group_by_dim", INT64_ONLY),
298];
299
300pub static ARRAY_ELEMENTWISE_ARGS: &[ArgTypeSpec] = &[
301 typed("left", TEXT),
302 typed("right", TEXT),
303 typed("op", TEXT),
304 typed("attr", TEXT),
305];
306
307pub static ARRAY_MAINT_ARGS: &[ArgTypeSpec] = &[typed("name", TEXT)];
308
309pub static ID_CHECK_ARGS: &[ArgTypeSpec] = &[typed("value", TEXT)];
315
316pub static NANOID_ARGS: &[ArgTypeSpec] = &[typed("length", INT64_ONLY)];
319
320pub static ARRAY_1_ARGS: &[ArgTypeSpec] = &[typed("arr", ARRAY_ONLY)];
329
330pub static ARRAY_ELEM_ARGS: &[ArgTypeSpec] = &[typed("arr", ARRAY_ONLY), any("value")];
334
335pub static ARRAY_PREPEND_ARGS: &[ArgTypeSpec] = &[any("value"), typed("arr", ARRAY_ONLY)];
338
339pub static ARRAY_CAT_ARGS: &[ArgTypeSpec] = &[typed("arr1", ARRAY_ONLY), typed("arr2", ARRAY_ONLY)];
341
342pub static DATETIME_1_ARGS: &[ArgTypeSpec] = &[any("value")];
351
352pub static DATE_PART_ARGS: &[ArgTypeSpec] = &[typed("part", TEXT), any("ts")];
356
357pub static DATE_ARITH_ARGS: &[ArgTypeSpec] = &[any("ts"), typed("duration", TEXT)];
360
361pub static DATE_DIFF_ARGS: &[ArgTypeSpec] = &[any("ts1"), any("ts2")];
363
364pub static JSON_EXTRACT_ARGS: &[ArgTypeSpec] = &[any("json"), typed("path", TEXT)];
372
373pub static JSON_SET_ARGS: &[ArgTypeSpec] = &[any("json"), typed("key", TEXT), any("value")];
375
376pub static JSON_REMOVE_ARGS: &[ArgTypeSpec] = &[any("json"), typed("key", TEXT)];
378
379pub static JSON_1_ARGS: &[ArgTypeSpec] = &[any("json")];
382
383pub static JSON_ARRAY_ARGS: &[ArgTypeSpec] = &[any_variadic("value")];
385
386pub static JSON_OBJECT_ARGS: &[ArgTypeSpec] = &[any_variadic("kv")];
388
389pub static JSON_CONTAINS_ARGS: &[ArgTypeSpec] = &[any("container"), any("needle")];
391
392pub static JSON_MERGE_ARGS: &[ArgTypeSpec] = &[any("base"), any("overlay")];
394
395pub static TO_JSONB_ARGS: &[ArgTypeSpec] = &[any("value")];
397
398pub static SEQUENCE_NAME_ARGS: &[ArgTypeSpec] = &[typed("sequence", TEXT)];
402
403pub static SETVAL_ARGS: &[ArgTypeSpec] = &[typed("sequence", TEXT), typed("value", INT64_ONLY)];