in driver/src/main/scala/com/datastax/spark/connector/util/NameTools.scala [91:126]
def getSuggestions(clusterMetadata: Metadata, keyspace: String, table: String): Option[Suggestions] = {
val keyspaceScores = clusterMetadata
.getKeyspaces
.values().asScala
.toSeq
.map(ks =>
(ks, StringUtils.getJaroWinklerDistance(toName(ks.getName).toLowerCase(Locale.ROOT), keyspace.toLowerCase(Locale.ROOT))))
val ktScores = for ((ks, ksScore) <- keyspaceScores; (_, t) <- (ks.getTables.asScala ++ ks.getViews.asScala)) yield {
val tScore = StringUtils.getJaroWinklerDistance(toName(t.getName).toLowerCase(Locale.ROOT), table.toLowerCase(Locale.ROOT))
(toName(ks.getName), toName(t.getName), ksScore, tScore)
}
//1. Perfect match on keyspace, fuzzy match on table
val suggestedTables = ktScores
.collect { case (ks, t, ksScore, tScore) if ks == keyspace && tScore > MinJWScore => t}
//2. Fuzzy match on table, perfect match on table
val suggestedKeyspaces = ktScores
.collect { case (ks, t, ksScore, tScore) if ksScore > MinJWScore && t == table => ks}
//3. Fuzzy match on keyspace, fuzzy match on table
val suggestedKeyspaceAndTables = ktScores
.collect { case (ks, t, ksScore, tScore) if ksScore > MinJWScore && tScore > MinJWScore => (ks, t)}
//4. No match on keyspace, fuzzy match on table
val suggestedTablesUnknownKeyspace = ktScores
.collect { case (ks, t, ksScore, tScore) if tScore > MinJWScore => (ks, t)}
if (suggestedTables.nonEmpty) Some(TableSuggestions(suggestedTables))
else if (suggestedKeyspaces.nonEmpty) Some(KeyspaceSuggestions(suggestedKeyspaces))
else if (suggestedKeyspaceAndTables.nonEmpty) Some(KeyspaceAndTableSuggestions(suggestedKeyspaceAndTables))
else if (suggestedTablesUnknownKeyspace.nonEmpty) Some(KeyspaceAndTableSuggestions(suggestedTablesUnknownKeyspace))
else None
}