Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
match on DataType when flattening fields
  • Loading branch information
gaborbarna committed Feb 3, 2018
commit d94f27ba17ed0292b2abbe54f7e7d97e99023fda
20 changes: 11 additions & 9 deletions core/src/main/scala/ste/encoder.scala
Original file line number Diff line number Diff line change
Expand Up @@ -103,19 +103,21 @@ trait LowPriorityImplicits {
tEncoder: AnnotatedStructTypeEncoder[T]
): AnnotatedStructTypeEncoder[FieldType[K, H] :: T] = AnnotatedStructTypeEncoder.pure { (metadata, flattened) =>
val fieldName = witness.value.name
val fields = flattened.head.flatMap(f => hEncoder.value.fields.map(flattenFields(_, fieldName, f))).getOrElse(
Seq(StructField(fieldName, hEncoder.value.encode, hEncoder.value.nullable, metadata.head)))
val dt = hEncoder.value.encode
val fields = flattened.head.flatMap(f => hEncoder.value.fields.map(flattenFields(_, dt, fieldName, f))).getOrElse(
Seq(StructField(fieldName, dt, hEncoder.value.nullable, metadata.head)))
val tail = tEncoder.encode(metadata.tail, flattened.tail)
StructType(fields ++ tail.fields)
}

private def flattenFields(fields: Seq[StructField], prefix: String, flattened: Flattened) = flattened match {
case Flattened(times, _) if times > 1 =>
(0 until times).flatMap(i => fields.map(prefixStructField(_, s"$prefix$i")))
case Flattened(_, keys) if keys.nonEmpty =>
keys.flatMap(k => fields.map(prefixStructField(_, s"$k.$prefix")))
case Flattened(_, _) => fields.map(prefixStructField(_, prefix))
}
private def flattenFields(fields: Seq[StructField], dt: DataType, prefix: String, flattened: Flattened) =
(dt, flattened) match {
case (_: ArrayType, Flattened(times, _)) if times > 1 =>
(0 until times).flatMap(i => fields.map(prefixStructField(_, s"$prefix$i")))
case (_: MapType, Flattened(_, keys)) if keys.nonEmpty =>
keys.flatMap(k => fields.map(prefixStructField(_, s"$k.$prefix")))
case (_, Flattened(_, _)) => fields.map(prefixStructField(_, prefix))
}

private def prefixStructField(f: StructField, prefix: String) =
f.copy(name = s"$prefix.${f.name}")
Expand Down