From 609758b8f46fc3900cd9ecfd5bfa9ab2b63d1695 Mon Sep 17 00:00:00 2001 From: cli2 Date: Wed, 12 Jul 2023 12:44:26 +0800 Subject: [PATCH 01/11] [EBAY-KYLIN-4185]Support Arithmetic function COT() --- datafusion/expr/src/built_in_function.rs | 3 + datafusion/expr/src/expr_fn.rs | 2 + datafusion/physical-expr/src/functions.rs | 3 + .../physical-expr/src/math_expressions.rs | 72 +++++++++++++++++++ datafusion/proto/proto/datafusion.proto | 1 + datafusion/proto/src/generated/pbjson.rs | 3 + datafusion/proto/src/generated/prost.rs | 3 + .../proto/src/logical_plan/from_proto.rs | 1 + datafusion/proto/src/logical_plan/to_proto.rs | 1 + 9 files changed, 89 insertions(+) diff --git a/datafusion/expr/src/built_in_function.rs b/datafusion/expr/src/built_in_function.rs index 9acb82d47b05..cfec0787b86e 100644 --- a/datafusion/expr/src/built_in_function.rs +++ b/datafusion/expr/src/built_in_function.rs @@ -111,6 +111,8 @@ pub enum BuiltinScalarFunction { Tanh, /// trunc Trunc, + /// cot + Cot, // array functions /// array_append @@ -339,6 +341,7 @@ impl BuiltinScalarFunction { BuiltinScalarFunction::ArrayReplace => Volatility::Immutable, BuiltinScalarFunction::ArrayToString => Volatility::Immutable, BuiltinScalarFunction::Cardinality => Volatility::Immutable, + BuiltinScalarFunction::Cot => Volatility::Immutable, BuiltinScalarFunction::MakeArray => Volatility::Immutable, BuiltinScalarFunction::TrimArray => Volatility::Immutable, BuiltinScalarFunction::Ascii => Volatility::Immutable, diff --git a/datafusion/expr/src/expr_fn.rs b/datafusion/expr/src/expr_fn.rs index 480ea5d60890..4773737674f2 100644 --- a/datafusion/expr/src/expr_fn.rs +++ b/datafusion/expr/src/expr_fn.rs @@ -476,6 +476,7 @@ scalar_expr!(Cbrt, cbrt, num, "cube root of a number"); scalar_expr!(Sin, sin, num, "sine"); scalar_expr!(Cos, cos, num, "cosine"); scalar_expr!(Tan, tan, num, "tangent"); +scalar_expr!(Cot, cot, num, "cotangent"); scalar_expr!(Sinh, sinh, num, "hyperbolic sine"); scalar_expr!(Cosh, cosh, num, "hyperbolic cosine"); scalar_expr!(Tanh, tanh, num, "hyperbolic tangent"); @@ -912,6 +913,7 @@ mod test { test_unary_scalar_expr!(Sin, sin); test_unary_scalar_expr!(Cos, cos); test_unary_scalar_expr!(Tan, tan); + test_unary_scalar_expr!(Cot, cot); test_unary_scalar_expr!(Sinh, sinh); test_unary_scalar_expr!(Cosh, cosh); test_unary_scalar_expr!(Tanh, tanh); diff --git a/datafusion/physical-expr/src/functions.rs b/datafusion/physical-expr/src/functions.rs index 6a81042b7cb4..a92d4335d42c 100644 --- a/datafusion/physical-expr/src/functions.rs +++ b/datafusion/physical-expr/src/functions.rs @@ -403,6 +403,9 @@ pub fn create_physical_fun( BuiltinScalarFunction::Log => { Arc::new(|args| make_scalar_function(math_expressions::log)(args)) } + BuiltinScalarFunction::Cot => { + Arc::new(|args| make_scalar_function(math_expressions::cot)(args)) + } // array functions BuiltinScalarFunction::ArrayAppend => { diff --git a/datafusion/physical-expr/src/math_expressions.rs b/datafusion/physical-expr/src/math_expressions.rs index fbfb82814e0f..98f123b6878d 100644 --- a/datafusion/physical-expr/src/math_expressions.rs +++ b/datafusion/physical-expr/src/math_expressions.rs @@ -497,6 +497,46 @@ pub fn log(args: &[ArrayRef]) -> Result { } } +pub fn cot(args: &[ArrayRef]) -> Result { + match args[0].data_type() { + DataType::Float64 => Ok(Arc::new(make_function_inputs2!( + &args[0], + &args[0], + "x", + "y", + Float64Array, + Float64Array, + { compute_cot64 } + )) as ArrayRef), + + DataType::Float32 => Ok(Arc::new(make_function_inputs2!( + &args[0], + &args[0], + "x", + "y", + Float32Array, + Float32Array, + { compute_cot32 } + )) as ArrayRef), + + other => Err(DataFusionError::Internal(format!( + "Unsupported data type {other:?} for function cot" + ))), + } +} + +fn compute_cot32(x:f32, y:f32) -> f32 { + let a = f32::sin(x); + let b = f32::cos(y); + return b / a; +} + +fn compute_cot64(x:f64, y:f64) -> f64 { + let a = f64::sin(x); + let b = f64::cos(y); + return b / a; +} + #[cfg(test)] mod tests { @@ -739,4 +779,36 @@ mod tests { assert_eq!(ints.value(2), 75); assert_eq!(ints.value(3), 16); } + + #[test] + fn test_cot_f32() { + let args: Vec = vec![ + Arc::new(Float32Array::from(vec![12.1, 30.0, 90.0, -30.0])) + ]; + let result = cot(&args).expect("failed to initialize function cot"); + let floats = as_float32_array(&result).expect("failed to initialize function cot"); + + let expected = Float32Array::from( + vec![-1.98646045, -0.156119958, -0.501202822, 0.156119958]); + + assert_eq!(floats.len(), 4); + assert_eq!(floats, &expected); + + } + + #[test] + fn test_cot_f64() { + let args: Vec = vec![ + Arc::new(Float64Array::from(vec![12.1, 30.0, 90.0, -30.0])) + ]; + let result = cot(&args).expect("failed to initialize function cot"); + let floats = as_float64_array(&result).expect("failed to initialize function cot"); + + let expected = Float64Array::from( + vec![-1.9864586858814326, -0.15611995216165922, -0.5012027833801533, 0.15611995216165922]); + + assert_eq!(floats.len(), 4); + assert_eq!(floats, &expected); + } + } diff --git a/datafusion/proto/proto/datafusion.proto b/datafusion/proto/proto/datafusion.proto index 89bca57cf306..b26d18947f0f 100644 --- a/datafusion/proto/proto/datafusion.proto +++ b/datafusion/proto/proto/datafusion.proto @@ -566,6 +566,7 @@ enum ScalarFunction { ArrayContains = 100; Encode = 101; Decode = 102; + Cot = 103; } message ScalarFunctionNode { diff --git a/datafusion/proto/src/generated/pbjson.rs b/datafusion/proto/src/generated/pbjson.rs index 590b462ad815..1c22f7316c93 100644 --- a/datafusion/proto/src/generated/pbjson.rs +++ b/datafusion/proto/src/generated/pbjson.rs @@ -17968,6 +17968,7 @@ impl serde::Serialize for ScalarFunction { Self::Ascii => "Ascii", Self::Ceil => "Ceil", Self::Cos => "Cos", + Self::Cot => "Cot", Self::Digest => "Digest", Self::Exp => "Exp", Self::Floor => "Floor", @@ -18082,6 +18083,7 @@ impl<'de> serde::Deserialize<'de> for ScalarFunction { "Ascii", "Ceil", "Cos", + "Cot", "Digest", "Exp", "Floor", @@ -18227,6 +18229,7 @@ impl<'de> serde::Deserialize<'de> for ScalarFunction { "Ascii" => Ok(ScalarFunction::Ascii), "Ceil" => Ok(ScalarFunction::Ceil), "Cos" => Ok(ScalarFunction::Cos), + "Cot" => Ok(ScalarFunction::Cot), "Digest" => Ok(ScalarFunction::Digest), "Exp" => Ok(ScalarFunction::Exp), "Floor" => Ok(ScalarFunction::Floor), diff --git a/datafusion/proto/src/generated/prost.rs b/datafusion/proto/src/generated/prost.rs index 251760f0902a..7dcaad88dc2e 100644 --- a/datafusion/proto/src/generated/prost.rs +++ b/datafusion/proto/src/generated/prost.rs @@ -2248,6 +2248,7 @@ pub enum ScalarFunction { Factorial = 83, Lcm = 84, Gcd = 85, + Cot = 86, ArrayAppend = 86, ArrayConcat = 87, ArrayDims = 88, @@ -2280,6 +2281,7 @@ impl ScalarFunction { ScalarFunction::Ascii => "Ascii", ScalarFunction::Ceil => "Ceil", ScalarFunction::Cos => "Cos", + ScalarFunction::Cot => "Cot", ScalarFunction::Digest => "Digest", ScalarFunction::Exp => "Exp", ScalarFunction::Floor => "Floor", @@ -2388,6 +2390,7 @@ impl ScalarFunction { "Ascii" => Some(Self::Ascii), "Ceil" => Some(Self::Ceil), "Cos" => Some(Self::Cos), + "Cot" => Some(Self::Cot), "Digest" => Some(Self::Digest), "Exp" => Some(Self::Exp), "Floor" => Some(Self::Floor), diff --git a/datafusion/proto/src/logical_plan/from_proto.rs b/datafusion/proto/src/logical_plan/from_proto.rs index 1b48364ad418..13f34458d4d2 100644 --- a/datafusion/proto/src/logical_plan/from_proto.rs +++ b/datafusion/proto/src/logical_plan/from_proto.rs @@ -417,6 +417,7 @@ impl From<&protobuf::ScalarFunction> for BuiltinScalarFunction { ScalarFunction::Sin => Self::Sin, ScalarFunction::Cos => Self::Cos, ScalarFunction::Tan => Self::Tan, + ScalarFunction::Cot => Self::Cot, ScalarFunction::Asin => Self::Asin, ScalarFunction::Acos => Self::Acos, ScalarFunction::Atan => Self::Atan, diff --git a/datafusion/proto/src/logical_plan/to_proto.rs b/datafusion/proto/src/logical_plan/to_proto.rs index 8665ca00c317..30bb30950cdb 100644 --- a/datafusion/proto/src/logical_plan/to_proto.rs +++ b/datafusion/proto/src/logical_plan/to_proto.rs @@ -1344,6 +1344,7 @@ impl TryFrom<&BuiltinScalarFunction> for protobuf::ScalarFunction { BuiltinScalarFunction::Sin => Self::Sin, BuiltinScalarFunction::Cos => Self::Cos, BuiltinScalarFunction::Tan => Self::Tan, + BuiltinScalarFunction::Cot => Self::Cot, BuiltinScalarFunction::Sinh => Self::Sinh, BuiltinScalarFunction::Cosh => Self::Cosh, BuiltinScalarFunction::Tanh => Self::Tanh, From 1956bb1a1cda14397859d39c7b96b3556a499cff Mon Sep 17 00:00:00 2001 From: cli2 Date: Wed, 12 Jul 2023 13:09:22 +0800 Subject: [PATCH 02/11] [EBAY-KYLIN-4185]Support Arithmetic function COT() --- datafusion/proto/src/generated/prost.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datafusion/proto/src/generated/prost.rs b/datafusion/proto/src/generated/prost.rs index 7dcaad88dc2e..7a3b0cd2c81c 100644 --- a/datafusion/proto/src/generated/prost.rs +++ b/datafusion/proto/src/generated/prost.rs @@ -2248,7 +2248,6 @@ pub enum ScalarFunction { Factorial = 83, Lcm = 84, Gcd = 85, - Cot = 86, ArrayAppend = 86, ArrayConcat = 87, ArrayDims = 88, @@ -2266,6 +2265,7 @@ pub enum ScalarFunction { ArrayContains = 100, Encode = 101, Decode = 102, + Cot = 103, } impl ScalarFunction { /// String value of the enum field names used in the ProtoBuf definition. From ce8370a335ea17c2596c12e6bb2b9c21d26e8787 Mon Sep 17 00:00:00 2001 From: cli2 Date: Wed, 12 Jul 2023 12:44:26 +0800 Subject: [PATCH 03/11] Support Arithmetic function COT() --- datafusion/expr/src/built_in_function.rs | 3 + datafusion/expr/src/expr_fn.rs | 2 + datafusion/physical-expr/src/functions.rs | 3 + .../physical-expr/src/math_expressions.rs | 72 +++++++++++++++++++ datafusion/proto/proto/datafusion.proto | 1 + datafusion/proto/src/generated/pbjson.rs | 3 + datafusion/proto/src/generated/prost.rs | 3 + .../proto/src/logical_plan/from_proto.rs | 1 + datafusion/proto/src/logical_plan/to_proto.rs | 1 + 9 files changed, 89 insertions(+) diff --git a/datafusion/expr/src/built_in_function.rs b/datafusion/expr/src/built_in_function.rs index 9acb82d47b05..cfec0787b86e 100644 --- a/datafusion/expr/src/built_in_function.rs +++ b/datafusion/expr/src/built_in_function.rs @@ -111,6 +111,8 @@ pub enum BuiltinScalarFunction { Tanh, /// trunc Trunc, + /// cot + Cot, // array functions /// array_append @@ -339,6 +341,7 @@ impl BuiltinScalarFunction { BuiltinScalarFunction::ArrayReplace => Volatility::Immutable, BuiltinScalarFunction::ArrayToString => Volatility::Immutable, BuiltinScalarFunction::Cardinality => Volatility::Immutable, + BuiltinScalarFunction::Cot => Volatility::Immutable, BuiltinScalarFunction::MakeArray => Volatility::Immutable, BuiltinScalarFunction::TrimArray => Volatility::Immutable, BuiltinScalarFunction::Ascii => Volatility::Immutable, diff --git a/datafusion/expr/src/expr_fn.rs b/datafusion/expr/src/expr_fn.rs index 480ea5d60890..4773737674f2 100644 --- a/datafusion/expr/src/expr_fn.rs +++ b/datafusion/expr/src/expr_fn.rs @@ -476,6 +476,7 @@ scalar_expr!(Cbrt, cbrt, num, "cube root of a number"); scalar_expr!(Sin, sin, num, "sine"); scalar_expr!(Cos, cos, num, "cosine"); scalar_expr!(Tan, tan, num, "tangent"); +scalar_expr!(Cot, cot, num, "cotangent"); scalar_expr!(Sinh, sinh, num, "hyperbolic sine"); scalar_expr!(Cosh, cosh, num, "hyperbolic cosine"); scalar_expr!(Tanh, tanh, num, "hyperbolic tangent"); @@ -912,6 +913,7 @@ mod test { test_unary_scalar_expr!(Sin, sin); test_unary_scalar_expr!(Cos, cos); test_unary_scalar_expr!(Tan, tan); + test_unary_scalar_expr!(Cot, cot); test_unary_scalar_expr!(Sinh, sinh); test_unary_scalar_expr!(Cosh, cosh); test_unary_scalar_expr!(Tanh, tanh); diff --git a/datafusion/physical-expr/src/functions.rs b/datafusion/physical-expr/src/functions.rs index 6a81042b7cb4..a92d4335d42c 100644 --- a/datafusion/physical-expr/src/functions.rs +++ b/datafusion/physical-expr/src/functions.rs @@ -403,6 +403,9 @@ pub fn create_physical_fun( BuiltinScalarFunction::Log => { Arc::new(|args| make_scalar_function(math_expressions::log)(args)) } + BuiltinScalarFunction::Cot => { + Arc::new(|args| make_scalar_function(math_expressions::cot)(args)) + } // array functions BuiltinScalarFunction::ArrayAppend => { diff --git a/datafusion/physical-expr/src/math_expressions.rs b/datafusion/physical-expr/src/math_expressions.rs index fbfb82814e0f..98f123b6878d 100644 --- a/datafusion/physical-expr/src/math_expressions.rs +++ b/datafusion/physical-expr/src/math_expressions.rs @@ -497,6 +497,46 @@ pub fn log(args: &[ArrayRef]) -> Result { } } +pub fn cot(args: &[ArrayRef]) -> Result { + match args[0].data_type() { + DataType::Float64 => Ok(Arc::new(make_function_inputs2!( + &args[0], + &args[0], + "x", + "y", + Float64Array, + Float64Array, + { compute_cot64 } + )) as ArrayRef), + + DataType::Float32 => Ok(Arc::new(make_function_inputs2!( + &args[0], + &args[0], + "x", + "y", + Float32Array, + Float32Array, + { compute_cot32 } + )) as ArrayRef), + + other => Err(DataFusionError::Internal(format!( + "Unsupported data type {other:?} for function cot" + ))), + } +} + +fn compute_cot32(x:f32, y:f32) -> f32 { + let a = f32::sin(x); + let b = f32::cos(y); + return b / a; +} + +fn compute_cot64(x:f64, y:f64) -> f64 { + let a = f64::sin(x); + let b = f64::cos(y); + return b / a; +} + #[cfg(test)] mod tests { @@ -739,4 +779,36 @@ mod tests { assert_eq!(ints.value(2), 75); assert_eq!(ints.value(3), 16); } + + #[test] + fn test_cot_f32() { + let args: Vec = vec![ + Arc::new(Float32Array::from(vec![12.1, 30.0, 90.0, -30.0])) + ]; + let result = cot(&args).expect("failed to initialize function cot"); + let floats = as_float32_array(&result).expect("failed to initialize function cot"); + + let expected = Float32Array::from( + vec![-1.98646045, -0.156119958, -0.501202822, 0.156119958]); + + assert_eq!(floats.len(), 4); + assert_eq!(floats, &expected); + + } + + #[test] + fn test_cot_f64() { + let args: Vec = vec![ + Arc::new(Float64Array::from(vec![12.1, 30.0, 90.0, -30.0])) + ]; + let result = cot(&args).expect("failed to initialize function cot"); + let floats = as_float64_array(&result).expect("failed to initialize function cot"); + + let expected = Float64Array::from( + vec![-1.9864586858814326, -0.15611995216165922, -0.5012027833801533, 0.15611995216165922]); + + assert_eq!(floats.len(), 4); + assert_eq!(floats, &expected); + } + } diff --git a/datafusion/proto/proto/datafusion.proto b/datafusion/proto/proto/datafusion.proto index 89bca57cf306..b26d18947f0f 100644 --- a/datafusion/proto/proto/datafusion.proto +++ b/datafusion/proto/proto/datafusion.proto @@ -566,6 +566,7 @@ enum ScalarFunction { ArrayContains = 100; Encode = 101; Decode = 102; + Cot = 103; } message ScalarFunctionNode { diff --git a/datafusion/proto/src/generated/pbjson.rs b/datafusion/proto/src/generated/pbjson.rs index 590b462ad815..1c22f7316c93 100644 --- a/datafusion/proto/src/generated/pbjson.rs +++ b/datafusion/proto/src/generated/pbjson.rs @@ -17968,6 +17968,7 @@ impl serde::Serialize for ScalarFunction { Self::Ascii => "Ascii", Self::Ceil => "Ceil", Self::Cos => "Cos", + Self::Cot => "Cot", Self::Digest => "Digest", Self::Exp => "Exp", Self::Floor => "Floor", @@ -18082,6 +18083,7 @@ impl<'de> serde::Deserialize<'de> for ScalarFunction { "Ascii", "Ceil", "Cos", + "Cot", "Digest", "Exp", "Floor", @@ -18227,6 +18229,7 @@ impl<'de> serde::Deserialize<'de> for ScalarFunction { "Ascii" => Ok(ScalarFunction::Ascii), "Ceil" => Ok(ScalarFunction::Ceil), "Cos" => Ok(ScalarFunction::Cos), + "Cot" => Ok(ScalarFunction::Cot), "Digest" => Ok(ScalarFunction::Digest), "Exp" => Ok(ScalarFunction::Exp), "Floor" => Ok(ScalarFunction::Floor), diff --git a/datafusion/proto/src/generated/prost.rs b/datafusion/proto/src/generated/prost.rs index 251760f0902a..7dcaad88dc2e 100644 --- a/datafusion/proto/src/generated/prost.rs +++ b/datafusion/proto/src/generated/prost.rs @@ -2248,6 +2248,7 @@ pub enum ScalarFunction { Factorial = 83, Lcm = 84, Gcd = 85, + Cot = 86, ArrayAppend = 86, ArrayConcat = 87, ArrayDims = 88, @@ -2280,6 +2281,7 @@ impl ScalarFunction { ScalarFunction::Ascii => "Ascii", ScalarFunction::Ceil => "Ceil", ScalarFunction::Cos => "Cos", + ScalarFunction::Cot => "Cot", ScalarFunction::Digest => "Digest", ScalarFunction::Exp => "Exp", ScalarFunction::Floor => "Floor", @@ -2388,6 +2390,7 @@ impl ScalarFunction { "Ascii" => Some(Self::Ascii), "Ceil" => Some(Self::Ceil), "Cos" => Some(Self::Cos), + "Cot" => Some(Self::Cot), "Digest" => Some(Self::Digest), "Exp" => Some(Self::Exp), "Floor" => Some(Self::Floor), diff --git a/datafusion/proto/src/logical_plan/from_proto.rs b/datafusion/proto/src/logical_plan/from_proto.rs index 1b48364ad418..13f34458d4d2 100644 --- a/datafusion/proto/src/logical_plan/from_proto.rs +++ b/datafusion/proto/src/logical_plan/from_proto.rs @@ -417,6 +417,7 @@ impl From<&protobuf::ScalarFunction> for BuiltinScalarFunction { ScalarFunction::Sin => Self::Sin, ScalarFunction::Cos => Self::Cos, ScalarFunction::Tan => Self::Tan, + ScalarFunction::Cot => Self::Cot, ScalarFunction::Asin => Self::Asin, ScalarFunction::Acos => Self::Acos, ScalarFunction::Atan => Self::Atan, diff --git a/datafusion/proto/src/logical_plan/to_proto.rs b/datafusion/proto/src/logical_plan/to_proto.rs index 8665ca00c317..30bb30950cdb 100644 --- a/datafusion/proto/src/logical_plan/to_proto.rs +++ b/datafusion/proto/src/logical_plan/to_proto.rs @@ -1344,6 +1344,7 @@ impl TryFrom<&BuiltinScalarFunction> for protobuf::ScalarFunction { BuiltinScalarFunction::Sin => Self::Sin, BuiltinScalarFunction::Cos => Self::Cos, BuiltinScalarFunction::Tan => Self::Tan, + BuiltinScalarFunction::Cot => Self::Cot, BuiltinScalarFunction::Sinh => Self::Sinh, BuiltinScalarFunction::Cosh => Self::Cosh, BuiltinScalarFunction::Tanh => Self::Tanh, From 8fca5e6ec7c8616aca1a06ad9bb3ece9b588469d Mon Sep 17 00:00:00 2001 From: cli2 Date: Wed, 12 Jul 2023 13:09:22 +0800 Subject: [PATCH 04/11] Support Arithmetic function COT() --- datafusion/proto/src/generated/prost.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datafusion/proto/src/generated/prost.rs b/datafusion/proto/src/generated/prost.rs index 7dcaad88dc2e..7a3b0cd2c81c 100644 --- a/datafusion/proto/src/generated/prost.rs +++ b/datafusion/proto/src/generated/prost.rs @@ -2248,7 +2248,6 @@ pub enum ScalarFunction { Factorial = 83, Lcm = 84, Gcd = 85, - Cot = 86, ArrayAppend = 86, ArrayConcat = 87, ArrayDims = 88, @@ -2266,6 +2265,7 @@ pub enum ScalarFunction { ArrayContains = 100, Encode = 101, Decode = 102, + Cot = 103, } impl ScalarFunction { /// String value of the enum field names used in the ProtoBuf definition. From cda9006f2cfcbccd038d55a3ba5d7eba41ddd2d5 Mon Sep 17 00:00:00 2001 From: cli2 Date: Wed, 12 Jul 2023 13:47:20 +0800 Subject: [PATCH 05/11] modify code format --- datafusion/expr/src/built_in_function.rs | 8 +++-- .../physical-expr/src/math_expressions.rs | 36 +++++++++++-------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/datafusion/expr/src/built_in_function.rs b/datafusion/expr/src/built_in_function.rs index cfec0787b86e..5a2a02b8731c 100644 --- a/datafusion/expr/src/built_in_function.rs +++ b/datafusion/expr/src/built_in_function.rs @@ -324,6 +324,7 @@ impl BuiltinScalarFunction { BuiltinScalarFunction::Sinh => Volatility::Immutable, BuiltinScalarFunction::Sqrt => Volatility::Immutable, BuiltinScalarFunction::Cbrt => Volatility::Immutable, + BuiltinScalarFunction::Cot => Volatility::Immutable, BuiltinScalarFunction::Tan => Volatility::Immutable, BuiltinScalarFunction::Tanh => Volatility::Immutable, BuiltinScalarFunction::Trunc => Volatility::Immutable, @@ -767,7 +768,8 @@ impl BuiltinScalarFunction { | BuiltinScalarFunction::Cbrt | BuiltinScalarFunction::Tan | BuiltinScalarFunction::Tanh - | BuiltinScalarFunction::Trunc => match input_expr_types[0] { + | BuiltinScalarFunction::Trunc + | BuiltinScalarFunction::Cot => match input_expr_types[0] { Float32 => Ok(Float32), _ => Ok(Float64), }, @@ -1115,7 +1117,8 @@ impl BuiltinScalarFunction { | BuiltinScalarFunction::Sqrt | BuiltinScalarFunction::Tan | BuiltinScalarFunction::Tanh - | BuiltinScalarFunction::Trunc => { + | BuiltinScalarFunction::Trunc + | BuiltinScalarFunction::Cot => { // math expressions expect 1 argument of type f64 or f32 // priority is given to f64 because e.g. `sqrt(1i32)` is in IR (real numbers) and thus we // return the best approximation for it (in f64). @@ -1145,6 +1148,7 @@ fn aliases(func: &BuiltinScalarFunction) -> &'static [&'static str] { BuiltinScalarFunction::Cbrt => &["cbrt"], BuiltinScalarFunction::Ceil => &["ceil"], BuiltinScalarFunction::Cos => &["cos"], + BuiltinScalarFunction::Cot => &["cot"], BuiltinScalarFunction::Cosh => &["cosh"], BuiltinScalarFunction::Degrees => &["degrees"], BuiltinScalarFunction::Exp => &["exp"], diff --git a/datafusion/physical-expr/src/math_expressions.rs b/datafusion/physical-expr/src/math_expressions.rs index 98f123b6878d..bd67d5a06eb3 100644 --- a/datafusion/physical-expr/src/math_expressions.rs +++ b/datafusion/physical-expr/src/math_expressions.rs @@ -525,13 +525,13 @@ pub fn cot(args: &[ArrayRef]) -> Result { } } -fn compute_cot32(x:f32, y:f32) -> f32 { +fn compute_cot32(x: f32, y: f32) -> f32 { let a = f32::sin(x); let b = f32::cos(y); return b / a; } -fn compute_cot64(x:f64, y:f64) -> f64 { +fn compute_cot64(x: f64, y: f64) -> f64 { let a = f64::sin(x); let b = f64::cos(y); return b / a; @@ -782,14 +782,18 @@ mod tests { #[test] fn test_cot_f32() { - let args: Vec = vec![ - Arc::new(Float32Array::from(vec![12.1, 30.0, 90.0, -30.0])) - ]; + let args: Vec = + vec![Arc::new(Float32Array::from(vec![12.1, 30.0, 90.0, -30.0]))]; let result = cot(&args).expect("failed to initialize function cot"); - let floats = as_float32_array(&result).expect("failed to initialize function cot"); + let floats = + as_float32_array(&result).expect("failed to initialize function cot"); - let expected = Float32Array::from( - vec![-1.98646045, -0.156119958, -0.501202822, 0.156119958]); + let expected = Float32Array::from(vec![ + -1.98646045, + -0.156119958, + -0.501202822, + 0.156119958 + ]); assert_eq!(floats.len(), 4); assert_eq!(floats, &expected); @@ -798,14 +802,18 @@ mod tests { #[test] fn test_cot_f64() { - let args: Vec = vec![ - Arc::new(Float64Array::from(vec![12.1, 30.0, 90.0, -30.0])) - ]; + let args: Vec = + vec![Arc::new(Float64Array::from(vec![12.1, 30.0, 90.0, -30.0]))]; let result = cot(&args).expect("failed to initialize function cot"); - let floats = as_float64_array(&result).expect("failed to initialize function cot"); + let floats = + as_float64_array(&result).expect("failed to initialize function cot"); - let expected = Float64Array::from( - vec![-1.9864586858814326, -0.15611995216165922, -0.5012027833801533, 0.15611995216165922]); + let expected = Float64Array::from(vec![ + -1.9864586858814326, + -0.15611995216165922, + -0.5012027833801533, + 0.15611995216165922 + ]); assert_eq!(floats.len(), 4); assert_eq!(floats, &expected); From b450df7f39fe18225ab602a52f3f59acd48abaff Mon Sep 17 00:00:00 2001 From: cli2 Date: Wed, 12 Jul 2023 14:09:30 +0800 Subject: [PATCH 06/11] modify code format --- datafusion/expr/src/built_in_function.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/datafusion/expr/src/built_in_function.rs b/datafusion/expr/src/built_in_function.rs index 5a2a02b8731c..74561d9fd7f5 100644 --- a/datafusion/expr/src/built_in_function.rs +++ b/datafusion/expr/src/built_in_function.rs @@ -342,7 +342,6 @@ impl BuiltinScalarFunction { BuiltinScalarFunction::ArrayReplace => Volatility::Immutable, BuiltinScalarFunction::ArrayToString => Volatility::Immutable, BuiltinScalarFunction::Cardinality => Volatility::Immutable, - BuiltinScalarFunction::Cot => Volatility::Immutable, BuiltinScalarFunction::MakeArray => Volatility::Immutable, BuiltinScalarFunction::TrimArray => Volatility::Immutable, BuiltinScalarFunction::Ascii => Volatility::Immutable, From 378787bc43f2fe1ea48fd7fa04fc5ebe5698c803 Mon Sep 17 00:00:00 2001 From: cli2 Date: Wed, 12 Jul 2023 14:39:48 +0800 Subject: [PATCH 07/11] modify code format --- datafusion/physical-expr/src/math_expressions.rs | 6 ++---- datafusion/proto/src/generated/pbjson.rs | 6 +++--- datafusion/proto/src/generated/prost.rs | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/datafusion/physical-expr/src/math_expressions.rs b/datafusion/physical-expr/src/math_expressions.rs index bd67d5a06eb3..ea3f0a15c813 100644 --- a/datafusion/physical-expr/src/math_expressions.rs +++ b/datafusion/physical-expr/src/math_expressions.rs @@ -792,12 +792,11 @@ mod tests { -1.98646045, -0.156119958, -0.501202822, - 0.156119958 + 0.156119958, ]); assert_eq!(floats.len(), 4); assert_eq!(floats, &expected); - } #[test] @@ -812,11 +811,10 @@ mod tests { -1.9864586858814326, -0.15611995216165922, -0.5012027833801533, - 0.15611995216165922 + 0.15611995216165922, ]); assert_eq!(floats.len(), 4); assert_eq!(floats, &expected); } - } diff --git a/datafusion/proto/src/generated/pbjson.rs b/datafusion/proto/src/generated/pbjson.rs index 1c22f7316c93..09e85f11a710 100644 --- a/datafusion/proto/src/generated/pbjson.rs +++ b/datafusion/proto/src/generated/pbjson.rs @@ -17968,7 +17968,6 @@ impl serde::Serialize for ScalarFunction { Self::Ascii => "Ascii", Self::Ceil => "Ceil", Self::Cos => "Cos", - Self::Cot => "Cot", Self::Digest => "Digest", Self::Exp => "Exp", Self::Floor => "Floor", @@ -18065,6 +18064,7 @@ impl serde::Serialize for ScalarFunction { Self::ArrayContains => "ArrayContains", Self::Encode => "Encode", Self::Decode => "Decode", + Self::Cot => "Cot", }; serializer.serialize_str(variant) } @@ -18083,7 +18083,6 @@ impl<'de> serde::Deserialize<'de> for ScalarFunction { "Ascii", "Ceil", "Cos", - "Cot", "Digest", "Exp", "Floor", @@ -18180,6 +18179,7 @@ impl<'de> serde::Deserialize<'de> for ScalarFunction { "ArrayContains", "Encode", "Decode", + "Cot", ]; struct GeneratedVisitor; @@ -18229,7 +18229,6 @@ impl<'de> serde::Deserialize<'de> for ScalarFunction { "Ascii" => Ok(ScalarFunction::Ascii), "Ceil" => Ok(ScalarFunction::Ceil), "Cos" => Ok(ScalarFunction::Cos), - "Cot" => Ok(ScalarFunction::Cot), "Digest" => Ok(ScalarFunction::Digest), "Exp" => Ok(ScalarFunction::Exp), "Floor" => Ok(ScalarFunction::Floor), @@ -18326,6 +18325,7 @@ impl<'de> serde::Deserialize<'de> for ScalarFunction { "ArrayContains" => Ok(ScalarFunction::ArrayContains), "Encode" => Ok(ScalarFunction::Encode), "Decode" => Ok(ScalarFunction::Decode), + "Cot" => Ok(ScalarFunction::Cot), _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), } } diff --git a/datafusion/proto/src/generated/prost.rs b/datafusion/proto/src/generated/prost.rs index 7a3b0cd2c81c..516aa325bc25 100644 --- a/datafusion/proto/src/generated/prost.rs +++ b/datafusion/proto/src/generated/prost.rs @@ -2281,7 +2281,6 @@ impl ScalarFunction { ScalarFunction::Ascii => "Ascii", ScalarFunction::Ceil => "Ceil", ScalarFunction::Cos => "Cos", - ScalarFunction::Cot => "Cot", ScalarFunction::Digest => "Digest", ScalarFunction::Exp => "Exp", ScalarFunction::Floor => "Floor", @@ -2378,6 +2377,7 @@ impl ScalarFunction { ScalarFunction::ArrayContains => "ArrayContains", ScalarFunction::Encode => "Encode", ScalarFunction::Decode => "Decode", + ScalarFunction::Cot => "Cot", } } /// Creates an enum from field names used in the ProtoBuf definition. @@ -2390,7 +2390,6 @@ impl ScalarFunction { "Ascii" => Some(Self::Ascii), "Ceil" => Some(Self::Ceil), "Cos" => Some(Self::Cos), - "Cot" => Some(Self::Cot), "Digest" => Some(Self::Digest), "Exp" => Some(Self::Exp), "Floor" => Some(Self::Floor), @@ -2487,6 +2486,7 @@ impl ScalarFunction { "ArrayContains" => Some(Self::ArrayContains), "Encode" => Some(Self::Encode), "Decode" => Some(Self::Decode), + "Cot" => Some(Self::Cot), _ => None, } } From bcad1082714b55e4c262fe4943bfc2a15c1313f7 Mon Sep 17 00:00:00 2001 From: cli2 Date: Wed, 12 Jul 2023 15:34:37 +0800 Subject: [PATCH 08/11] modify unit tests --- .../physical-expr/src/math_expressions.rs | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/datafusion/physical-expr/src/math_expressions.rs b/datafusion/physical-expr/src/math_expressions.rs index ea3f0a15c813..dcfa129852da 100644 --- a/datafusion/physical-expr/src/math_expressions.rs +++ b/datafusion/physical-expr/src/math_expressions.rs @@ -528,13 +528,13 @@ pub fn cot(args: &[ArrayRef]) -> Result { fn compute_cot32(x: f32, y: f32) -> f32 { let a = f32::sin(x); let b = f32::cos(y); - return b / a; + b / a } fn compute_cot64(x: f64, y: f64) -> f64 { let a = f64::sin(x); let b = f64::cos(y); - return b / a; + b / a } #[cfg(test)] @@ -789,14 +789,18 @@ mod tests { as_float32_array(&result).expect("failed to initialize function cot"); let expected = Float32Array::from(vec![ - -1.98646045, - -0.156119958, - -0.501202822, - 0.156119958, + -1.986_460_4, + -0.156_119_96, + -0.501_202_8, + 0.156_119_96, ]); + let eps = 1e-6; assert_eq!(floats.len(), 4); - assert_eq!(floats, &expected); + assert!((floats.value(0) - expected.value(0)).abs() < eps); + assert!((floats.value(1) - expected.value(1)).abs() < eps); + assert!((floats.value(2) - expected.value(2)).abs() < eps); + assert!((floats.value(3) - expected.value(3)).abs() < eps); } #[test] @@ -808,13 +812,17 @@ mod tests { as_float64_array(&result).expect("failed to initialize function cot"); let expected = Float64Array::from(vec![ - -1.9864586858814326, - -0.15611995216165922, - -0.5012027833801533, - 0.15611995216165922, + -1.986_458_685_881_4, + -0.156_119_952_161_6, + -0.501_202_783_380_1, + 0.156_119_952_161_6, ]); + let eps = 1e-12; assert_eq!(floats.len(), 4); - assert_eq!(floats, &expected); + assert!((floats.value(0) - expected.value(0)).abs() < eps); + assert!((floats.value(1) - expected.value(1)).abs() < eps); + assert!((floats.value(2) - expected.value(2)).abs() < eps); + assert!((floats.value(3) - expected.value(3)).abs() < eps); } } From b20957e12568c0af72a77140d06c15a8f314303b Mon Sep 17 00:00:00 2001 From: cli2 Date: Wed, 12 Jul 2023 17:06:53 +0800 Subject: [PATCH 09/11] add from proto of cot --- datafusion/proto/src/logical_plan/from_proto.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/datafusion/proto/src/logical_plan/from_proto.rs b/datafusion/proto/src/logical_plan/from_proto.rs index 13f34458d4d2..124dfd4ad8e2 100644 --- a/datafusion/proto/src/logical_plan/from_proto.rs +++ b/datafusion/proto/src/logical_plan/from_proto.rs @@ -41,7 +41,7 @@ use datafusion_expr::{ array_prepend, array_remove, array_replace, array_to_string, ascii, asin, asinh, atan, atan2, atanh, bit_length, btrim, cardinality, cbrt, ceil, character_length, chr, coalesce, concat_expr, concat_ws_expr, cos, cosh, current_date, current_time, - date_bin, date_part, date_trunc, degrees, digest, exp, + date_bin, date_part, date_trunc, degrees, digest, exp, cot, expr::{self, InList, Sort, WindowFunction}, factorial, floor, from_unixtime, gcd, lcm, left, ln, log, log10, log2, logical_plan::{PlanType, StringifiedPlan}, @@ -1474,6 +1474,7 @@ pub fn parse_expr( )), ScalarFunction::CurrentDate => Ok(current_date()), ScalarFunction::CurrentTime => Ok(current_time()), + ScalarFunction::Cot => Ok(cot(parse_expr(&args[0], registry)?)), _ => Err(proto_error( "Protobuf deserialization error: Unsupported scalar function", )), From 0a5307b11d48e42f5db1795605c722ea595fcc1a Mon Sep 17 00:00:00 2001 From: cli2 Date: Thu, 13 Jul 2023 15:35:27 +0800 Subject: [PATCH 10/11] modify cot method --- .../physical-expr/src/math_expressions.rs | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/datafusion/physical-expr/src/math_expressions.rs b/datafusion/physical-expr/src/math_expressions.rs index dcfa129852da..9a4653c8a0c8 100644 --- a/datafusion/physical-expr/src/math_expressions.rs +++ b/datafusion/physical-expr/src/math_expressions.rs @@ -497,24 +497,19 @@ pub fn log(args: &[ArrayRef]) -> Result { } } +///cot SQL function pub fn cot(args: &[ArrayRef]) -> Result { match args[0].data_type() { - DataType::Float64 => Ok(Arc::new(make_function_inputs2!( - &args[0], + DataType::Float64 => Ok(Arc::new(make_function_scalar_inputs!( &args[0], "x", - "y", - Float64Array, Float64Array, { compute_cot64 } )) as ArrayRef), - DataType::Float32 => Ok(Arc::new(make_function_inputs2!( - &args[0], + DataType::Float32 => Ok(Arc::new(make_function_scalar_inputs!( &args[0], "x", - "y", - Float32Array, Float32Array, { compute_cot32 } )) as ArrayRef), @@ -525,16 +520,14 @@ pub fn cot(args: &[ArrayRef]) -> Result { } } -fn compute_cot32(x: f32, y: f32) -> f32 { - let a = f32::sin(x); - let b = f32::cos(y); - b / a +fn compute_cot32(x: f32) -> f32 { + let a = f32::tan(x); + 1.0 / a } -fn compute_cot64(x: f64, y: f64) -> f64 { - let a = f64::sin(x); - let b = f64::cos(y); - b / a +fn compute_cot64(x: f64) -> f64 { + let a = f64::tan(x); + 1.0 / a } #[cfg(test)] From 98c924603a4580a1ef02ae1fc039105c83f95c28 Mon Sep 17 00:00:00 2001 From: cli2 Date: Fri, 14 Jul 2023 14:17:54 +0800 Subject: [PATCH 11/11] adjust code format --- datafusion/proto/src/logical_plan/from_proto.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datafusion/proto/src/logical_plan/from_proto.rs b/datafusion/proto/src/logical_plan/from_proto.rs index 124dfd4ad8e2..8b70480e7d96 100644 --- a/datafusion/proto/src/logical_plan/from_proto.rs +++ b/datafusion/proto/src/logical_plan/from_proto.rs @@ -40,8 +40,8 @@ use datafusion_expr::{ array_fill, array_length, array_ndims, array_position, array_positions, array_prepend, array_remove, array_replace, array_to_string, ascii, asin, asinh, atan, atan2, atanh, bit_length, btrim, cardinality, cbrt, ceil, character_length, - chr, coalesce, concat_expr, concat_ws_expr, cos, cosh, current_date, current_time, - date_bin, date_part, date_trunc, degrees, digest, exp, cot, + chr, coalesce, concat_expr, concat_ws_expr, cos, cosh, cot, current_date, + current_time, date_bin, date_part, date_trunc, degrees, digest, exp, expr::{self, InList, Sort, WindowFunction}, factorial, floor, from_unixtime, gcd, lcm, left, ln, log, log10, log2, logical_plan::{PlanType, StringifiedPlan},