69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
package postgres
|
|
|
|
import (
|
|
"github.com/go-jet/jet/v2/internal/jet"
|
|
)
|
|
|
|
type onConflict interface {
|
|
ON_CONSTRAINT(name string) conflictTarget
|
|
WHERE(indexPredicate BoolExpression) conflictTarget
|
|
conflictTarget
|
|
}
|
|
|
|
type conflictTarget interface {
|
|
DO_NOTHING() InsertStatement
|
|
DO_UPDATE(action conflictAction) InsertStatement
|
|
}
|
|
|
|
type onConflictClause struct {
|
|
insertStatement InsertStatement
|
|
constraint string
|
|
indexExpressions []jet.ColumnExpression
|
|
whereClause jet.ClauseWhere
|
|
do jet.Serializer
|
|
}
|
|
|
|
func (o *onConflictClause) ON_CONSTRAINT(name string) conflictTarget {
|
|
o.constraint = name
|
|
return o
|
|
}
|
|
|
|
func (o *onConflictClause) WHERE(indexPredicate BoolExpression) conflictTarget {
|
|
o.whereClause.Condition = indexPredicate
|
|
return o
|
|
}
|
|
|
|
func (o *onConflictClause) DO_NOTHING() InsertStatement {
|
|
o.do = jet.Keyword("DO NOTHING")
|
|
return o.insertStatement
|
|
}
|
|
|
|
func (o *onConflictClause) DO_UPDATE(action conflictAction) InsertStatement {
|
|
o.do = action
|
|
return o.insertStatement
|
|
}
|
|
|
|
func (o *onConflictClause) Serialize(statementType jet.StatementType, out *jet.SQLBuilder, options ...jet.SerializeOption) {
|
|
if len(o.indexExpressions) == 0 && o.constraint == "" {
|
|
return
|
|
}
|
|
|
|
out.NewLine()
|
|
out.WriteString("ON CONFLICT")
|
|
if len(o.indexExpressions) > 0 {
|
|
out.WriteString("(")
|
|
jet.SerializeColumnExpressions(o.indexExpressions, statementType, out, jet.ShortName)
|
|
out.WriteString(")")
|
|
}
|
|
|
|
if o.constraint != "" {
|
|
out.WriteString("ON CONSTRAINT")
|
|
out.WriteString(o.constraint)
|
|
}
|
|
|
|
o.whereClause.Serialize(statementType, out, jet.SkipNewLine, jet.ShortName)
|
|
|
|
out.IncreaseIdent(7)
|
|
jet.Serialize(o.do, statementType, out)
|
|
out.DecreaseIdent(7)
|
|
}
|