in cassandra-bigtable-migration-tools/cassandra-bigtable-proxy/translator/translator_select.go [40:148]
func parseColumnsFromSelect(input cql.ISelectElementsContext) (ColumnMeta, error) {
var response ColumnMeta
var funcName, argument string
if input == nil {
// todo - parser support for writetime - parser fails to get the selectItemList if first Item is writetime function
return response, errors.New("no Input parameters found for columns")
}
if input.STAR() != nil {
response.Star = true
} else {
columns := input.AllSelectElement()
if len(columns) == 0 {
// Todo - Code is not reachable
return response, errors.New("no column parameters found in the query")
}
for _, val := range columns {
var selectedColumns schemaMapping.SelectedColumns
if val == nil {
return response, errors.New("error while parsing the values")
}
funcCall := val.FunctionCall()
if funcCall == nil {
selectedColumns.Name = val.GetText()
// Handle map access
mapAccess := val.MapAccess()
if mapAccess != nil {
objectName := mapAccess.OBJECT_NAME(0).GetText()
if mapAccess.KwAs() != nil && len(mapAccess.AllOBJECT_NAME()) > 1 {
selectedColumns.IsAs = true
selectedColumns.Alias = mapAccess.OBJECT_NAME(1).GetText()
}
mapKey := mapAccess.Constant().GetText()
// Remove surrounding quotes from mapKey
mapKey = strings.Trim(mapKey, "'")
// Populate the selected column
selectedColumns.Name = objectName + "_" + mapKey
selectedColumns.MapColumnName = objectName
selectedColumns.MapKey = mapKey
// Append the parsed column to the response
response.Column = append(response.Column, selectedColumns)
continue
}
} else {
selectedColumns.IsFunc = true
if funcCall.OBJECT_NAME() == nil {
return response, errors.New("function call object is nil")
}
funcName = strings.ToLower(funcCall.OBJECT_NAME().GetText())
if funcCall.STAR() != nil {
argument = funcCall.STAR().GetText()
// selectedColumns.Alias = funcName
} else {
if funcCall.FunctionArgs() == nil {
return response, errors.New("function call argument object is nil")
}
argument = funcCall.FunctionArgs().GetText()
}
selectedColumns.Name = funcName + "_" + argument
selectedColumns.FuncName = funcName
selectedColumns.FuncColumnName = argument
asOperator := val.KwAs()
if asOperator != nil {
selectedColumns.IsAs = true
selectedColumns.Alias = val.AllOBJECT_NAME()[0].GetText()
}
response.Column = append(response.Column, selectedColumns)
continue
}
if strings.Contains(selectedColumns.Name, missingUndefined) {
return response, errors.New("one or more undefined fields for column name")
}
allObject := val.AllOBJECT_NAME()
asOperator := val.KwAs()
if asOperator != nil && len(allObject) != 2 {
return response, errors.New("unknown flow with as operator")
}
if asOperator != nil {
selectedColumns.IsAs = true
selectedColumns.Name = allObject[0].GetText()
selectedColumns.Alias = allObject[1].GetText()
} else if len(allObject) == 2 {
columnName := allObject[0].GetText()
s := strings.ToLower(selectedColumns.Name)
if strings.Contains(s, "writetime("+columnName+")") {
selectedColumns.Name = "writetime(" + columnName + ")"
selectedColumns.Alias = allObject[1].GetText()
selectedColumns.IsAs = true
selectedColumns.FuncColumnName = columnName
selectedColumns.IsWriteTimeColumn = true
}
}
selectedColumns.Name = strings.ReplaceAll(selectedColumns.Name, literalPlaceholder, "")
writetime_value, isExist := ExtractWritetimeValue(selectedColumns.Name)
if isExist {
selectedColumns.IsWriteTimeColumn = true
selectedColumns.FuncColumnName = writetime_value
}
response.Column = append(response.Column, selectedColumns)
}
}
return response, nil
}