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

liuneng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-gluten.git


The following commit(s) were added to refs/heads/main by this push:
     new 42a103b9e [CH] Support expm1 function (#5422)
42a103b9e is described below

commit 42a103b9e1d80249b9bedb71881eaeb4696632b1
Author: exmy <[email protected]>
AuthorDate: Thu Apr 18 20:42:53 2024 +0800

    [CH] Support expm1 function (#5422)
    
    What changes were proposed in this pull request?
    How was this patch tested?
    Pass CI
---
 .../Parser/scalar_function_parser/expm1.cpp        | 59 ++++++++++++++++++++++
 .../gluten/expression/ExpressionMappings.scala     |  1 +
 .../utils/clickhouse/ClickHouseTestSettings.scala  |  1 -
 .../utils/clickhouse/ClickHouseTestSettings.scala  |  1 -
 .../apache/gluten/expression/ExpressionNames.scala |  1 +
 5 files changed, 61 insertions(+), 2 deletions(-)

diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/expm1.cpp 
b/cpp-ch/local-engine/Parser/scalar_function_parser/expm1.cpp
new file mode 100644
index 000000000..7470da62b
--- /dev/null
+++ b/cpp-ch/local-engine/Parser/scalar_function_parser/expm1.cpp
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Parser/FunctionParser.h>
+
+namespace DB
+{
+namespace ErrorCodes
+{
+    extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH;
+}
+}
+
+namespace local_engine
+{
+class FunctionParserExpm1 : public FunctionParser
+{
+public:
+    explicit FunctionParserExpm1(SerializedPlanParser * plan_parser_) : 
FunctionParser(plan_parser_) {}
+    ~FunctionParserExpm1() override = default;
+
+    static constexpr auto name = "expm1";
+
+    String getName() const override { return name; }
+
+    const ActionsDAG::Node * parse(
+        const substrait::Expression_ScalarFunction & substrait_func,
+        ActionsDAGPtr & actions_dag) const override
+    {
+        /// parse expm1(x) as exp(x) - 1
+        auto parsed_args = parseFunctionArguments(substrait_func, "", 
actions_dag);
+        if (parsed_args.size() != 1)
+            throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, 
"Function {} requires exactly one arguments", getName());
+
+        const auto * x_node = parsed_args[0];
+        const auto * exp_node = toFunctionNode(actions_dag, "exp", {x_node});
+        const auto * one_const_node = addColumnToActionsDAG(actions_dag,  
std::make_shared<DataTypeFloat64>(), 1.0);
+        const auto * result_node = toFunctionNode(actions_dag, "minus", 
{exp_node, one_const_node});
+
+        return convertNodeTypeIfNeeded(substrait_func, result_node, 
actions_dag);
+    }
+};
+
+static FunctionParserRegister<FunctionParserExpm1> register_expm1;
+}
diff --git 
a/gluten-core/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala
 
b/gluten-core/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala
index e34ea8840..0f529947a 100644
--- 
a/gluten-core/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala
+++ 
b/gluten-core/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala
@@ -110,6 +110,7 @@ object ExpressionMappings {
     Sig[Ceil](CEIL),
     Sig[Floor](FLOOR),
     Sig[Exp](EXP),
+    Sig[Expm1](EXPM1),
     Sig[Pow](POWER),
     Sig[Pmod](PMOD),
     Sig[Round](ROUND),
diff --git 
a/gluten-ut/spark32/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala
 
b/gluten-ut/spark32/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala
index a51157e62..7831424ed 100644
--- 
a/gluten-ut/spark32/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala
+++ 
b/gluten-ut/spark32/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala
@@ -844,7 +844,6 @@ class ClickHouseTestSettings extends BackendTestSettings {
   enableSuite[GlutenMathExpressionsSuite]
     .exclude("tanh")
     .exclude("rint")
-    .exclude("expm1")
     .exclude("unhex")
     .exclude("atan2")
     .exclude("round/bround")
diff --git 
a/gluten-ut/spark33/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala
 
b/gluten-ut/spark33/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala
index 144d103c0..002501097 100644
--- 
a/gluten-ut/spark33/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala
+++ 
b/gluten-ut/spark33/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala
@@ -849,7 +849,6 @@ class ClickHouseTestSettings extends BackendTestSettings {
   enableSuite[GlutenMathExpressionsSuite]
     .exclude("tanh")
     .exclude("rint")
-    .exclude("expm1")
     .exclude("unhex")
     .exclude("atan2")
     .exclude("round/bround/floor/ceil")
diff --git 
a/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala
 
b/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala
index f097d5362..851c81a8d 100644
--- 
a/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala
+++ 
b/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala
@@ -137,6 +137,7 @@ object ExpressionNames {
   final val CEIL = "ceil"
   final val FLOOR = "floor"
   final val EXP = "exp"
+  final val EXPM1 = "expm1"
   final val POWER = "power"
   final val PMOD = "pmod"
   final val ROUND = "round"


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to