Files
contracts/base/query_field.go
T
2026-05-15 09:04:12 +08:00

125 lines
2.4 KiB
Go

package base
import (
"reflect"
"strings"
"unicode"
"git.fsdpf.net/go/db"
"git.fsdpf.net/go/req"
)
type QueryField struct {
ResField
typ req.RouteParamType `db:"dataType"`
alias string `db:"alias"`
isExpr bool `db:"isExpr"`
isOmitempty bool
ignored bool
}
func (this QueryField) Alias() string {
return this.alias
}
func (this QueryField) Ignored() bool {
return this.ignored
}
func (this QueryField) IsExpr() bool {
return this.isExpr
}
func (this QueryField) IsOmitempty() bool {
return this.isOmitempty
}
func (this QueryField) Type() req.RouteParamType {
return this.typ
}
func (this *QueryField) SetOptions(options byte) req.QueryField {
if options&req.IsExpr != 0 {
this.isExpr = true
}
if options&req.IsOmitempty != 0 {
this.isOmitempty = true
}
if options&req.Ignored != 0 {
this.ignored = true
}
return this
}
func (this QueryField) GetCodeOrAlias() string {
if this.Alias() != "" {
return this.Alias()
}
return this.Code
}
func (this *QueryField) ToSql() db.Expression {
if this.Alias() != "" {
if this.IsExpr() {
if this.GetCode() == "" {
return db.V(nil).As(this.Alias())
}
return db.L(this.GetCode()).As(this.Alias())
}
return db.T(this.GetCodeResource()).Col(this.GetCode()).As(this.Alias())
}
return db.T(this.GetCodeResource()).Col(this.GetCode())
}
func (this *QueryField) ToStructField(tags ...string) reflect.StructField {
var typ reflect.Type
fCode := this.GetCodeOrAlias()
// 字段规则
if !unicode.IsLetter(rune(fCode[0])) {
panic("struct field name invalid. " + fCode)
}
fTag := `db:"` + fCode
if this.ignored {
fTag = fTag + `" json:"-"`
} else if this.isOmitempty {
fTag = fTag + `" json:"` + fCode + `,omitempty"`
} else {
fTag = fTag + `" json:"` + fCode + `"`
}
if len(tags) > 0 {
fTag = strings.Join(tags, " ") + " " + fTag
}
switch this.typ {
case req.ReqString:
typ = reflect.TypeOf(string(""))
case req.ReqNumber:
typ = reflect.TypeOf(float64(0))
case req.ReqInteger:
typ = reflect.TypeOf(int64(0))
case req.ReqFloat:
typ = reflect.TypeOf(float64(0))
case req.ReqBool:
typ = reflect.TypeOf(true)
case req.ReqArray:
typ = reflect.TypeOf([]any{})
case req.ReqJson:
typ = reflect.TypeOf(map[string]any{})
}
return reflect.StructField{
Name: strings.ToUpper(fCode[:1]) + fCode[1:],
Tag: reflect.StructTag(fTag),
Type: typ,
}
}