datafusion_functions_nested/
lib.rs1#![doc(
19 html_logo_url = "https://raw.githubusercontent.com/apache/datafusion/19fe44cf2f30cbdd63d4a4f52c74055163c6cc38/docs/logos/standalone_logo/logo_original.svg",
20 html_favicon_url = "https://raw.githubusercontent.com/apache/datafusion/19fe44cf2f30cbdd63d4a4f52c74055163c6cc38/docs/logos/standalone_logo/logo_original.svg"
21)]
22#![cfg_attr(docsrs, feature(doc_cfg))]
23#![deny(clippy::clone_on_ref_ptr)]
26#![cfg_attr(test, allow(clippy::needless_pass_by_value))]
27
28#[macro_use]
38pub mod macros;
39
40pub mod array_has;
41pub mod arrays_zip;
42pub mod cardinality;
43pub mod concat;
44pub mod dimension;
45pub mod distance;
46pub mod empty;
47pub mod except;
48pub mod expr_ext;
49pub mod extract;
50pub mod flatten;
51pub mod length;
52pub mod make_array;
53pub mod map;
54pub mod map_entries;
55pub mod map_extract;
56pub mod map_keys;
57pub mod map_values;
58pub mod min_max;
59pub mod planner;
60pub mod position;
61pub mod range;
62pub mod remove;
63pub mod repeat;
64pub mod replace;
65pub mod resize;
66pub mod reverse;
67pub mod set_ops;
68pub mod sort;
69pub mod string;
70pub mod utils;
71
72use datafusion_common::Result;
73use datafusion_execution::FunctionRegistry;
74use datafusion_expr::ScalarUDF;
75use log::debug;
76use std::sync::Arc;
77
78pub mod expr_fn {
80 pub use super::array_has::array_has;
81 pub use super::array_has::array_has_all;
82 pub use super::array_has::array_has_any;
83 pub use super::arrays_zip::arrays_zip;
84 pub use super::cardinality::cardinality;
85 pub use super::concat::array_append;
86 pub use super::concat::array_concat;
87 pub use super::concat::array_prepend;
88 pub use super::dimension::array_dims;
89 pub use super::dimension::array_ndims;
90 pub use super::distance::array_distance;
91 pub use super::empty::array_empty;
92 pub use super::except::array_except;
93 pub use super::extract::array_any_value;
94 pub use super::extract::array_element;
95 pub use super::extract::array_pop_back;
96 pub use super::extract::array_pop_front;
97 pub use super::extract::array_slice;
98 pub use super::flatten::flatten;
99 pub use super::length::array_length;
100 pub use super::make_array::make_array;
101 pub use super::map_entries::map_entries;
102 pub use super::map_extract::map_extract;
103 pub use super::map_keys::map_keys;
104 pub use super::map_values::map_values;
105 pub use super::min_max::array_max;
106 pub use super::min_max::array_min;
107 pub use super::position::array_position;
108 pub use super::position::array_positions;
109 pub use super::range::gen_series;
110 pub use super::range::range;
111 pub use super::remove::array_remove;
112 pub use super::remove::array_remove_all;
113 pub use super::remove::array_remove_n;
114 pub use super::repeat::array_repeat;
115 pub use super::replace::array_replace;
116 pub use super::replace::array_replace_all;
117 pub use super::replace::array_replace_n;
118 pub use super::resize::array_resize;
119 pub use super::reverse::array_reverse;
120 pub use super::set_ops::array_distinct;
121 pub use super::set_ops::array_intersect;
122 pub use super::set_ops::array_union;
123 pub use super::sort::array_sort;
124 pub use super::string::array_to_string;
125 pub use super::string::string_to_array;
126}
127
128pub fn all_default_nested_functions() -> Vec<Arc<ScalarUDF>> {
130 vec![
131 string::array_to_string_udf(),
132 string::string_to_array_udf(),
133 range::range_udf(),
134 range::gen_series_udf(),
135 dimension::array_dims_udf(),
136 cardinality::cardinality_udf(),
137 dimension::array_ndims_udf(),
138 concat::array_append_udf(),
139 concat::array_prepend_udf(),
140 concat::array_concat_udf(),
141 except::array_except_udf(),
142 extract::array_element_udf(),
143 extract::array_pop_back_udf(),
144 extract::array_pop_front_udf(),
145 extract::array_slice_udf(),
146 extract::array_any_value_udf(),
147 make_array::make_array_udf(),
148 array_has::array_has_udf(),
149 array_has::array_has_all_udf(),
150 array_has::array_has_any_udf(),
151 empty::array_empty_udf(),
152 length::array_length_udf(),
153 distance::array_distance_udf(),
154 flatten::flatten_udf(),
155 min_max::array_max_udf(),
156 min_max::array_min_udf(),
157 sort::array_sort_udf(),
158 repeat::array_repeat_udf(),
159 resize::array_resize_udf(),
160 reverse::array_reverse_udf(),
161 set_ops::array_distinct_udf(),
162 set_ops::array_intersect_udf(),
163 set_ops::array_union_udf(),
164 arrays_zip::arrays_zip_udf(),
165 position::array_position_udf(),
166 position::array_positions_udf(),
167 remove::array_remove_udf(),
168 remove::array_remove_all_udf(),
169 remove::array_remove_n_udf(),
170 replace::array_replace_n_udf(),
171 replace::array_replace_all_udf(),
172 replace::array_replace_udf(),
173 map::map_udf(),
174 map_entries::map_entries_udf(),
175 map_extract::map_extract_udf(),
176 map_keys::map_keys_udf(),
177 map_values::map_values_udf(),
178 ]
179}
180
181pub fn register_all(registry: &mut dyn FunctionRegistry) -> Result<()> {
183 let functions: Vec<Arc<ScalarUDF>> = all_default_nested_functions();
184 functions.into_iter().try_for_each(|udf| {
185 let existing_udf = registry.register_udf(udf)?;
186 if let Some(existing_udf) = existing_udf {
187 debug!("Overwrite existing UDF: {}", existing_udf.name());
188 }
189 Ok(()) as Result<()>
190 })?;
191
192 Ok(())
193}
194
195#[cfg(test)]
196mod tests {
197 use crate::all_default_nested_functions;
198 use datafusion_common::Result;
199 use std::collections::HashSet;
200
201 #[test]
202 fn test_no_duplicate_name() -> Result<()> {
203 let mut names = HashSet::new();
204 for func in all_default_nested_functions() {
205 assert!(
206 names.insert(func.name().to_string().to_lowercase()),
207 "duplicate function name: {}",
208 func.name()
209 );
210 for alias in func.aliases() {
211 assert!(
212 names.insert(alias.to_string().to_lowercase()),
213 "duplicate function name: {alias}"
214 );
215 }
216 }
217 Ok(())
218 }
219}