Skip to content

Instantly share code, notes, and snippets.

@thesamet
Last active March 13, 2018 04:34

Revisions

  1. thesamet renamed this gist Mar 13, 2018. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. thesamet created this gist Mar 13, 2018.
    49 changes: 49 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,49 @@

    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
    )
    }
    }