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

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


The following commit(s) were added to refs/heads/master by this push:
     new c0943b349de7 [SPARK-48885][SQL] Make some subclasses of 
RuntimeReplaceable override replacement to lazy val
c0943b349de7 is described below

commit c0943b349de7e38e2a36ca144b903e4bd11fc042
Author: Kent Yao <[email protected]>
AuthorDate: Tue Jul 16 10:18:12 2024 +0800

    [SPARK-48885][SQL] Make some subclasses of RuntimeReplaceable override 
replacement to lazy val
    
    ### What changes were proposed in this pull request?
    
    This PR makes 8 subclasses of RuntimeReplaceable override replacement to 
lazy val to align with other 60+ members and avoid recreation of new expressions
    
    ```scala
    Value read  (51 usages found)
                spark-catalyst_2.13  (50 usages found)
                    AnyValue.scala  (1 usage found)
                        54 override lazy val replacement: Expression = 
First(child, ignoreNulls)
                    arithmetic.scala  (1 usage found)
                        127 override lazy val replacement: Expression = child
                    bitmapExpressions.scala  (3 usages found)
                        52 override lazy val replacement: Expression = 
StaticInvoke(
                        85 override lazy val replacement: Expression = 
StaticInvoke(
                        134 override lazy val replacement: Expression = 
StaticInvoke(
                    boolAggregates.scala  (2 usages found)
                        39 override lazy val replacement: Expression = 
Min(child)
                        61 override lazy val replacement: Expression = 
Max(child)
                    collationExpressions.scala  (1 usage found)
                        123 override def replacement: Expression = {
                    collectionOperations.scala  (5 usages found)
                        168 override lazy val replacement: Expression = 
Size(child, legacySizeOfNull = false)
                        231 override lazy val replacement: Expression = 
ArrayContains(MapKeys(left), right)
                        1596 override lazy val replacement: Expression = new 
ArrayInsert(left, Literal(1), right)
                        1631 override lazy val replacement: Expression = new 
ArrayInsert(left, Literal(-1), right)
                        5203 override lazy val replacement: Expression = 
ArrayFilter(child, lambda)
                    CountIf.scala  (1 usage found)
                        42 override lazy val replacement: Expression = 
Count(new NullIf(child, Literal.FalseLiteral))
                    datetimeExpressions.scala  (2 usages found)
                        2070 override lazy val replacement: Expression = 
format.map { f =>
                        2145 override lazy val replacement: Expression = 
format.map { f =>
                    linearRegression.scala  (5 usages found)
                        45 override lazy val replacement: Expression = 
Count(Seq(left, right))
                        79 override lazy val replacement: Expression =
                        114 override lazy val replacement: Expression =
                        176 override lazy val replacement: Expression =
                        232 override lazy val replacement: Expression =
                    misc.scala  (3 usages found)
                        294 override lazy val replacement: Expression = 
StaticInvoke(
                        397 override lazy val replacement: Expression = 
StaticInvoke(
                        475 override lazy val replacement: Expression = 
StaticInvoke(
                    percentiles.scala  (2 usages found)
                        346 override def replacement: Expression = percentile
                        365 override def replacement: Expression = percentile
                    regexpExpressions.scala  (3 usages found)
                        262 override lazy val replacement: Expression = 
Like(Lower(left), Lower(right), escapeChar)
                        1034 override lazy val replacement: Expression =
                        1072 override lazy val replacement: Expression =
                    stringExpressions.scala  (14 usages found)
                        561 override lazy val replacement =
                        723 override lazy val replacement: Expression = 
Invoke(input, "isValid", BooleanType)
                        770 override lazy val replacement: Expression = 
Invoke(input, "makeValid", input.dataType)
                        810 override lazy val replacement: Expression = 
StaticInvoke(
                        859 override lazy val replacement: Expression = 
StaticInvoke(
                        1854 override lazy val replacement: Expression = 
StaticInvoke(
                        2246 override lazy val replacement: Expression = If(
                        2284 override lazy val replacement: Expression = 
Substring(str, Literal(1), len)
                        2713 override def replacement: Expression = 
StaticInvoke(
                        2940 override def replacement: Expression = 
StaticInvoke(
                        3004 override val replacement: Expression = 
StaticInvoke(
                        3075 override lazy val replacement: Expression = if 
(fmt == null) {
                        3473 override lazy val replacement: Expression =
                        3533 override lazy val replacement: Expression = 
StaticInvoke(
                    toFromAvroSqlFunctions.scala  (2 usages found)
                        96 override def replacement: Expression = {
                        168 override def replacement: Expression = {
                    urlExpressions.scala  (2 usages found)
                        55 override def replacement: Expression =
                        92 override def replacement: Expression =
                    variantExpressions.scala  (3 usages found)
                        58 override lazy val replacement: Expression = 
StaticInvoke(
                        100 override lazy val replacement: Expression = 
StaticInvoke(
                        635 override lazy val replacement: Expression = 
StaticInvoke(
                spark-examples_2.13  (1 usage found)
                    AgeExample.scala  (1 usage found)
                        27 override lazy val replacement: Expression = 
SubtractDates(CurrentDate(), birthday)
    ```
    
    ### Why are the changes needed?
    
    Improve RuntimeReplaceable implementations
    
    ### Does this PR introduce _any_ user-facing change?
    NO
    
    ### How was this patch tested?
    existing tests
    
    ### Was this patch authored or co-authored using generative AI tooling?
    no
    
    Closes #47333 from yaooqinn/SPARK-48885.
    
    Authored-by: Kent Yao <[email protected]>
    Signed-off-by: Kent Yao <[email protected]>
