gorm/clause/clause.go

83 lines
1.6 KiB
Go
Raw Normal View History

2020-01-29 14:22:44 +03:00
package clause
2020-02-07 18:45:35 +03:00
// Interface clause interface
type Interface interface {
Name() string
Build(Builder)
MergeClause(*Clause)
}
// ClauseBuilder clause builder, allows to custmize how to build clause
type ClauseBuilder interface {
Build(Clause, Builder)
}
// Builder builder interface
type Builder interface {
WriteByte(byte) error
Write(sql ...string) error
WriteQuoted(field interface{}) error
AddVar(vars ...interface{}) string
Quote(field interface{}) string
}
2020-01-30 10:14:48 +03:00
// Clause
type Clause struct {
Name string // WHERE
Priority float64
BeforeExpressions []Expression
AfterNameExpressions []Expression
AfterExpressions []Expression
Expression Expression
Builder ClauseBuilder
}
// Build build clause
func (c Clause) Build(builder Builder) {
if c.Builder != nil {
c.Builder.Build(c, builder)
} else {
builders := c.BeforeExpressions
if c.Name != "" {
2020-02-07 18:45:35 +03:00
builders = append(builders, Expr{SQL: c.Name})
2020-01-30 10:14:48 +03:00
}
builders = append(builders, c.AfterNameExpressions...)
if c.Expression != nil {
builders = append(builders, c.Expression)
}
for idx, expr := range append(builders, c.AfterExpressions...) {
if idx != 0 {
builder.WriteByte(' ')
}
expr.Build(builder)
}
}
2020-01-29 14:22:44 +03:00
}
2020-02-07 18:45:35 +03:00
const (
PrimaryKey string = "@@@priamry_key@@@"
CurrentTable string = "@@@table@@@"
)
2020-01-29 22:03:06 +03:00
2020-02-07 18:45:35 +03:00
var (
currentTable = Table{Name: CurrentTable}
PrimaryColumn = Column{Table: CurrentTable, Name: PrimaryKey}
)
2020-01-29 14:22:44 +03:00
2020-02-07 18:45:35 +03:00
// Column quote with name
type Column struct {
Table string
Name string
Alias string
Raw bool
2020-01-29 14:22:44 +03:00
}
2020-02-07 18:45:35 +03:00
// Table quote with name
type Table struct {
Name string
Alias string
Raw bool
2020-01-29 14:22:44 +03:00
}