in v1/src/main/java/com/google/cloud/teleport/spanner/ddl/InformationSchemaScanner.java [544:614]
private void listIndexColumns(
Ddl.Builder builder, Map<String, NavigableMap<String, Index.Builder>> indexes) {
Statement statement = listIndexColumnsSQL();
ResultSet resultSet = context.executeQuery(statement);
while (resultSet.next()) {
String tableName = getQualifiedName(resultSet.getString(0), resultSet.getString(1));
String columnName = resultSet.getString(2);
String ordering = resultSet.isNull(3) ? null : resultSet.getString(3);
String indexLocalName = resultSet.getString(4);
String indexType = resultSet.getString(5);
String spannerType = resultSet.getString(6);
if (indexLocalName.equals("PRIMARY_KEY")) {
IndexColumn.IndexColumnsBuilder<Table.Builder> pkBuilder =
builder.createTable(tableName).primaryKey();
if (ordering.equalsIgnoreCase("ASC")) {
pkBuilder.asc(columnName).end();
} else {
pkBuilder.desc(columnName).end();
}
pkBuilder.end().endTable();
} else {
String tokenlistType = dialect == Dialect.POSTGRESQL ? "spanner.tokenlist" : "TOKENLIST";
if (indexType != null && ordering != null) {
// Non-tokenlist columns should not be included in the key for Search Indexes.
if ((indexType.equals("SEARCH") && !spannerType.contains(tokenlistType))
|| (indexType.equals("VECTOR") && !spannerType.startsWith("ARRAY"))) {
continue;
}
}
Map<String, Index.Builder> tableIndexes = indexes.get(tableName);
if (tableIndexes == null) {
continue;
}
String indexName =
dialect == Dialect.POSTGRESQL
? indexLocalName
: getQualifiedName(resultSet.getString(0), indexLocalName);
Index.Builder indexBuilder = tableIndexes.get(indexName);
if (indexBuilder == null) {
LOG.warn("Can not find index using name {}", indexName);
continue;
}
IndexColumn.IndexColumnsBuilder<Index.Builder> indexColumnsBuilder =
indexBuilder.columns().create().name(columnName);
// Tokenlist columns do not have ordering.
if (spannerType != null
&& (spannerType.equals(tokenlistType) || spannerType.startsWith("ARRAY"))) {
indexColumnsBuilder.none();
} else if (ordering == null) {
indexColumnsBuilder.storing();
} else {
ordering = ordering.toUpperCase();
if (ordering.startsWith("ASC")) {
indexColumnsBuilder.asc();
}
if (ordering.startsWith("DESC")) {
indexColumnsBuilder.desc();
}
if (ordering.endsWith("NULLS FIRST")) {
indexColumnsBuilder.nullsFirst();
}
if (ordering.endsWith("NULLS LAST")) {
indexColumnsBuilder.nullsLast();
}
}
indexColumnsBuilder.endIndexColumn().end();
}
}
}