forked from mirror/gorm
90 lines
1.7 KiB
Go
90 lines
1.7 KiB
Go
package clause
|
|
|
|
// Interface clause interface
|
|
type Interface interface {
|
|
Name() string
|
|
Build(Builder)
|
|
MergeClause(*Clause)
|
|
}
|
|
|
|
// ClauseBuilder clause builder, allows to customize how to build clause
|
|
type ClauseBuilder func(Clause, Builder)
|
|
|
|
type Writer interface {
|
|
WriteByte(byte) error
|
|
WriteString(string) (int, error)
|
|
}
|
|
|
|
// Builder builder interface
|
|
type Builder interface {
|
|
Writer
|
|
WriteQuoted(field interface{})
|
|
AddVar(Writer, ...interface{})
|
|
AddError(error) error
|
|
}
|
|
|
|
// Clause
|
|
type Clause struct {
|
|
Name string // WHERE
|
|
BeforeExpression Expression
|
|
AfterNameExpression Expression
|
|
AfterExpression Expression
|
|
Expression Expression
|
|
Builder ClauseBuilder
|
|
}
|
|
|
|
// Build build clause
|
|
func (c Clause) Build(builder Builder) {
|
|
if c.Builder != nil {
|
|
c.Builder(c, builder)
|
|
} else if c.Expression != nil {
|
|
if c.BeforeExpression != nil {
|
|
c.BeforeExpression.Build(builder)
|
|
builder.WriteByte(' ')
|
|
}
|
|
|
|
if c.Name != "" {
|
|
builder.WriteString(c.Name)
|
|
builder.WriteByte(' ')
|
|
}
|
|
|
|
if c.AfterNameExpression != nil {
|
|
c.AfterNameExpression.Build(builder)
|
|
builder.WriteByte(' ')
|
|
}
|
|
|
|
c.Expression.Build(builder)
|
|
|
|
if c.AfterExpression != nil {
|
|
builder.WriteByte(' ')
|
|
c.AfterExpression.Build(builder)
|
|
}
|
|
}
|
|
}
|
|
|
|
const (
|
|
PrimaryKey string = "~~~py~~~" // primary key
|
|
CurrentTable string = "~~~ct~~~" // current table
|
|
Associations string = "~~~as~~~" // associations
|
|
)
|
|
|
|
var (
|
|
currentTable = Table{Name: CurrentTable}
|
|
PrimaryColumn = Column{Table: CurrentTable, Name: PrimaryKey}
|
|
)
|
|
|
|
// Column quote with name
|
|
type Column struct {
|
|
Table string
|
|
Name string
|
|
Alias string
|
|
Raw bool
|
|
}
|
|
|
|
// Table quote with name
|
|
type Table struct {
|
|
Name string
|
|
Alias string
|
|
Raw bool
|
|
}
|