[SPARK-35840][SQL] Add apply()
for a single field to YearMonthIntervalType
and DayTimeIntervalType
### What changes were proposed in this pull request? In the PR, I propose to add 2 new methods that accept one field and produce either `YearMonthIntervalType` or `DayTimeIntervalType`. ### Why are the changes needed? To improve code maintenance. ### Does this PR introduce _any_ user-facing change? No. ### How was this patch tested? By existing test suites. Closes #32997 from MaxGekk/ansi-interval-types-single-field. Authored-by: Max Gekk <max.gekk@gmail.com> Signed-off-by: Max Gekk <max.gekk@gmail.com>
This commit is contained in:
parent
1488ea9a8c
commit
37ef7bb98c
|
@ -173,18 +173,18 @@ object DataType {
|
|||
private val otherTypes = {
|
||||
Seq(NullType, DateType, TimestampType, BinaryType, IntegerType, BooleanType, LongType,
|
||||
DoubleType, FloatType, ShortType, ByteType, StringType, CalendarIntervalType,
|
||||
DayTimeIntervalType(DAY, DAY),
|
||||
DayTimeIntervalType(DAY),
|
||||
DayTimeIntervalType(DAY, HOUR),
|
||||
DayTimeIntervalType(DAY, MINUTE),
|
||||
DayTimeIntervalType(DAY, SECOND),
|
||||
DayTimeIntervalType(HOUR, HOUR),
|
||||
DayTimeIntervalType(HOUR),
|
||||
DayTimeIntervalType(HOUR, MINUTE),
|
||||
DayTimeIntervalType(HOUR, SECOND),
|
||||
DayTimeIntervalType(MINUTE, MINUTE),
|
||||
DayTimeIntervalType(MINUTE),
|
||||
DayTimeIntervalType(MINUTE, SECOND),
|
||||
DayTimeIntervalType(SECOND, SECOND),
|
||||
YearMonthIntervalType(YEAR, YEAR),
|
||||
YearMonthIntervalType(MONTH, MONTH),
|
||||
DayTimeIntervalType(SECOND),
|
||||
YearMonthIntervalType(YEAR),
|
||||
YearMonthIntervalType(MONTH),
|
||||
YearMonthIntervalType(YEAR, MONTH),
|
||||
TimestampWithoutTZType)
|
||||
.map(t => t.typeName -> t).toMap
|
||||
|
|
|
@ -101,6 +101,7 @@ case object DayTimeIntervalType extends AbstractDataType {
|
|||
val DEFAULT = DayTimeIntervalType(DAY, SECOND)
|
||||
|
||||
def apply(): DayTimeIntervalType = DEFAULT
|
||||
def apply(field: Byte): DayTimeIntervalType = DayTimeIntervalType(field, field)
|
||||
|
||||
override private[sql] def defaultConcreteType: DataType = DEFAULT
|
||||
|
||||
|
|
|
@ -95,6 +95,7 @@ case object YearMonthIntervalType extends AbstractDataType {
|
|||
val DEFAULT = YearMonthIntervalType(YEAR, MONTH)
|
||||
|
||||
def apply(): YearMonthIntervalType = DEFAULT
|
||||
def apply(field: Byte): YearMonthIntervalType = YearMonthIntervalType(field, field)
|
||||
|
||||
override private[sql] def defaultConcreteType: DataType = DEFAULT
|
||||
|
||||
|
|
|
@ -277,16 +277,16 @@ class CatalystTypeConvertersSuite extends SparkFunSuite with SQLHelper {
|
|||
|
||||
test("SPARK-35726: Truncate java.time.Duration by fields of day-time interval type") {
|
||||
val duration = Duration.ofSeconds(90061, 1000000023)
|
||||
Seq((DayTimeIntervalType(DAY, DAY), 86400000000L, -86400000000L),
|
||||
Seq((DayTimeIntervalType(DAY), 86400000000L, -86400000000L),
|
||||
(DayTimeIntervalType(DAY, HOUR), 90000000000L, -90000000000L),
|
||||
(DayTimeIntervalType(DAY, MINUTE), 90060000000L, -90060000000L),
|
||||
(DayTimeIntervalType(DAY, SECOND), 90062000000L, -90062000001L),
|
||||
(DayTimeIntervalType(HOUR, HOUR), 90000000000L, -90000000000L),
|
||||
(DayTimeIntervalType(HOUR), 90000000000L, -90000000000L),
|
||||
(DayTimeIntervalType(HOUR, MINUTE), 90060000000L, -90060000000L),
|
||||
(DayTimeIntervalType(HOUR, SECOND), 90062000000L, -90062000001L),
|
||||
(DayTimeIntervalType(MINUTE, MINUTE), 90060000000L, -90060000000L),
|
||||
(DayTimeIntervalType(MINUTE), 90060000000L, -90060000000L),
|
||||
(DayTimeIntervalType(MINUTE, SECOND), 90062000000L, -90062000001L),
|
||||
(DayTimeIntervalType(SECOND, SECOND), 90062000000L, -90062000001L))
|
||||
(DayTimeIntervalType(SECOND), 90062000000L, -90062000001L))
|
||||
.foreach { case (dt, positive, negative) =>
|
||||
assert(CatalystTypeConverters.createToCatalystConverter(dt)(duration) == positive)
|
||||
assert(
|
||||
|
@ -331,9 +331,9 @@ class CatalystTypeConvertersSuite extends SparkFunSuite with SQLHelper {
|
|||
}
|
||||
|
||||
test("SPARK-35769: Truncate java.time.Period by fields of year-month interval type") {
|
||||
Seq(YearMonthIntervalType(YEAR, YEAR) -> 12,
|
||||
Seq(YearMonthIntervalType(YEAR) -> 12,
|
||||
YearMonthIntervalType(YEAR, MONTH) -> 13,
|
||||
YearMonthIntervalType(MONTH, MONTH) -> 13)
|
||||
YearMonthIntervalType(MONTH) -> 13)
|
||||
.foreach { case (ym, value) =>
|
||||
assert(CatalystTypeConverters.createToCatalystConverter(ym)(Period.of(1, 1, 0)) == value)
|
||||
}
|
||||
|
|
|
@ -687,9 +687,9 @@ class CastSuite extends CastSuiteBase {
|
|||
|
||||
test("SPARK-35819: Support cast YearMonthIntervalType in different fields") {
|
||||
val ym = cast(Literal.create("1-1"), YearMonthIntervalType(YEAR, MONTH))
|
||||
Seq(YearMonthIntervalType(YEAR, YEAR) -> 12,
|
||||
Seq(YearMonthIntervalType(YEAR) -> 12,
|
||||
YearMonthIntervalType(YEAR, MONTH) -> 13,
|
||||
YearMonthIntervalType(MONTH, MONTH) -> 13)
|
||||
YearMonthIntervalType(MONTH) -> 13)
|
||||
.foreach { case (dt, value) =>
|
||||
checkEvaluation(cast(ym, dt), value)
|
||||
}
|
||||
|
|
|
@ -53,21 +53,21 @@ object DataTypeTestUtils {
|
|||
val numericTypeWithoutDecimal: Set[DataType] = integralType ++ Set(DoubleType, FloatType)
|
||||
|
||||
val dayTimeIntervalTypes: Seq[DayTimeIntervalType] = Seq(
|
||||
DayTimeIntervalType(DAY, DAY),
|
||||
DayTimeIntervalType(DAY),
|
||||
DayTimeIntervalType(DAY, HOUR),
|
||||
DayTimeIntervalType(DAY, MINUTE),
|
||||
DayTimeIntervalType(DAY, SECOND),
|
||||
DayTimeIntervalType(HOUR, HOUR),
|
||||
DayTimeIntervalType(HOUR),
|
||||
DayTimeIntervalType(HOUR, MINUTE),
|
||||
DayTimeIntervalType(HOUR, SECOND),
|
||||
DayTimeIntervalType(MINUTE, MINUTE),
|
||||
DayTimeIntervalType(MINUTE),
|
||||
DayTimeIntervalType(MINUTE, SECOND),
|
||||
DayTimeIntervalType(SECOND, SECOND))
|
||||
DayTimeIntervalType(SECOND))
|
||||
|
||||
val yearMonthIntervalTypes: Seq[YearMonthIntervalType] = Seq(
|
||||
YearMonthIntervalType(YEAR, MONTH),
|
||||
YearMonthIntervalType(YEAR, YEAR),
|
||||
YearMonthIntervalType(MONTH, MONTH))
|
||||
YearMonthIntervalType(YEAR),
|
||||
YearMonthIntervalType(MONTH))
|
||||
|
||||
/**
|
||||
* Instances of all [[NumericType]]s and [[CalendarIntervalType]]
|
||||
|
|
Loading…
Reference in a new issue