convert.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package gen
  2. import (
  3. "errors"
  4. "fmt"
  5. "sort"
  6. "strings"
  7. "github.com/tal-tech/go-zero/tools/goctl/model/sql/util"
  8. )
  9. func TableConvert(outerTable OuterTable) (*InnerTable, error) {
  10. var table InnerTable
  11. table.CreateNotFound = outerTable.CreateNotFound
  12. tableSnakeCase, tableUpperCamelCase, tableLowerCamelCase := util.FormatField(outerTable.Table)
  13. table.SnakeCase = tableSnakeCase
  14. table.UpperCamelCase = tableUpperCamelCase
  15. table.LowerCamelCase = tableLowerCamelCase
  16. fields := make([]*InnerField, 0)
  17. var primaryField *InnerField
  18. conflict := make(map[string]struct{})
  19. var containsCache bool
  20. for _, field := range outerTable.Fields {
  21. if field.Cache && !containsCache {
  22. containsCache = true
  23. }
  24. fieldSnakeCase, fieldUpperCamelCase, fieldLowerCamelCase := util.FormatField(field.Name)
  25. tag, err := genTag(fieldSnakeCase)
  26. if err != nil {
  27. return nil, err
  28. }
  29. var comment string
  30. if field.Comment != "" {
  31. comment = fmt.Sprintf("// %s", field.Comment)
  32. }
  33. withFields := make([]InnerWithField, 0)
  34. unique := make([]string, 0)
  35. unique = append(unique, fmt.Sprintf("%v", field.QueryType))
  36. unique = append(unique, field.Name)
  37. for _, item := range field.WithFields {
  38. unique = append(unique, item.Name)
  39. withFieldSnakeCase, withFieldUpperCamelCase, withFieldLowerCamelCase := util.FormatField(item.Name)
  40. withFields = append(withFields, InnerWithField{
  41. Case: Case{
  42. SnakeCase: withFieldSnakeCase,
  43. LowerCamelCase: withFieldLowerCamelCase,
  44. UpperCamelCase: withFieldUpperCamelCase,
  45. },
  46. DataType: commonMysqlDataTypeMap[item.DataBaseType],
  47. })
  48. }
  49. sort.Strings(unique)
  50. uniqueKey := strings.Join(unique, "#")
  51. if _, ok := conflict[uniqueKey]; ok {
  52. return nil, ErrCircleQuery
  53. } else {
  54. conflict[uniqueKey] = struct{}{}
  55. }
  56. sortFields := make([]InnerSort, 0)
  57. for _, sortField := range field.OuterSort {
  58. sortSnake, sortUpperCamelCase, sortLowerCamelCase := util.FormatField(sortField.Field)
  59. sortFields = append(sortFields, InnerSort{
  60. Field: Case{
  61. SnakeCase: sortSnake,
  62. LowerCamelCase: sortUpperCamelCase,
  63. UpperCamelCase: sortLowerCamelCase,
  64. },
  65. Asc: sortField.Asc,
  66. })
  67. }
  68. innerField := &InnerField{
  69. IsPrimaryKey: field.IsPrimaryKey,
  70. InnerWithField: InnerWithField{
  71. Case: Case{
  72. SnakeCase: fieldSnakeCase,
  73. LowerCamelCase: fieldLowerCamelCase,
  74. UpperCamelCase: fieldUpperCamelCase,
  75. },
  76. DataType: commonMysqlDataTypeMap[field.DataBaseType],
  77. },
  78. DataBaseType: field.DataBaseType,
  79. Tag: tag,
  80. Comment: comment,
  81. Cache: field.Cache,
  82. QueryType: field.QueryType,
  83. WithFields: withFields,
  84. Sort: sortFields,
  85. }
  86. if field.IsPrimaryKey {
  87. primaryField = innerField
  88. }
  89. fields = append(fields, innerField)
  90. }
  91. if primaryField == nil {
  92. return nil, errors.New("please ensure that primary exists")
  93. }
  94. table.ContainsCache = containsCache
  95. primaryField.Cache = containsCache
  96. table.PrimaryField = primaryField
  97. table.Fields = fields
  98. cacheKey, err := genCacheKeys(&table)
  99. if err != nil {
  100. return nil, err
  101. }
  102. table.CacheKey = cacheKey
  103. return &table, nil
  104. }