keys.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package gen
  2. import (
  3. "fmt"
  4. "sort"
  5. "strings"
  6. "github.com/zeromicro/go-zero/tools/goctl/model/sql/parser"
  7. "github.com/zeromicro/go-zero/tools/goctl/util"
  8. "github.com/zeromicro/go-zero/tools/goctl/util/stringx"
  9. )
  10. // Key describes cache key
  11. type Key struct {
  12. // VarLeft describes the variable of cache key expression which likes cacheUserIdPrefix
  13. VarLeft string
  14. // VarRight describes the value of cache key expression which likes "cache:user:id:"
  15. VarRight string
  16. // VarExpression describes the cache key expression which likes cacheUserIdPrefix = "cache:user:id:"
  17. VarExpression string
  18. // KeyLeft describes the variable of key definition expression which likes userKey
  19. KeyLeft string
  20. // KeyRight describes the value of key definition expression which likes fmt.Sprintf("%s%v", cacheUserPrefix, user)
  21. KeyRight string
  22. // DataKeyRight describes data key likes fmt.Sprintf("%s%v", cacheUserPrefix, data.User)
  23. DataKeyRight string
  24. // KeyExpression describes key expression likes userKey := fmt.Sprintf("%s%v", cacheUserPrefix, user)
  25. KeyExpression string
  26. // DataKeyExpression describes data key expression likes userKey := fmt.Sprintf("%s%v", cacheUserPrefix, data.User)
  27. DataKeyExpression string
  28. // FieldNameJoin describes the filed slice of table
  29. FieldNameJoin Join
  30. // Fields describes the fields of table
  31. Fields []*parser.Field
  32. }
  33. // Join describes an alias of string slice
  34. type Join []string
  35. func genCacheKeys(table parser.Table) (Key, []Key) {
  36. var primaryKey Key
  37. var uniqueKey []Key
  38. primaryKey = genCacheKey(table.Db, table.Name, []*parser.Field{&table.PrimaryKey.Field})
  39. for _, each := range table.UniqueIndex {
  40. uniqueKey = append(uniqueKey, genCacheKey(table.Db, table.Name, each))
  41. }
  42. sort.Slice(uniqueKey, func(i, j int) bool {
  43. return uniqueKey[i].VarLeft < uniqueKey[j].VarLeft
  44. })
  45. return primaryKey, uniqueKey
  46. }
  47. func genCacheKey(db, table stringx.String, in []*parser.Field) Key {
  48. var (
  49. varLeftJoin, varRightJoin, fieldNameJoin Join
  50. varLeft, varRight, varExpression string
  51. keyLeftJoin, keyRightJoin, keyRightArgJoin, dataRightJoin Join
  52. keyLeft, keyRight, dataKeyRight, keyExpression, dataKeyExpression string
  53. )
  54. dbName, tableName := util.SafeString(db.Source()), util.SafeString(table.Source())
  55. if len(dbName) > 0 {
  56. varLeftJoin = append(varLeftJoin, "cache", dbName, tableName)
  57. varRightJoin = append(varRightJoin, "cache", dbName, tableName)
  58. keyLeftJoin = append(keyLeftJoin, dbName, tableName)
  59. } else {
  60. varLeftJoin = append(varLeftJoin, "cache", tableName)
  61. varRightJoin = append(varRightJoin, "cache", tableName)
  62. keyLeftJoin = append(keyLeftJoin, tableName)
  63. }
  64. for _, each := range in {
  65. varLeftJoin = append(varLeftJoin, each.Name.Source())
  66. varRightJoin = append(varRightJoin, each.Name.Source())
  67. keyLeftJoin = append(keyLeftJoin, each.Name.Source())
  68. keyRightJoin = append(keyRightJoin, util.EscapeGolangKeyword(stringx.From(each.Name.ToCamel()).Untitle()))
  69. keyRightArgJoin = append(keyRightArgJoin, "%v")
  70. dataRightJoin = append(dataRightJoin, "data."+each.Name.ToCamel())
  71. fieldNameJoin = append(fieldNameJoin, each.Name.Source())
  72. }
  73. varLeftJoin = append(varLeftJoin, "prefix")
  74. keyLeftJoin = append(keyLeftJoin, "key")
  75. varLeft = util.SafeString(varLeftJoin.Camel().With("").Untitle())
  76. varRight = fmt.Sprintf(`"%s"`, varRightJoin.Camel().Untitle().With(":").Source()+":")
  77. varExpression = fmt.Sprintf(`%s = %s`, varLeft, varRight)
  78. keyLeft = util.SafeString(keyLeftJoin.Camel().With("").Untitle())
  79. keyRight = fmt.Sprintf(`fmt.Sprintf("%s%s", %s, %s)`, "%s", keyRightArgJoin.With(":").Source(), varLeft, keyRightJoin.With(", ").Source())
  80. dataKeyRight = fmt.Sprintf(`fmt.Sprintf("%s%s", %s, %s)`, "%s", keyRightArgJoin.With(":").Source(), varLeft, dataRightJoin.With(", ").Source())
  81. keyExpression = fmt.Sprintf("%s := %s", keyLeft, keyRight)
  82. dataKeyExpression = fmt.Sprintf("%s := %s", keyLeft, dataKeyRight)
  83. return Key{
  84. VarLeft: varLeft,
  85. VarRight: varRight,
  86. VarExpression: varExpression,
  87. KeyLeft: keyLeft,
  88. KeyRight: keyRight,
  89. DataKeyRight: dataKeyRight,
  90. KeyExpression: keyExpression,
  91. DataKeyExpression: dataKeyExpression,
  92. Fields: in,
  93. FieldNameJoin: fieldNameJoin,
  94. }
  95. }
  96. // Title convert items into Title and return
  97. func (j Join) Title() Join {
  98. var join Join
  99. for _, each := range j {
  100. join = append(join, stringx.From(each).Title())
  101. }
  102. return join
  103. }
  104. // Camel convert items into Camel and return
  105. func (j Join) Camel() Join {
  106. var join Join
  107. for _, each := range j {
  108. join = append(join, stringx.From(each).ToCamel())
  109. }
  110. return join
  111. }
  112. // Snake convert items into Snake and return
  113. func (j Join) Snake() Join {
  114. var join Join
  115. for _, each := range j {
  116. join = append(join, stringx.From(each).ToSnake())
  117. }
  118. return join
  119. }
  120. // Untitle converts items into Untitle and return
  121. func (j Join) Untitle() Join {
  122. var join Join
  123. for _, each := range j {
  124. join = append(join, stringx.From(each).Untitle())
  125. }
  126. return join
  127. }
  128. // Upper convert items into Upper and return
  129. func (j Join) Upper() Join {
  130. var join Join
  131. for _, each := range j {
  132. join = append(join, stringx.From(each).Upper())
  133. }
  134. return join
  135. }
  136. // Lower convert items into Lower and return
  137. func (j Join) Lower() Join {
  138. var join Join
  139. for _, each := range j {
  140. join = append(join, stringx.From(each).Lower())
  141. }
  142. return join
  143. }
  144. // With convert items into With and return
  145. func (j Join) With(sep string) stringx.String {
  146. return stringx.From(strings.Join(j, sep))
  147. }