48 lines
		
	
	
		
			901 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			901 B
		
	
	
	
		
			Go
		
	
	
	
	
	
package clause
 | 
						|
 | 
						|
type JoinType string
 | 
						|
 | 
						|
const (
 | 
						|
	CrossJoin JoinType = "CROSS"
 | 
						|
	InnerJoin JoinType = "INNER"
 | 
						|
	LeftJoin  JoinType = "LEFT"
 | 
						|
	RightJoin JoinType = "RIGHT"
 | 
						|
)
 | 
						|
 | 
						|
// Join clause for from
 | 
						|
type Join struct {
 | 
						|
	Type       JoinType
 | 
						|
	Table      Table
 | 
						|
	ON         Where
 | 
						|
	Using      []string
 | 
						|
	Expression Expression
 | 
						|
}
 | 
						|
 | 
						|
func (join Join) Build(builder Builder) {
 | 
						|
	if join.Expression != nil {
 | 
						|
		join.Expression.Build(builder)
 | 
						|
	} else {
 | 
						|
		if join.Type != "" {
 | 
						|
			builder.WriteString(string(join.Type))
 | 
						|
			builder.WriteByte(' ')
 | 
						|
		}
 | 
						|
 | 
						|
		builder.WriteString("JOIN ")
 | 
						|
		builder.WriteQuoted(join.Table)
 | 
						|
 | 
						|
		if len(join.ON.Exprs) > 0 {
 | 
						|
			builder.WriteString(" ON ")
 | 
						|
			join.ON.Build(builder)
 | 
						|
		} else if len(join.Using) > 0 {
 | 
						|
			builder.WriteString(" USING (")
 | 
						|
			for idx, c := range join.Using {
 | 
						|
				if idx > 0 {
 | 
						|
					builder.WriteByte(',')
 | 
						|
				}
 | 
						|
				builder.WriteQuoted(c)
 | 
						|
			}
 | 
						|
			builder.WriteByte(')')
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |