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
 | |
| }
 |