github.com/systematiccaos/gorm@v1.22.6/clause/set.go (about)

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