keys_test.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. package gen
  2. import (
  3. "sort"
  4. "testing"
  5. "github.com/stretchr/testify/assert"
  6. "github.com/wuntsong-org/go-zero-plus/tools/goctlwt/model/sql/parser"
  7. "github.com/wuntsong-org/go-zero-plus/tools/goctlwt/util/stringx"
  8. )
  9. func TestGenCacheKeys(t *testing.T) {
  10. primaryField := &parser.Field{
  11. Name: stringx.From("id"),
  12. DataType: "int64",
  13. Comment: "自增id",
  14. SeqInIndex: 1,
  15. }
  16. mobileField := &parser.Field{
  17. Name: stringx.From("mobile"),
  18. DataType: "string",
  19. Comment: "手机号",
  20. SeqInIndex: 1,
  21. }
  22. classField := &parser.Field{
  23. Name: stringx.From("class"),
  24. DataType: "string",
  25. Comment: "班级",
  26. SeqInIndex: 1,
  27. }
  28. nameField := &parser.Field{
  29. Name: stringx.From("name"),
  30. DataType: "string",
  31. Comment: "姓名",
  32. SeqInIndex: 2,
  33. }
  34. primariCacheKey, uniqueCacheKey := genCacheKeys(parser.Table{
  35. Name: stringx.From("user"),
  36. Db: stringx.From("go_zero"),
  37. PrimaryKey: parser.Primary{
  38. Field: *primaryField,
  39. AutoIncrement: true,
  40. },
  41. UniqueIndex: map[string][]*parser.Field{
  42. "mobile_unique": {
  43. mobileField,
  44. },
  45. "class_name_unique": {
  46. classField,
  47. nameField,
  48. },
  49. },
  50. Fields: []*parser.Field{
  51. primaryField,
  52. mobileField,
  53. classField,
  54. nameField,
  55. {
  56. Name: stringx.From("createTime"),
  57. DataType: "time.Time",
  58. Comment: "创建时间",
  59. },
  60. {
  61. Name: stringx.From("updateTime"),
  62. DataType: "time.Time",
  63. Comment: "更新时间",
  64. },
  65. },
  66. })
  67. t.Run("primaryCacheKey", func(t *testing.T) {
  68. assert.Equal(t, true, func() bool {
  69. return cacheKeyEqual(primariCacheKey, Key{
  70. VarLeft: "cacheGoZeroUserIdPrefix",
  71. VarRight: `"cache:goZero:user:id:"`,
  72. VarExpression: `cacheGoZeroUserIdPrefix = "cache:goZero:user:id:"`,
  73. KeyLeft: "goZeroUserIdKey",
  74. KeyRight: `fmt.Sprintf("%s%v", cacheGoZeroUserIdPrefix, id)`,
  75. DataKeyRight: `fmt.Sprintf("%s%v", cacheGoZeroUserIdPrefix, data.ID)`,
  76. KeyExpression: `goZeroUserIdKey := fmt.Sprintf("%s%v", cacheGoZeroUserIdPrefix, id)`,
  77. DataKeyExpression: `goZeroUserIdKey := fmt.Sprintf("%s%v", cacheGoZeroUserIdPrefix, data.ID)`,
  78. FieldNameJoin: []string{"id"},
  79. })
  80. }())
  81. })
  82. t.Run("uniqueCacheKey", func(t *testing.T) {
  83. assert.Equal(t, true, func() bool {
  84. expected := []Key{
  85. {
  86. VarLeft: "cacheGoZeroUserClassNamePrefix",
  87. VarRight: `"cache:goZero:user:class:name:"`,
  88. VarExpression: `cacheGoZeroUserClassNamePrefix = "cache:goZero:user:class:name:"`,
  89. KeyLeft: "goZeroUserClassNameKey",
  90. KeyRight: `fmt.Sprintf("%s%v:%v", cacheGoZeroUserClassNamePrefix, class, name)`,
  91. DataKeyRight: `fmt.Sprintf("%s%v:%v", cacheGoZeroUserClassNamePrefix, data.Class, data.Name)`,
  92. KeyExpression: `goZeroUserClassNameKey := fmt.Sprintf("%s%v:%v", cacheGoZeroUserClassNamePrefix, class, name)`,
  93. DataKeyExpression: `goZeroUserClassNameKey := fmt.Sprintf("%s%v:%v", cacheGoZeroUserClassNamePrefix, data.Class, data.Name)`,
  94. FieldNameJoin: []string{"class", "name"},
  95. },
  96. {
  97. VarLeft: "cacheGoZeroUserMobilePrefix",
  98. VarRight: `"cache:goZero:user:mobile:"`,
  99. VarExpression: `cacheGoZeroUserMobilePrefix = "cache:goZero:user:mobile:"`,
  100. KeyLeft: "goZeroUserMobileKey",
  101. KeyRight: `fmt.Sprintf("%s%v", cacheGoZeroUserMobilePrefix, mobile)`,
  102. DataKeyRight: `fmt.Sprintf("%s%v", cacheGoZeroUserMobilePrefix, data.Mobile)`,
  103. KeyExpression: `goZeroUserMobileKey := fmt.Sprintf("%s%v", cacheGoZeroUserMobilePrefix, mobile)`,
  104. DataKeyExpression: `goZeroUserMobileKey := fmt.Sprintf("%s%v", cacheGoZeroUserMobilePrefix, data.Mobile)`,
  105. FieldNameJoin: []string{"mobile"},
  106. },
  107. }
  108. sort.Slice(uniqueCacheKey, func(i, j int) bool {
  109. return uniqueCacheKey[i].VarLeft < uniqueCacheKey[j].VarLeft
  110. })
  111. if len(expected) != len(uniqueCacheKey) {
  112. return false
  113. }
  114. for index, each := range uniqueCacheKey {
  115. expecting := expected[index]
  116. if !cacheKeyEqual(expecting, each) {
  117. return false
  118. }
  119. }
  120. return true
  121. }())
  122. })
  123. t.Run("no database name", func(t *testing.T) {
  124. primariCacheKey, _ = genCacheKeys(parser.Table{
  125. Name: stringx.From("user"),
  126. Db: stringx.From(""),
  127. PrimaryKey: parser.Primary{
  128. Field: *primaryField,
  129. AutoIncrement: true,
  130. },
  131. UniqueIndex: map[string][]*parser.Field{
  132. "mobile_unique": {
  133. mobileField,
  134. },
  135. "class_name_unique": {
  136. classField,
  137. nameField,
  138. },
  139. },
  140. Fields: []*parser.Field{
  141. primaryField,
  142. mobileField,
  143. classField,
  144. nameField,
  145. {
  146. Name: stringx.From("createTime"),
  147. DataType: "time.Time",
  148. Comment: "创建时间",
  149. },
  150. {
  151. Name: stringx.From("updateTime"),
  152. DataType: "time.Time",
  153. Comment: "更新时间",
  154. },
  155. },
  156. })
  157. assert.Equal(t, true, func() bool {
  158. return cacheKeyEqual(primariCacheKey, Key{
  159. VarLeft: "cacheUserIdPrefix",
  160. VarRight: `"cache:user:id:"`,
  161. VarExpression: `cacheUserIdPrefix = "cache:user:id:"`,
  162. KeyLeft: "userIdKey",
  163. KeyRight: `fmt.Sprintf("%s%v", cacheUserIdPrefix, id)`,
  164. DataKeyRight: `fmt.Sprintf("%s%v", cacheUserIdPrefix, data.ID)`,
  165. KeyExpression: `userIdKey := fmt.Sprintf("%s%v", cacheUserIdPrefix, id)`,
  166. DataKeyExpression: `userIdKey := fmt.Sprintf("%s%v", cacheUserIdPrefix, data.ID)`,
  167. FieldNameJoin: []string{"id"},
  168. })
  169. }())
  170. })
  171. }
  172. func cacheKeyEqual(k1, k2 Key) bool {
  173. k1Join := k1.FieldNameJoin
  174. k2Join := k2.FieldNameJoin
  175. sort.Strings(k1Join)
  176. sort.Strings(k2Join)
  177. if len(k1Join) != len(k2Join) {
  178. return false
  179. }
  180. for index, each := range k1Join {
  181. k2Item := k2Join[index]
  182. if each != k2Item {
  183. return false
  184. }
  185. }
  186. return k1.VarLeft == k2.VarLeft &&
  187. k1.VarRight == k2.VarRight &&
  188. k1.VarExpression == k2.VarExpression &&
  189. k1.KeyLeft == k2.KeyLeft &&
  190. k1.KeyRight == k2.KeyRight &&
  191. k1.DataKeyRight == k2.DataKeyRight &&
  192. k1.DataKeyExpression == k2.DataKeyExpression &&
  193. k1.KeyExpression == k2.KeyExpression
  194. }