This is an automated email from the ASF dual-hosted git repository.
corgy pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git
The following commit(s) were added to refs/heads/dev by this push:
new d3571e3541 [Feature][Transform-V2] Add `TRIM_SCALE` function for sql
transform (#9700)
d3571e3541 is described below
commit d3571e354100d573aca02a8783feebe14889d2a9
Author: Jia Fan <[email protected]>
AuthorDate: Fri Aug 15 18:15:19 2025 +0800
[Feature][Transform-V2] Add `TRIM_SCALE` function for sql transform (#9700)
---
docs/en/transform-v2/sql-functions.md | 10 +++
docs/zh/transform-v2/sql-functions.md | 10 +++
.../transform/sql/zeta/ZetaSQLFunction.java | 3 +
.../seatunnel/transform/sql/zeta/ZetaSQLType.java | 1 +
.../sql/zeta/functions/NumericFunction.java | 15 ++++
.../transform/sql/zeta/NumericFunctionTest.java | 81 ++++++++++++++++++++++
6 files changed, 120 insertions(+)
diff --git a/docs/en/transform-v2/sql-functions.md
b/docs/en/transform-v2/sql-functions.md
index 1c580097e0..0e659688c8 100644
--- a/docs/en/transform-v2/sql-functions.md
+++ b/docs/en/transform-v2/sql-functions.md
@@ -647,6 +647,16 @@ Example:
TRUNC(N, 2)
+### TRIM_SCALE
+
+```TRIM_SCALE(numeric)```
+
+Reduce the scale of a number by removing trailing zeroes. This method returns
a value of string, and with adjusted scale.
+
+Example:
+
+TRIM_SCALE(N)
+
## Time and Date Functions
### CURRENT_DATE
diff --git a/docs/zh/transform-v2/sql-functions.md
b/docs/zh/transform-v2/sql-functions.md
index ca8aaf5c2a..add6809b5a 100644
--- a/docs/zh/transform-v2/sql-functions.md
+++ b/docs/zh/transform-v2/sql-functions.md
@@ -649,6 +649,16 @@ SIGN(N)
TRUNC(N, 2)
+### TRIM_SCALE
+
+```TRIM_SCALE(numeric)```
+
+通过删除尾数部分的零来降低值的刻度(小数位数)。此方法返回一个字符串值,并调整小数位数。
+
+示例:
+
+TRIM_SCALE(N)
+
## Time and Date Functions
### CURRENT_DATE
diff --git
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java
index 6d55b74d7b..af01127cd7 100644
---
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java
+++
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLFunction.java
@@ -155,6 +155,7 @@ public class ZetaSQLFunction {
public static final String TRUNCATE = "TRUNCATE";
public static final String ARRAY_MAX = "ARRAY_MAX";
public static final String ARRAY_MIN = "ARRAY_MIN";
+ public static final String TRIM_SCALE = "TRIM_SCALE";
// -------------------------time and date
functions----------------------------
public static final String CURRENT_DATE = "CURRENT_DATE";
@@ -532,6 +533,8 @@ public class ZetaSQLFunction {
case TRUNC:
case TRUNCATE:
return NumericFunction.trunc(args);
+ case TRIM_SCALE:
+ return NumericFunction.trimScale(args);
case NOW:
return DateTimeFunction.currentTimestamp();
case DATEADD:
diff --git
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLType.java
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLType.java
index bf40565aa8..62fdd97dc7 100644
---
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLType.java
+++
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/ZetaSQLType.java
@@ -347,6 +347,7 @@ public class ZetaSQLType {
case ZetaSQLFunction.FORMATDATETIME:
case ZetaSQLFunction.FROM_UNIXTIME:
case ZetaSQLFunction.UUID:
+ case ZetaSQLFunction.TRIM_SCALE:
return BasicType.STRING_TYPE;
case ZetaSQLFunction.ASCII:
case ZetaSQLFunction.LOCATE:
diff --git
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/NumericFunction.java
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/NumericFunction.java
index 055116430c..64e1c20d60 100644
---
a/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/NumericFunction.java
+++
b/seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/sql/zeta/functions/NumericFunction.java
@@ -443,4 +443,19 @@ public class NumericFunction {
}
return round(v1, v2, RoundingMode.DOWN);
}
+
+ public static String trimScale(List<Object> args) {
+ Number v1 = (Number) args.get(0);
+ if (v1 == null) {
+ return null;
+ }
+ BigDecimal bd;
+ if (v1 instanceof BigDecimal) {
+ bd = (BigDecimal) v1;
+ } else {
+ bd = new BigDecimal(v1.toString());
+ }
+ bd = bd.stripTrailingZeros();
+ return bd.toPlainString();
+ }
}
diff --git
a/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/zeta/NumericFunctionTest.java
b/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/zeta/NumericFunctionTest.java
new file mode 100644
index 0000000000..bf60b0aa57
--- /dev/null
+++
b/seatunnel-transforms-v2/src/test/java/org/apache/seatunnel/transform/sql/zeta/NumericFunctionTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ */
+
+package org.apache.seatunnel.transform.sql.zeta;
+
+import org.apache.seatunnel.api.table.type.BasicType;
+import org.apache.seatunnel.api.table.type.DecimalType;
+import org.apache.seatunnel.api.table.type.SeaTunnelDataType;
+import org.apache.seatunnel.api.table.type.SeaTunnelRow;
+import org.apache.seatunnel.api.table.type.SeaTunnelRowType;
+import org.apache.seatunnel.transform.sql.SQLEngine;
+import org.apache.seatunnel.transform.sql.SQLEngineFactory;
+import org.apache.seatunnel.transform.sql.zeta.functions.NumericFunction;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+
+public class NumericFunctionTest {
+
+ @Test
+ public void testTrimScale() {
+
+ SQLEngine sqlEngine =
SQLEngineFactory.getSQLEngine(SQLEngineFactory.EngineType.ZETA);
+ SeaTunnelRowType rowType =
+ new SeaTunnelRowType(
+ new String[] {"int_v", "long_v", "float_v",
"double_v", "decimal_v"},
+ new SeaTunnelDataType[] {
+ BasicType.INT_TYPE,
+ BasicType.LONG_TYPE,
+ BasicType.FLOAT_TYPE,
+ BasicType.DOUBLE_TYPE,
+ new DecimalType(20, 10)
+ });
+
+ SeaTunnelRow inputRow =
+ new SeaTunnelRow(
+ new Object[] {20, -99L, 1.20f, 1.230d, new
BigDecimal("1.0000010000")});
+
+ sqlEngine.init(
+ "test",
+ null,
+ rowType,
+ "select TRIM_SCALE(int_v) as new_int_v, TRIM_SCALE(long_v) as
new_long_v, TRIM_SCALE(float_v) as new_float_v, TRIM_SCALE(double_v) as
new_double_v, TRIM_SCALE(decimal_v) as new_decimal_v from test");
+ SeaTunnelRow outRow = sqlEngine.transformBySQL(inputRow,
rowType).get(0);
+ Assertions.assertEquals("20", outRow.getField(0));
+ Assertions.assertEquals("-99", outRow.getField(1));
+ Assertions.assertEquals("1.2", outRow.getField(2));
+ Assertions.assertEquals("1.23", outRow.getField(3));
+ Assertions.assertEquals("1.000001", outRow.getField(4));
+
+ Assertions.assertEquals("123",
NumericFunction.trimScale(Collections.singletonList(123)));
+ Assertions.assertEquals(
+ "123.45",
NumericFunction.trimScale(Collections.singletonList(123.45000)));
+ Assertions.assertEquals(
+ "123",
NumericFunction.trimScale(Collections.singletonList(123.0000)));
+ Assertions.assertEquals(
+ "-123.4",
NumericFunction.trimScale(Collections.singletonList(-123.4000)));
+ Assertions.assertEquals(
+ "0.1",
+ NumericFunction.trimScale(Collections.singletonList(new
BigDecimal("0.1000"))));
+ Assertions.assertEquals("0",
NumericFunction.trimScale(Collections.singletonList(0)));
+
Assertions.assertNull(NumericFunction.trimScale(Collections.singletonList((Object)
null)));
+ }
+}