gitee.com/h79/goutils@v1.22.10/dao/wrapper/order.go (about) 1 package wrapper 2 3 import ( 4 commonoption "gitee.com/h79/goutils/common/option" 5 "gitee.com/h79/goutils/dao/option" 6 "strings" 7 ) 8 9 const ( 10 kDesc = "DESC" 11 kAsc = "ASC" 12 ) 13 14 var _ IBuilder = (*OrderBy)(nil) 15 16 // OrderBy 排序(降序(大=>小)desc, 升序(小=>大)asc 17 // example: "orderBy:[{"col:"create_at","desc":true}, {"col":"id","desc":false}] 18 // 19 // "orderBy:[{"col:"create_at,id","desc":true}] 20 type OrderBy []Column 21 22 func (ob *OrderBy) Is() bool { 23 return len(*ob) > 0 24 } 25 26 func (ob *OrderBy) Build(opts ...commonoption.Option) string { 27 var ii = 0 28 var m = 6 29 var full = false 30 var convert option.ColumnConvertFunc 31 commonoption.Filter(func(opt commonoption.Option) bool { 32 if opt.Type() == option.TypeMaxColumn { 33 m = opt.Value().(int) 34 ii++ 35 } else if opt.Type() == option.TypeFullSql { 36 full = opt.Value().(bool) 37 ii++ 38 } else if opt.Type() == option.TypeSqlColumnConvert { 39 convert = opt.Value().(option.ColumnConvertFunc) 40 ii++ 41 } 42 return ii == 3 43 }, opts...) 44 return ob.buildOpt(full, convert, m) 45 } 46 47 func (ob *OrderBy) Check(filters []FField, opts ...commonoption.Option) { 48 length := len(*ob) 49 var m = option.MaxColumnExist(opts...) 50 if length > m { //防止多 51 length = m 52 } 53 cols := (*ob)[:length] 54 for i := range cols { 55 cols[i].Check(filters) 56 } 57 } 58 59 func (ob *OrderBy) buildOpt(full bool, convert option.ColumnConvertFunc, max int) string { 60 count := 0 61 builder := strings.Builder{} 62 for i := range *ob { 63 if count >= max { 64 //后面不要接入 65 break 66 } 67 if c := ob.build(&(*ob)[i], convert); len(c) > 0 { 68 if count == 0 { 69 if full { 70 builder.WriteString(" ORDER BY ") 71 } 72 } else if count > 0 { 73 builder.WriteByte(',') 74 } 75 builder.WriteString(c) 76 count++ 77 } 78 } 79 return builder.String() 80 } 81 82 func (ob *OrderBy) build(col *Column, convert option.ColumnConvertFunc) string { 83 var cc = false 84 var builder = strings.Builder{} 85 if convert != nil { 86 cc = SqlColumn(&builder, convert(col.Column)) 87 } else { 88 cc = SqlColumn(&builder, col.Column) 89 } 90 if cc && col.Desc { 91 builder.WriteByte(' ') 92 builder.WriteString(kDesc) 93 } 94 return builder.String() 95 }