MySQL refactor.
This commit is contained in:
parent
8519ccbdd0
commit
4fbf576370
36 changed files with 1080 additions and 270 deletions
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(")")
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue