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

     1  package clauses
     2  
     3  import (
     4  	"gorm.io/gorm/clause"
     5  )
     6  
     7  type WhenMatched struct {
     8  	clause.Set
     9  	Where, Delete clause.Where
    10  }
    11  
    12  func (w WhenMatched) Name() string {
    13  	return "WHEN MATCHED"
    14  }
    15  
    16  func (w WhenMatched) Build(builder clause.Builder) {
    17  	if len(w.Set) > 0 {
    18  		builder.WriteString("THEN")
    19  		builder.WriteString(" UPDATE")
    20  		builder.WriteString(" SET")
    21  		builder.WriteByte(' ')
    22  		w.Set.Build(builder)
    23  
    24  		buildWhere := func(where clause.Where) {
    25  			builder.WriteString(where.Name())
    26  			builder.WriteByte(' ')
    27  			where.Build(builder)
    28  		}
    29  
    30  		if len(w.Where.Exprs) > 0 {
    31  			buildWhere(w.Where)
    32  		}
    33  
    34  		if len(w.Delete.Exprs) > 0 {
    35  			builder.WriteString(" DELETE ")
    36  			buildWhere(w.Delete)
    37  		}
    38  	}
    39  }
    40  
    41  func (w WhenMatched) MergeClause(clause *clause.Clause) {
    42  	clause.Name = w.Name()
    43  	clause.Expression = w
    44  }