This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new 30de35e653 Add `PartitionEvaluatorArgs` to
`WindowUDFImpl::partition_evaluator` (#12804)
30de35e653 is described below
commit 30de35e6534abd68b7f7a1d2bca37d043bb8d6a6
Author: jcsherin <[email protected]>
AuthorDate: Wed Oct 9 21:38:31 2024 +0530
Add `PartitionEvaluatorArgs` to `WindowUDFImpl::partition_evaluator`
(#12804)
* Patched from `lead-lag` conversion tree
* Fixes unit tests in `row_number` udwf
* Add doc comments
* Updates doc comment
* Updates API to expose `input_exprs` directly
* Updates API to returns data types of input expressions
---
datafusion-cli/Cargo.lock | 1 +
datafusion-examples/Cargo.toml | 1 +
datafusion-examples/examples/advanced_udwf.rs | 6 +-
.../examples/simplify_udwf_expression.rs | 6 +-
.../user_defined/user_defined_window_functions.rs | 6 +-
datafusion/expr/src/expr_fn.rs | 10 ++-
datafusion/expr/src/udwf.rs | 46 ++++++++---
datafusion/functions-window-common/Cargo.toml | 1 +
datafusion/functions-window-common/src/lib.rs | 1 +
.../functions-window-common/src/partition.rs | 89 ++++++++++++++++++++++
datafusion/functions-window/src/macros.rs | 15 ++++
datafusion/functions-window/src/row_number.rs | 10 ++-
.../src/simplify_expressions/expr_simplifier.rs | 11 ++-
datafusion/physical-plan/src/windows/mod.rs | 9 ++-
.../proto/tests/cases/roundtrip_logical_plan.rs | 6 +-
15 files changed, 191 insertions(+), 27 deletions(-)
diff --git a/datafusion-cli/Cargo.lock b/datafusion-cli/Cargo.lock
index fafac1edf7..aa64e14fca 100644
--- a/datafusion-cli/Cargo.lock
+++ b/datafusion-cli/Cargo.lock
@@ -1455,6 +1455,7 @@ name = "datafusion-functions-window-common"
version = "42.0.0"
dependencies = [
"datafusion-common",
+ "datafusion-physical-expr-common",
]
[[package]]
diff --git a/datafusion-examples/Cargo.toml b/datafusion-examples/Cargo.toml
index f430a87e19..e2432abdc1 100644
--- a/datafusion-examples/Cargo.toml
+++ b/datafusion-examples/Cargo.toml
@@ -62,6 +62,7 @@ dashmap = { workspace = true }
datafusion = { workspace = true, default-features = true, features = ["avro"] }
datafusion-common = { workspace = true, default-features = true }
datafusion-expr = { workspace = true }
+datafusion-functions-window-common = { workspace = true }
datafusion-optimizer = { workspace = true, default-features = true }
datafusion-physical-expr = { workspace = true, default-features = true }
datafusion-proto = { workspace = true }
diff --git a/datafusion-examples/examples/advanced_udwf.rs
b/datafusion-examples/examples/advanced_udwf.rs
index fd1b84070c..1c20e292f0 100644
--- a/datafusion-examples/examples/advanced_udwf.rs
+++ b/datafusion-examples/examples/advanced_udwf.rs
@@ -30,6 +30,7 @@ use datafusion_expr::function::WindowUDFFieldArgs;
use datafusion_expr::{
PartitionEvaluator, Signature, WindowFrame, WindowUDF, WindowUDFImpl,
};
+use datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
/// This example shows how to use the full WindowUDFImpl API to implement a
user
/// defined window function. As in the `simple_udwf.rs` example, this struct
implements
@@ -74,7 +75,10 @@ impl WindowUDFImpl for SmoothItUdf {
/// Create a `PartitionEvaluator` to evaluate this function on a new
/// partition.
- fn partition_evaluator(&self) -> Result<Box<dyn PartitionEvaluator>> {
+ fn partition_evaluator(
+ &self,
+ _partition_evaluator_args: PartitionEvaluatorArgs,
+ ) -> Result<Box<dyn PartitionEvaluator>> {
Ok(Box::new(MyPartitionEvaluator::new()))
}
diff --git a/datafusion-examples/examples/simplify_udwf_expression.rs
b/datafusion-examples/examples/simplify_udwf_expression.rs
index 1ff629eef1..d95f1147bc 100644
--- a/datafusion-examples/examples/simplify_udwf_expression.rs
+++ b/datafusion-examples/examples/simplify_udwf_expression.rs
@@ -27,6 +27,7 @@ use datafusion_expr::{
expr::WindowFunction, simplify::SimplifyInfo, Expr, PartitionEvaluator,
Signature,
Volatility, WindowUDF, WindowUDFImpl,
};
+use datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
/// This UDWF will show how to use the WindowUDFImpl::simplify() API
#[derive(Debug, Clone)]
@@ -60,7 +61,10 @@ impl WindowUDFImpl for SimplifySmoothItUdf {
&self.signature
}
- fn partition_evaluator(&self) -> Result<Box<dyn PartitionEvaluator>> {
+ fn partition_evaluator(
+ &self,
+ _partition_evaluator_args: PartitionEvaluatorArgs,
+ ) -> Result<Box<dyn PartitionEvaluator>> {
todo!()
}
diff --git
a/datafusion/core/tests/user_defined/user_defined_window_functions.rs
b/datafusion/core/tests/user_defined/user_defined_window_functions.rs
index d96bb23953..3760328934 100644
--- a/datafusion/core/tests/user_defined/user_defined_window_functions.rs
+++ b/datafusion/core/tests/user_defined/user_defined_window_functions.rs
@@ -36,6 +36,7 @@ use datafusion_expr::{
PartitionEvaluator, Signature, Volatility, WindowUDF, WindowUDFImpl,
};
use datafusion_functions_window_common::field::WindowUDFFieldArgs;
+use datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
/// A query with a window function evaluated over the entire partition
const UNBOUNDED_WINDOW_QUERY: &str = "SELECT x, y, val, \
@@ -552,7 +553,10 @@ impl OddCounter {
&self.signature
}
- fn partition_evaluator(&self) -> Result<Box<dyn
PartitionEvaluator>> {
+ fn partition_evaluator(
+ &self,
+ _partition_evaluator_args: PartitionEvaluatorArgs,
+ ) -> Result<Box<dyn PartitionEvaluator>> {
Ok(Box::new(OddCounter::new(Arc::clone(&self.test_state))))
}
diff --git a/datafusion/expr/src/expr_fn.rs b/datafusion/expr/src/expr_fn.rs
index 2975e36488..ea053b9fb1 100644
--- a/datafusion/expr/src/expr_fn.rs
+++ b/datafusion/expr/src/expr_fn.rs
@@ -27,8 +27,8 @@ use crate::function::{
};
use crate::{
conditional_expressions::CaseBuilder, expr::Sort, logical_plan::Subquery,
- AggregateUDF, Expr, LogicalPlan, Operator, ScalarFunctionImplementation,
ScalarUDF,
- Signature, Volatility,
+ AggregateUDF, Expr, LogicalPlan, Operator, PartitionEvaluator,
+ ScalarFunctionImplementation, ScalarUDF, Signature, Volatility,
};
use crate::{
AggregateUDFImpl, ColumnarValue, ScalarUDFImpl, WindowFrame, WindowUDF,
WindowUDFImpl,
@@ -39,6 +39,7 @@ use arrow::compute::kernels::cast_utils::{
use arrow::datatypes::{DataType, Field};
use datafusion_common::{plan_err, Column, Result, ScalarValue, TableReference};
use datafusion_functions_window_common::field::WindowUDFFieldArgs;
+use datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
use sqlparser::ast::NullTreatment;
use std::any::Any;
use std::fmt::Debug;
@@ -658,7 +659,10 @@ impl WindowUDFImpl for SimpleWindowUDF {
&self.signature
}
- fn partition_evaluator(&self) -> Result<Box<dyn
crate::PartitionEvaluator>> {
+ fn partition_evaluator(
+ &self,
+ _partition_evaluator_args: PartitionEvaluatorArgs,
+ ) -> Result<Box<dyn PartitionEvaluator>> {
(self.partition_evaluator_factory)()
}
diff --git a/datafusion/expr/src/udwf.rs b/datafusion/expr/src/udwf.rs
index 69f357d48f..6d8f2be97e 100644
--- a/datafusion/expr/src/udwf.rs
+++ b/datafusion/expr/src/udwf.rs
@@ -28,14 +28,14 @@ use std::{
use arrow::datatypes::{DataType, Field};
-use datafusion_common::{not_impl_err, Result};
-use datafusion_functions_window_common::field::WindowUDFFieldArgs;
-
use crate::expr::WindowFunction;
use crate::{
function::WindowFunctionSimplification, Documentation, Expr,
PartitionEvaluator,
Signature,
};
+use datafusion_common::{not_impl_err, Result};
+use datafusion_functions_window_common::field::WindowUDFFieldArgs;
+use datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
/// Logical representation of a user-defined window function (UDWF)
/// A UDWF is different from a UDF in that it is stateful across batches.
@@ -150,8 +150,11 @@ impl WindowUDF {
}
/// Return a `PartitionEvaluator` for evaluating this window function
- pub fn partition_evaluator_factory(&self) -> Result<Box<dyn
PartitionEvaluator>> {
- self.inner.partition_evaluator()
+ pub fn partition_evaluator_factory(
+ &self,
+ partition_evaluator_args: PartitionEvaluatorArgs,
+ ) -> Result<Box<dyn PartitionEvaluator>> {
+ self.inner.partition_evaluator(partition_evaluator_args)
}
/// Returns the field of the final result of evaluating this window
function.
@@ -218,8 +221,9 @@ where
/// # use datafusion_common::{DataFusionError, plan_err, Result};
/// # use datafusion_expr::{col, Signature, Volatility, PartitionEvaluator,
WindowFrame, ExprFunctionExt, Documentation};
/// # use datafusion_expr::{WindowUDFImpl, WindowUDF};
-/// # use datafusion_expr::window_doc_sections::DOC_SECTION_ANALYTICAL;
/// # use datafusion_functions_window_common::field::WindowUDFFieldArgs;
+/// # use
datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
+/// # use datafusion_expr::window_doc_sections::DOC_SECTION_ANALYTICAL;
///
/// #[derive(Debug, Clone)]
/// struct SmoothIt {
@@ -254,7 +258,12 @@ where
/// fn name(&self) -> &str { "smooth_it" }
/// fn signature(&self) -> &Signature { &self.signature }
/// // The actual implementation would smooth the window
-/// fn partition_evaluator(&self) -> Result<Box<dyn PartitionEvaluator>> {
unimplemented!() }
+/// fn partition_evaluator(
+/// &self,
+/// _partition_evaluator_args: PartitionEvaluatorArgs,
+/// ) -> Result<Box<dyn PartitionEvaluator>> {
+/// unimplemented!()
+/// }
/// fn field(&self, field_args: WindowUDFFieldArgs) -> Result<Field> {
/// if let Some(DataType::Int32) = field_args.get_input_type(0) {
/// Ok(Field::new(field_args.name(), DataType::Int32, false))
@@ -294,7 +303,10 @@ pub trait WindowUDFImpl: Debug + Send + Sync {
fn signature(&self) -> &Signature;
/// Invoke the function, returning the [`PartitionEvaluator`] instance
- fn partition_evaluator(&self) -> Result<Box<dyn PartitionEvaluator>>;
+ fn partition_evaluator(
+ &self,
+ partition_evaluator_args: PartitionEvaluatorArgs,
+ ) -> Result<Box<dyn PartitionEvaluator>>;
/// Returns any aliases (alternate names) for this function.
///
@@ -468,8 +480,11 @@ impl WindowUDFImpl for AliasedWindowUDFImpl {
self.inner.signature()
}
- fn partition_evaluator(&self) -> Result<Box<dyn PartitionEvaluator>> {
- self.inner.partition_evaluator()
+ fn partition_evaluator(
+ &self,
+ partition_evaluator_args: PartitionEvaluatorArgs,
+ ) -> Result<Box<dyn PartitionEvaluator>> {
+ self.inner.partition_evaluator(partition_evaluator_args)
}
fn aliases(&self) -> &[String] {
@@ -550,6 +565,7 @@ mod test {
use datafusion_common::Result;
use datafusion_expr_common::signature::{Signature, Volatility};
use datafusion_functions_window_common::field::WindowUDFFieldArgs;
+ use datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
use std::any::Any;
use std::cmp::Ordering;
@@ -581,7 +597,10 @@ mod test {
fn signature(&self) -> &Signature {
&self.signature
}
- fn partition_evaluator(&self) -> Result<Box<dyn PartitionEvaluator>> {
+ fn partition_evaluator(
+ &self,
+ _partition_evaluator_args: PartitionEvaluatorArgs,
+ ) -> Result<Box<dyn PartitionEvaluator>> {
unimplemented!()
}
fn field(&self, _field_args: WindowUDFFieldArgs) -> Result<Field> {
@@ -617,7 +636,10 @@ mod test {
fn signature(&self) -> &Signature {
&self.signature
}
- fn partition_evaluator(&self) -> Result<Box<dyn PartitionEvaluator>> {
+ fn partition_evaluator(
+ &self,
+ _partition_evaluator_args: PartitionEvaluatorArgs,
+ ) -> Result<Box<dyn PartitionEvaluator>> {
unimplemented!()
}
fn field(&self, _field_args: WindowUDFFieldArgs) -> Result<Field> {
diff --git a/datafusion/functions-window-common/Cargo.toml
b/datafusion/functions-window-common/Cargo.toml
index 98b6f8c6db..b5df212b7d 100644
--- a/datafusion/functions-window-common/Cargo.toml
+++ b/datafusion/functions-window-common/Cargo.toml
@@ -39,3 +39,4 @@ path = "src/lib.rs"
[dependencies]
datafusion-common = { workspace = true }
+datafusion-physical-expr-common = { workspace = true }
diff --git a/datafusion/functions-window-common/src/lib.rs
b/datafusion/functions-window-common/src/lib.rs
index 2e4bcbbc83..53f9eb1c9a 100644
--- a/datafusion/functions-window-common/src/lib.rs
+++ b/datafusion/functions-window-common/src/lib.rs
@@ -19,3 +19,4 @@
//!
//! [DataFusion]: <https://crates.io/crates/datafusion>
pub mod field;
+pub mod partition;
diff --git a/datafusion/functions-window-common/src/partition.rs
b/datafusion/functions-window-common/src/partition.rs
new file mode 100644
index 0000000000..64786d2fe7
--- /dev/null
+++ b/datafusion/functions-window-common/src/partition.rs
@@ -0,0 +1,89 @@
+// 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.
+
+use datafusion_common::arrow::datatypes::DataType;
+use datafusion_physical_expr_common::physical_expr::PhysicalExpr;
+use std::sync::Arc;
+
+/// Arguments passed to created user-defined window function state
+/// during physical execution.
+#[derive(Debug, Default)]
+pub struct PartitionEvaluatorArgs<'a> {
+ /// The expressions passed as arguments to the user-defined window
+ /// function.
+ input_exprs: &'a [Arc<dyn PhysicalExpr>],
+ /// The corresponding data types of expressions passed as arguments
+ /// to the user-defined window function.
+ input_types: &'a [DataType],
+ /// Set to `true` if the user-defined window function is reversed.
+ is_reversed: bool,
+ /// Set to `true` if `IGNORE NULLS` is specified.
+ ignore_nulls: bool,
+}
+
+impl<'a> PartitionEvaluatorArgs<'a> {
+ /// Create an instance of [`PartitionEvaluatorArgs`].
+ ///
+ /// # Arguments
+ ///
+ /// * `input_exprs` - The expressions passed as arguments
+ /// to the user-defined window function.
+ /// * `input_types` - The data types corresponding to the
+ /// arguments to the user-defined window function.
+ /// * `is_reversed` - Set to `true` if and only if the user-defined
+ /// window function is reversible and is reversed.
+ /// * `ignore_nulls` - Set to `true` when `IGNORE NULLS` is
+ /// specified.
+ ///
+ pub fn new(
+ input_exprs: &'a [Arc<dyn PhysicalExpr>],
+ input_types: &'a [DataType],
+ is_reversed: bool,
+ ignore_nulls: bool,
+ ) -> Self {
+ Self {
+ input_exprs,
+ input_types,
+ is_reversed,
+ ignore_nulls,
+ }
+ }
+
+ /// Returns the expressions passed as arguments to the user-defined
+ /// window function.
+ pub fn input_exprs(&self) -> &'a [Arc<dyn PhysicalExpr>] {
+ self.input_exprs
+ }
+
+ /// Returns the [`DataType`]s corresponding to the input expressions
+ /// to the user-defined window function.
+ pub fn input_types(&self) -> &'a [DataType] {
+ self.input_types
+ }
+
+ /// Returns `true` when the user-defined window function is
+ /// reversed, otherwise returns `false`.
+ pub fn is_reversed(&self) -> bool {
+ self.is_reversed
+ }
+
+ /// Returns `true` when `IGNORE NULLS` is specified, otherwise
+ /// returns `false`.
+ pub fn ignore_nulls(&self) -> bool {
+ self.ignore_nulls
+ }
+}
diff --git a/datafusion/functions-window/src/macros.rs
b/datafusion/functions-window/src/macros.rs
index 843d8ecb38..e934f883b1 100644
--- a/datafusion/functions-window/src/macros.rs
+++ b/datafusion/functions-window/src/macros.rs
@@ -45,6 +45,7 @@
/// #
/// # use datafusion_functions_window_common::field::WindowUDFFieldArgs;
/// # use datafusion_functions_window::get_or_init_udwf;
+/// # use
datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
/// #
/// /// Defines the `simple_udwf()` user-defined window function.
/// get_or_init_udwf!(
@@ -80,6 +81,7 @@
/// # }
/// # fn partition_evaluator(
/// # &self,
+/// # _partition_evaluator_args: PartitionEvaluatorArgs,
/// # ) -> datafusion_common::Result<Box<dyn PartitionEvaluator>> {
/// # unimplemented!()
/// # }
@@ -145,6 +147,8 @@ macro_rules! get_or_init_udwf {
/// # use datafusion_expr::{PartitionEvaluator, Signature, Volatility,
WindowUDFImpl};
/// # use datafusion_functions_window::{create_udwf_expr, get_or_init_udwf};
/// # use datafusion_functions_window_common::field::WindowUDFFieldArgs;
+/// # use
datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
+///
/// # get_or_init_udwf!(
/// # RowNumber,
/// # row_number,
@@ -193,6 +197,7 @@ macro_rules! get_or_init_udwf {
/// # }
/// # fn partition_evaluator(
/// # &self,
+/// # _partition_evaluator_args: PartitionEvaluatorArgs,
/// # ) -> datafusion_common::Result<Box<dyn PartitionEvaluator>> {
/// # unimplemented!()
/// # }
@@ -216,6 +221,7 @@ macro_rules! get_or_init_udwf {
/// # use datafusion_common::arrow::datatypes::Field;
/// # use datafusion_common::ScalarValue;
/// # use datafusion_expr::{col, lit};
+/// # use
datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
/// #
/// # get_or_init_udwf!(Lead, lead, "user-defined window function");
/// #
@@ -278,6 +284,7 @@ macro_rules! get_or_init_udwf {
/// # }
/// # fn partition_evaluator(
/// # &self,
+/// # partition_evaluator_args: PartitionEvaluatorArgs,
/// # ) -> datafusion_common::Result<Box<dyn PartitionEvaluator>> {
/// # unimplemented!()
/// # }
@@ -355,6 +362,7 @@ macro_rules! create_udwf_expr {
/// #
/// # use datafusion_functions_window_common::field::WindowUDFFieldArgs;
/// # use datafusion_functions_window::{define_udwf_and_expr,
get_or_init_udwf, create_udwf_expr};
+/// # use
datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
/// #
/// /// 1. Defines the `simple_udwf()` user-defined window function.
/// ///
@@ -397,6 +405,7 @@ macro_rules! create_udwf_expr {
/// # }
/// # fn partition_evaluator(
/// # &self,
+/// # partition_evaluator_args: PartitionEvaluatorArgs,
/// # ) -> datafusion_common::Result<Box<dyn PartitionEvaluator>> {
/// # unimplemented!()
/// # }
@@ -415,6 +424,7 @@ macro_rules! create_udwf_expr {
/// # use datafusion_expr::{PartitionEvaluator, Signature, Volatility,
WindowUDFImpl};
/// # use datafusion_functions_window::{create_udwf_expr,
define_udwf_and_expr, get_or_init_udwf};
/// # use datafusion_functions_window_common::field::WindowUDFFieldArgs;
+/// # use
datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
/// #
/// /// 1. Defines the `row_number_udwf()` user-defined window function.
/// ///
@@ -459,6 +469,7 @@ macro_rules! create_udwf_expr {
/// # }
/// # fn partition_evaluator(
/// # &self,
+/// # _partition_evaluator_args: PartitionEvaluatorArgs,
/// # ) -> datafusion_common::Result<Box<dyn PartitionEvaluator>> {
/// # unimplemented!()
/// # }
@@ -484,6 +495,7 @@ macro_rules! create_udwf_expr {
/// # use datafusion_common::arrow::datatypes::Field;
/// # use datafusion_common::ScalarValue;
/// # use datafusion_expr::{col, lit};
+/// # use
datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
/// #
/// /// 1. Defines the `lead_udwf()` user-defined window function.
/// ///
@@ -543,6 +555,7 @@ macro_rules! create_udwf_expr {
/// # }
/// # fn partition_evaluator(
/// # &self,
+/// # _partition_evaluator_args: PartitionEvaluatorArgs,
/// # ) -> datafusion_common::Result<Box<dyn PartitionEvaluator>> {
/// # unimplemented!()
/// # }
@@ -570,6 +583,7 @@ macro_rules! create_udwf_expr {
/// # use datafusion_common::arrow::datatypes::Field;
/// # use datafusion_common::ScalarValue;
/// # use datafusion_expr::{col, lit};
+/// # use
datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
/// #
/// /// 1. Defines the `lead_udwf()` user-defined window function.
/// ///
@@ -630,6 +644,7 @@ macro_rules! create_udwf_expr {
/// # }
/// # fn partition_evaluator(
/// # &self,
+/// # _partition_evaluator_args: PartitionEvaluatorArgs,
/// # ) -> datafusion_common::Result<Box<dyn PartitionEvaluator>> {
/// # unimplemented!()
/// # }
diff --git a/datafusion/functions-window/src/row_number.rs
b/datafusion/functions-window/src/row_number.rs
index c903f6778a..ca4372bef2 100644
--- a/datafusion/functions-window/src/row_number.rs
+++ b/datafusion/functions-window/src/row_number.rs
@@ -28,6 +28,7 @@ use datafusion_expr::{
Documentation, PartitionEvaluator, Signature, Volatility, WindowUDFImpl,
};
use datafusion_functions_window_common::field;
+use datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
use field::WindowUDFFieldArgs;
use std::any::Any;
use std::fmt::Debug;
@@ -89,7 +90,10 @@ impl WindowUDFImpl for RowNumber {
&self.signature
}
- fn partition_evaluator(&self) -> Result<Box<dyn PartitionEvaluator>> {
+ fn partition_evaluator(
+ &self,
+ _partition_evaluator_args: PartitionEvaluatorArgs,
+ ) -> Result<Box<dyn PartitionEvaluator>> {
Ok(Box::<NumRowsEvaluator>::default())
}
@@ -162,7 +166,7 @@ mod tests {
let num_rows = values.len();
let actual = RowNumber::default()
- .partition_evaluator()?
+ .partition_evaluator(PartitionEvaluatorArgs::default())?
.evaluate_all(&[values], num_rows)?;
let actual = as_uint64_array(&actual)?;
@@ -178,7 +182,7 @@ mod tests {
let num_rows = values.len();
let actual = RowNumber::default()
- .partition_evaluator()?
+ .partition_evaluator(PartitionEvaluatorArgs::default())?
.evaluate_all(&[values], num_rows)?;
let actual = as_uint64_array(&actual)?;
diff --git a/datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs
b/datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs
index e8164ce989..e720188ae3 100644
--- a/datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs
+++ b/datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs
@@ -1781,6 +1781,8 @@ fn inlist_except(mut l1: InList, l2: &InList) ->
Result<Expr> {
#[cfg(test)]
mod tests {
+ use crate::simplify_expressions::SimplifyContext;
+ use crate::test::test_table_scan_with_name;
use datafusion_common::{assert_contains, DFSchemaRef, ToDFSchema};
use datafusion_expr::{
function::{
@@ -1791,15 +1793,13 @@ mod tests {
*,
};
use datafusion_functions_window_common::field::WindowUDFFieldArgs;
+ use datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
use std::{
collections::HashMap,
ops::{BitAnd, BitOr, BitXor},
sync::Arc,
};
- use crate::simplify_expressions::SimplifyContext;
- use crate::test::test_table_scan_with_name;
-
use super::*;
// ------------------------------
@@ -3896,7 +3896,10 @@ mod tests {
}
}
- fn partition_evaluator(&self) -> Result<Box<dyn PartitionEvaluator>> {
+ fn partition_evaluator(
+ &self,
+ _partition_evaluator_args: PartitionEvaluatorArgs,
+ ) -> Result<Box<dyn PartitionEvaluator>> {
unimplemented!("not needed for tests")
}
diff --git a/datafusion/physical-plan/src/windows/mod.rs
b/datafusion/physical-plan/src/windows/mod.rs
index 6aafaad0ad..ff5085a6d9 100644
--- a/datafusion/physical-plan/src/windows/mod.rs
+++ b/datafusion/physical-plan/src/windows/mod.rs
@@ -52,6 +52,7 @@ mod window_agg_exec;
pub use bounded_window_agg_exec::BoundedWindowAggExec;
use datafusion_functions_window_common::field::WindowUDFFieldArgs;
+use datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
use datafusion_physical_expr::expressions::Column;
pub use datafusion_physical_expr::window::{
BuiltInWindowExpr, PlainAggregateWindowExpr, WindowExpr,
@@ -385,7 +386,13 @@ impl BuiltInWindowFunctionExpr for WindowUDFExpr {
}
fn create_evaluator(&self) -> Result<Box<dyn PartitionEvaluator>> {
- self.fun.partition_evaluator_factory()
+ self.fun
+ .partition_evaluator_factory(PartitionEvaluatorArgs::new(
+ &self.args,
+ &self.input_types,
+ self.is_reversed,
+ self.ignore_nulls,
+ ))
}
fn name(&self) -> &str {
diff --git a/datafusion/proto/tests/cases/roundtrip_logical_plan.rs
b/datafusion/proto/tests/cases/roundtrip_logical_plan.rs
index cd789e06dc..46b1af3d32 100644
--- a/datafusion/proto/tests/cases/roundtrip_logical_plan.rs
+++ b/datafusion/proto/tests/cases/roundtrip_logical_plan.rs
@@ -75,6 +75,7 @@ use datafusion_functions_aggregate::expr_fn::{
};
use datafusion_functions_aggregate::string_agg::string_agg;
use datafusion_functions_window_common::field::WindowUDFFieldArgs;
+use datafusion_functions_window_common::partition::PartitionEvaluatorArgs;
use datafusion_proto::bytes::{
logical_plan_from_bytes, logical_plan_from_bytes_with_extension_codec,
logical_plan_to_bytes, logical_plan_to_bytes_with_extension_codec,
@@ -2459,7 +2460,10 @@ fn roundtrip_window() {
&self.signature
}
- fn partition_evaluator(&self) -> Result<Box<dyn PartitionEvaluator>> {
+ fn partition_evaluator(
+ &self,
+ _partition_evaluator_args: PartitionEvaluatorArgs,
+ ) -> Result<Box<dyn PartitionEvaluator>> {
make_partition_evaluator()
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]