func parseColumnsFromSelect()

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
}