gosora/query_gen/micro_builders.go
Azareal 033f4624c8 Experiment with the accumulator.
Less boilerplate.
2019-10-29 11:58:04 +10:00

284 lines
6.3 KiB
Go

package qgen
type dateCutoff struct {
Column string
Quantity int
Unit string
Type int
}
type prebuilder struct {
adapter Adapter
}
func (b *prebuilder) Select(nlist ...string) *selectPrebuilder {
name := optString(nlist, "")
return &selectPrebuilder{name, "", "", "", "", "", nil, nil, "", b.adapter}
}
func (b *prebuilder) Count(nlist ...string) *selectPrebuilder {
name := optString(nlist, "")
return &selectPrebuilder{name, "", "COUNT(*)", "", "", "", nil, nil, "", b.adapter}
}
func (b *prebuilder) Insert(nlist ...string) *insertPrebuilder {
name := optString(nlist, "")
return &insertPrebuilder{name, "", "", "", b.adapter}
}
func (b *prebuilder) Update(nlist ...string) *updatePrebuilder {
name := optString(nlist, "")
return &updatePrebuilder{name, "", "", "", nil, nil, b.adapter}
}
func (b *prebuilder) Delete(nlist ...string) *deletePrebuilder {
name := optString(nlist, "")
return &deletePrebuilder{name, "", "", nil, b.adapter}
}
type deletePrebuilder struct {
name string
table string
where string
dateCutoff *dateCutoff
build Adapter
}
func (b *deletePrebuilder) Table(table string) *deletePrebuilder {
b.table = table
return b
}
func (b *deletePrebuilder) Where(where string) *deletePrebuilder {
if b.where != "" {
b.where += " AND "
}
b.where += where
return b
}
// TODO: We probably want to avoid the double allocation of two builders somehow
func (b *deletePrebuilder) FromAcc(acc *accDeleteBuilder) *deletePrebuilder {
b.table = acc.table
b.where = acc.where
b.dateCutoff = acc.dateCutoff
return b
}
func (b *deletePrebuilder) Text() (string, error) {
return b.build.SimpleDelete(b.name, b.table, b.where)
}
func (b *deletePrebuilder) Parse() {
b.build.SimpleDelete(b.name, b.table, b.where)
}
type updatePrebuilder struct {
name string
table string
set string
where string
dateCutoff *dateCutoff // We might want to do this in a slightly less hacky way
whereSubQuery *selectPrebuilder
build Adapter
}
func qUpdate(table string, set string, where string) *updatePrebuilder {
return &updatePrebuilder{table: table, set: set, where: where}
}
func (b *updatePrebuilder) Table(table string) *updatePrebuilder {
b.table = table
return b
}
func (b *updatePrebuilder) Set(set string) *updatePrebuilder {
b.set = set
return b
}
func (b *updatePrebuilder) Where(where string) *updatePrebuilder {
if b.where != "" {
b.where += " AND "
}
b.where += where
return b
}
func (b *updatePrebuilder) WhereQ(sel *selectPrebuilder) *updatePrebuilder {
b.whereSubQuery = sel
return b
}
func (b *updatePrebuilder) Text() (string, error) {
return b.build.SimpleUpdate(b)
}
func (b *updatePrebuilder) Parse() {
b.build.SimpleUpdate(b)
}
type selectPrebuilder struct {
name string
table string
columns string
where string
orderby string
limit string
dateCutoff *dateCutoff
inChain *selectPrebuilder
inColumn string // for inChain
build Adapter
}
func (b *selectPrebuilder) Table(table string) *selectPrebuilder {
b.table = table
return b
}
func (b *selectPrebuilder) Columns(columns string) *selectPrebuilder {
b.columns = columns
return b
}
func (b *selectPrebuilder) Where(where string) *selectPrebuilder {
if b.where != "" {
b.where += " AND "
}
b.where += where
return b
}
func (b *selectPrebuilder) InQ(subBuilder *selectPrebuilder) *selectPrebuilder {
b.inChain = subBuilder
return b
}
func (b *selectPrebuilder) Orderby(orderby string) *selectPrebuilder {
b.orderby = orderby
return b
}
func (b *selectPrebuilder) Limit(limit string) *selectPrebuilder {
b.limit = limit
return b
}
// TODO: We probably want to avoid the double allocation of two builders somehow
func (b *selectPrebuilder) FromAcc(acc *AccSelectBuilder) *selectPrebuilder {
b.table = acc.table
if acc.columns != "" {
b.columns = acc.columns
}
b.where = acc.where
b.orderby = acc.orderby
b.limit = acc.limit
b.dateCutoff = acc.dateCutoff
if acc.inChain != nil {
b.inChain = &selectPrebuilder{"", acc.inChain.table, acc.inChain.columns, acc.inChain.where, acc.inChain.orderby, acc.inChain.limit, acc.inChain.dateCutoff, nil, "", b.build}
b.inColumn = acc.inColumn
}
return b
}
func (b *selectPrebuilder) FromCountAcc(acc *accCountBuilder) *selectPrebuilder {
b.table = acc.table
b.where = acc.where
b.limit = acc.limit
b.dateCutoff = acc.dateCutoff
if acc.inChain != nil {
b.inChain = &selectPrebuilder{"", acc.inChain.table, acc.inChain.columns, acc.inChain.where, acc.inChain.orderby, acc.inChain.limit, acc.inChain.dateCutoff, nil, "", b.build}
b.inColumn = acc.inColumn
}
return b
}
// TODO: Add support for dateCutoff
func (b *selectPrebuilder) Text() (string, error) {
return b.build.SimpleSelect(b.name, b.table, b.columns, b.where, b.orderby, b.limit)
}
// TODO: Add support for dateCutoff
func (b *selectPrebuilder) Parse() {
b.build.SimpleSelect(b.name, b.table, b.columns, b.where, b.orderby, b.limit)
}
type insertPrebuilder struct {
name string
table string
columns string
fields string
build Adapter
}
func (b *insertPrebuilder) Table(table string) *insertPrebuilder {
b.table = table
return b
}
func (b *insertPrebuilder) Columns(columns string) *insertPrebuilder {
b.columns = columns
return b
}
func (b *insertPrebuilder) Fields(fields string) *insertPrebuilder {
b.fields = fields
return b
}
func (b *insertPrebuilder) Text() (string, error) {
return b.build.SimpleInsert(b.name, b.table, b.columns, b.fields)
}
func (b *insertPrebuilder) Parse() {
b.build.SimpleInsert(b.name, b.table, b.columns, b.fields)
}
/*type countPrebuilder struct {
name string
table string
where string
limit string
build Adapter
}
func (b *countPrebuilder) Table(table string) *countPrebuilder {
b.table = table
return b
}
func b *countPrebuilder) Where(where string) *countPrebuilder {
if b.where != "" {
b.where += " AND "
}
b.where += where
return b
}
func (b *countPrebuilder) Limit(limit string) *countPrebuilder {
b.limit = limit
return b
}
func (b *countPrebuilder) Text() (string, error) {
return b.build.SimpleCount(b.name, b.table, b.where, b.limit)
}
func (b *countPrebuilder) Parse() {
b.build.SimpleCount(b.name, b.table, b.where, b.limit)
}*/
func optString(nlist []string, defaultStr string) string {
if len(nlist) == 0 {
return defaultStr
}
return nlist[0]
}