1 Star 0 Fork 0

h79/goutils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
group.go 1.68 KB
一键复制 编辑 原始数据 按行查看 历史
package wrapper
import (
"gitee.com/h79/goutils/dao/option"
"strings"
)
type GroupBy []Column
var _ IBuilder = (*GroupBy)(nil)
func (g *GroupBy) Is() bool {
return len(*g) > 0
}
func (g *GroupBy) Build(opts ...option.Option) string {
var ii = 0
var max = 6
var full = true
var convert option.SqlColumnConvertFunc
option.Filter(func(opt option.Option) bool {
if opt.Type() == option.TypeMaxColumn {
max = int(opt.Value().(option.MaxColumn))
ii++
} else if opt.Type() == option.TypeFullSql {
full = bool(opt.Value().(option.FullSql))
ii++
} else if opt.Type() == option.TypeSqlColumnConvert {
convert = opt.Value().(option.SqlColumnConvertFunc)
ii++
}
return ii == 3
}, opts...)
return g.buildOpt(full, convert, max)
}
func (g *GroupBy) Check(filters []FField, opts ...option.Option) {
length := len(*g)
max := option.MaxColumnExist(opts...)
if length > max { //防止多
length = max
}
cols := (*g)[:length]
for i := range cols {
cols[i].Check(filters)
}
}
func (g *GroupBy) buildOpt(full bool, convert option.SqlColumnConvertFunc, max int) string {
count := 0
builder := strings.Builder{}
expr := false
cc := false
for i := range *g {
if count >= max {
//后面不要接入
break
}
if count == 0 {
if full {
builder.WriteString(" GROUP BY ")
}
} else if count > 0 {
builder.WriteByte(',')
}
expr = (*g)[i].Expr != ""
if (*g)[i].Column != "" {
if convert != nil {
cc = SqlColumn(&builder, convert((*g)[i].Column))
} else {
cc = SqlColumn(&builder, (*g)[i].Column)
}
if expr && cc {
builder.WriteByte(' ')
}
}
if expr {
builder.WriteString((*g)[i].Expr)
}
count++
}
return builder.String()
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/h79/goutils.git
git@gitee.com:h79/goutils.git
h79
goutils
goutils
v1.8.71

搜索帮助