datafusion_spark/function/math/
atan2.rs1use std::sync::Arc;
19
20use arrow::array::{ArrayRef, AsArray, Float64Array};
21use arrow::compute::kernels::arity::binary;
22use arrow::datatypes::{DataType, Float64Type};
23use datafusion_common::Result;
24use datafusion_common::utils::take_function_args;
25use datafusion_expr::{
26 ColumnarValue, ScalarFunctionArgs, ScalarUDFImpl, Signature, Volatility,
27};
28use datafusion_functions::utils::make_scalar_function;
29
30#[derive(Debug, PartialEq, Eq, Hash)]
37pub struct SparkAtan2 {
38 signature: Signature,
39}
40
41impl Default for SparkAtan2 {
42 fn default() -> Self {
43 Self::new()
44 }
45}
46
47impl SparkAtan2 {
48 pub fn new() -> Self {
49 Self {
50 signature: Signature::exact(
52 vec![DataType::Float64, DataType::Float64],
53 Volatility::Immutable,
54 ),
55 }
56 }
57}
58
59impl ScalarUDFImpl for SparkAtan2 {
60 fn name(&self) -> &str {
61 "atan2"
62 }
63
64 fn signature(&self) -> &Signature {
65 &self.signature
66 }
67
68 fn return_type(&self, _arg_types: &[DataType]) -> Result<DataType> {
69 Ok(DataType::Float64)
70 }
71
72 fn invoke_with_args(&self, args: ScalarFunctionArgs) -> Result<ColumnarValue> {
73 make_scalar_function(spark_atan2, vec![])(&args.args)
74 }
75}
76
77fn spark_atan2(args: &[ArrayRef]) -> Result<ArrayRef> {
78 let [y, x] = take_function_args("atan2", args)?;
80 let y = y.as_primitive::<Float64Type>();
81 let x = x.as_primitive::<Float64Type>();
82 let result: Float64Array = binary(y, x, |y, x| y.atan2(x))?;
83 Ok(Arc::new(result))
84}