in cassandra-bigtable-migration-tools/cassandra-bigtable-proxy/translator/translator_select.go [383:425]
func processFunctionColumn(t *Translator, columnMetadata schemaMapping.SelectedColumns, tableName string, keySpace string, columns []string) ([]string, string, error) {
if columnMetadata.FuncColumnName == STAR && strings.ToLower(columnMetadata.FuncName) == "count" {
columns = append(columns, "count(*)")
return columns, "bigint", nil
}
colMeta, found := t.SchemaMappingConfig.TablesMetaData[keySpace][tableName][columnMetadata.FuncColumnName]
if !found {
// Check if the column is an alias
if aliasMeta, aliasFound := t.SchemaMappingConfig.TablesMetaData[keySpace][tableName][columnMetadata.Alias]; aliasFound {
colMeta = aliasMeta
} else if columnMetadata.FuncName == "count" && columnMetadata.FuncColumnName == STAR {
// Handle special case for count(*)
return append(columns, "count(*)"), "bigint", nil
} else {
return nil, "", fmt.Errorf("column metadata not found for column '%s' in table '%s' and keyspace '%s'", columnMetadata.FuncColumnName, tableName, keySpace)
}
}
colFamiliy := t.SchemaMappingConfig.SystemColumnFamily
dataType := colMeta.CQLType
column := ""
if !funcAllowedInAggregate(columnMetadata.FuncName) {
return nil, "", fmt.Errorf("unknown function '%s'", columnMetadata.FuncName)
}
if columnMetadata.FuncName != "count" {
if !dtAllowedInAggregate(colMeta.ColumnType) {
return nil, "", fmt.Errorf("column not supported for aggregate")
}
}
castValue, castErr := castColumns(colMeta, colFamiliy)
if castErr != nil {
return nil, "", castErr
}
column = fmt.Sprintf("%s(%s)", columnMetadata.FuncName, castValue)
if columnMetadata.IsAs {
column = column + " as " + columnMetadata.Alias
}
columns = append(columns, column)
return columns, dataType, nil
}