in driver/src/main/scala/com/datastax/spark/connector/mapper/TupleColumnMapper.scala [51:87]
override def columnMapForWriting(struct: StructDef, selectedColumns: IndexedSeq[ColumnRef]) = {
val GetterRegex = "_([0-9]+)".r
require(
selectedColumns.forall(colName => colName.selectedAs == colName.columnName) ||
selectedColumns.forall(colName => colName.selectedAs != colName.columnName),
"""No mixing of implicit and explicit column mapping when writing tuples
|1. All columns must be un-aliased or aliased to themselves OR
|2. Some columns aliased to fields (_1,_2 ...) but no columns are implicitly mapped"""
.stripMargin
)
for (colName <- selectedColumns) {
val columnName = colName.columnName
val alias = colName.selectedAs
if (alias != columnName && !methodNames.contains(alias))
throw new IllegalArgumentException(
s"""Found Alias: $alias
|Tuple provided does not have a getter for that alias.'
|Provided getters are ${methodNames.mkString(",")}""".stripMargin)
}
val aliasToRef = selectedColumns.map(colRef => colRef.selectedAs -> colRef).toMap
//Implicit Mapping, Order of C* Columns == Tuple Field Order
val getters = if (selectedColumns.forall(colRef => colRef.columnName == colRef.selectedAs)) {
for (methodName @ GetterRegex(id) <- methodNames if id.toInt <= selectedColumns.length)
yield (methodName, selectedColumns(id.toInt - 1))
}.toMap
else {
//Explicit Mapping, Tuple field aliases used
for (methodName @ GetterRegex(id) <- methodNames if aliasToRef.contains(methodName))
yield (methodName, aliasToRef(methodName))
}.toMap
SimpleColumnMapForWriting(getters)
}