datafusion_functions_window/
utils.rs1use datafusion_common::arrow::datatypes::DataType;
19use datafusion_common::{exec_err, DataFusionError, Result, ScalarValue};
20use datafusion_physical_expr::expressions::Literal;
21use datafusion_physical_expr_common::physical_expr::PhysicalExpr;
22use std::sync::Arc;
23
24pub(crate) fn get_signed_integer(value: ScalarValue) -> Result<i64> {
25 if value.is_null() {
26 return Ok(0);
27 }
28
29 if !value.data_type().is_integer() {
30 return exec_err!("Expected an integer value");
31 }
32
33 value.cast_to(&DataType::Int64)?.try_into()
34}
35
36pub(crate) fn get_scalar_value_from_args(
37 args: &[Arc<dyn PhysicalExpr>],
38 index: usize,
39) -> Result<Option<ScalarValue>> {
40 Ok(if let Some(field) = args.get(index) {
41 let tmp = field
42 .as_any()
43 .downcast_ref::<Literal>()
44 .ok_or_else(|| DataFusionError::NotImplemented(
45 format!("There is only support Literal types for field at idx: {index} in Window Function"),
46 ))?
47 .value()
48 .clone();
49 Some(tmp)
50 } else {
51 None
52 })
53}
54
55pub(crate) fn get_unsigned_integer(value: ScalarValue) -> Result<u64> {
56 if value.is_null() {
57 return Ok(0);
58 }
59
60 if !value.data_type().is_integer() {
61 return exec_err!("Expected an integer value");
62 }
63
64 value.cast_to(&DataType::UInt64)?.try_into()
65}