From 818c12f57eee53b16bc622157d6efbbe1fd59837 Mon Sep 17 00:00:00 2001 From: Qi Zhu <821684824@qq.com> Date: Sat, 15 Nov 2025 14:46:59 +0800 Subject: [PATCH 1/6] Add benchmark for array_has/array_has_all/array_has_any --- datafusion/functions-nested/Cargo.toml | 4 + .../functions-nested/benches/array_has.rs | 419 ++++++++++++++++++ 2 files changed, 423 insertions(+) create mode 100644 datafusion/functions-nested/benches/array_has.rs diff --git a/datafusion/functions-nested/Cargo.toml b/datafusion/functions-nested/Cargo.toml index 8e4801ba2729..3a02db7501b7 100644 --- a/datafusion/functions-nested/Cargo.toml +++ b/datafusion/functions-nested/Cargo.toml @@ -69,6 +69,10 @@ rand = { workspace = true } harness = false name = "array_expression" +[[bench]] +harness = false +name = "array_has" + [[bench]] harness = false name = "array_reverse" diff --git a/datafusion/functions-nested/benches/array_has.rs b/datafusion/functions-nested/benches/array_has.rs new file mode 100644 index 000000000000..f6e1590a0528 --- /dev/null +++ b/datafusion/functions-nested/benches/array_has.rs @@ -0,0 +1,419 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#[macro_use] +extern crate criterion; + +use criterion::{BenchmarkId, Criterion}; +use datafusion_expr::lit; +use datafusion_functions_nested::expr_fn::{array_has, array_has_all, array_has_any, make_array}; +use std::hint::black_box; + +fn criterion_benchmark(c: &mut Criterion) { + // Test different array sizes + let array_sizes = vec![1, 10, 100, 1000, 10000]; + + for &size in &array_sizes { + bench_array_has(c, size); + bench_array_has_all(c, size); + bench_array_has_any(c, size); + } + + // Specific benchmarks for string arrays (common use case) + bench_array_has_strings(c); + bench_array_has_all_strings(c); + bench_array_has_any_strings(c); + + // Edge cases + bench_array_has_edge_cases(c); +} + +fn bench_array_has(c: &mut Criterion, array_size: usize) { + let mut group = c.benchmark_group("array_has"); + + // Benchmark: element found at beginning + group.bench_with_input( + BenchmarkId::new("found_at_start", array_size), + &array_size, + |b, &size| { + let array = (0..size).map(|i| lit(i as i64)).collect::>(); + let list_array = make_array(array); + let needle = lit(0_i64); + + b.iter(|| { + black_box(array_has(list_array.clone(), needle.clone())) + }) + }, + ); + + // Benchmark: element found at end + group.bench_with_input( + BenchmarkId::new("found_at_end", array_size), + &array_size, + |b, &size| { + let array = (0..size).map(|i| lit(i as i64)).collect::>(); + let list_array = make_array(array); + let needle = lit((size - 1) as i64); + + b.iter(|| { + black_box(array_has(list_array.clone(), needle.clone())) + }) + }, + ); + + // Benchmark: element not found + group.bench_with_input( + BenchmarkId::new("not_found", array_size), + &array_size, + |b, &size| { + let array = (0..size).map(|i| lit(i as i64)).collect::>(); + let list_array = make_array(array); + let needle = lit(-1_i64); // Not in array + + b.iter(|| { + black_box(array_has(list_array.clone(), needle.clone())) + }) + }, + ); + + group.finish(); +} + +fn bench_array_has_all(c: &mut Criterion, array_size: usize) { + let mut group = c.benchmark_group("array_has_all"); + + // Benchmark: all elements found (small needle) + group.bench_with_input( + BenchmarkId::new("all_found_small_needle", array_size), + &array_size, + |b, &size| { + let array = (0..size).map(|i| lit(i as i64)).collect::>(); + let list_array = make_array(array); + let needle_array = make_array(vec![lit(0_i64), lit(1_i64), lit(2_i64)]); + + b.iter(|| { + black_box(array_has_all(list_array.clone(), needle_array.clone())) + }) + }, + ); + + // Benchmark: all elements found (medium needle - 10% of haystack) + group.bench_with_input( + BenchmarkId::new("all_found_medium_needle", array_size), + &array_size, + |b, &size| { + let array = (0..size).map(|i| lit(i as i64)).collect::>(); + let list_array = make_array(array); + let needle_size = (size / 10).max(1); + let needle = (0..needle_size).map(|i| lit(i as i64)).collect::>(); + let needle_array = make_array(needle); + + b.iter(|| { + black_box(array_has_all(list_array.clone(), needle_array.clone())) + }) + }, + ); + + // Benchmark: not all found (early exit) + group.bench_with_input( + BenchmarkId::new("early_exit", array_size), + &array_size, + |b, &size| { + let array = (0..size).map(|i| lit(i as i64)).collect::>(); + let list_array = make_array(array); + let needle_array = make_array(vec![lit(0_i64), lit(-1_i64)]); // -1 not in array + + b.iter(|| { + black_box(array_has_all(list_array.clone(), needle_array.clone())) + }) + }, + ); + + group.finish(); +} + +fn bench_array_has_any(c: &mut Criterion, array_size: usize) { + let mut group = c.benchmark_group("array_has_any"); + + // Benchmark: first element matches (best case) + group.bench_with_input( + BenchmarkId::new("first_match", array_size), + &array_size, + |b, &size| { + let array = (0..size).map(|i| lit(i as i64)).collect::>(); + let list_array = make_array(array); + let needle_array = make_array(vec![lit(0_i64), lit(-1_i64), lit(-2_i64)]); + + b.iter(|| { + black_box(array_has_any(list_array.clone(), needle_array.clone())) + }) + }, + ); + + // Benchmark: last element matches (worst case) + group.bench_with_input( + BenchmarkId::new("last_match", array_size), + &array_size, + |b, &size| { + let array = (0..size).map(|i| lit(i as i64)).collect::>(); + let list_array = make_array(array); + let needle_array = make_array(vec![lit(-1_i64), lit(-2_i64), lit(0_i64)]); + + b.iter(|| { + black_box(array_has_any(list_array.clone(), needle_array.clone())) + }) + }, + ); + + // Benchmark: no match + group.bench_with_input( + BenchmarkId::new("no_match", array_size), + &array_size, + |b, &size| { + let array = (0..size).map(|i| lit(i as i64)).collect::>(); + let list_array = make_array(array); + let needle_array = make_array(vec![lit(-1_i64), lit(-2_i64), lit(-3_i64)]); + + b.iter(|| { + black_box(array_has_any(list_array.clone(), needle_array.clone())) + }) + }, + ); + + group.finish(); +} + +fn bench_array_has_strings(c: &mut Criterion) { + let mut group = c.benchmark_group("array_has_strings"); + + // Benchmark with string arrays (common use case for tickers, tags, etc.) + let sizes = vec![10, 100, 1000]; + + for &size in &sizes { + group.bench_with_input( + BenchmarkId::new("found", size), + &size, + |b, &size| { + let array = (0..size) + .map(|i| lit(format!("TICKER{:04}", i))) + .collect::>(); + let list_array = make_array(array); + let needle = lit("TICKER0050"); + + b.iter(|| { + black_box(array_has(list_array.clone(), needle.clone())) + }) + }, + ); + + group.bench_with_input( + BenchmarkId::new("not_found", size), + &size, + |b, &size| { + let array = (0..size) + .map(|i| lit(format!("TICKER{:04}", i))) + .collect::>(); + let list_array = make_array(array); + let needle = lit("NOTFOUND"); + + b.iter(|| { + black_box(array_has(list_array.clone(), needle.clone())) + }) + }, + ); + } + + group.finish(); +} + +fn bench_array_has_all_strings(c: &mut Criterion) { + let mut group = c.benchmark_group("array_has_all_strings"); + + // Realistic scenario: checking if a portfolio contains certain tickers + let portfolio_size = 100; + let check_sizes = vec![1, 3, 5, 10]; + + for &check_size in &check_sizes { + group.bench_with_input( + BenchmarkId::new("all_found", check_size), + &check_size, + |b, &check_size| { + let portfolio = (0..portfolio_size) + .map(|i| lit(format!("TICKER{:04}", i))) + .collect::>(); + let list_array = make_array(portfolio); + + let checking = (0..check_size) + .map(|i| lit(format!("TICKER{:04}", i))) + .collect::>(); + let needle_array = make_array(checking); + + b.iter(|| { + black_box(array_has_all(list_array.clone(), needle_array.clone())) + }) + }, + ); + + group.bench_with_input( + BenchmarkId::new("some_missing", check_size), + &check_size, + |b, &check_size| { + let portfolio = (0..portfolio_size) + .map(|i| lit(format!("TICKER{:04}", i))) + .collect::>(); + let list_array = make_array(portfolio); + + let mut checking = (0..check_size - 1) + .map(|i| lit(format!("TICKER{:04}", i))) + .collect::>(); + checking.push(lit("NOTFOUND".to_string())); + let needle_array = make_array(checking); + + b.iter(|| { + black_box(array_has_all(list_array.clone(), needle_array.clone())) + }) + }, + ); + } + + group.finish(); +} + +fn bench_array_has_any_strings(c: &mut Criterion) { + let mut group = c.benchmark_group("array_has_any_strings"); + + let portfolio_size = 100; + let check_sizes = vec![1, 3, 5, 10]; + + for &check_size in &check_sizes { + group.bench_with_input( + BenchmarkId::new("first_matches", check_size), + &check_size, + |b, &check_size| { + let portfolio = (0..portfolio_size) + .map(|i| lit(format!("TICKER{:04}", i))) + .collect::>(); + let list_array = make_array(portfolio); + + let mut checking = vec![lit("TICKER0000".to_string())]; + checking.extend( + (1..check_size) + .map(|_| lit("NOTFOUND".to_string())) + ); + let needle_array = make_array(checking); + + b.iter(|| { + black_box(array_has_any(list_array.clone(), needle_array.clone())) + }) + }, + ); + + group.bench_with_input( + BenchmarkId::new("none_match", check_size), + &check_size, + |b, &check_size| { + let portfolio = (0..portfolio_size) + .map(|i| lit(format!("TICKER{:04}", i))) + .collect::>(); + let list_array = make_array(portfolio); + + let checking = (0..check_size) + .map(|i| lit(format!("NOTFOUND{}", i))) + .collect::>(); + let needle_array = make_array(checking); + + b.iter(|| { + black_box(array_has_any(list_array.clone(), needle_array.clone())) + }) + }, + ); + } + + group.finish(); +} + +fn bench_array_has_edge_cases(c: &mut Criterion) { + let mut group = c.benchmark_group("array_has_edge_cases"); + + // Empty array + group.bench_function("empty_array", |b| { + let list_array = make_array(vec![]); + let needle = lit(1_i64); + + b.iter(|| { + black_box(array_has(list_array.clone(), needle.clone())) + }) + }); + + // Single element array - found + group.bench_function("single_element_found", |b| { + let list_array = make_array(vec![lit(1_i64)]); + let needle = lit(1_i64); + + b.iter(|| { + black_box(array_has(list_array.clone(), needle.clone())) + }) + }); + + // Single element array - not found + group.bench_function("single_element_not_found", |b| { + let list_array = make_array(vec![lit(1_i64)]); + let needle = lit(2_i64); + + b.iter(|| { + black_box(array_has(list_array.clone(), needle.clone())) + }) + }); + + // Array with duplicates + group.bench_function("array_with_duplicates", |b| { + let array = vec![lit(1_i64); 1000]; + let list_array = make_array(array); + let needle = lit(1_i64); + + b.iter(|| { + black_box(array_has(list_array.clone(), needle.clone())) + }) + }); + + // array_has_all: empty needle + group.bench_function("array_has_all_empty_needle", |b| { + let array = (0..1000).map(|i| lit(i as i64)).collect::>(); + let list_array = make_array(array); + let needle_array = make_array(vec![]); + + b.iter(|| { + black_box(array_has_all(list_array.clone(), needle_array.clone())) + }) + }); + + // array_has_any: empty needle + group.bench_function("array_has_any_empty_needle", |b| { + let array = (0..1000).map(|i| lit(i as i64)).collect::>(); + let list_array = make_array(array); + let needle_array = make_array(vec![]); + + b.iter(|| { + black_box(array_has_any(list_array.clone(), needle_array.clone())) + }) + }); + + group.finish(); +} + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); \ No newline at end of file From cabcaa91e01dd8b8043248d81da890246988b857 Mon Sep 17 00:00:00 2001 From: Qi Zhu <821684824@qq.com> Date: Sat, 15 Nov 2025 14:49:24 +0800 Subject: [PATCH 2/6] fmt --- .../functions-nested/benches/array_has.rs | 115 ++++++------------ 1 file changed, 36 insertions(+), 79 deletions(-) diff --git a/datafusion/functions-nested/benches/array_has.rs b/datafusion/functions-nested/benches/array_has.rs index f6e1590a0528..64e0fd18c6e3 100644 --- a/datafusion/functions-nested/benches/array_has.rs +++ b/datafusion/functions-nested/benches/array_has.rs @@ -20,7 +20,9 @@ extern crate criterion; use criterion::{BenchmarkId, Criterion}; use datafusion_expr::lit; -use datafusion_functions_nested::expr_fn::{array_has, array_has_all, array_has_any, make_array}; +use datafusion_functions_nested::expr_fn::{ + array_has, array_has_all, array_has_any, make_array, +}; use std::hint::black_box; fn criterion_benchmark(c: &mut Criterion) { @@ -54,9 +56,7 @@ fn bench_array_has(c: &mut Criterion, array_size: usize) { let list_array = make_array(array); let needle = lit(0_i64); - b.iter(|| { - black_box(array_has(list_array.clone(), needle.clone())) - }) + b.iter(|| black_box(array_has(list_array.clone(), needle.clone()))) }, ); @@ -69,9 +69,7 @@ fn bench_array_has(c: &mut Criterion, array_size: usize) { let list_array = make_array(array); let needle = lit((size - 1) as i64); - b.iter(|| { - black_box(array_has(list_array.clone(), needle.clone())) - }) + b.iter(|| black_box(array_has(list_array.clone(), needle.clone()))) }, ); @@ -84,9 +82,7 @@ fn bench_array_has(c: &mut Criterion, array_size: usize) { let list_array = make_array(array); let needle = lit(-1_i64); // Not in array - b.iter(|| { - black_box(array_has(list_array.clone(), needle.clone())) - }) + b.iter(|| black_box(array_has(list_array.clone(), needle.clone()))) }, ); @@ -105,9 +101,7 @@ fn bench_array_has_all(c: &mut Criterion, array_size: usize) { let list_array = make_array(array); let needle_array = make_array(vec![lit(0_i64), lit(1_i64), lit(2_i64)]); - b.iter(|| { - black_box(array_has_all(list_array.clone(), needle_array.clone())) - }) + b.iter(|| black_box(array_has_all(list_array.clone(), needle_array.clone()))) }, ); @@ -122,9 +116,7 @@ fn bench_array_has_all(c: &mut Criterion, array_size: usize) { let needle = (0..needle_size).map(|i| lit(i as i64)).collect::>(); let needle_array = make_array(needle); - b.iter(|| { - black_box(array_has_all(list_array.clone(), needle_array.clone())) - }) + b.iter(|| black_box(array_has_all(list_array.clone(), needle_array.clone()))) }, ); @@ -137,9 +129,7 @@ fn bench_array_has_all(c: &mut Criterion, array_size: usize) { let list_array = make_array(array); let needle_array = make_array(vec![lit(0_i64), lit(-1_i64)]); // -1 not in array - b.iter(|| { - black_box(array_has_all(list_array.clone(), needle_array.clone())) - }) + b.iter(|| black_box(array_has_all(list_array.clone(), needle_array.clone()))) }, ); @@ -158,9 +148,7 @@ fn bench_array_has_any(c: &mut Criterion, array_size: usize) { let list_array = make_array(array); let needle_array = make_array(vec![lit(0_i64), lit(-1_i64), lit(-2_i64)]); - b.iter(|| { - black_box(array_has_any(list_array.clone(), needle_array.clone())) - }) + b.iter(|| black_box(array_has_any(list_array.clone(), needle_array.clone()))) }, ); @@ -173,9 +161,7 @@ fn bench_array_has_any(c: &mut Criterion, array_size: usize) { let list_array = make_array(array); let needle_array = make_array(vec![lit(-1_i64), lit(-2_i64), lit(0_i64)]); - b.iter(|| { - black_box(array_has_any(list_array.clone(), needle_array.clone())) - }) + b.iter(|| black_box(array_has_any(list_array.clone(), needle_array.clone()))) }, ); @@ -188,9 +174,7 @@ fn bench_array_has_any(c: &mut Criterion, array_size: usize) { let list_array = make_array(array); let needle_array = make_array(vec![lit(-1_i64), lit(-2_i64), lit(-3_i64)]); - b.iter(|| { - black_box(array_has_any(list_array.clone(), needle_array.clone())) - }) + b.iter(|| black_box(array_has_any(list_array.clone(), needle_array.clone()))) }, ); @@ -204,37 +188,25 @@ fn bench_array_has_strings(c: &mut Criterion) { let sizes = vec![10, 100, 1000]; for &size in &sizes { - group.bench_with_input( - BenchmarkId::new("found", size), - &size, - |b, &size| { - let array = (0..size) - .map(|i| lit(format!("TICKER{:04}", i))) - .collect::>(); - let list_array = make_array(array); - let needle = lit("TICKER0050"); + group.bench_with_input(BenchmarkId::new("found", size), &size, |b, &size| { + let array = (0..size) + .map(|i| lit(format!("TICKER{:04}", i))) + .collect::>(); + let list_array = make_array(array); + let needle = lit("TICKER0050"); - b.iter(|| { - black_box(array_has(list_array.clone(), needle.clone())) - }) - }, - ); + b.iter(|| black_box(array_has(list_array.clone(), needle.clone()))) + }); - group.bench_with_input( - BenchmarkId::new("not_found", size), - &size, - |b, &size| { - let array = (0..size) - .map(|i| lit(format!("TICKER{:04}", i))) - .collect::>(); - let list_array = make_array(array); - let needle = lit("NOTFOUND"); + group.bench_with_input(BenchmarkId::new("not_found", size), &size, |b, &size| { + let array = (0..size) + .map(|i| lit(format!("TICKER{:04}", i))) + .collect::>(); + let list_array = make_array(array); + let needle = lit("NOTFOUND"); - b.iter(|| { - black_box(array_has(list_array.clone(), needle.clone())) - }) - }, - ); + b.iter(|| black_box(array_has(list_array.clone(), needle.clone()))) + }); } group.finish(); @@ -310,10 +282,7 @@ fn bench_array_has_any_strings(c: &mut Criterion) { let list_array = make_array(portfolio); let mut checking = vec![lit("TICKER0000".to_string())]; - checking.extend( - (1..check_size) - .map(|_| lit("NOTFOUND".to_string())) - ); + checking.extend((1..check_size).map(|_| lit("NOTFOUND".to_string()))); let needle_array = make_array(checking); b.iter(|| { @@ -354,9 +323,7 @@ fn bench_array_has_edge_cases(c: &mut Criterion) { let list_array = make_array(vec![]); let needle = lit(1_i64); - b.iter(|| { - black_box(array_has(list_array.clone(), needle.clone())) - }) + b.iter(|| black_box(array_has(list_array.clone(), needle.clone()))) }); // Single element array - found @@ -364,9 +331,7 @@ fn bench_array_has_edge_cases(c: &mut Criterion) { let list_array = make_array(vec![lit(1_i64)]); let needle = lit(1_i64); - b.iter(|| { - black_box(array_has(list_array.clone(), needle.clone())) - }) + b.iter(|| black_box(array_has(list_array.clone(), needle.clone()))) }); // Single element array - not found @@ -374,9 +339,7 @@ fn bench_array_has_edge_cases(c: &mut Criterion) { let list_array = make_array(vec![lit(1_i64)]); let needle = lit(2_i64); - b.iter(|| { - black_box(array_has(list_array.clone(), needle.clone())) - }) + b.iter(|| black_box(array_has(list_array.clone(), needle.clone()))) }); // Array with duplicates @@ -385,9 +348,7 @@ fn bench_array_has_edge_cases(c: &mut Criterion) { let list_array = make_array(array); let needle = lit(1_i64); - b.iter(|| { - black_box(array_has(list_array.clone(), needle.clone())) - }) + b.iter(|| black_box(array_has(list_array.clone(), needle.clone()))) }); // array_has_all: empty needle @@ -396,9 +357,7 @@ fn bench_array_has_edge_cases(c: &mut Criterion) { let list_array = make_array(array); let needle_array = make_array(vec![]); - b.iter(|| { - black_box(array_has_all(list_array.clone(), needle_array.clone())) - }) + b.iter(|| black_box(array_has_all(list_array.clone(), needle_array.clone()))) }); // array_has_any: empty needle @@ -407,13 +366,11 @@ fn bench_array_has_edge_cases(c: &mut Criterion) { let list_array = make_array(array); let needle_array = make_array(vec![]); - b.iter(|| { - black_box(array_has_any(list_array.clone(), needle_array.clone())) - }) + b.iter(|| black_box(array_has_any(list_array.clone(), needle_array.clone()))) }); group.finish(); } criterion_group!(benches, criterion_benchmark); -criterion_main!(benches); \ No newline at end of file +criterion_main!(benches); From bc98d36b4e1cfa2f73943a4a2cd1497730487a90 Mon Sep 17 00:00:00 2001 From: Qi Zhu <821684824@qq.com> Date: Sat, 15 Nov 2025 15:29:29 +0800 Subject: [PATCH 3/6] clippy --- .../functions-nested/benches/array_has.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/datafusion/functions-nested/benches/array_has.rs b/datafusion/functions-nested/benches/array_has.rs index 64e0fd18c6e3..97ecab9f17c3 100644 --- a/datafusion/functions-nested/benches/array_has.rs +++ b/datafusion/functions-nested/benches/array_has.rs @@ -190,7 +190,7 @@ fn bench_array_has_strings(c: &mut Criterion) { for &size in &sizes { group.bench_with_input(BenchmarkId::new("found", size), &size, |b, &size| { let array = (0..size) - .map(|i| lit(format!("TICKER{:04}", i))) + .map(|i| lit(format!("TICKER{i:04}"))) .collect::>(); let list_array = make_array(array); let needle = lit("TICKER0050"); @@ -200,7 +200,7 @@ fn bench_array_has_strings(c: &mut Criterion) { group.bench_with_input(BenchmarkId::new("not_found", size), &size, |b, &size| { let array = (0..size) - .map(|i| lit(format!("TICKER{:04}", i))) + .map(|i| lit(format!("TICKER{i:04}"))) .collect::>(); let list_array = make_array(array); let needle = lit("NOTFOUND"); @@ -225,12 +225,12 @@ fn bench_array_has_all_strings(c: &mut Criterion) { &check_size, |b, &check_size| { let portfolio = (0..portfolio_size) - .map(|i| lit(format!("TICKER{:04}", i))) + .map(|i| lit(format!("TICKER{i:04}"))) .collect::>(); let list_array = make_array(portfolio); let checking = (0..check_size) - .map(|i| lit(format!("TICKER{:04}", i))) + .map(|i| lit(format!("TICKER{i:04}"))) .collect::>(); let needle_array = make_array(checking); @@ -245,12 +245,12 @@ fn bench_array_has_all_strings(c: &mut Criterion) { &check_size, |b, &check_size| { let portfolio = (0..portfolio_size) - .map(|i| lit(format!("TICKER{:04}", i))) + .map(|i| lit(format!("TICKER{i:04}"))) .collect::>(); let list_array = make_array(portfolio); let mut checking = (0..check_size - 1) - .map(|i| lit(format!("TICKER{:04}", i))) + .map(|i| lit(format!("TICKER{i:04}"))) .collect::>(); checking.push(lit("NOTFOUND".to_string())); let needle_array = make_array(checking); @@ -277,7 +277,7 @@ fn bench_array_has_any_strings(c: &mut Criterion) { &check_size, |b, &check_size| { let portfolio = (0..portfolio_size) - .map(|i| lit(format!("TICKER{:04}", i))) + .map(|i| lit(format!("TICKER{i:04}"))) .collect::>(); let list_array = make_array(portfolio); @@ -296,12 +296,12 @@ fn bench_array_has_any_strings(c: &mut Criterion) { &check_size, |b, &check_size| { let portfolio = (0..portfolio_size) - .map(|i| lit(format!("TICKER{:04}", i))) + .map(|i| lit(format!("TICKER{i:04}"))) .collect::>(); let list_array = make_array(portfolio); let checking = (0..check_size) - .map(|i| lit(format!("NOTFOUND{}", i))) + .map(|i| lit(format!("NOTFOUND{i}"))) .collect::>(); let needle_array = make_array(checking); From 46d157f897209e128317e539680685c0ca9e5a2a Mon Sep 17 00:00:00 2001 From: Qi Zhu <821684824@qq.com> Date: Sun, 16 Nov 2025 10:35:37 +0800 Subject: [PATCH 4/6] Update datafusion/functions-nested/benches/array_has.rs Co-authored-by: Yongting You <2010youy01@gmail.com> --- datafusion/functions-nested/benches/array_has.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/datafusion/functions-nested/benches/array_has.rs b/datafusion/functions-nested/benches/array_has.rs index 97ecab9f17c3..b4b2b1cc3309 100644 --- a/datafusion/functions-nested/benches/array_has.rs +++ b/datafusion/functions-nested/benches/array_has.rs @@ -25,6 +25,7 @@ use datafusion_functions_nested::expr_fn::{ }; use std::hint::black_box; +// If not explicitly stated, `array` and `array_size` refer to the haystack array. fn criterion_benchmark(c: &mut Criterion) { // Test different array sizes let array_sizes = vec![1, 10, 100, 1000, 10000]; From 5f32868e050a8326975aad3abbcb36d4ea895236 Mon Sep 17 00:00:00 2001 From: Qi Zhu <821684824@qq.com> Date: Sun, 16 Nov 2025 10:35:44 +0800 Subject: [PATCH 5/6] Update datafusion/functions-nested/benches/array_has.rs Co-authored-by: Yongting You <2010youy01@gmail.com> --- datafusion/functions-nested/benches/array_has.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datafusion/functions-nested/benches/array_has.rs b/datafusion/functions-nested/benches/array_has.rs index b4b2b1cc3309..542b6379f97f 100644 --- a/datafusion/functions-nested/benches/array_has.rs +++ b/datafusion/functions-nested/benches/array_has.rs @@ -46,7 +46,7 @@ fn criterion_benchmark(c: &mut Criterion) { } fn bench_array_has(c: &mut Criterion, array_size: usize) { - let mut group = c.benchmark_group("array_has"); + let mut group = c.benchmark_group("array_has_i64"); // Benchmark: element found at beginning group.bench_with_input( From 8cadff663df2edb31fea9c077267629519791f8b Mon Sep 17 00:00:00 2001 From: Qi Zhu <821684824@qq.com> Date: Sun, 16 Nov 2025 22:37:51 +0800 Subject: [PATCH 6/6] Update datafusion/functions-nested/benches/array_has.rs Co-authored-by: Martin Grigorov --- datafusion/functions-nested/benches/array_has.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datafusion/functions-nested/benches/array_has.rs b/datafusion/functions-nested/benches/array_has.rs index 542b6379f97f..a44a80c6ae63 100644 --- a/datafusion/functions-nested/benches/array_has.rs +++ b/datafusion/functions-nested/benches/array_has.rs @@ -194,7 +194,7 @@ fn bench_array_has_strings(c: &mut Criterion) { .map(|i| lit(format!("TICKER{i:04}"))) .collect::>(); let list_array = make_array(array); - let needle = lit("TICKER0050"); + let needle = lit("TICKER0005"); b.iter(|| black_box(array_has(list_array.clone(), needle.clone()))) });