You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by yj...@apache.org on 2023/04/19 01:34:07 UTC

[arrow-datafusion] branch main updated: feat: degrees and radians (#6023)

This is an automated email from the ASF dual-hosted git repository.

yjshen pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new 427231ef88 feat: degrees and radians (#6023)
427231ef88 is described below

commit 427231ef886fb698e71509b59b7a4654a08cd0ff
Author: Igor Izvekov <iz...@gmail.com>
AuthorDate: Wed Apr 19 04:34:01 2023 +0300

    feat: degrees and radians (#6023)
    
    * feat: degrees and radians
    
    * fix: expressions.md
    
    * fix: use prettier
---
 .../core/tests/sqllogictests/test_files/scalar.slt | 24 ++++++++++++++++++
 datafusion/expr/src/built_in_function.rs           |  8 ++++++
 datafusion/expr/src/expr_fn.rs                     |  4 +++
 datafusion/expr/src/function.rs                    |  2 ++
 datafusion/physical-expr/src/functions.rs          |  2 ++
 datafusion/physical-expr/src/math_expressions.rs   |  2 ++
 datafusion/proto/proto/datafusion.proto            |  2 ++
 datafusion/proto/src/generated/pbjson.rs           |  6 +++++
 datafusion/proto/src/generated/prost.rs            |  6 +++++
 datafusion/proto/src/logical_plan/from_proto.rs    | 16 +++++++-----
 datafusion/proto/src/logical_plan/to_proto.rs      |  2 ++
 docs/source/user-guide/expressions.md              |  2 ++
 docs/source/user-guide/sql/scalar_functions.md     | 29 ++++++++++++++++++++++
 13 files changed, 99 insertions(+), 6 deletions(-)

diff --git a/datafusion/core/tests/sqllogictests/test_files/scalar.slt b/datafusion/core/tests/sqllogictests/test_files/scalar.slt
index 138d71e1c4..7583600802 100644
--- a/datafusion/core/tests/sqllogictests/test_files/scalar.slt
+++ b/datafusion/core/tests/sqllogictests/test_files/scalar.slt
@@ -166,6 +166,18 @@ select ceil(null);
 ----
 NULL
 
+# degrees scalar function
+query RRR rowsort
+select degrees(0), degrees(pi() / 2), degrees(pi());
+----
+0 90 180
+
+# degrees scalar nulls
+query R rowsort
+select degrees(null);
+----
+NULL
+
 # cos scalar function
 query RRR rowsort
 select cos(0), cos(pi() / 3), cos(pi() / 2);
@@ -342,6 +354,18 @@ select power(null, null);
 ----
 NULL
 
+# radians scalar function
+query RRR rowsort
+select radians(0), radians(90), radians(180);
+----
+0 1.570796326795 3.14159265359
+
+# radians scalar nulls
+query R rowsort
+select radians(null);
+----
+NULL
+
 # round scalar function
 query RRR rowsort
 select round(1.4), round(1.5), round(1.6);
diff --git a/datafusion/expr/src/built_in_function.rs b/datafusion/expr/src/built_in_function.rs
index 95bd811dd4..524fe23a32 100644
--- a/datafusion/expr/src/built_in_function.rs
+++ b/datafusion/expr/src/built_in_function.rs
@@ -52,6 +52,8 @@ pub enum BuiltinScalarFunction {
     Cos,
     /// cos
     Cosh,
+    /// degrees
+    Degrees,
     /// Digest
     Digest,
     /// exp
@@ -70,6 +72,8 @@ pub enum BuiltinScalarFunction {
     Pi,
     /// power
     Power,
+    /// radians
+    Radians,
     /// round
     Round,
     /// signum
@@ -222,6 +226,7 @@ impl BuiltinScalarFunction {
             BuiltinScalarFunction::Coalesce => Volatility::Immutable,
             BuiltinScalarFunction::Cos => Volatility::Immutable,
             BuiltinScalarFunction::Cosh => Volatility::Immutable,
+            BuiltinScalarFunction::Degrees => Volatility::Immutable,
             BuiltinScalarFunction::Exp => Volatility::Immutable,
             BuiltinScalarFunction::Floor => Volatility::Immutable,
             BuiltinScalarFunction::Ln => Volatility::Immutable,
@@ -258,6 +263,7 @@ impl BuiltinScalarFunction {
             BuiltinScalarFunction::MD5 => Volatility::Immutable,
             BuiltinScalarFunction::NullIf => Volatility::Immutable,
             BuiltinScalarFunction::OctetLength => Volatility::Immutable,
+            BuiltinScalarFunction::Radians => Volatility::Immutable,
             BuiltinScalarFunction::RegexpReplace => Volatility::Immutable,
             BuiltinScalarFunction::Repeat => Volatility::Immutable,
             BuiltinScalarFunction::Replace => Volatility::Immutable,
@@ -323,6 +329,7 @@ impl FromStr for BuiltinScalarFunction {
             "ceil" => BuiltinScalarFunction::Ceil,
             "cos" => BuiltinScalarFunction::Cos,
             "cosh" => BuiltinScalarFunction::Cosh,
+            "degrees" => BuiltinScalarFunction::Degrees,
             "exp" => BuiltinScalarFunction::Exp,
             "floor" => BuiltinScalarFunction::Floor,
             "ln" => BuiltinScalarFunction::Ln,
@@ -331,6 +338,7 @@ impl FromStr for BuiltinScalarFunction {
             "log2" => BuiltinScalarFunction::Log2,
             "pi" => BuiltinScalarFunction::Pi,
             "power" | "pow" => BuiltinScalarFunction::Power,
+            "radians" => BuiltinScalarFunction::Radians,
             "random" => BuiltinScalarFunction::Random,
             "round" => BuiltinScalarFunction::Round,
             "signum" => BuiltinScalarFunction::Signum,
diff --git a/datafusion/expr/src/expr_fn.rs b/datafusion/expr/src/expr_fn.rs
index 9cfc565b59..99ecfd4abe 100644
--- a/datafusion/expr/src/expr_fn.rs
+++ b/datafusion/expr/src/expr_fn.rs
@@ -479,6 +479,8 @@ scalar_expr!(
     num,
     "nearest integer greater than or equal to argument"
 );
+scalar_expr!(Degrees, degrees, num, "converts radians to degrees");
+scalar_expr!(Radians, radians, num, "converts degrees to radians");
 nary_scalar_expr!(Round, round, "round to nearest integer");
 scalar_expr!(Trunc, trunc, num, "truncate toward zero");
 scalar_expr!(Abs, abs, num, "absolute value");
@@ -788,6 +790,8 @@ mod test {
         test_unary_scalar_expr!(Atanh, atanh);
         test_unary_scalar_expr!(Floor, floor);
         test_unary_scalar_expr!(Ceil, ceil);
+        test_unary_scalar_expr!(Degrees, degrees);
+        test_unary_scalar_expr!(Radians, radians);
         test_nary_scalar_expr!(Round, round, input);
         test_nary_scalar_expr!(Round, round, input, decimal_places);
         test_unary_scalar_expr!(Trunc, trunc);
diff --git a/datafusion/expr/src/function.rs b/datafusion/expr/src/function.rs
index eff5111d05..37afd17956 100644
--- a/datafusion/expr/src/function.rs
+++ b/datafusion/expr/src/function.rs
@@ -288,11 +288,13 @@ pub fn return_type(
         | BuiltinScalarFunction::Ceil
         | BuiltinScalarFunction::Cos
         | BuiltinScalarFunction::Cosh
+        | BuiltinScalarFunction::Degrees
         | BuiltinScalarFunction::Exp
         | BuiltinScalarFunction::Floor
         | BuiltinScalarFunction::Ln
         | BuiltinScalarFunction::Log10
         | BuiltinScalarFunction::Log2
+        | BuiltinScalarFunction::Radians
         | BuiltinScalarFunction::Round
         | BuiltinScalarFunction::Signum
         | BuiltinScalarFunction::Sin
diff --git a/datafusion/physical-expr/src/functions.rs b/datafusion/physical-expr/src/functions.rs
index 15d9810b01..352ec08166 100644
--- a/datafusion/physical-expr/src/functions.rs
+++ b/datafusion/physical-expr/src/functions.rs
@@ -345,11 +345,13 @@ pub fn create_physical_fun(
         BuiltinScalarFunction::Ceil => Arc::new(math_expressions::ceil),
         BuiltinScalarFunction::Cos => Arc::new(math_expressions::cos),
         BuiltinScalarFunction::Cosh => Arc::new(math_expressions::cosh),
+        BuiltinScalarFunction::Degrees => Arc::new(math_expressions::to_degrees),
         BuiltinScalarFunction::Exp => Arc::new(math_expressions::exp),
         BuiltinScalarFunction::Floor => Arc::new(math_expressions::floor),
         BuiltinScalarFunction::Ln => Arc::new(math_expressions::ln),
         BuiltinScalarFunction::Log10 => Arc::new(math_expressions::log10),
         BuiltinScalarFunction::Log2 => Arc::new(math_expressions::log2),
+        BuiltinScalarFunction::Radians => Arc::new(math_expressions::to_radians),
         BuiltinScalarFunction::Random => Arc::new(math_expressions::random),
         BuiltinScalarFunction::Round => {
             Arc::new(|args| make_scalar_function(math_expressions::round)(args))
diff --git a/datafusion/physical-expr/src/math_expressions.rs b/datafusion/physical-expr/src/math_expressions.rs
index ee96b19a5c..1af9f29805 100644
--- a/datafusion/physical-expr/src/math_expressions.rs
+++ b/datafusion/physical-expr/src/math_expressions.rs
@@ -164,6 +164,8 @@ math_unary_function!("exp", exp);
 math_unary_function!("ln", ln);
 math_unary_function!("log2", log2);
 math_unary_function!("log10", log10);
+math_unary_function!("degrees", to_degrees);
+math_unary_function!("radians", to_radians);
 
 /// Pi SQL function
 pub fn pi(args: &[ColumnarValue]) -> Result<ColumnarValue> {
diff --git a/datafusion/proto/proto/datafusion.proto b/datafusion/proto/proto/datafusion.proto
index 6b8cc61034..3023cbc264 100644
--- a/datafusion/proto/proto/datafusion.proto
+++ b/datafusion/proto/proto/datafusion.proto
@@ -532,6 +532,8 @@ enum ScalarFunction {
   Cosh = 78;
   Tanh = 79;
   Pi = 80;
+  Degrees = 81;
+  Radians = 82;
 }
 
 message ScalarFunctionNode {
diff --git a/datafusion/proto/src/generated/pbjson.rs b/datafusion/proto/src/generated/pbjson.rs
index 2acac28c40..6a416d37c9 100644
--- a/datafusion/proto/src/generated/pbjson.rs
+++ b/datafusion/proto/src/generated/pbjson.rs
@@ -17321,6 +17321,8 @@ impl serde::Serialize for ScalarFunction {
             Self::Cosh => "Cosh",
             Self::Tanh => "Tanh",
             Self::Pi => "Pi",
+            Self::Degrees => "Degrees",
+            Self::Radians => "Radians",
         };
         serializer.serialize_str(variant)
     }
@@ -17413,6 +17415,8 @@ impl<'de> serde::Deserialize<'de> for ScalarFunction {
             "Cosh",
             "Tanh",
             "Pi",
+            "Degrees",
+            "Radians",
         ];
 
         struct GeneratedVisitor;
@@ -17536,6 +17540,8 @@ impl<'de> serde::Deserialize<'de> for ScalarFunction {
                     "Cosh" => Ok(ScalarFunction::Cosh),
                     "Tanh" => Ok(ScalarFunction::Tanh),
                     "Pi" => Ok(ScalarFunction::Pi),
+                    "Degrees" => Ok(ScalarFunction::Degrees),
+                    "Radians" => Ok(ScalarFunction::Radians),
                     _ => 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 a3d60ef436..8ec16070ee 100644
--- a/datafusion/proto/src/generated/prost.rs
+++ b/datafusion/proto/src/generated/prost.rs
@@ -2152,6 +2152,8 @@ pub enum ScalarFunction {
     Cosh = 78,
     Tanh = 79,
     Pi = 80,
+    Degrees = 81,
+    Radians = 82,
 }
 impl ScalarFunction {
     /// String value of the enum field names used in the ProtoBuf definition.
@@ -2241,6 +2243,8 @@ impl ScalarFunction {
             ScalarFunction::Cosh => "Cosh",
             ScalarFunction::Tanh => "Tanh",
             ScalarFunction::Pi => "Pi",
+            ScalarFunction::Degrees => "Degrees",
+            ScalarFunction::Radians => "Radians",
         }
     }
     /// Creates an enum from field names used in the ProtoBuf definition.
@@ -2327,6 +2331,8 @@ impl ScalarFunction {
             "Cosh" => Some(Self::Cosh),
             "Tanh" => Some(Self::Tanh),
             "Pi" => Some(Self::Pi),
+            "Degrees" => Some(Self::Degrees),
+            "Radians" => Some(Self::Radians),
             _ => None,
         }
     }
diff --git a/datafusion/proto/src/logical_plan/from_proto.rs b/datafusion/proto/src/logical_plan/from_proto.rs
index fdb048c78e..c66fbc0e7d 100644
--- a/datafusion/proto/src/logical_plan/from_proto.rs
+++ b/datafusion/proto/src/logical_plan/from_proto.rs
@@ -37,15 +37,15 @@ use datafusion_common::{
 use datafusion_expr::{
     abs, acos, acosh, array, ascii, asin, asinh, atan, atan2, atanh, bit_length, btrim,
     cbrt, ceil, character_length, chr, coalesce, concat_expr, concat_ws_expr, cos, cosh,
-    date_bin, date_part, date_trunc, digest, exp,
+    date_bin, date_part, date_trunc, degrees, digest, exp,
     expr::{self, Sort, WindowFunction},
     floor, from_unixtime, left, ln, log, log10, log2,
     logical_plan::{PlanType, StringifiedPlan},
-    lower, lpad, ltrim, md5, now, nullif, octet_length, pi, power, random, regexp_match,
-    regexp_replace, repeat, replace, reverse, right, round, rpad, rtrim, sha224, sha256,
-    sha384, sha512, signum, sin, sinh, split_part, sqrt, starts_with, strpos, substr,
-    substring, tan, tanh, to_hex, to_timestamp_micros, to_timestamp_millis,
-    to_timestamp_seconds, translate, trim, trunc, upper, uuid,
+    lower, lpad, ltrim, md5, now, nullif, octet_length, pi, power, radians, random,
+    regexp_match, regexp_replace, repeat, replace, reverse, right, round, rpad, rtrim,
+    sha224, sha256, sha384, sha512, signum, sin, sinh, split_part, sqrt, starts_with,
+    strpos, substr, substring, tan, tanh, to_hex, to_timestamp_micros,
+    to_timestamp_millis, to_timestamp_seconds, translate, trim, trunc, upper, uuid,
     window_frame::regularize,
     AggregateFunction, Between, BinaryExpr, BuiltInWindowFunction, BuiltinScalarFunction,
     Case, Cast, Expr, GetIndexedField, GroupingSet,
@@ -425,6 +425,8 @@ impl From<&protobuf::ScalarFunction> for BuiltinScalarFunction {
             ScalarFunction::Log => Self::Log,
             ScalarFunction::Ln => Self::Ln,
             ScalarFunction::Log10 => Self::Log10,
+            ScalarFunction::Degrees => Self::Degrees,
+            ScalarFunction::Radians => Self::Radians,
             ScalarFunction::Floor => Self::Floor,
             ScalarFunction::Ceil => Self::Ceil,
             ScalarFunction::Round => Self::Round,
@@ -1157,6 +1159,8 @@ pub fn parse_expr(
                 ScalarFunction::Tanh => Ok(tanh(parse_expr(&args[0], registry)?)),
                 ScalarFunction::Atanh => Ok(atanh(parse_expr(&args[0], registry)?)),
                 ScalarFunction::Exp => Ok(exp(parse_expr(&args[0], registry)?)),
+                ScalarFunction::Degrees => Ok(degrees(parse_expr(&args[0], registry)?)),
+                ScalarFunction::Radians => Ok(radians(parse_expr(&args[0], registry)?)),
                 ScalarFunction::Log2 => Ok(log2(parse_expr(&args[0], registry)?)),
                 ScalarFunction::Ln => Ok(ln(parse_expr(&args[0], registry)?)),
                 ScalarFunction::Log10 => Ok(log10(parse_expr(&args[0], registry)?)),
diff --git a/datafusion/proto/src/logical_plan/to_proto.rs b/datafusion/proto/src/logical_plan/to_proto.rs
index 53bc8a7dce..e757f7830b 100644
--- a/datafusion/proto/src/logical_plan/to_proto.rs
+++ b/datafusion/proto/src/logical_plan/to_proto.rs
@@ -1279,6 +1279,8 @@ impl TryFrom<&BuiltinScalarFunction> for protobuf::ScalarFunction {
             BuiltinScalarFunction::Log => Self::Log,
             BuiltinScalarFunction::Ln => Self::Ln,
             BuiltinScalarFunction::Log10 => Self::Log10,
+            BuiltinScalarFunction::Degrees => Self::Degrees,
+            BuiltinScalarFunction::Radians => Self::Radians,
             BuiltinScalarFunction::Floor => Self::Floor,
             BuiltinScalarFunction::Ceil => Self::Ceil,
             BuiltinScalarFunction::Round => Self::Round,
diff --git a/docs/source/user-guide/expressions.md b/docs/source/user-guide/expressions.md
index cbbc328df1..0a8bef345f 100644
--- a/docs/source/user-guide/expressions.md
+++ b/docs/source/user-guide/expressions.md
@@ -89,6 +89,7 @@ expressions such as `col("a") + col("b")` to be used.
 | ceil(x)               | nearest integer greater than or equal to argument |
 | cos(x)                | cosine                                            |
 | cosh(x)               | hyperbolic cosine                                 |
+| degrees(x)            | converts radians to degrees                       |
 | exp(x)                | exponential                                       |
 | floor(x)              | nearest integer less than or equal to argument    |
 | ln(x)                 | natural logarithm                                 |
@@ -97,6 +98,7 @@ expressions such as `col("a") + col("b")` to be used.
 | log2(x)               | base 2 logarithm                                  |
 | pi()                  | approximate value of π                            |
 | power(base, exponent) | base raised to the power of exponent              |
+| radians(x)            | converts degrees to radians                       |
 | round(x)              | round to nearest integer                          |
 | signum(x)             | sign of the argument (-1, 0, +1)                  |
 | sin(x)                | sine                                              |
diff --git a/docs/source/user-guide/sql/scalar_functions.md b/docs/source/user-guide/sql/scalar_functions.md
index 25002e572d..0f2e3f1439 100644
--- a/docs/source/user-guide/sql/scalar_functions.md
+++ b/docs/source/user-guide/sql/scalar_functions.md
@@ -33,6 +33,7 @@
 - [ceil](#ceil)
 - [cos](#cos)
 - [cosh](#cosh)
+- [degrees](#degrees)
 - [exp](#exp)
 - [floor](#floor)
 - [ln](#ln)
@@ -42,6 +43,7 @@
 - [pi](#pi)
 - [power](#power)
 - [pow](#pow)
+- [radians](#radians)
 - [random](#random)
 - [round](#round)
 - [signum](#signum)
@@ -205,6 +207,19 @@ Returns the hyperbolic cosine of a number.
 cosh(numeric_expression)
 ```
 
+### `degrees`
+
+Converts radians to degrees.
+
+```
+degrees(numeric_expression)
+```
+
+#### Arguments
+
+- **numeric_expression**: Numeric expression to operate on.
+  Can be a constant, column, or function, and any combination of arithmetic operators.
+
 #### Arguments
 
 - **numeric_expression**: Numeric expression to operate on.
@@ -323,6 +338,20 @@ power(base, exponent)
 
 _Alias of [power](#power)._
 
+### `radians`
+
+Converts degrees to radians.
+
+```
+radians(numeric_expression)
+```
+
+#### Arguments
+
+- **numeric_expression**: Numeric expression to operate on.
+  Can be a constant, column, or function, and any combination of arithmetic operators.
+  =======
+
 ### `random`
 
 Returns a random float value in the range [0, 1).