Skip to content

Commit 6281637

Browse files
authored
feat: array-empty (#7313)
* feat: array-empty * add definition in pbjson * add definition * remove useless tests * add the function in proto * add doc * refactor * format * remove useless code * fix format * support NULL * remove redundant code * support NULL * fix clippy
1 parent 61ae79f commit 6281637

File tree

11 files changed

+110
-2
lines changed

11 files changed

+110
-2
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,
@@ -536,7 +539,8 @@ impl BuiltinScalarFunction {
536539
}
537540
BuiltinScalarFunction::ArrayHasAll
538541
| BuiltinScalarFunction::ArrayHasAny
539-
| BuiltinScalarFunction::ArrayHas => Ok(Boolean),
542+
| BuiltinScalarFunction::ArrayHas
543+
| BuiltinScalarFunction::ArrayEmpty => Ok(Boolean),
540544
BuiltinScalarFunction::ArrayDims => {
541545
Ok(List(Arc::new(Field::new("item", UInt64, true))))
542546
}
@@ -829,6 +833,7 @@ impl BuiltinScalarFunction {
829833
Signature::variadic_any(self.volatility())
830834
}
831835
BuiltinScalarFunction::ArrayDims => Signature::any(1, self.volatility()),
836+
BuiltinScalarFunction::ArrayEmpty => Signature::any(1, self.volatility()),
832837
BuiltinScalarFunction::ArrayElement => Signature::any(2, self.volatility()),
833838
BuiltinScalarFunction::Flatten => Signature::any(1, self.volatility()),
834839
BuiltinScalarFunction::ArrayHasAll
@@ -1319,6 +1324,7 @@ fn aliases(func: &BuiltinScalarFunction) -> &'static [&'static str] {
13191324
&["array_concat", "array_cat", "list_concat", "list_cat"]
13201325
}
13211326
BuiltinScalarFunction::ArrayDims => &["array_dims", "list_dims"],
1327+
BuiltinScalarFunction::ArrayEmpty => &["empty"],
13221328
BuiltinScalarFunction::ArrayElement => &[
13231329
"array_element",
13241330
"array_extract",

datafusion/expr/src/expr_fn.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,12 @@ scalar_expr!(
552552
first_array second_array,
553553
"returns true, if the element appears in the first array, otherwise false."
554554
);
555+
scalar_expr!(
556+
ArrayEmpty,
557+
array_empty,
558+
array,
559+
"returns 1 for an empty array or 0 for a non-empty array."
560+
);
555561
scalar_expr!(
556562
ArrayHasAll,
557563
array_has_all,

datafusion/physical-expr/src/array_expressions.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -982,6 +982,21 @@ macro_rules! general_repeat_list {
982982
}};
983983
}
984984

