9 whereConditions []map[string]interface{}
10 orConditions []map[string]interface{}
11 notConditions []map[string]interface{}
12 havingConditions []map[string]interface{}
13 joinConditions []map[string]interface{}
14 initAttrs []interface{}
15 assignAttrs []interface{}
16 selects map[string]interface{}
19 preload []searchPreload
29 type searchPreload struct {
31 conditions []interface{}
34 func (s *search) clone() *search {
39 func (s *search) Where(query interface{}, values ...interface{}) *search {
40 s.whereConditions = append(s.whereConditions, map[string]interface{}{"query": query, "args": values})
44 func (s *search) Not(query interface{}, values ...interface{}) *search {
45 s.notConditions = append(s.notConditions, map[string]interface{}{"query": query, "args": values})
49 func (s *search) Or(query interface{}, values ...interface{}) *search {
50 s.orConditions = append(s.orConditions, map[string]interface{}{"query": query, "args": values})
54 func (s *search) Attrs(attrs ...interface{}) *search {
55 s.initAttrs = append(s.initAttrs, toSearchableMap(attrs...))
59 func (s *search) Assign(attrs ...interface{}) *search {
60 s.assignAttrs = append(s.assignAttrs, toSearchableMap(attrs...))
64 func (s *search) Order(value interface{}, reorder ...bool) *search {
65 if len(reorder) > 0 && reorder[0] {
66 s.orders = []interface{}{}
69 if value != nil && value != "" {
70 s.orders = append(s.orders, value)
75 func (s *search) Select(query interface{}, args ...interface{}) *search {
76 s.selects = map[string]interface{}{"query": query, "args": args}
80 func (s *search) Omit(columns ...string) *search {
85 func (s *search) Limit(limit interface{}) *search {
90 func (s *search) Offset(offset interface{}) *search {
95 func (s *search) Group(query string) *search {
96 s.group = s.getInterfaceAsSQL(query)
100 func (s *search) Having(query interface{}, values ...interface{}) *search {
101 if val, ok := query.(*expr); ok {
102 s.havingConditions = append(s.havingConditions, map[string]interface{}{"query": val.expr, "args": val.args})
104 s.havingConditions = append(s.havingConditions, map[string]interface{}{"query": query, "args": values})
109 func (s *search) Joins(query string, values ...interface{}) *search {
110 s.joinConditions = append(s.joinConditions, map[string]interface{}{"query": query, "args": values})
114 func (s *search) Preload(schema string, values ...interface{}) *search {
115 var preloads []searchPreload
116 for _, preload := range s.preload {
117 if preload.schema != schema {
118 preloads = append(preloads, preload)
121 preloads = append(preloads, searchPreload{schema, values})
126 func (s *search) Raw(b bool) *search {
131 func (s *search) unscoped() *search {
136 func (s *search) Table(name string) *search {
141 func (s *search) getInterfaceAsSQL(value interface{}) (str string) {
142 switch value.(type) {
143 case string, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:
144 str = fmt.Sprintf("%v", value)
146 s.db.AddError(ErrInvalidSQL)