Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- object HBaseRecordSerDe {
- import shapeless.{::, HList, HNil}
- implicit val hNilEncoder = instance[HNil](
- r => Map(),
- l => HNil
- )
- implicit def hListSerDe[Key <: Symbol, H, T <: HList](
- implicit
- key: Witness.Aux[Key],
- headSerDe: HBaseFieldShapelessSerDe[H],
- tailSerDe: HBaseRecordShapelessSerDe[T]
- ): HBaseRecordShapelessSerDe[FieldType[Key, H] :: T] = instance[FieldType[Key,H] :: T](
- hList => {
- Map(key.value.name -> headSerDe.serialize(hList.head)) ++ tailSerDe.serialize(hList.tail)
- },
- byteList => {
- field[Key](headSerDe.deSerialize(byteList.head._2)) :: tailSerDe.deSerialize(byteList.tail)
- }
- )
- implicit def caseClassSerDe[TargetType, L <: HList](implicit genRepr: LabelledGeneric.Aux[TargetType, L], hListSerDe: HBaseRecordShapelessSerDe[L]): HBaseRecordShapelessSerDe[TargetType] = instance[TargetType](
- hList => {
- hListSerDe.serialize(genRepr.to(hList))
- },
- byteList => {
- genRepr.from( hListSerDe.deSerialize(byteList))
- }
- )
- def apply[RecordSerDeType](implicit serde: HBaseRecordShapelessSerDe[RecordSerDeType]): HBaseRecordShapelessSerDe[RecordSerDeType] = serde
- def instance[RecordSerDeType](serializeFunc: RecordSerDeType => Map[String, Array[Byte]], deserializeFunc: Map[String, Array[Byte]] => RecordSerDeType): HBaseRecordShapelessSerDe[RecordSerDeType] = {
- new HBaseRecordShapelessSerDe[RecordSerDeType] {
- override def serialize(value: RecordSerDeType): Map[String, Array[Byte]] = serializeFunc(value)
- override def deSerialize(value:Map[String, Array[Byte]]): RecordSerDeType = deserializeFunc(value)
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement