(&self, args: ScalarFunctionArgs)
| 91 | } |
| 92 | |
| 93 | fn invoke_with_args(&self, args: ScalarFunctionArgs) -> Result<ColumnarValue> { |
| 94 | // When from and to are scalars, pre-build the translation map once |
| 95 | if let (Some(from_str), Some(to_str)) = ( |
| 96 | try_as_scalar_str(&args.args[1]), |
| 97 | try_as_scalar_str(&args.args[2]), |
| 98 | ) { |
| 99 | let to_chars: Vec<char> = to_str.chars().collect(); |
| 100 | |
| 101 | let mut from_map: HashMap<char, usize> = HashMap::new(); |
| 102 | for (index, c) in from_str.chars().enumerate() { |
| 103 | from_map.entry(c).or_insert(index); |
| 104 | } |
| 105 | |
| 106 | let ascii_table = build_ascii_translate_table(from_str, to_str); |
| 107 | |
| 108 | let string_array = args.args[0].to_array_of_size(args.number_rows)?; |
| 109 | let len = string_array.len(); |
| 110 | |
| 111 | let result = match string_array.data_type() { |
| 112 | DataType::Utf8View => { |
| 113 | let arr = string_array.as_string_view(); |
| 114 | let builder = StringViewBuilder::with_capacity(len); |
| 115 | translate_with_map( |
| 116 | arr, |
| 117 | &from_map, |
| 118 | &to_chars, |
| 119 | ascii_table.as_ref(), |
| 120 | builder, |
| 121 | ) |
| 122 | } |
| 123 | DataType::Utf8 => { |
| 124 | let arr = string_array.as_string::<i32>(); |
| 125 | let builder = |
| 126 | StringBuilder::with_capacity(len, arr.value_data().len()); |
| 127 | translate_with_map( |
| 128 | arr, |
| 129 | &from_map, |
| 130 | &to_chars, |
| 131 | ascii_table.as_ref(), |
| 132 | builder, |
| 133 | ) |
| 134 | } |
| 135 | DataType::LargeUtf8 => { |
| 136 | let arr = string_array.as_string::<i64>(); |
| 137 | let builder = |
| 138 | LargeStringBuilder::with_capacity(len, arr.value_data().len()); |
| 139 | translate_with_map( |
| 140 | arr, |
| 141 | &from_map, |
| 142 | &to_chars, |
| 143 | ascii_table.as_ref(), |
| 144 | builder, |
| 145 | ) |
| 146 | } |
| 147 | other => { |
| 148 | return exec_err!( |
| 149 | "Unsupported data type {other:?} for function translate" |
| 150 | ); |
nothing calls this directly
no test coverage detected