search.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package gorm
  2. import (
  3. "context"
  4. "fmt"
  5. )
  6. type search struct {
  7. db *DB
  8. whereConditions []map[string]interface{}
  9. orConditions []map[string]interface{}
  10. notConditions []map[string]interface{}
  11. havingConditions []map[string]interface{}
  12. joinConditions []map[string]interface{}
  13. initAttrs []interface{}
  14. assignAttrs []interface{}
  15. selects map[string]interface{}
  16. omits []string
  17. orders []interface{}
  18. preload []searchPreload
  19. offset interface{}
  20. limit interface{}
  21. group string
  22. tableName string
  23. raw bool
  24. Unscoped bool
  25. ignoreOrderQuery bool
  26. ctx context.Context
  27. }
  28. type searchPreload struct {
  29. schema string
  30. conditions []interface{}
  31. }
  32. func (s *search) clone() *search {
  33. clone := *s
  34. return &clone
  35. }
  36. func (s *search) Where(query interface{}, values ...interface{}) *search {
  37. s.whereConditions = append(s.whereConditions, map[string]interface{}{"query": query, "args": values})
  38. return s
  39. }
  40. func (s *search) Not(query interface{}, values ...interface{}) *search {
  41. s.notConditions = append(s.notConditions, map[string]interface{}{"query": query, "args": values})
  42. return s
  43. }
  44. func (s *search) Or(query interface{}, values ...interface{}) *search {
  45. s.orConditions = append(s.orConditions, map[string]interface{}{"query": query, "args": values})
  46. return s
  47. }
  48. func (s *search) Attrs(attrs ...interface{}) *search {
  49. s.initAttrs = append(s.initAttrs, toSearchableMap(attrs...))
  50. return s
  51. }
  52. func (s *search) Assign(attrs ...interface{}) *search {
  53. s.assignAttrs = append(s.assignAttrs, toSearchableMap(attrs...))
  54. return s
  55. }
  56. func (s *search) Order(value interface{}, reorder ...bool) *search {
  57. if len(reorder) > 0 && reorder[0] {
  58. s.orders = []interface{}{}
  59. }
  60. if value != nil && value != "" {
  61. s.orders = append(s.orders, value)
  62. }
  63. return s
  64. }
  65. func (s *search) Select(query interface{}, args ...interface{}) *search {
  66. s.selects = map[string]interface{}{"query": query, "args": args}
  67. return s
  68. }
  69. func (s *search) Omit(columns ...string) *search {
  70. s.omits = columns
  71. return s
  72. }
  73. func (s *search) Limit(limit interface{}) *search {
  74. s.limit = limit
  75. return s
  76. }
  77. func (s *search) Offset(offset interface{}) *search {
  78. s.offset = offset
  79. return s
  80. }
  81. func (s *search) Group(query string) *search {
  82. s.group = s.getInterfaceAsSQL(query)
  83. return s
  84. }
  85. func (s *search) Having(query interface{}, values ...interface{}) *search {
  86. if val, ok := query.(*expr); ok {
  87. s.havingConditions = append(s.havingConditions, map[string]interface{}{"query": val.expr, "args": val.args})
  88. } else {
  89. s.havingConditions = append(s.havingConditions, map[string]interface{}{"query": query, "args": values})
  90. }
  91. return s
  92. }
  93. func (s *search) Joins(query string, values ...interface{}) *search {
  94. s.joinConditions = append(s.joinConditions, map[string]interface{}{"query": query, "args": values})
  95. return s
  96. }
  97. func (s *search) Preload(schema string, values ...interface{}) *search {
  98. var preloads []searchPreload
  99. for _, preload := range s.preload {
  100. if preload.schema != schema {
  101. preloads = append(preloads, preload)
  102. }
  103. }
  104. preloads = append(preloads, searchPreload{schema, values})
  105. s.preload = preloads
  106. return s
  107. }
  108. func (s *search) Raw(b bool) *search {
  109. s.raw = b
  110. return s
  111. }
  112. func (s *search) unscoped() *search {
  113. s.Unscoped = true
  114. return s
  115. }
  116. func (s *search) Table(name string) *search {
  117. s.tableName = name
  118. return s
  119. }
  120. func (s *search) Ctx(ctx context.Context) *search {
  121. s.ctx = ctx
  122. return s
  123. }
  124. func (s *search) GetCtx() context.Context {
  125. return s.ctx
  126. }
  127. func (s *search) getInterfaceAsSQL(value interface{}) (str string) {
  128. switch value.(type) {
  129. case string, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:
  130. str = fmt.Sprintf("%v", value)
  131. default:
  132. s.db.AddError(ErrInvalidSQL)
  133. }
  134. if str == "-1" {
  135. return ""
  136. }
  137. return
  138. }