condition.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package search
  2. import "strings"
  3. type Condition interface {
  4. SetWhere(k string, v []interface{})
  5. SetOr(k string, v []interface{})
  6. SetOrder(k string)
  7. SetJoinOn(t, on string) Condition
  8. }
  9. type GormCondition struct {
  10. GormPublic
  11. Join []*GormJoin
  12. }
  13. type GormPublic struct {
  14. Where map[string][]interface{}
  15. Order []string
  16. Or map[string][]interface{}
  17. }
  18. type GormJoin struct {
  19. Type string
  20. JoinOn string
  21. GormPublic
  22. }
  23. func (e *GormJoin) SetJoinOn(t, on string) Condition {
  24. return nil
  25. }
  26. func (e *GormPublic) SetWhere(k string, v []interface{}) {
  27. if e.Where == nil {
  28. e.Where = make(map[string][]interface{})
  29. }
  30. e.Where[k] = v
  31. }
  32. func (e *GormPublic) SetOr(k string, v []interface{}) {
  33. if e.Or == nil {
  34. e.Or = make(map[string][]interface{})
  35. }
  36. e.Or[k] = v
  37. }
  38. func (e *GormPublic) SetOrder(k string) {
  39. if e.Order == nil {
  40. e.Order = make([]string, 0)
  41. }
  42. e.Order = append(e.Order, k)
  43. }
  44. func (e *GormCondition) SetJoinOn(t, on string) Condition {
  45. if e.Join == nil {
  46. e.Join = make([]*GormJoin, 0)
  47. }
  48. join := &GormJoin{
  49. Type: t,
  50. JoinOn: on,
  51. GormPublic: GormPublic{},
  52. }
  53. e.Join = append(e.Join, join)
  54. return join
  55. }
  56. type resolveSearchTag struct {
  57. Type string
  58. Column string
  59. Table string
  60. On []string
  61. Join string
  62. }
  63. // makeTag 解析search的tag标签
  64. func makeTag(tag string) *resolveSearchTag {
  65. r := &resolveSearchTag{}
  66. tags := strings.Split(tag, ";")
  67. var ts []string
  68. for _, t := range tags {
  69. ts = strings.Split(t, ":")
  70. if len(ts) == 0 {
  71. continue
  72. }
  73. switch ts[0] {
  74. case "type":
  75. if len(ts) > 1 {
  76. r.Type = ts[1]
  77. }
  78. case "column":
  79. if len(ts) > 1 {
  80. r.Column = ts[1]
  81. }
  82. case "table":
  83. if len(ts) > 1 {
  84. r.Table = ts[1]
  85. }
  86. case "on":
  87. if len(ts) > 1 {
  88. r.On = ts[1:]
  89. }
  90. case "join":
  91. if len(ts) > 1 {
  92. r.Join = ts[1]
  93. }
  94. }
  95. }
  96. return r
  97. }