Skip to content

Commit 85de2b2

Browse files
committed
feat: array-empty
1 parent d2f9025 commit 85de2b2

File tree

7 files changed

+68
-1
lines changed

7 files changed

+68
-1
lines changed

datafusion/expr/src/built_in_function.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ pub enum BuiltinScalarFunction {
138138
ArrayDims,
139139
/// array_element
140140
ArrayElement,
141+
/// array_empty
142+
ArrayEmpty,
141143
/// array_length
142144
ArrayLength,
143145
/// array_ndims
@@ -360,6 +362,7 @@ impl BuiltinScalarFunction {
360362
BuiltinScalarFunction::Trunc => Volatility::Immutable,
361363
BuiltinScalarFunction::ArrayAppend => Volatility::Immutable,
362364
BuiltinScalarFunction::ArrayConcat => Volatility::Immutable,
365+
BuiltinScalarFunction::ArrayEmpty => Volatility::Immutable,
363366
BuiltinScalarFunction::ArrayHasAll => Volatility::Immutable,
364367
BuiltinScalarFunction::ArrayHasAny => Volatility::Immutable,
365368
BuiltinScalarFunction::ArrayHas => Volatility::Immutable,
@@ -538,7 +541,8 @@ impl BuiltinScalarFunction {
538541
}
539542
BuiltinScalarFunction::ArrayHasAll
540543
| BuiltinScalarFunction::ArrayHasAny
541-
| BuiltinScalarFunction::ArrayHas => Ok(Boolean),
544+
| BuiltinScalarFunction::ArrayHas
545+
| BuiltinScalarFunction::ArrayEmpty => Ok(Boolean),
542546
BuiltinScalarFunction::ArrayDims => {
543547
Ok(List(Arc::new(Field::new("item", UInt64, true))))
544548
}
@@ -832,6 +836,7 @@ impl BuiltinScalarFunction {
832836
Signature::variadic_any(self.volatility())
833837
}
834838
BuiltinScalarFunction::ArrayDims => Signature::any(1, self.volatility()),
839+
BuiltinScalarFunction::ArrayEmpty => Signature::any(1, self.volatility()),
835840
BuiltinScalarFunction::ArrayElement => Signature::any(2, self.volatility()),
836841
BuiltinScalarFunction::Flatten => Signature::any(1, self.volatility()),
837842
BuiltinScalarFunction::ArrayHasAll
@@ -1322,6 +1327,7 @@ fn aliases(func: &BuiltinScalarFunction) -> &'static [&'static str] {
13221327
&["array_concat", "array_cat", "list_concat", "list_cat"]
13231328
}
13241329
BuiltinScalarFunction::ArrayDims => &["array_dims", "list_dims"],
1330+
BuiltinScalarFunction::ArrayEmpty => &["empty"],
13251331
BuiltinScalarFunction::ArrayElement => &[
13261332
"array_element",
13271333
"array_extract",

datafusion/physical-expr/src/array_expressions.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -986,6 +986,36 @@ macro_rules! general_repeat_list {
986986
}};
987987
}
988988

989+
/// Array_empty SQL function
990+
pub fn array_empty(args: &[ArrayRef]) -> Result<ArrayRef> {
991+
let array = as_list_array(&args[0])?;
992+
let mut builder = UInt8Array::builder(1);
993+
994+
for arr in array.iter() {
995+
if let Some(arr) = arr {
996+
let res = match arr.data_type() {
997+
DataType::List(_) => {
998+
let arr = downcast_arg!(arr, ListArray);
999+
let mut res = 1;
1000+
for i in 0..arr.len() {
1001+
if arr.value_length(i) > 0 {
1002+
res = 0;
1003+
break;
1004+
}
1005+
}
1006+
res
1007+
}
1008+
DataType::Null => 1,
1009+
_ => 0,
1010+
};
1011+
builder.append_value(res);
1012+
} else {
1013+
builder.append_value(1);
1014+
}
1015+
}
1016+
Ok(Arc::new(builder.finish()))
1017+
}
1018+
9891019
/// Array_repeat SQL function
9901020
pub fn array_repeat(args: &[ArrayRef]) -> Result<ArrayRef> {
9911021
let element = &args[0];
@@ -2988,6 +3018,19 @@ mod tests {
29883018
);
29893019
}
29903020

