Skip to content

Commit

Permalink
continue
Browse files Browse the repository at this point in the history
  • Loading branch information
buraksenn committed Nov 3, 2024
1 parent b61b2fc commit 8cf82f0
Show file tree
Hide file tree
Showing 5 changed files with 220 additions and 269 deletions.
105 changes: 1 addition & 104 deletions datafusion/expr/src/built_in_window_function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,115 +17,12 @@

//! Built-in functions module contains all the built-in functions definitions.

use std::fmt;
use std::str::FromStr;

use crate::type_coercion::functions::data_types;
use crate::utils;
use crate::{Signature, Volatility};
use datafusion_common::{plan_datafusion_err, plan_err, DataFusionError, Result};

use arrow::datatypes::DataType;

use strum_macros::EnumIter;

impl fmt::Display for BuiltInWindowFunction {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.name())
}
}

/// A [window function] built in to DataFusion
///
/// [Window Function]: https://en.wikipedia.org/wiki/Window_function_(SQL)
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Hash, EnumIter)]
pub enum BuiltInWindowFunction {
/// returns value evaluated at the row that is the first row of the window frame
FirstValue,
/// Returns value evaluated at the row that is the last row of the window frame
LastValue,
/// Returns value evaluated at the row that is the nth row of the window frame (counting from 1); returns null if no such row
NthValue,
}

impl BuiltInWindowFunction {
pub fn name(&self) -> &str {
use BuiltInWindowFunction::*;
match self {
FirstValue => "first_value",
LastValue => "last_value",
NthValue => "NTH_VALUE",
}
}
}

impl FromStr for BuiltInWindowFunction {
type Err = DataFusionError;
fn from_str(name: &str) -> Result<BuiltInWindowFunction> {
Ok(match name.to_uppercase().as_str() {
"FIRST_VALUE" => BuiltInWindowFunction::FirstValue,
"LAST_VALUE" => BuiltInWindowFunction::LastValue,
"NTH_VALUE" => BuiltInWindowFunction::NthValue,
_ => return plan_err!("There is no built-in window function named {name}"),
})
}
}

/// Returns the datatype of the built-in window function
impl BuiltInWindowFunction {
pub fn return_type(&self, input_expr_types: &[DataType]) -> Result<DataType> {
// Note that this function *must* return the same type that the respective physical expression returns
// or the execution panics.

// Verify that this is a valid set of data types for this function
data_types(input_expr_types, &self.signature())
// Original errors are all related to wrong function signature
// Aggregate them for better error message
.map_err(|_| {
plan_datafusion_err!(
"{}",
utils::generate_signature_error_msg(
&format!("{self}"),
self.signature(),
input_expr_types,
)
)
})?;

match self {
BuiltInWindowFunction::FirstValue
| BuiltInWindowFunction::LastValue
| BuiltInWindowFunction::NthValue => Ok(input_expr_types[0].clone()),
}
}

/// The signatures supported by the built-in window function `fun`.
pub fn signature(&self) -> Signature {
// Note: The physical expression must accept the type returned by this function or the execution panics.
match self {
BuiltInWindowFunction::FirstValue | BuiltInWindowFunction::LastValue => {
Signature::any(1, Volatility::Immutable)
}
BuiltInWindowFunction::NthValue => Signature::any(2, Volatility::Immutable),
}
}
}

#[cfg(test)]
mod tests {
use super::*;
use strum::IntoEnumIterator;
#[test]
// Test for BuiltInWindowFunction's Display and from_str() implementations.
// For each variant in BuiltInWindowFunction, it converts the variant to a string
// and then back to a variant. The test asserts that the original variant and
// the reconstructed variant are the same. This assertion is also necessary for
// function suggestion. See https://github.com/apache/datafusion/issues/8082
fn test_display_and_from_str() {
for func_original in BuiltInWindowFunction::iter() {
let func_name = func_original.to_string();
let func_from_str = BuiltInWindowFunction::from_str(&func_name).unwrap();
assert_eq!(func_from_str, func_original);
}
}
Stub,
}
3 changes: 3 additions & 0 deletions datafusion/functions-window/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@
//!
//! [DataFusion]: https://crates.io/crates/datafusion
//!

extern crate core;

use std::sync::Arc;

use log::debug;
Expand Down
Loading

0 comments on commit 8cf82f0

Please sign in to comment.