985+
/// Array_empty SQL function
986+
pub fn array_empty(args: &[ArrayRef]) -> Result<ArrayRef> {
987+
println!("args[0]: {:?}", &args[0]);
988+
if args[0].as_any().downcast_ref::<NullArray>().is_some() {
989+
return Ok(args[0].clone());
990+
}
991+
992+
let array = as_list_array(&args[0])?;
993+
let builder = array
994+
.iter()
995+
.map(|arr| arr.map(|arr| arr.len() == arr.null_count()))
996+
.collect::<BooleanArray>();
997+
Ok(Arc::new(builder))
998+
}
999+
9851000
/// Array_repeat SQL function
9861001
pub fn array_repeat(args: &[ArrayRef]) -> Result<ArrayRef> {
9871002
let element = &args[0];

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/proto/datafusion.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,7 @@ enum ScalarFunction {
597597
Flatten = 112;
598598
Isnan = 113;
599599
Iszero = 114;
600+
ArrayEmpty = 115;
600601
}
601602

602603
message ScalarFunctionNode {

datafusion/proto/src/generated/pbjson.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/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: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ use datafusion_common::{
3434
internal_err, Column, DFField, DFSchema, DFSchemaRef, DataFusionError,
3535
OwnedTableReference, Result, ScalarValue,
3636
};
37-
use datafusion_expr::expr::{Alias, Placeholder};
3837
use datafusion_expr::{
3938
abs, acos, acosh, array, array_append, array_concat, array_dims, array_element,
4039
array_has, array_has_all, array_has_any, array_length, array_ndims, array_position,
@@ -59,6 +58,10 @@ use datafusion_expr::{
5958
JoinConstraint, JoinType, Like, Operator, TryCast, WindowFrame, WindowFrameBound,
6059
WindowFrameUnits,
6160
};
61+
use datafusion_expr::{
62+
array_empty,
63+
expr::{Alias, Placeholder},
64+
};
6265
use std::sync::Arc;
6366

6467
#[derive(Debug)]
@@ -452,6 +455,7 @@ impl From<&protobuf::ScalarFunction> for BuiltinScalarFunction {
452455
ScalarFunction::ToTimestamp => Self::ToTimestamp,
453456
ScalarFunction::ArrayAppend => Self::ArrayAppend,
454457
ScalarFunction::ArrayConcat => Self::ArrayConcat,
458+
ScalarFunction::ArrayEmpty => Self::ArrayEmpty,
455459
ScalarFunction::ArrayHasAll => Self::ArrayHasAll,
456460
ScalarFunction::ArrayHasAny => Self::ArrayHasAny,
457461
ScalarFunction::ArrayHas => Self::ArrayHas,
@@ -1355,6 +1359,9 @@ pub fn parse_expr(
13551359
parse_expr(&args[0], registry)?,
13561360
parse_expr(&args[1], registry)?,
13571361
)),
1362+
ScalarFunction::ArrayEmpty => {
1363+
Ok(array_empty(parse_expr(&args[0], registry)?))
1364+
}
13581365
ScalarFunction::ArrayNdims => {
13591366
Ok(array_ndims(parse_expr(&args[0], registry)?))
13601367
}

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: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2363,6 +2363,42 @@ 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+
# empty scalar function #1
2367+
query B
2368+
select empty(make_array(1));
2369+
----
2370+
false
2371+
2372+
# empty scalar function #2
2373+
query B
2374+
select empty(make_array());
2375+
----
2376+
true
2377+
2378+
# empty scalar function #3
2379+
query B
2380+
select empty(make_array(NULL));
2381+
----
2382+
true
2383+
2384+
# empty scalar function #4
2385+
query B
2386+
select empty(NULL);
2387+
----
2388+
NULL
2389+
2390+
# empty scalar function #5
2391+
query B
2392+
select empty(column1) from arrays;
2393+
----
2394+
false
2395+
false
2396+
false
2397+
false
2398+
NULL
2399+
false
2400+
false
2401+
23662402
### Delete tables
23672403

23682404
statement ok

docs/source/user-guide/sql/scalar_functions.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1495,6 +1495,7 @@ from_unixtime(expression)
14951495
- [array_slice](#array_slice)
14961496
- [array_to_string](#array_to_string)
14971497
- [cardinality](#cardinality)
1498+
- [empty](#empty)
14981499
- [list_append](#list_append)
14991500
- [list_cat](#list_cat)
15001501
- [list_concat](#list_concat)
@@ -1693,6 +1694,8 @@ array_element(array, index)
16931694
- list_element
16941695
- list_extract
16951696

1697+
### `array_empty`
1698+
16961699
### `array_extract`
16971700

16981701
_Alias of [array_element](#array_element)._
@@ -2188,6 +2191,30 @@ cardinality(array)
21882191
+--------------------------------------+
21892192
```
21902193

2194+
### `empty`
2195+
2196+
Returns 1 for an empty array or 0 for a non-empty array.
2197+
2198+
```
2199+
empty(array)
2200+
```
2201+
2202+
#### Arguments
2203+
2204+
- **array**: Array expression.
2205+
Can be a constant, column, or function, and any combination of array operators.
2206+
2207+
#### Example
2208+
2209+
```
2210+
❯ select empty([1]);
2211+
+------------------+
2212+
| empty(List([1])) |
2213+
+------------------+
2214+
| 0 |
2215+
+------------------+
2216+
```
2217+
21912218
### `list_append`
21922219

21932220
_Alias of [array_append](#array_append)._

0 commit comments

Comments
 (0)