J'ai donc une implémentation fonctionnelle, sauf que je ne peux pas obtenir ma liste HList dans le bon ordre avant d'utiliser LabelledGenerics pour construire l'objet CaseClass.Mapper [String, Array [Byte]] à CaseClass avec Scala Shapeless
Ce qui fonctionne est en ce moment
case class Foo(a:int, b:String)
val serializedRecord("a" -> somebytes, "b" -> someotherbytes)
val caseClassObject = HBaseSerDe[Foo].deserialize(serializedRecord)
Ce qui ne fonctionne pas est:
case class Foo(a:int, b:String)
val serializedRecord(x -> value1 ,"a" -> somebytes, "b" -> someotherbytes, z -> value2)
//expected Foo(somebytes, someotherbytes)
val caseClassObject = HBaseSerDe[Foo].deserialize(serializedRecord)
D'après ce que j'ai lu que je suis censé utiliser Aligner et Intersection pour obtenir mon Hlist triée avant désérialisation mais dans tous les exemples que je pouvais trouver quelque chose qu'ils utilisent comme ce qui suit (extrait de github.com/underscoreio/shapeless-guide)
implicit def genericMigration[
A, B,
ARepr <: HList, BRepr <: HList,
Unaligned <: HList
](
implicit
aGen : LabelledGeneric.Aux[A, ARepr],
bGen : LabelledGeneric.Aux[B, BRepr],
inter : hlist.Intersection.Aux[ARepr, BRepr, Unaligned],
align : hlist.Align[Unaligned, BRepr]
): Migration[A, B] = new Migration[A, B] {
def apply(a: A): B =
bGen.from(align.apply(inter.apply(aGen.to(a))))
}
Cependant, je n'ai pas de CaseClass A et je ne pouvais pas comprendre comment construire sa représentation à la volée. Ci-dessous vous pouvez trouver le code actuel:
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)
}
}