2019-08-11 09:52:02 +02:00
|
|
|
package postgres
|
|
|
|
|
|
2019-08-11 12:13:59 +02:00
|
|
|
import (
|
|
|
|
|
"errors"
|
|
|
|
|
"github.com/go-jet/jet/internal/jet"
|
|
|
|
|
)
|
2019-08-11 09:52:02 +02:00
|
|
|
|
|
|
|
|
// UpdateStatement is interface of SQL UPDATE statement
|
|
|
|
|
type UpdateStatement interface {
|
|
|
|
|
jet.Statement
|
|
|
|
|
|
|
|
|
|
SET(value interface{}, values ...interface{}) UpdateStatement
|
|
|
|
|
MODEL(data interface{}) UpdateStatement
|
|
|
|
|
|
|
|
|
|
WHERE(expression BoolExpression) UpdateStatement
|
|
|
|
|
RETURNING(projections ...jet.Projection) UpdateStatement
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type updateStatementImpl struct {
|
|
|
|
|
jet.StatementImpl
|
|
|
|
|
|
|
|
|
|
Update jet.ClauseUpdate
|
2019-08-11 12:13:59 +02:00
|
|
|
Set ClauseSet
|
2019-08-11 09:52:02 +02:00
|
|
|
Where jet.ClauseWhere
|
2019-08-11 14:29:03 +02:00
|
|
|
Returning ClauseReturning
|
2019-08-11 09:52:02 +02:00
|
|
|
}
|
|
|
|
|
|
2019-08-11 14:29:03 +02:00
|
|
|
func newUpdateStatement(table WritableTable, columns []jet.Column) UpdateStatement {
|
2019-08-11 09:52:02 +02:00
|
|
|
update := &updateStatementImpl{}
|
|
|
|
|
update.StatementImpl = jet.NewStatementImpl(Dialect, jet.UpdateStatementType, update, &update.Update,
|
|
|
|
|
&update.Set, &update.Where, &update.Returning)
|
|
|
|
|
|
|
|
|
|
update.Update.Table = table
|
|
|
|
|
update.Set.Columns = columns
|
|
|
|
|
update.Where.Mandatory = true
|
|
|
|
|
|
|
|
|
|
return update
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (u *updateStatementImpl) SET(value interface{}, values ...interface{}) UpdateStatement {
|
|
|
|
|
u.Set.Values = jet.UnwindRowFromValues(value, values)
|
|
|
|
|
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) RETURNING(projections ...jet.Projection) UpdateStatement {
|
|
|
|
|
u.Returning.Projections = projections
|
|
|
|
|
return u
|
|
|
|
|
}
|
2019-08-11 12:13:59 +02:00
|
|
|
|
|
|
|
|
type ClauseSet struct {
|
2019-08-11 14:29:03 +02:00
|
|
|
Columns []jet.Column
|
2019-08-11 12:13:59 +02:00
|
|
|
Values []jet.Serializer
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *ClauseSet) Serialize(statementType jet.StatementType, out *jet.SqlBuilder) error {
|
|
|
|
|
out.NewLine()
|
|
|
|
|
out.WriteString("SET")
|
|
|
|
|
|
|
|
|
|
if len(s.Columns) == 0 {
|
|
|
|
|
return errors.New("jet: no columns selected")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(s.Columns) > 1 {
|
|
|
|
|
out.WriteString("(")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err := jet.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 = jet.SerializeClauseList(statementType, s.Values, out)
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(s.Values) > 1 {
|
|
|
|
|
out.WriteString(")")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|