jet/mysql/update_statement.go

82 lines
2.1 KiB
Go
Raw Normal View History

2019-08-11 12:13:59 +02:00
package mysql
import "source.gleipnir.technology/Gleipnir/jet/v2/internal/jet"
2019-08-11 12:13:59 +02:00
// UpdateStatement is interface of SQL UPDATE statement
type UpdateStatement interface {
jet.Statement
2022-09-29 13:33:00 +02:00
OPTIMIZER_HINTS(hints ...OptimizerHint) UpdateStatement
2019-08-11 12:13:59 +02:00
SET(value interface{}, values ...interface{}) UpdateStatement
MODEL(data interface{}) UpdateStatement
WHERE(expression BoolExpression) UpdateStatement
LIMIT(limit int64) UpdateStatement
2019-08-11 12:13:59 +02:00
}
type updateStatementImpl struct {
2019-08-17 18:32:01 +02:00
jet.SerializerStatement
2019-08-11 12:13:59 +02:00
Update jet.ClauseUpdate
Set jet.SetClause
SetNew jet.SetClauseNew
2019-08-11 12:13:59 +02:00
Where jet.ClauseWhere
Limit jet.ClauseLimit
2019-08-11 12:13:59 +02:00
}
2019-08-11 14:29:03 +02:00
func newUpdateStatement(table Table, columns []jet.Column) UpdateStatement {
2019-08-11 12:13:59 +02:00
update := &updateStatementImpl{}
update.SerializerStatement = jet.NewStatementImpl(Dialect, jet.UpdateStatementType, update,
&update.Update,
&update.Set,
&update.SetNew,
&update.Where,
&update.Limit)
2019-08-11 12:13:59 +02:00
update.Update.Table = table
update.Set.Columns = columns
update.Where.Mandatory = true
update.Limit.Count = -1 // Initialize to -1 to indicate no LIMIT
2019-08-11 12:13:59 +02:00
return update
}
2022-09-29 13:33:00 +02:00
func (u *updateStatementImpl) OPTIMIZER_HINTS(hints ...OptimizerHint) UpdateStatement {
u.Update.OptimizerHints = hints
return u
}
2019-08-11 12:13:59 +02:00
func (u *updateStatementImpl) SET(value interface{}, values ...interface{}) UpdateStatement {
columnAssigment, isColumnAssigment := value.(ColumnAssigment)
if isColumnAssigment {
u.SetNew = []ColumnAssigment{columnAssigment}
for _, value := range values {
u.SetNew = append(u.SetNew, value.(ColumnAssigment))
}
} else {
u.Set.Values = jet.UnwindRowFromValues(value, values)
}
2019-08-11 12:13:59 +02:00
return u
}
func (u *updateStatementImpl) MODEL(data interface{}) UpdateStatement {
u.Set.Values = jet.UnwindRowFromModel(u.Set.Columns, data)
return u
}
func (u *updateStatementImpl) WHERE(expression BoolExpression) UpdateStatement {
u.Where.Condition = expression
return u
}
func (u *updateStatementImpl) LIMIT(limit int64) UpdateStatement {
if _, isJoinTable := u.Update.Table.(*joinTable); isJoinTable {
panic("jet: MySQL does not support LIMIT with multi-table UPDATE statements")
}
u.Limit.Count = limit
return u
}