gosora/query_gen/micro_builders.go
Azareal ac0dd6d2cb The login and registration logs are pruned after a year now.
Add filter exclusions for the user agents analytics pane.
Shorten some of the variable names in qgen.

Add ComplexDelete to the query adapter.
Add DateCutoff and DateOlderThan to accDeleteBuilder.
2019-06-05 14:57:10 +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 (build *prebuilder) Select(nlist ...string) *selectPrebuilder {
name := optString(nlist, "")
return &selectPrebuilder{name, "", "", "", "", "", nil, nil, "", build.adapter}
}
func (build *prebuilder) Count(nlist ...string) *selectPrebuilder {
name := optString(nlist, "")
return &selectPrebuilder{name, "", "COUNT(*)", "", "", "", nil, nil, "", build.adapter}
}
func (build *prebuilder) Insert(nlist ...string) *insertPrebuilder {
name := optString(nlist, "")
return &insertPrebuilder{name, "", "", "", build.adapter}
}
func (build *prebuilder) Update(nlist ...string) *updatePrebuilder {
name := optString(nlist, "")
return &updatePrebuilder{name, "", "", "", nil, nil, build.adapter}
}
func (build *prebuilder) Delete(nlist ...string) *deletePrebuilder {
name := optString(nlist, "")
return &deletePrebuilder{name, "", "", nil, build.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]
}