in driver/src/main/scala/com/datastax/spark/connector/types/TypeConverter.scala [1014:1072]
private def forCollectionType(tpe: Type, moreConverters: Seq[TypeConverter[_]]): TypeConverter[_] = {
tpe match {
case TypeRef(_, symbol, List(arg)) =>
val untypedItemConverter = forType(arg, moreConverters)
type T = untypedItemConverter.targetType
implicit val itemConverter = untypedItemConverter.asInstanceOf[TypeConverter[T]]
implicit val ordering = orderingFor(arg).map(_.asInstanceOf[Ordering[T]]).orNull
symbol match {
case CassandraOptionSymbol => cassandraOptionConverter[T]
case OptionSymbol => optionConverter[T]
case ListSymbol => listConverter[T]
case VectorSymbol => vectorConverter[T]
case SetSymbol => setConverter[T]
case TreeSetSymbol if ordering != null => treeSetConverter[T]
case SeqSymbol => seqConverter[T]
case IndexedSeqSymbol => indexedSeqConverter[T]
case IterableSymbol => iterableConverter[T]
case JavaListSymbol => javaListConverter[T]
case JavaArrayListSymbol => javaArrayListConverter[T]
case JavaSetSymbol => javaSetConverter[T]
case JavaHashSetSymbol => javaHashSetConverter[T]
case _ => throw new IllegalArgumentException(s"Unsupported type: $tpe")
}
case TypeRef(_, symbol, List(k, v)) =>
val untypedKeyConverter = forType(k, moreConverters)
val untypedValueConverter = forType(v, moreConverters)
type K = untypedKeyConverter.targetType
type V = untypedValueConverter.targetType
implicit val keyConverter = untypedKeyConverter.asInstanceOf[TypeConverter[K]]
implicit val valueConverter = untypedValueConverter.asInstanceOf[TypeConverter[V]]
implicit val ordering = orderingFor(k).map(_.asInstanceOf[Ordering[K]]).orNull
symbol match {
case PairSymbol => pairConverter[K, V]
case MapSymbol => mapConverter[K, V]
case TreeMapSymbol if ordering != null => treeMapConverter[K, V]
case JavaMapSymbol => javaMapConverter[K, V]
case JavaHashMapSymbol => javaHashMapConverter[K, V]
case _ => throw new IllegalArgumentException(s"Unsupported type: $tpe")
}
case TypeRef(_, symbol, List(t1, t2, t3)) =>
val untypedConverter1 = forType(t1, moreConverters)
val untypedConverter2 = forType(t2, moreConverters)
val untypedConverter3 = forType(t3, moreConverters)
type T1 = untypedConverter1.targetType
type T2 = untypedConverter2.targetType
type T3 = untypedConverter3.targetType
implicit val converter1 = untypedConverter1.asInstanceOf[TypeConverter[T1]]
implicit val converter2 = untypedConverter2.asInstanceOf[TypeConverter[T2]]
implicit val converter3 = untypedConverter3.asInstanceOf[TypeConverter[T3]]
symbol match {
case TripleSymbol => tripleConverter[T1, T2, T3]
case _ => throw new IllegalArgumentException(s"Unsupported type: $tpe")
}
case _ => throw new IllegalArgumentException(s"Unsupported type: $tpe")
}
}