1 Star 0 Fork 0

h79/goutils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
column.go 3.19 KB
一键复制 编辑 原始数据 按行查看 历史
package wrapper
import (
"gitee.com/h79/goutils/dao/option"
"regexp"
"strings"
)
var nameRegex = regexp.MustCompile("^([a-zA-Z])[a-zA-Z0-9_.]+")
func MustName(name string) string {
if nameRegex.MatchString(name) {
return name
}
return ""
}
func SqlColumn(builder *strings.Builder, column string) bool {
before, after, ok := strings.Cut(column, ".")
if AddQuoted(builder, MustName(before)) {
if ok && after != "" {
if after = MustName(after); after != "" {
builder.WriteByte('.')
AddQuoted(builder, after)
}
}
return true
}
return false
}
func ParseColumn(column string) TableColumn {
var t = strings.Split(column, ".")
switch len(t) {
case 1:
return TableColumn{Col: t[0]}
case 2:
return TableColumn{Name: t[0], Col: t[1]}
}
return TableColumn{}
}
type TableColumn struct {
Name string `form:"name" json:"name"` //表名
Col string `form:"col" json:"col"` //项
}
func (t *TableColumn) Column() string {
var builder = strings.Builder{}
if AddQuoted(&builder, MustName(t.Name)) {
builder.WriteByte('.')
}
AddQuoted(&builder, MustName(t.Col))
return builder.String()
}
type FField string
func (ff FField) Equal(des FField) bool {
return ff == des
}
type Flag struct {
FInt int `form:"flag" json:"flag" yaml:"flag"`
}
type Column struct {
Flag //是否函数
Column string `form:"col" json:"col" yaml:"col"` //项
As string `form:"as" json:"as" yaml:"as"` // 别名
Expr string `form:"expr" json:"expr" yaml:"expr"`
Desc bool `form:"desc" json:"desc" yaml:"desc"` //(降序(大=>小)desc, 升序(小=>大)asc
}
func WithColumn(column string) *Column {
return &Column{
Column: column,
}
}
func WithColumns(cols []string) *Column {
c := &Column{}
c.SetColumn(cols)
return c
}
func (col *Column) GetColumn(opts ...option.Option) []string {
return strings.SplitN(col.Column, ",", option.MaxColumnExist(opts...))
}
func (col *Column) SetColumn(cols []string) {
if len(cols) <= 0 {
col.Column = ""
return
}
col.Column = strings.Join(cols, ",")
}
func (col *Column) With(column string) *Column {
col.Column = column
return col
}
func (col *Column) AS(as string) *Column {
col.As = as
return col
}
func (col *Column) WithFunc(fg int) *Column {
col.FInt = fg
return col
}
func (col *Column) Check(filters []FField) *Column {
var (
filter = func(col string) bool {
for i := range filters {
if filters[i].Equal(FField(col)) {
return true
}
}
return false
}
newCol []string
)
cols := col.GetColumn()
for i := range cols {
if filter(cols[i]) {
newCol = append(newCol, cols[i])
}
}
col.SetColumn(newCol)
return col
}
func (col *Column) Build(convert option.SqlColumnConvertFunc) string {
builder := strings.Builder{}
if col.Expr != "" {
builder.WriteString(col.Expr)
} else {
fn := SQLFunc(col.FInt)
if len(fn) > 0 {
builder.WriteString(fn)
builder.WriteByte('(')
if convert != nil {
builder.WriteString(convert(col.Column))
} else {
builder.WriteString(col.Column)
}
builder.WriteByte(')')
} else if convert != nil {
AddQuoted(&builder, convert(col.Column))
} else {
AddQuoted(&builder, col.Column)
}
}
AddAlias(&builder, col.As)
return builder.String()
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/h79/goutils.git
git@gitee.com:h79/goutils.git
h79
goutils
goutils
v1.8.96

搜索帮助

23e8dbc6 1850385 7e0993f3 1850385