1
0

keys_test.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package gen
  2. import (
  3. "sort"
  4. "testing"
  5. "github.com/stretchr/testify/assert"
  6. "github.com/tal-tech/go-zero/tools/goctl/model/sql/parser"
  7. "github.com/tal-tech/go-zero/tools/goctl/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. PrimaryKey: parser.Primary{
  37. Field: *primaryField,
  38. AutoIncrement: true,
  39. },
  40. UniqueIndex: map[string][]*parser.Field{
  41. "mobile_unique": {
  42. mobileField,
  43. },
  44. "class_name_unique": {
  45. classField,
  46. nameField,
  47. },
  48. },
  49. Fields: []*parser.Field{
  50. primaryField,
  51. mobileField,
  52. classField,
  53. nameField,
  54. {
  55. Name: stringx.From("createTime"),
  56. DataType: "time.Time",
  57. Comment: "创建时间",
  58. },
  59. {
  60. Name: stringx.From("updateTime"),
  61. DataType: "time.Time",
  62. Comment: "更新时间",
  63. },
  64. },
  65. })
  66. t.Run("primaryCacheKey", func(t *testing.T) {
  67. assert.Equal(t, true, func() bool {
  68. return cacheKeyEqual(primariCacheKey, Key{
  69. VarLeft: "cacheUserIdPrefix",
  70. VarRight: `"cache:user:id:"`,
  71. VarExpression: `cacheUserIdPrefix = "cache:user:id:"`,
  72. KeyLeft: "userIdKey",
  73. KeyRight: `fmt.Sprintf("%s%v", cacheUserIdPrefix, id)`,
  74. DataKeyRight: `fmt.Sprintf("%s%v", cacheUserIdPrefix, data.Id)`,
  75. KeyExpression: `userIdKey := fmt.Sprintf("%s%v", cacheUserIdPrefix, id)`,
  76. DataKeyExpression: `userIdKey := fmt.Sprintf("%s%v", cacheUserIdPrefix, data.Id)`,
  77. FieldNameJoin: []string{"id"},
  78. })
  79. }())
  80. })
  81. t.Run("uniqueCacheKey", func(t *testing.T) {
  82. assert.Equal(t, true, func() bool {
  83. expected := []Key{
  84. {
  85. VarLeft: "cacheUserClassNamePrefix",
  86. VarRight: `"cache:user:class:name:"`,
  87. VarExpression: `cacheUserClassNamePrefix = "cache:user:class:name:"`,
  88. KeyLeft: "userClassNameKey",
  89. KeyRight: `fmt.Sprintf("%s%v:%v", cacheUserClassNamePrefix, class, name)`,
  90. DataKeyRight: `fmt.Sprintf("%s%v:%v", cacheUserClassNamePrefix, data.Class, data.Name)`,
  91. KeyExpression: `userClassNameKey := fmt.Sprintf("%s%v:%v", cacheUserClassNamePrefix, class, name)`,
  92. DataKeyExpression: `userClassNameKey := fmt.Sprintf("%s%v:%v", cacheUserClassNamePrefix, data.Class, data.Name)`,
  93. FieldNameJoin: []string{"class", "name"},
  94. },
  95. {
  96. VarLeft: "cacheUserMobilePrefix",
  97. VarRight: `"cache:user:mobile:"`,
  98. VarExpression: `cacheUserMobilePrefix = "cache:user:mobile:"`,
  99. KeyLeft: "userMobileKey",
  100. KeyRight: `fmt.Sprintf("%s%v", cacheUserMobilePrefix, mobile)`,
  101. DataKeyRight: `fmt.Sprintf("%s%v", cacheUserMobilePrefix, data.Mobile)`,
  102. KeyExpression: `userMobileKey := fmt.Sprintf("%s%v", cacheUserMobilePrefix, mobile)`,
  103. DataKeyExpression: `userMobileKey := fmt.Sprintf("%s%v", cacheUserMobilePrefix, data.Mobile)`,
  104. FieldNameJoin: []string{"mobile"},
  105. },
  106. }
  107. sort.Slice(uniqueCacheKey, func(i, j int) bool {
  108. return uniqueCacheKey[i].VarLeft < uniqueCacheKey[j].VarLeft
  109. })
  110. if len(expected) != len(uniqueCacheKey) {
  111. return false
  112. }
  113. for index, each := range uniqueCacheKey {
  114. expecting := expected[index]
  115. if !cacheKeyEqual(expecting, each) {
  116. return false
  117. }
  118. }
  119. return true
  120. }())
  121. })
  122. }
  123. func cacheKeyEqual(k1, k2 Key) bool {
  124. k1Join := k1.FieldNameJoin
  125. k2Join := k2.FieldNameJoin
  126. sort.Strings(k1Join)
  127. sort.Strings(k2Join)
  128. if len(k1Join) != len(k2Join) {
  129. return false
  130. }
  131. for index, each := range k1Join {
  132. k2Item := k2Join[index]
  133. if each != k2Item {
  134. return false
  135. }
  136. }
  137. return k1.VarLeft == k2.VarLeft &&
  138. k1.VarRight == k2.VarRight &&
  139. k1.VarExpression == k2.VarExpression &&
  140. k1.KeyLeft == k2.KeyLeft &&
  141. k1.KeyRight == k2.KeyRight &&
  142. k1.DataKeyRight == k2.DataKeyRight &&
  143. k1.DataKeyExpression == k2.DataKeyExpression &&
  144. k1.KeyExpression == k2.KeyExpression
  145. }