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

casion pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/linkis.git


The following commit(s) were added to refs/heads/master by this push:
     new c0065b1818 script variable replaces a number that exceeds a Long type 
value and converts it to scientific notation (#5256)
c0065b1818 is described below

commit c0065b1818bc46726988635e32189cfa936d2694
Author: jianjunHu <[email protected]>
AuthorDate: Mon Sep 22 17:11:17 2025 +0800

    script variable replaces a number that exceeds a Long type value and 
converts it to scientific notation (#5256)
---
 .../apache/linkis/common/utils/VariableUtils.scala | 16 +++------
 .../linkis/common/variable/VariableType.scala      | 38 ++++++++++++++++++++++
 .../linkis/common/utils/VariableUtilsTest.scala    | 32 ++++++++++++++++++
 3 files changed, 75 insertions(+), 11 deletions(-)

diff --git 
a/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/utils/VariableUtils.scala
 
b/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/utils/VariableUtils.scala
index bd2fab4930..09c7669fe4 100644
--- 
a/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/utils/VariableUtils.scala
+++ 
b/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/utils/VariableUtils.scala
@@ -21,18 +21,11 @@ import org.apache.linkis.common.conf.Configuration
 import org.apache.linkis.common.exception.LinkisCommonErrorException
 import org.apache.linkis.common.variable
 import org.apache.linkis.common.variable._
-import org.apache.linkis.common.variable.DateTypeUtils.{
-  getCurHour,
-  getMonthDay,
-  getToday,
-  getYesterday
-}
-
-import org.apache.commons.lang3.StringUtils
+import org.apache.linkis.common.variable.DateTypeUtils.{getCurHour, 
getMonthDay, getToday, getYesterday}
+import org.apache.commons.lang3.{StringUtils, Strings}
 
 import java.time.ZonedDateTime
 import java.util
-
 import scala.collection.JavaConverters._
 import scala.collection.mutable
 import scala.util.control.Exception.allCatch
@@ -121,8 +114,9 @@ object VariableUtils extends Logging {
             }
           case _ =>
             if (!nameAndType.contains(key) && StringUtils.isNotEmpty(value)) {
-              if ((allCatch opt value.toDouble).isDefined) {
-                nameAndType(key) = variable.DoubleValue(value.toDouble)
+//              if ((allCatch opt value.toDouble).isDefined) {
+              if ((allCatch opt BigDecimal(value)).isDefined && 
!Strings.CS.startsWith(value, "0")) {
+                nameAndType(key) = variable.BigDecimalValue(BigDecimal(value))
               } else {
                 nameAndType(key) = variable.StringType(value)
               }
diff --git 
a/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/variable/VariableType.scala
 
b/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/variable/VariableType.scala
index 71c6215b7a..75e22cb51b 100644
--- 
a/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/variable/VariableType.scala
+++ 
b/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/variable/VariableType.scala
@@ -110,6 +110,44 @@ case class YearType(value: CustomYearType) extends 
VariableType {
 
 }
 
+case class BigDecimalValue(value: BigDecimal) extends VariableType {
+  override def getValue: String = {
+    val result = bigDecimalOrLong(value)
+    result match {
+      case bd: BigDecimal => bd.bigDecimal.toPlainString
+      case _ => result.toString
+    }
+  }
+
+  def calculator(signal: String, bValue: String): String = {
+    signal match {
+      case "+" => val res = value + BigDecimal(bValue); formatResult(res)
+      case "-" => val res = value - BigDecimal(bValue); formatResult(res)
+      case "*" => val res = value * BigDecimal(bValue); formatResult(res)
+      case "/" => val res = value / BigDecimal(bValue); formatResult(res)
+      case _ =>
+        throw new LinkisCommonErrorException(20050, s"BigDecimal class is not 
supported to use:$signal")
+    }
+  }
+
+  private def formatResult(bd: BigDecimal): String = {
+    val result = bigDecimalOrLong(bd)
+    result match {
+      case bd: BigDecimal => bd.bigDecimal.toPlainString
+      case _ => result.toString
+    }
+  }
+
+  private def bigDecimalOrLong(bd: BigDecimal): BigDecimal = {
+    // 检查是否为整数且在 Long 范围内
+    if (bd.isWhole && bd.isValidLong) {
+      bd.longValue
+    } else {
+      bd
+    }
+  }
+}
+
 case class LongType(value: Long) extends VariableType {
   override def getValue: String = value.toString
 
diff --git 
a/linkis-commons/linkis-common/src/test/scala/org/apache/linkis/common/utils/VariableUtilsTest.scala
 
b/linkis-commons/linkis-common/src/test/scala/org/apache/linkis/common/utils/VariableUtilsTest.scala
index 892731e0d5..a293c32590 100644
--- 
a/linkis-commons/linkis-common/src/test/scala/org/apache/linkis/common/utils/VariableUtilsTest.scala
+++ 
b/linkis-commons/linkis-common/src/test/scala/org/apache/linkis/common/utils/VariableUtilsTest.scala
@@ -90,4 +90,36 @@ class VariableUtilsTest {
     assertEquals(nameAndValue.size, 2)
   }
 
+  @Test def testReplaceBigDecimal(): Unit = {
+    val sql = """select
+                |${num} as num,
+                |${num-2} as num_sub2,
+                |${num+2} as num_add2,
+                |${long_num} as long_num,
+                |${long_num-1} as long_num_sub1,
+                |${long_num+1} as long_num_add1,
+                |${big_num} as big_num,
+                |${big_num-1} as big_num_sub1,
+                |${big_num+1} as big_num_add1,
+                |'${str_num}' as str_num""".stripMargin
+    val varMap = new util.HashMap[String, String]()
+    varMap.put("num", "301")
+    varMap.put("long_num", "9223372036854775807")
+    varMap.put("big_num", "3000102010000000000000000200001")
+    varMap.put("str_num", "03000102010000000000000000200001")
+
+    val resultSql = """select
+                      |301 as num,
+                      |299 as num_sub2,
+                      |303 as num_add2,
+                      |9223372036854775807 as long_num,
+                      |9223372036854775806 as long_num_sub1,
+                      |9223372036854775808 as long_num_add1,
+                      |3000102010000000000000000200001 as big_num,
+                      |3000102010000000000000000200000 as big_num_sub1,
+                      |3000102010000000000000000200002 as big_num_add1,
+                      |'03000102010000000000000000200001' as 
str_num""".stripMargin
+    assertEquals(VariableUtils.replace(sql, "sql", varMap), resultSql)
+  }
+
 }


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

Reply via email to