From 2e773e1b5bf62d8dc1239bb14761882567eb8316 Mon Sep 17 00:00:00 2001 From: "Malik, Junaid" Date: Mon, 29 Apr 2024 20:48:27 +0800 Subject: [PATCH] #1296 make `parseToDataType` to return Option for easier usage with java --- .../ignite/filter/FilterColumnValueParser.scala | 5 ++++- .../main/scala/org/finos/vuu/core/table/Column.scala | 11 ++++------- .../scala/org/finos/vuu/core/table/ColumnTest.scala | 9 ++++----- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/plugin/ignite-plugin/src/main/scala/org/finos/vuu/feature/ignite/filter/FilterColumnValueParser.scala b/plugin/ignite-plugin/src/main/scala/org/finos/vuu/feature/ignite/filter/FilterColumnValueParser.scala index 4128bfc61..d2d7661b4 100644 --- a/plugin/ignite-plugin/src/main/scala/org/finos/vuu/feature/ignite/filter/FilterColumnValueParser.scala +++ b/plugin/ignite-plugin/src/main/scala/org/finos/vuu/feature/ignite/filter/FilterColumnValueParser.scala @@ -64,7 +64,10 @@ private class ColumnValueParser(private val mapper: SchemaMapper) extends Filter } private def parseStringToColumnDataType(value: String): Either[ErrorMessage, Any] = - DataType.parseToDataType(value, column.dataType) + DataType.parseToDataType(value, column.dataType) match { + case Some(v) => Right(v) + case None => Left(s"Failed to parse column value '$value' to data type `${column.dataType}`.") + } private def convertColumnValueToExternalFieldType(columnValue: Any): Either[ErrorMessage, Any] = mapper.toMappedExternalFieldType(column.name, columnValue) diff --git a/vuu/src/main/scala/org/finos/vuu/core/table/Column.scala b/vuu/src/main/scala/org/finos/vuu/core/table/Column.scala index 3726fd170..26cb7cd13 100644 --- a/vuu/src/main/scala/org/finos/vuu/core/table/Column.scala +++ b/vuu/src/main/scala/org/finos/vuu/core/table/Column.scala @@ -4,10 +4,11 @@ import org.finos.vuu.api.TableDef import org.finos.vuu.core.table.column.CalculatedColumnClause import org.finos.vuu.util.types.{DefaultTypeConverters, TypeConverterContainerBuilder} -import scala.util.{Failure, Success, Try} +import scala.util.Try object DataType { + // if a new type's added, make sure that both methods `parseToDataType` & `fromString` can support it final val CharDataType: Class[Char] = classOf[Char] final val StringDataType: Class[String] = classOf[String] final val BooleanDataType: Class[Boolean] = classOf[Boolean] @@ -37,12 +38,8 @@ object DataType { } } - private type ErrorMessage = String - def parseToDataType[T](value: String, t: Class[T]): Either[ErrorMessage, T] = { - Try(typeConverterContainer.convert[String, T](value, classOf[String], t).get) match { - case Success(parsedValue) => Right(parsedValue) - case Failure(ex) => Left(s"Failed to parse String $value to data type $t: ${ex.getMessage}") - } + def parseToDataType[T](value: String, t: Class[T]): Option[T] = { + Try(typeConverterContainer.convert[String, T](value, classOf[String], t).get).toOption } private val typeConverterContainer = TypeConverterContainerBuilder() diff --git a/vuu/src/test/scala/org/finos/vuu/core/table/ColumnTest.scala b/vuu/src/test/scala/org/finos/vuu/core/table/ColumnTest.scala index e70a44dc0..7b6d7d74a 100644 --- a/vuu/src/test/scala/org/finos/vuu/core/table/ColumnTest.scala +++ b/vuu/src/test/scala/org/finos/vuu/core/table/ColumnTest.scala @@ -20,8 +20,8 @@ class ColumnTest extends AnyFeatureSpec with Matchers { Scenario(s"can parse string '$stringInput' to `$dataType` type") { val parsedValue = DataType.parseToDataType(stringInput, dataType) - parsedValue shouldEqual Right(expectedOutput) - TypeUtils.areTypesEqual(dataType, parsedValue.toOption.get.getClass) shouldBe true + parsedValue shouldEqual Some(expectedOutput) + TypeUtils.areTypesEqual(dataType, parsedValue.get.getClass) shouldBe true } }) @@ -32,11 +32,10 @@ class ColumnTest extends AnyFeatureSpec with Matchers { (DataType.LongDataType, "33.5"), (DataType.DoubleDataType, "12x1"), ))((dataType, stringInput) => { - Scenario(s"should return error when string '$stringInput' cannot be parsed to `$dataType` type") { + Scenario(s"should return empty when string '$stringInput' cannot be parsed to `$dataType` type") { val parsedValue = DataType.parseToDataType(stringInput, dataType) - parsedValue.isLeft shouldBe true - parsedValue.swap.toOption.get should startWith("Failed to parse") + parsedValue shouldBe empty } })