aws.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package cloudutil
  2. import (
  3. <<<<<<< HEAD
  4. "strings"
  5. "unicode"
  6. =======
  7. "fmt"
  8. "strings"
  9. "unicode"
  10. "github.com/kubecost/cost-model/pkg/log"
  11. >>>>>>> 8f84d202d4aa2126642ec05b1f03513893dabfbc
  12. )
  13. // ConvertToGlueColumnFormat takes a string and runs through various regex
  14. // and string replacement statements to convert it to a format compatible
  15. // with AWS Glue and Athena column names.
  16. // Following guidance from AWS provided here ('Column Names' section):
  17. // https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/run-athena-sql.html
  18. // It returns a string containing the column name in proper column name format and length.
  19. func ConvertToGlueColumnFormat(columnName string) string {
  20. var sb strings.Builder
  21. var prev rune
  22. for i, r := range columnName {
  23. if unicode.IsUpper(r) && prev != '_' && i != 0 {
  24. sb.WriteRune('_')
  25. }
  26. if !unicode.IsLetter(r) && !unicode.IsNumber(r) {
  27. if prev != '_' && i != 0 && i != (len(columnName)-1) {
  28. sb.WriteRune('_')
  29. }
  30. prev = '_'
  31. continue
  32. }
  33. if r == '_' {
  34. if prev == '_' || i == 0 || i == len(columnName)-1 {
  35. prev = '_'
  36. continue
  37. }
  38. }
  39. sb.WriteRune(unicode.ToLower(r))
  40. prev = r
  41. }
  42. final := sb.String()
  43. if prev == '_' { // string any trailing '_'
  44. final = final[:len(final)-1]
  45. }
  46. // Longer column name than expected - remove _ left to right
  47. allowedColLen := 128
  48. underscoreToRemove := len(final) - allowedColLen
  49. if underscoreToRemove > 0 {
  50. final = strings.Replace(final, "_", "", underscoreToRemove)
  51. }
  52. // If removing all of the underscores still didn't
  53. // make the column name < 128 characters, trim it!
  54. if len(final) > allowedColLen {
  55. final = final[:allowedColLen]
  56. }
  57. return final
  58. }