3021+
#[test]
3022+
fn test_array_empty() {
3023+
// array_dims([[1, 2, 3, 4], [5, 6, 7, 8]]) = [2, 4]
3024+
let list_array = return_nested_array().into_array(1);
3025+
3026+
let array = array_empty(&[list_array])
3027+
.expect("failed to initialize function array_empty");
3028+
// println!("{:?}", array);
3029+
let result = array.as_any().downcast_ref::<UInt8Array>();
3030+
3031+
assert_eq!(&[1], result.unwrap().values())
3032+
}
3033+
29913034
#[test]
29923035
fn test_nested_array_dims() {
29933036
// array_dims([[1, 2, 3, 4], [5, 6, 7, 8]]) = [2, 4]

datafusion/physical-expr/src/functions.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,9 @@ pub fn create_physical_fun(
425425
BuiltinScalarFunction::ArrayConcat => {
426426
Arc::new(|args| make_scalar_function(array_expressions::array_concat)(args))
427427
}
428+
BuiltinScalarFunction::ArrayEmpty => {
429+
Arc::new(|args| make_scalar_function(array_expressions::array_empty)(args))
430+
}
428431
BuiltinScalarFunction::ArrayHasAll => {
429432
Arc::new(|args| make_scalar_function(array_expressions::array_has_all)(args))
430433
}

datafusion/proto/src/generated/prost.rs

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

datafusion/proto/src/logical_plan/from_proto.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,7 @@ impl From<&protobuf::ScalarFunction> for BuiltinScalarFunction {
452452
ScalarFunction::ToTimestamp => Self::ToTimestamp,
453453
ScalarFunction::ArrayAppend => Self::ArrayAppend,
454454
ScalarFunction::ArrayConcat => Self::ArrayConcat,
455+
ScalarFunction::ArrayEmpty => Self::ArrayEmpty,
455456
ScalarFunction::ArrayHasAll => Self::ArrayHasAll,
456457
ScalarFunction::ArrayHasAny => Self::ArrayHasAny,
457458
ScalarFunction::ArrayHas => Self::ArrayHas,

datafusion/proto/src/logical_plan/to_proto.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,6 +1451,7 @@ impl TryFrom<&BuiltinScalarFunction> for protobuf::ScalarFunction {
14511451
BuiltinScalarFunction::ToTimestamp => Self::ToTimestamp,
14521452
BuiltinScalarFunction::ArrayAppend => Self::ArrayAppend,
14531453
BuiltinScalarFunction::ArrayConcat => Self::ArrayConcat,
1454+
BuiltinScalarFunction::ArrayEmpty => Self::ArrayEmpty,
14541455
BuiltinScalarFunction::ArrayHasAll => Self::ArrayHasAll,
14551456
BuiltinScalarFunction::ArrayHasAny => Self::ArrayHasAny,
14561457
BuiltinScalarFunction::ArrayHas => Self::ArrayHas,

datafusion/sqllogictest/test_files/array.slt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2363,6 +2363,16 @@ from flatten_table;
23632363
[1, 2, 3] [1, 2, 3, 4, 5, 6] [1, 2, 3] [1.0, 2.1, 2.2, 3.2, 3.3, 3.4]
23642364
[1, 2, 3, 4, 5, 6] [8] [1, 2, 3] [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
23652365

2366+
query B
2367+
select empty(make_array(1));
2368+
----
2369+
0
2370+
2371+
query B
2372+
select empty(make_array());
2373+
----
2374+
1
2375+
23662376
### Delete tables
23672377

23682378
statement ok

0 commit comments

Comments
 (0)