Skip to content

Instantly share code, notes, and snippets.

@thesamet
Last active March 13, 2018 04:34
Show Gist options
  • Save thesamet/1c44d4c78d7defff489fe7c252f15394 to your computer and use it in GitHub Desktop.
Save thesamet/1c44d4c78d7defff489fe7c252f15394 to your computer and use it in GitHub Desktop.
case class DeserializeEnumExpression[T](child: Expression)(implicit clsTag: ClassTag[T]) extends UnaryExpression with NonSQLExpression {
override def nullable: Boolean = true
override protected def doGenCode(ctx: CodegenContext,
ev: ExprCode): ExprCode = {
val inputObject = child.genCode(ctx)
val javaType = ctx.javaType(dataType)
val code =
s"""
${inputObject.code}
final boolean ${ev.isNull} = ${inputObject.isNull};
final $javaType ${ev.value} = ${ev.isNull} ? ${ctx.defaultValue(dataType)} : ${clsTag.runtimeClass.getName}$$.MODULE$$.fromValue(${inputObject.value});
"""
ev.copy(code = code)
}
override def dataType: DataType = ObjectType(clsTag.runtimeClass)
}
object Enums {
def enumEncoder[T <: GeneratedEnum](implicit cmp: GeneratedEnumCompanion[T], clsTag: ClassTag[T]): Encoder[T] = {
val inputObject = BoundReference(0, ObjectType(clsTag.runtimeClass), nullable = true)
val inputObject1 = BoundReference(0, DataTypes.IntegerType, nullable = true)
val b = s"foo"
new ExpressionEncoder[T](new StructType().add("val", DataTypes.IntegerType, true), false,
serializer = Seq(
Invoke(inputObject, "value", DataTypes.IntegerType, Nil, false, false)
),
deserializer = DeserializeEnumExpression[T](inputObject1),
clsTag
)
}
def enumEncoder[T <: GeneratedEnum](implicit cmp: GeneratedEnumCompanion[T], clsTag: ClassTag[T]): Encoder[T] = {
val inputObject = BoundReference(0, ObjectType(clsTag.runtimeClass), nullable = true)
val inputObject1 = BoundReference(0, DataTypes.IntegerType, nullable = true)
val b = s"foo"
new ExpressionEncoder[T](new StructType().add("val", DataTypes.IntegerType, true), false,
serializer = Seq(
Invoke(inputObject, "value", DataTypes.IntegerType, Nil, false, false)
),
deserializer = Invoke(Literal.fromObject(cmp), "fromName", ObjectType(clsTag.runtimeClass), Seq(inputObject1), false, false),
clsTag
)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment