gitee.com/h79/goutils@v1.22.10/dao/wrapper/group.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 type GroupBy []Column 10 11 var _ IBuilder = (*GroupBy)(nil) 12 13 func (g *GroupBy) Is() bool { 14 return len(*g) > 0 15 } 16 17 func (g *GroupBy) Build(opts ...commonoption.Option) string { 18 var ii = 0 19 var m = 6 20 var full = true 21 var convert option.ColumnConvertFunc 22 commonoption.Filter(func(opt commonoption.Option) bool { 23 if opt.Type() == option.TypeMaxColumn { 24 m = opt.Value().(int) 25 ii++ 26 } else if opt.Type() == option.TypeFullSql { 27 full = opt.Value().(bool) 28 ii++ 29 } else if opt.Type() == option.TypeSqlColumnConvert { 30 convert = opt.Value().(option.ColumnConvertFunc) 31 ii++ 32 } 33 return ii == 3 34 }, opts...) 35 return g.buildOpt(full, convert, m) 36 } 37 38 func (g *GroupBy) Check(filters []FField, opts ...commonoption.Option) { 39 length := len(*g) 40 m := option.MaxColumnExist(opts...) 41 if length > m { //防止多 42 length = m 43 } 44 cols := (*g)[:length] 45 for i := range cols { 46 cols[i].Check(filters) 47 } 48 } 49 50 func (g *GroupBy) buildOpt(full bool, convert option.ColumnConvertFunc, max int) string { 51 count := 0 52 builder := strings.Builder{} 53 expr := false 54 cc := false 55 for i := range *g { 56 if count >= max { 57 //后面不要接入 58 break 59 } 60 if count == 0 { 61 if full { 62 builder.WriteString(" GROUP BY ") 63 } 64 } else if count > 0 { 65 builder.WriteByte(',') 66 } 67 expr = (*g)[i].Expr != "" 68 if (*g)[i].Column != "" { 69 if convert != nil { 70 cc = SqlColumn(&builder, convert((*g)[i].Column)) 71 } else { 72 cc = SqlColumn(&builder, (*g)[i].Column) 73 } 74 if expr && cc { 75 builder.WriteByte(' ') 76 } 77 } 78 if expr { 79 builder.WriteString((*g)[i].Expr) 80 } 81 count++ 82 } 83 return builder.String() 84 }