in ratatool-diffy/src/main/scala/com/spotify/ratatool/diffy/BigDiffy.scala [543:573]
private def mergeFields(
x: Seq[TableFieldSchema],
y: Seq[TableFieldSchema]
): Seq[TableFieldSchema] = {
val xMap = x.map(f => (f.getName, f)).toMap
val yMap = y.map(f => (f.getName, f)).toMap
val names = mutable.LinkedHashSet.empty[String]
xMap.foreach(kv => names.add(kv._1))
yMap.foreach(kv => names.add(kv._1))
names.map { n =>
(xMap.get(n), yMap.get(n)) match {
case (Some(f), None) => f
case (None, Some(f)) => f
case (Some(fx), Some(fy)) =>
val fxMode = getFieldModeWithDefault(fx.getMode)
val fyMode = getFieldModeWithDefault(fy.getMode)
assert(
fx.getType == fy.getType && fxMode == fyMode,
f"field ${fx.getName} in lhs, type: ${fx.getType} mode: $fxMode, and rhs, type: ${fy.getType} mode: $fyMode, do not match"
)
if (fx.getType == "RECORD") {
fx.setFields(
mergeFields(fx.getFields.asScala.toList, fy.getFields.asScala.toList).asJava
)
} else {
fx
}
case _ => throw new RuntimeException
}
}.toSeq
}