set.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package clause
  2. import "sort"
  3. type Set []Assignment
  4. type Assignment struct {
  5. Column Column
  6. Value interface{}
  7. }
  8. func (set Set) Name() string {
  9. return "SET"
  10. }
  11. func (set Set) Build(builder Builder) {
  12. if len(set) > 0 {
  13. for idx, assignment := range set {
  14. if idx > 0 {
  15. builder.WriteByte(',')
  16. }
  17. builder.WriteQuoted(assignment.Column)
  18. builder.WriteByte('=')
  19. builder.AddVar(builder, assignment.Value)
  20. }
  21. } else {
  22. builder.WriteQuoted(PrimaryColumn)
  23. builder.WriteByte('=')
  24. builder.WriteQuoted(PrimaryColumn)
  25. }
  26. }
  27. // MergeClause merge assignments clauses
  28. func (set Set) MergeClause(clause *Clause) {
  29. copiedAssignments := make([]Assignment, len(set))
  30. copy(copiedAssignments, set)
  31. clause.Expression = Set(copiedAssignments)
  32. }
  33. func Assignments(values map[string]interface{}) Set {
  34. keys := make([]string, 0, len(values))
  35. for key := range values {
  36. keys = append(keys, key)
  37. }
  38. sort.Strings(keys)
  39. assignments := make([]Assignment, len(keys))
  40. for idx, key := range keys {
  41. assignments[idx] = Assignment{Column: Column{Name: key}, Value: values[key]}
  42. }
  43. return assignments
  44. }
  45. func AssignmentColumns(values []string) Set {
  46. assignments := make([]Assignment, len(values))
  47. for idx, value := range values {
  48. assignments[idx] = Assignment{Column: Column{Name: value}, Value: Column{Table: "excluded", Name: value}}
  49. }
  50. return assignments
  51. }