2024-08-09 15:00:52 +00:00
|
|
|
package builder
|
2024-08-07 19:16:40 +00:00
|
|
|
|
2024-08-09 19:14:28 +00:00
|
|
|
import "strings"
|
|
|
|
|
2024-08-07 19:16:40 +00:00
|
|
|
type SQLParts struct {
|
2024-08-09 19:14:28 +00:00
|
|
|
Operation string
|
|
|
|
From string
|
|
|
|
FieldsExp string
|
|
|
|
FromExp string
|
|
|
|
HavingExp string
|
|
|
|
FiterExp string
|
|
|
|
JoinExps []string
|
|
|
|
GroupExp string
|
|
|
|
OrderExp string
|
|
|
|
LimitExp string
|
2024-08-07 19:16:40 +00:00
|
|
|
updateExp string
|
|
|
|
upsertExp string
|
|
|
|
}
|
|
|
|
|
|
|
|
type Builder struct {
|
2024-08-09 19:14:28 +00:00
|
|
|
Parts SQLParts
|
|
|
|
TableName string
|
|
|
|
TableAlias string
|
|
|
|
Ctx Context
|
2024-08-07 19:16:40 +00:00
|
|
|
}
|
|
|
|
|
2024-08-09 19:14:28 +00:00
|
|
|
func New(ctx Context) *Builder {
|
|
|
|
return &Builder{
|
|
|
|
Parts: SQLParts{
|
|
|
|
Operation: "SELECT",
|
|
|
|
From: "FROM",
|
|
|
|
},
|
|
|
|
Ctx: ctx,
|
|
|
|
}
|
2024-08-07 19:16:40 +00:00
|
|
|
}
|
|
|
|
|
2024-08-09 19:14:28 +00:00
|
|
|
func (b *Builder) In(table string) *Builder {
|
|
|
|
b.TableName, b.TableAlias = getTableAlias(table)
|
|
|
|
b.Parts.FromExp = table
|
|
|
|
b.Ctx = b.Ctx.New(CtxOpts{
|
|
|
|
"TableName": b.TableName,
|
|
|
|
"TableAlias": b.TableAlias,
|
|
|
|
})
|
2024-08-07 19:16:40 +00:00
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
2024-08-09 19:14:28 +00:00
|
|
|
func (b *Builder) Find(query Find) *Builder {
|
|
|
|
b.Parts.FiterExp = covertFind(
|
|
|
|
b.Ctx,
|
|
|
|
query,
|
|
|
|
)
|
|
|
|
if b.Parts.Operation == "" {
|
|
|
|
b.Parts.Operation = "SELECT"
|
|
|
|
}
|
|
|
|
if b.Parts.HavingExp == "" {
|
|
|
|
b.Parts.HavingExp = "WHERE"
|
|
|
|
}
|
|
|
|
if b.Parts.FieldsExp == "" {
|
|
|
|
b.Parts.FieldsExp = "*"
|
|
|
|
}
|
2024-08-07 19:16:40 +00:00
|
|
|
return b
|
|
|
|
}
|
|
|
|
|
2024-08-09 19:14:28 +00:00
|
|
|
func (b *Builder) Join(joins ...interface{}) *Builder {
|
|
|
|
b.Parts.JoinExps = convertJoin(b.Ctx, joins...)
|
2024-08-07 19:16:40 +00:00
|
|
|
return b
|
|
|
|
}
|
2024-08-09 19:14:28 +00:00
|
|
|
|
|
|
|
func (b *Builder) Sql() string {
|
|
|
|
operation := b.Parts.Operation
|
|
|
|
switch {
|
|
|
|
case operation == "SELECT" || operation == "SELECT DISTINCT":
|
|
|
|
return unspace(strings.Join([]string{
|
|
|
|
b.Parts.Operation,
|
|
|
|
b.Parts.FieldsExp,
|
|
|
|
b.Parts.From,
|
|
|
|
b.Parts.FromExp,
|
|
|
|
strings.Join(
|
|
|
|
b.Parts.JoinExps,
|
|
|
|
" ",
|
|
|
|
),
|
|
|
|
b.Parts.GroupExp,
|
|
|
|
b.Parts.HavingExp,
|
|
|
|
b.Parts.FiterExp,
|
|
|
|
b.Parts.OrderExp,
|
|
|
|
b.Parts.LimitExp,
|
|
|
|
}, " "))
|
|
|
|
default:
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
}
|