@@ -750,6 +750,21 @@ case class TimeTrunc(unit: Expression, time: Expression)
750750 }
751751}
752752
753+ abstract class TimeFromBase extends UnaryExpression with RuntimeReplaceable with ExpectsInputTypes {
754+ protected def timeConversionMethod : String
755+
756+ override def inputTypes : Seq [AbstractDataType ] = Seq (IntegralType )
757+ override def dataType : DataType = TimeType (TimeType .MICROS_PRECISION )
758+
759+ override def replacement : Expression = StaticInvoke (
760+ classOf [DateTimeUtils .type ],
761+ dataType,
762+ timeConversionMethod,
763+ Seq (child),
764+ Seq (child.dataType)
765+ )
766+ }
767+
753768// scalastyle:off line.size.limit
754769@ ExpressionDescription (
755770 usage = " _FUNC_(seconds) - Creates a TIME value from seconds since midnight." ,
@@ -772,20 +787,10 @@ case class TimeTrunc(unit: Expression, time: Expression)
772787 since = " 4.2.0" ,
773788 group = " datetime_funcs" )
774789// scalastyle:on line.size.limit
775- case class TimeFromSeconds (child : Expression )
776- extends UnaryExpression with RuntimeReplaceable with ExpectsInputTypes {
777-
778- override def replacement : Expression = StaticInvoke (
779- classOf [DateTimeUtils .type ],
780- TimeType (TimeType .MICROS_PRECISION ),
781- " timeFromSeconds" ,
782- Seq (child),
783- Seq (child.dataType)
784- )
785-
790+ case class TimeFromSeconds (child : Expression ) extends TimeFromBase {
786791 override def inputTypes : Seq [AbstractDataType ] = Seq (NumericType )
787- override def dataType : DataType = TimeType (TimeType .MICROS_PRECISION )
788792 override def prettyName : String = " time_from_seconds"
793+ override protected def timeConversionMethod : String = " timeFromSeconds"
789794
790795 override protected def withNewChildInternal (newChild : Expression ): TimeFromSeconds =
791796 copy(child = newChild)
@@ -812,20 +817,9 @@ case class TimeFromSeconds(child: Expression)
812817 since = " 4.2.0" ,
813818 group = " datetime_funcs" )
814819// scalastyle:on line.size.limit
815- case class TimeFromMillis (child : Expression )
816- extends UnaryExpression with RuntimeReplaceable with ExpectsInputTypes {
817-
818- override def replacement : Expression = StaticInvoke (
819- classOf [DateTimeUtils .type ],
820- TimeType (TimeType .MICROS_PRECISION ),
821- " timeFromMillis" ,
822- Seq (child),
823- Seq (child.dataType)
824- )
825-
826- override def inputTypes : Seq [AbstractDataType ] = Seq (IntegralType )
827- override def dataType : DataType = TimeType (TimeType .MICROS_PRECISION )
820+ case class TimeFromMillis (child : Expression ) extends TimeFromBase {
828821 override def prettyName : String = " time_from_millis"
822+ override protected def timeConversionMethod : String = " timeFromMillis"
829823
830824 override protected def withNewChildInternal (newChild : Expression ): TimeFromMillis =
831825 copy(child = newChild)
@@ -852,23 +846,27 @@ case class TimeFromMillis(child: Expression)
852846 since = " 4.2.0" ,
853847 group = " datetime_funcs" )
854848// scalastyle:on line.size.limit
855- case class TimeFromMicros (child : Expression )
856- extends UnaryExpression with RuntimeReplaceable with ExpectsInputTypes {
849+ case class TimeFromMicros (child : Expression ) extends TimeFromBase {
850+ override def prettyName : String = " time_from_micros"
851+ override protected def timeConversionMethod : String = " timeFromMicros"
852+
853+ override protected def withNewChildInternal (newChild : Expression ): TimeFromMicros =
854+ copy(child = newChild)
855+ }
856+
857+ abstract class TimeToBase extends UnaryExpression with RuntimeReplaceable with ExpectsInputTypes {
858+ protected def timeConversionMethod : String
859+
860+ override def inputTypes : Seq [AbstractDataType ] = Seq (AnyTimeType )
861+ override def dataType : DataType = LongType
857862
858863 override def replacement : Expression = StaticInvoke (
859864 classOf [DateTimeUtils .type ],
860- TimeType ( TimeType . MICROS_PRECISION ) ,
861- " timeFromMicros " ,
865+ dataType ,
866+ timeConversionMethod ,
862867 Seq (child),
863868 Seq (child.dataType)
864869 )
865-
866- override def inputTypes : Seq [AbstractDataType ] = Seq (IntegralType )
867- override def dataType : DataType = TimeType (TimeType .MICROS_PRECISION )
868- override def prettyName : String = " time_from_micros"
869-
870- override protected def withNewChildInternal (newChild : Expression ): TimeFromMicros =
871- copy(child = newChild)
872870}
873871
874872// scalastyle:off line.size.limit
@@ -894,19 +892,11 @@ case class TimeFromMicros(child: Expression)
894892 group = " datetime_funcs" )
895893// scalastyle:on line.size.limit
896894case class TimeToSeconds (child : Expression )
897- extends UnaryExpression with RuntimeReplaceable with ImplicitCastInputTypes {
895+ extends TimeToBase with ImplicitCastInputTypes {
898896
899- override def replacement : Expression = StaticInvoke (
900- classOf [DateTimeUtils .type ],
901- DecimalType (14 , 6 ),
902- " timeToSeconds" ,
903- Seq (child),
904- Seq (child.dataType)
905- )
906-
907- override def inputTypes : Seq [AbstractDataType ] = Seq (AnyTimeType )
908897 override def dataType : DataType = DecimalType (14 , 6 )
909898 override def prettyName : String = " time_to_seconds"
899+ override protected def timeConversionMethod : String = " timeToSeconds"
910900
911901 override protected def withNewChildInternal (newChild : Expression ): TimeToSeconds =
912902 copy(child = newChild)
@@ -934,20 +924,9 @@ case class TimeToSeconds(child: Expression)
934924 since = " 4.2.0" ,
935925 group = " datetime_funcs" )
936926// scalastyle:on line.size.limit
937- case class TimeToMillis (child : Expression )
938- extends UnaryExpression with RuntimeReplaceable with ExpectsInputTypes {
939-
940- override def replacement : Expression = StaticInvoke (
941- classOf [DateTimeUtils .type ],
942- LongType ,
943- " timeToMillis" ,
944- Seq (child),
945- Seq (child.dataType)
946- )
947-
948- override def inputTypes : Seq [AbstractDataType ] = Seq (AnyTimeType )
949- override def dataType : DataType = LongType
927+ case class TimeToMillis (child : Expression ) extends TimeToBase {
950928 override def prettyName : String = " time_to_millis"
929+ override protected def timeConversionMethod : String = " timeToMillis"
951930
952931 override protected def withNewChildInternal (newChild : Expression ): TimeToMillis =
953932 copy(child = newChild)
@@ -975,20 +954,9 @@ case class TimeToMillis(child: Expression)
975954 since = " 4.2.0" ,
976955 group = " datetime_funcs" )
977956// scalastyle:on line.size.limit
978- case class TimeToMicros (child : Expression )
979- extends UnaryExpression with RuntimeReplaceable with ExpectsInputTypes {
980-
981- override def replacement : Expression = StaticInvoke (
982- classOf [DateTimeUtils .type ],
983- LongType ,
984- " timeToMicros" ,
985- Seq (child),
986- Seq (child.dataType)
987- )
988-
989- override def inputTypes : Seq [AbstractDataType ] = Seq (AnyTimeType )
990- override def dataType : DataType = LongType
957+ case class TimeToMicros (child : Expression ) extends TimeToBase {
991958 override def prettyName : String = " time_to_micros"
959+ override protected def timeConversionMethod : String = " timeToMicros"
992960
993961 override protected def withNewChildInternal (newChild : Expression ): TimeToMicros =
994962 copy(child = newChild)
0 commit comments