---
 .../spark/sql/catalyst/expressions/aggregate/percentiles.scala |  4 ++--
 .../spark/sql/catalyst/expressions/collationExpressions.scala  |  2 +-
 .../spark/sql/catalyst/expressions/stringExpressions.scala     | 10 +++++-----
 .../sql/catalyst/expressions/toFromAvroSqlFunctions.scala      |  4 ++--
 .../apache/spark/sql/catalyst/expressions/urlExpressions.scala |  4 ++--
 5 files changed, 12 insertions(+), 12 deletions(-)

diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/aggregate/percentiles.scala
 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/aggregate/percentiles.scala
index c074b19f2419..77d2bc5b4228 100644
--- 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/aggregate/percentiles.scala
+++ 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/aggregate/percentiles.scala
@@ -343,7 +343,7 @@ case class Median(child: Expression)
   with ImplicitCastInputTypes
   with UnaryLike[Expression] {
   private lazy val percentile = new Percentile(child, Literal(0.5, DoubleType))
-  override def replacement: Expression = percentile
+  override lazy val replacement: Expression = percentile
   override def nodeName: String = "median"
   override def inputTypes: Seq[AbstractDataType] = 
percentile.inputTypes.take(1)
   override protected def withNewChildInternal(
@@ -362,7 +362,7 @@ case class PercentileCont(left: Expression, right: 
Expression, reverse: Boolean
   with SupportsOrderingWithinGroup
   with BinaryLike[Expression] {
   private lazy val percentile = new Percentile(left, right, reverse)
-  override def replacement: Expression = percentile
+  override lazy val replacement: Expression = percentile
   override def nodeName: String = "percentile_cont"
   override def inputTypes: Seq[AbstractDataType] = percentile.inputTypes
   override def sql(isDistinct: Boolean): String = {
diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collationExpressions.scala
 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collationExpressions.scala
index c7fbb39ea285..7a428e8ed45a 100644
--- 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collationExpressions.scala
+++ 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/collationExpressions.scala
@@ -120,7 +120,7 @@ case class Collate(child: Expression, collationName: String)
 case class Collation(child: Expression)
   extends UnaryExpression with RuntimeReplaceable with ExpectsInputTypes {
   override protected def withNewChildInternal(newChild: Expression): Collation 
= copy(newChild)
-  override def replacement: Expression = {
+  override lazy val replacement: Expression = {
     val collationId = child.dataType.asInstanceOf[StringType].collationId
     val collationName = 
CollationFactory.fetchCollation(collationId).collationName
     Literal.create(collationName, SQLConf.get.defaultStringType)
diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringExpressions.scala
 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringExpressions.scala
index fec782002bb7..08f373a86ae3 100755
--- 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringExpressions.scala
+++ 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringExpressions.scala
@@ -2707,10 +2707,10 @@ case class Base64(child: Expression, chunkBase64: 
Boolean)
 
   def this(expr: Expression) = this(expr, SQLConf.get.chunkBase64StringEnabled)
 
-  override def dataType: DataType = SQLConf.get.defaultStringType
+  override val dataType: DataType = SQLConf.get.defaultStringType
   override def inputTypes: Seq[DataType] = Seq(BinaryType)
 
-  override def replacement: Expression = StaticInvoke(
+  override lazy val replacement: Expression = StaticInvoke(
     classOf[Base64],
     dataType,
     "encode",
@@ -2932,12 +2932,12 @@ case class StringDecode(
   def this(bin: Expression, charset: Expression) =
     this(bin, charset, SQLConf.get.legacyJavaCharsets, 
SQLConf.get.legacyCodingErrorAction)
 
-  override def dataType: DataType = SQLConf.get.defaultStringType
+  override val dataType: DataType = SQLConf.get.defaultStringType
   override def inputTypes: Seq[AbstractDataType] = Seq(BinaryType, 
StringTypeAnyCollation)
   override def prettyName: String = "decode"
   override def toString: String = s"$prettyName($bin, $charset)"
 
-  override def replacement: Expression = StaticInvoke(
+  override lazy val replacement: Expression = StaticInvoke(
     classOf[StringDecode],
     SQLConf.get.defaultStringType,
     "decode",
@@ -3001,7 +3001,7 @@ case class Encode(
   override def inputTypes: Seq[AbstractDataType] =
     Seq(StringTypeAnyCollation, StringTypeAnyCollation)
 
-  override val replacement: Expression = StaticInvoke(
+  override lazy val replacement: Expression = StaticInvoke(
     classOf[Encode],
     BinaryType,
     "encode",
diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/toFromAvroSqlFunctions.scala
 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/toFromAvroSqlFunctions.scala
index ca53058230fb..88a53e459118 100644
--- 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/toFromAvroSqlFunctions.scala
+++ 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/toFromAvroSqlFunctions.scala
@@ -93,7 +93,7 @@ case class FromAvro(child: Expression, jsonFormatSchema: 
Expression, options: Ex
         TypeCheckResult.TypeCheckSuccess))
   }
 
-  override def replacement: Expression = {
+  override lazy val replacement: Expression = {
     val schemaValue: String = jsonFormatSchema.eval() match {
       case s: UTF8String =>
         s.toString
@@ -165,7 +165,7 @@ case class ToAvro(child: Expression, jsonFormatSchema: 
Expression)
     }
   }
 
-  override def replacement: Expression = {
+  override lazy val replacement: Expression = {
     val schemaValue: Option[String] = jsonFormatSchema.eval() match {
       case null =>
         None
diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/urlExpressions.scala
 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/urlExpressions.scala
index 65fce955b8f8..1687b69e46be 100644
--- 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/urlExpressions.scala
+++ 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/urlExpressions.scala
@@ -52,7 +52,7 @@ import org.apache.spark.unsafe.types.UTF8String
 case class UrlEncode(child: Expression)
   extends RuntimeReplaceable with UnaryLike[Expression] with 
ImplicitCastInputTypes {
 
-  override def replacement: Expression =
+  override lazy val replacement: Expression =
     StaticInvoke(
       UrlCodec.getClass,
       SQLConf.get.defaultStringType,
@@ -89,7 +89,7 @@ case class UrlEncode(child: Expression)
 case class UrlDecode(child: Expression)
   extends RuntimeReplaceable with UnaryLike[Expression] with 
ImplicitCastInputTypes {
 
-  override def replacement: Expression =
+  override lazy val replacement: Expression =
     StaticInvoke(
       UrlCodec.getClass,
       SQLConf.get.defaultStringType,


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

Reply via email to