MySQL refactor.

This commit is contained in:
go-jet 2019-08-11 12:13:59 +02:00
parent 8519ccbdd0
commit 4fbf576370
36 changed files with 1080 additions and 270 deletions

View file

@ -25,7 +25,7 @@ func (s *ClauseSelect) projections() []Projection {
}
func (s *ClauseSelect) Serialize(statementType StatementType, out *SqlBuilder) error {
out.newLine()
out.NewLine()
out.WriteString("SELECT")
if s.Distinct {
@ -74,7 +74,7 @@ func (c *ClauseGroupBy) Serialize(statementType StatementType, out *SqlBuilder)
return nil
}
out.newLine()
out.NewLine()
out.WriteString("GROUP BY")
out.increaseIdent()
@ -114,7 +114,7 @@ type ClauseLimit struct {
func (l *ClauseLimit) Serialize(statementType StatementType, out *SqlBuilder) error {
if l.Count >= 0 {
out.newLine()
out.NewLine()
out.WriteString("LIMIT")
out.insertParametrizedArgument(l.Count)
}
@ -128,7 +128,7 @@ type ClauseOffset struct {
func (o *ClauseOffset) Serialize(statementType StatementType, out *SqlBuilder) error {
if o.Count >= 0 {
out.newLine()
out.NewLine()
out.WriteString("OFFSET")
out.insertParametrizedArgument(o.Count)
}
@ -145,7 +145,7 @@ func (f *ClauseFor) Serialize(statementType StatementType, out *SqlBuilder) erro
return nil
}
out.newLine()
out.NewLine()
out.WriteString("FOR")
return f.Lock.serialize(statementType, out)
}
@ -179,20 +179,20 @@ func (s *ClauseSetStmtOperator) Serialize(statementType StatementType, out *SqlB
//}
if wrap {
out.newLine()
out.NewLine()
out.WriteString("(")
out.increaseIdent()
}
for i, selectStmt := range s.Selects {
out.newLine()
out.NewLine()
if i > 0 {
out.WriteString(s.Operator)
if s.All {
out.WriteString("ALL")
}
out.newLine()
out.NewLine()
}
if selectStmt == nil {
@ -208,7 +208,7 @@ func (s *ClauseSetStmtOperator) Serialize(statementType StatementType, out *SqlB
if wrap {
out.decreaseIdent()
out.newLine()
out.NewLine()
out.WriteString(")")
}
@ -238,7 +238,7 @@ type ClauseUpdate struct {
}
func (u *ClauseUpdate) Serialize(statementType StatementType, out *SqlBuilder) error {
out.newLine()
out.NewLine()
out.WriteString("UPDATE")
if utils.IsNil(u.Table) {
@ -258,42 +258,33 @@ type ClauseSet struct {
}
func (s *ClauseSet) Serialize(statementType StatementType, out *SqlBuilder) error {
out.newLine()
out.NewLine()
out.WriteString("SET")
if len(s.Columns) == 0 {
return errors.New("jet: no columns selected")
if len(s.Columns) != len(s.Values) {
return errors.New("jet: mismatch in numers of columns and values")
}
if len(s.Columns) > 1 {
out.WriteString("(")
}
err := SerializeColumnNames(s.Columns, out)
if err != nil {
return err
}
if len(s.Columns) > 1 {
out.WriteString(")")
}
out.WriteString("=")
if len(s.Values) > 1 {
out.WriteString("(")
}
err = SerializeClauseList(statementType, s.Values, out)
if err != nil {
return err
}
if len(s.Values) > 1 {
out.WriteString(")")
out.increaseIdent(4)
for i, column := range s.Columns {
if i > 0 {
out.WriteString(", ")
out.NewLine()
}
if column == nil {
return errors.New("jet: nil column in columns list")
}
out.WriteString(column.Name())
out.WriteString(" = ")
if err := Serialize(s.Values[i], UpdateStatementType, out); err != nil {
return err
}
}
out.decreaseIdent(4)
return nil
}
@ -312,7 +303,7 @@ type ClauseInsert struct {
}
func (i *ClauseInsert) Serialize(statementType StatementType, out *SqlBuilder) error {
out.newLine()
out.NewLine()
out.WriteString("INSERT INTO")
if utils.IsNil(i.Table) {
@ -357,7 +348,7 @@ func (v *ClauseValues) Serialize(statementType StatementType, out *SqlBuilder) e
}
out.increaseIdent()
out.newLine()
out.NewLine()
out.WriteString("(")
err := SerializeClauseList(statementType, row, out)
@ -389,7 +380,7 @@ type ClauseDelete struct {
}
func (d *ClauseDelete) Serialize(statementType StatementType, out *SqlBuilder) error {
out.newLine()
out.NewLine()
out.WriteString("DELETE FROM")
if d.Table == nil {
@ -409,7 +400,7 @@ type ClauseStatementBegin struct {
}
func (d *ClauseStatementBegin) Serialize(statementType StatementType, out *SqlBuilder) error {
out.newLine()
out.NewLine()
out.WriteString(d.Name)
for i, table := range d.Tables {
@ -433,7 +424,7 @@ type ClauseString struct {
}
func (d *ClauseString) Serialize(statementType StatementType, out *SqlBuilder) error {
out.newLine()
out.NewLine()
out.WriteString(d.Name)
out.WriteString(d.Data)
return nil
@ -573,7 +564,7 @@ func (t *JoinTableImpl) TableName() string {
return ""
}
func (t *JoinTableImpl) columns() []IColumn {
func (t *JoinTableImpl) Columns() []IColumn {
//return append(t.lhs.columns(), t.rhs.columns()...)
panic("Unimplemented")
}
@ -601,7 +592,7 @@ func (t *JoinTableImpl) serialize(statement StatementType, out *SqlBuilder, opti
return
}
out.newLine()
out.NewLine()
switch t.joinType {
case InnerJoin:
@ -667,7 +658,7 @@ func (s *SelectTableImpl2) Alias() string {
return s.alias
}
func (s *SelectTableImpl2) columns() []IColumn {
func (s *SelectTableImpl2) Columns() []IColumn {
return nil
}

View file

@ -48,7 +48,7 @@ func (d *deleteStatementImpl) serializeImpl(out *SqlBuilder) error {
if d == nil {
return errors.New("jet: delete statement is nil")
}
out.newLine()
out.NewLine()
out.WriteString("DELETE FROM")
if d.table == nil {

View file

@ -1,7 +1,6 @@
package jet
import (
"errors"
"strconv"
)
@ -11,7 +10,6 @@ var ANSII = NewDialect(DialectParams{ // just for tests
ArgumentPlaceholder: func(ord int) string {
return "$" + strconv.Itoa(ord)
},
SupportsReturning: true,
})
type Dialect interface {
@ -21,8 +19,6 @@ type Dialect interface {
AliasQuoteChar() byte
IdentifierQuoteChar() byte
ArgumentPlaceholder() QueryPlaceholderFunc
SetClause() func(columns []IColumn, values []Serializer, out *SqlBuilder) (err error)
SupportsReturning() bool
}
type SerializeFunc func(statement StatementType, out *SqlBuilder, options ...SerializeOption) error
@ -38,9 +34,6 @@ type DialectParams struct {
AliasQuoteChar byte
IdentifierQuoteChar byte
ArgumentPlaceholder QueryPlaceholderFunc
SetClause func(columns []IColumn, values []Serializer, out *SqlBuilder) (err error)
SupportsReturning bool
}
func NewDialect(params DialectParams) Dialect {
@ -51,8 +44,6 @@ func NewDialect(params DialectParams) Dialect {
aliasQuoteChar: params.AliasQuoteChar,
identifierQuoteChar: params.IdentifierQuoteChar,
argumentPlaceholder: params.ArgumentPlaceholder,
setClause: params.SetClause,
supportsReturning: params.SupportsReturning,
}
}
@ -91,41 +82,3 @@ func (d *dialectImpl) IdentifierQuoteChar() byte {
func (d *dialectImpl) ArgumentPlaceholder() QueryPlaceholderFunc {
return d.argumentPlaceholder
}
func (d *dialectImpl) SetClause() func(columns []IColumn, values []Serializer, out *SqlBuilder) (err error) {
if d.setClause != nil {
return d.setClause
}
return setClause
}
func (d *dialectImpl) SupportsReturning() bool {
return d.supportsReturning
}
func setClause(columns []IColumn, values []Serializer, out *SqlBuilder) (err error) {
if len(columns) != len(values) {
return errors.New("jet: mismatch in numers of columns and values")
}
for i, column := range columns {
if i > 0 {
out.WriteString(", ")
}
if column == nil {
return errors.New("jet: nil column in columns list")
}
out.WriteString(column.Name())
out.WriteString(" = ")
if err = Serialize(values[i], UpdateStatementType, out); err != nil {
return err
}
}
return nil
}

View file

@ -88,7 +88,7 @@ func (i *insertStatementImpl) Sql(dialect ...Dialect) (query string, args []inte
Dialect: detectDialect(i, dialect...),
}
out.newLine()
out.NewLine()
out.WriteString("INSERT INTO")
if utils.IsNil(i.table) {
@ -132,7 +132,7 @@ func (i *insertStatementImpl) Sql(dialect ...Dialect) (query string, args []inte
}
out.increaseIdent()
out.newLine()
out.NewLine()
out.WriteString("(")
err = SerializeClauseList(InsertStatementType, row, out)

View file

@ -66,7 +66,7 @@ func (l *lockStatementImpl) Sql(dialect ...Dialect) (query string, args []interf
Dialect: detectDialect(l, dialect...),
}
out.newLine()
out.NewLine()
out.WriteString("LOCK TABLE")
for i, table := range l.tables {

View file

@ -163,7 +163,7 @@ func (s *selectStatementImpl) serialize(statement StatementType, out *SqlBuilder
return err
}
out.newLine()
out.NewLine()
out.WriteString(")")
return nil
@ -174,7 +174,7 @@ func (s *selectStatementImpl) serializeImpl(out *SqlBuilder) error {
return errors.New("jet: Select expression is nil. ")
}
out.newLine()
out.NewLine()
out.WriteString("SELECT")
if s.distinct {
@ -230,19 +230,19 @@ func (s *selectStatementImpl) serializeImpl(out *SqlBuilder) error {
}
if s.limit >= 0 {
out.newLine()
out.NewLine()
out.WriteString("LIMIT")
out.insertParametrizedArgument(s.limit)
}
if s.offset >= 0 {
out.newLine()
out.NewLine()
out.WriteString("OFFSET")
out.insertParametrizedArgument(s.offset)
}
if s.lockFor != nil {
out.newLine()
out.NewLine()
out.WriteString("FOR")
err := s.lockFor.serialize(SelectStatementType, out)

View file

@ -109,7 +109,7 @@ func (s *setStatementImpl) serialize(statement StatementType, out *SqlBuilder, o
if wrap {
out.decreaseIdent()
out.newLine()
out.NewLine()
out.WriteString(")")
}
@ -129,19 +129,19 @@ func (s *setStatementImpl) serializeImpl(out *SqlBuilder) error {
return setOverride()(SelectStatementType, out)
}
out.newLine()
out.NewLine()
out.WriteString("(")
out.increaseIdent()
for i, selectStmt := range s.selects {
out.newLine()
out.NewLine()
if i > 0 {
out.WriteString(s.operator)
if s.all {
out.WriteString("ALL")
}
out.newLine()
out.NewLine()
}
if selectStmt == nil {
@ -156,7 +156,7 @@ func (s *setStatementImpl) serializeImpl(out *SqlBuilder) error {
}
out.decreaseIdent()
out.newLine()
out.NewLine()
out.WriteString(")")
if s.orderBy != nil {
@ -167,13 +167,13 @@ func (s *setStatementImpl) serializeImpl(out *SqlBuilder) error {
}
if s.limit >= 0 {
out.newLine()
out.NewLine()
out.WriteString("LIMIT")
out.insertParametrizedArgument(s.limit)
}
if s.offset >= 0 {
out.newLine()
out.NewLine()
out.WriteString("OFFSET")
out.insertParametrizedArgument(s.offset)
}

View file

@ -24,16 +24,26 @@ func (s *SqlBuilder) DebugSQL() string {
const defaultIdent = 5
func (q *SqlBuilder) increaseIdent() {
q.ident += defaultIdent
func (q *SqlBuilder) increaseIdent(ident ...int) {
if len(ident) > 0 {
q.ident += ident[0]
} else {
q.ident += defaultIdent
}
}
func (q *SqlBuilder) decreaseIdent() {
if q.ident < defaultIdent {
func (q *SqlBuilder) decreaseIdent(ident ...int) {
toDecrease := defaultIdent
if len(ident) > 0 {
toDecrease = ident[0]
}
if q.ident < toDecrease {
q.ident = 0
}
q.ident -= defaultIdent
q.ident -= toDecrease
}
func (q *SqlBuilder) writeProjections(statement StatementType, projections []Projection) error {
@ -44,7 +54,7 @@ func (q *SqlBuilder) writeProjections(statement StatementType, projections []Pro
}
func (q *SqlBuilder) writeFrom(statement StatementType, table Serializer) error {
q.newLine()
q.NewLine()
q.WriteString("FROM")
q.increaseIdent()
@ -55,7 +65,7 @@ func (q *SqlBuilder) writeFrom(statement StatementType, table Serializer) error
}
func (q *SqlBuilder) writeWhere(statement StatementType, where Expression) error {
q.newLine()
q.NewLine()
q.WriteString("WHERE")
q.increaseIdent()
@ -66,7 +76,7 @@ func (q *SqlBuilder) writeWhere(statement StatementType, where Expression) error
}
func (q *SqlBuilder) writeGroupBy(statement StatementType, groupBy []GroupByClause) error {
q.newLine()
q.NewLine()
q.WriteString("GROUP BY")
q.increaseIdent()
@ -77,7 +87,7 @@ func (q *SqlBuilder) writeGroupBy(statement StatementType, groupBy []GroupByClau
}
func (q *SqlBuilder) writeOrderBy(statement StatementType, orderBy []OrderByClause) error {
q.newLine()
q.NewLine()
q.WriteString("ORDER BY")
q.increaseIdent()
@ -88,7 +98,7 @@ func (q *SqlBuilder) writeOrderBy(statement StatementType, orderBy []OrderByClau
}
func (q *SqlBuilder) writeHaving(statement StatementType, having Expression) error {
q.newLine()
q.NewLine()
q.WriteString("HAVING")
q.increaseIdent()
@ -103,18 +113,14 @@ func (q *SqlBuilder) WriteReturning(statement StatementType, returning []Project
return nil
}
if !q.Dialect.SupportsReturning() {
panic("jet: " + q.Dialect.Name() + " dialect does not support RETURNING.")
}
q.newLine()
q.NewLine()
q.WriteString("RETURNING")
q.increaseIdent()
return q.writeProjections(statement, returning)
}
func (q *SqlBuilder) newLine() {
func (q *SqlBuilder) NewLine() {
q.write([]byte{'\n'})
q.write(bytes.Repeat([]byte{' '}, q.ident))
}

View file

@ -217,7 +217,7 @@ func (s *StatementImpl) serialize(statement StatementType, out *SqlBuilder, opti
if !contains(options, noWrap) {
out.decreaseIdent()
out.newLine()
out.NewLine()
out.WriteString(")")
}

View file

@ -7,10 +7,7 @@ import (
type SerializerTable interface {
Serializer
Columns() []IColumn
//SchemaName() string
//TableName() string
//AS(alias string)
TableInterface
}
type TableInterface interface {
@ -284,7 +281,7 @@ func (t *joinTable) serialize(statement StatementType, out *SqlBuilder, options
return
}
out.newLine()
out.NewLine()
switch t.joinType {
case InnerJoin:

View file

@ -67,7 +67,7 @@ func (u *updateStatementImpl) Sql(dialect ...Dialect) (query string, args []inte
Dialect: detectDialect(u, dialect...),
}
out.newLine()
out.NewLine()
out.WriteString("UPDATE")
if utils.IsNil(u.table) {
@ -86,13 +86,9 @@ func (u *updateStatementImpl) Sql(dialect ...Dialect) (query string, args []inte
return "", nil, errors.New("jet: no values to updated")
}
out.newLine()
out.NewLine()
out.WriteString("SET")
if err = out.Dialect.SetClause()(u.columns, u.values, out); err != nil {
return
}
if u.where == nil {
return "", nil, errors.New("jet: WHERE clause not set")
}

View file

@ -83,7 +83,7 @@ func SerializeProjectionList(statement StatementType, projections []Projection,
for i, col := range projections {
if i > 0 {
out.WriteString(",")
out.newLine()
out.NewLine()
}
if col == nil {