[SPARK-12321][SQL][FOLLOW-UP] Add tests for fromString
## What changes were proposed in this pull request? Add test cases for fromString ## How was this patch tested? N/A Closes #22345 from gatorsmile/addTest. Authored-by: Xiao Li <gatorsmile@gmail.com> Signed-off-by: gatorsmile <gatorsmile@gmail.com>
This commit is contained in:
parent
6d7bc5af45
commit
f96a8bf8ff
|
@ -128,30 +128,36 @@ object Literal {
|
|||
val dataType = DataType.parseDataType(json \ "dataType")
|
||||
json \ "value" match {
|
||||
case JNull => Literal.create(null, dataType)
|
||||
case JString(str) =>
|
||||
val value = dataType match {
|
||||
case BooleanType => str.toBoolean
|
||||
case ByteType => str.toByte
|
||||
case ShortType => str.toShort
|
||||
case IntegerType => str.toInt
|
||||
case LongType => str.toLong
|
||||
case FloatType => str.toFloat
|
||||
case DoubleType => str.toDouble
|
||||
case StringType => UTF8String.fromString(str)
|
||||
case DateType => java.sql.Date.valueOf(str)
|
||||
case TimestampType => java.sql.Timestamp.valueOf(str)
|
||||
case CalendarIntervalType => CalendarInterval.fromString(str)
|
||||
case t: DecimalType =>
|
||||
val d = Decimal(str)
|
||||
assert(d.changePrecision(t.precision, t.scale))
|
||||
d
|
||||
case _ => null
|
||||
}
|
||||
Literal.create(value, dataType)
|
||||
case JString(str) => fromString(str, dataType)
|
||||
case other => sys.error(s"$other is not a valid Literal json value")
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a Literal from a String
|
||||
*/
|
||||
def fromString(str: String, dataType: DataType): Literal = {
|
||||
val value = dataType match {
|
||||
case BooleanType => str.toBoolean
|
||||
case ByteType => str.toByte
|
||||
case ShortType => str.toShort
|
||||
case IntegerType => str.toInt
|
||||
case LongType => str.toLong
|
||||
case FloatType => str.toFloat
|
||||
case DoubleType => str.toDouble
|
||||
case StringType => UTF8String.fromString(str)
|
||||
case DateType => java.sql.Date.valueOf(str)
|
||||
case TimestampType => java.sql.Timestamp.valueOf(str)
|
||||
case CalendarIntervalType => CalendarInterval.fromString(str)
|
||||
case t: DecimalType =>
|
||||
val d = Decimal(str)
|
||||
assert(d.changePrecision(t.precision, t.scale))
|
||||
d
|
||||
case _ => null
|
||||
}
|
||||
Literal.create(value, dataType)
|
||||
}
|
||||
|
||||
def create(v: Any, dataType: DataType): Literal = {
|
||||
Literal(CatalystTypeConverters.convertToCatalyst(v), dataType)
|
||||
}
|
||||
|
|
|
@ -226,4 +226,25 @@ class LiteralExpressionSuite extends SparkFunSuite with ExpressionEvalHelper {
|
|||
checkEvaluation(Literal('\u0000'), "\u0000")
|
||||
checkEvaluation(Literal.create('\n'), "\n")
|
||||
}
|
||||
|
||||
test("fromString converts String/DataType input correctly") {
|
||||
checkEvaluation(Literal.fromString(false.toString, BooleanType), false)
|
||||
checkEvaluation(Literal.fromString(null, NullType), null)
|
||||
checkEvaluation(Literal.fromString(Int.MaxValue.toByte.toString, ByteType), Int.MaxValue.toByte)
|
||||
checkEvaluation(Literal.fromString(Short.MaxValue.toShort.toString, ShortType), Short.MaxValue
|
||||
.toShort)
|
||||
checkEvaluation(Literal.fromString(Int.MaxValue.toString, IntegerType), Int.MaxValue)
|
||||
checkEvaluation(Literal.fromString(Long.MaxValue.toString, LongType), Long.MaxValue)
|
||||
checkEvaluation(Literal.fromString(Float.MaxValue.toString, FloatType), Float.MaxValue)
|
||||
checkEvaluation(Literal.fromString(Double.MaxValue.toString, DoubleType), Double.MaxValue)
|
||||
checkEvaluation(Literal.fromString("1.23456", DecimalType(10, 5)), Decimal(1.23456))
|
||||
checkEvaluation(Literal.fromString("Databricks", StringType), "Databricks")
|
||||
val dateString = "1970-01-01"
|
||||
checkEvaluation(Literal.fromString(dateString, DateType), java.sql.Date.valueOf(dateString))
|
||||
val timestampString = "0000-01-01 00:00:00"
|
||||
checkEvaluation(Literal.fromString(timestampString, TimestampType),
|
||||
java.sql.Timestamp.valueOf(timestampString))
|
||||
val calInterval = new CalendarInterval(1, 1)
|
||||
checkEvaluation(Literal.fromString(calInterval.toString, CalendarIntervalType), calInterval)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue