github.com/wanlay/gorm-dm8@v1.0.5/clauses/merge.go (about)

     1  package clauses
     2  
     3  import (
     4  	"gorm.io/gorm/clause"
     5  )
     6  
     7  type Merge struct {
     8  	Table clause.Table
     9  	Using []clause.Interface
    10  	On    []clause.Expression
    11  }
    12  
    13  func (merge Merge) Name() string {
    14  	return "MERGE"
    15  }
    16  
    17  func MergeDefaultExcludeName() string {
    18  	return "excluded"
    19  }
    20  
    21  // Build build from clause
    22  func (merge Merge) Build(builder clause.Builder) {
    23  	clause.Insert{}.Build(builder)
    24  	builder.WriteString(" USING (")
    25  	for idx, iface := range merge.Using {
    26  		if idx > 0 {
    27  			builder.WriteByte(' ')
    28  		}
    29  		builder.WriteString(iface.Name())
    30  		builder.WriteByte(' ')
    31  		iface.Build(builder)
    32  	}
    33  	builder.WriteString(") ")
    34  	builder.WriteString(MergeDefaultExcludeName())
    35  	builder.WriteString(" ON (")
    36  	for idx, on := range merge.On {
    37  		if idx > 0 {
    38  			builder.WriteString(", ")
    39  		}
    40  		on.Build(builder)
    41  	}
    42  	builder.WriteString(")")
    43  }
    44  
    45  // MergeClause merge values clauses
    46  func (merge Merge) MergeClause(clause *clause.Clause) {
    47  	clause.Name = merge.Name()
    48  	clause.Expression = merge
    49  }