github.com/octohelm/storage@v0.0.0-20240516030302-1ac2cc1ea347/pkg/sqlbuilder/addition.go (about)

     1  package sqlbuilder
     2  
     3  import (
     4  	"sort"
     5  )
     6  
     7  type Additions []Addition
     8  
     9  type Addition interface {
    10  	SqlExpr
    11  	AdditionType() AdditionType
    12  }
    13  
    14  type AdditionType int
    15  
    16  const (
    17  	AdditionJoin AdditionType = iota
    18  	AdditionWhere
    19  	AdditionGroupBy
    20  	AdditionCombination
    21  	AdditionOrderBy
    22  	AdditionLimit
    23  	AdditionOnConflict
    24  	AdditionOther
    25  	AdditionComment
    26  )
    27  
    28  func WriteAdditions(e *Ex, additions ...Addition) {
    29  	finalAdditions := make(Additions, 0, len(additions))
    30  	for i := range additions {
    31  		if IsNilExpr(additions[i]) {
    32  			continue
    33  		}
    34  		finalAdditions = append(finalAdditions, additions[i])
    35  	}
    36  
    37  	if len(finalAdditions) == 0 {
    38  		return
    39  	}
    40  
    41  	sort.Sort(finalAdditions)
    42  
    43  	for i := range finalAdditions {
    44  		e.WriteQueryByte('\n')
    45  		e.WriteExpr(finalAdditions[i])
    46  	}
    47  }
    48  
    49  func (additions Additions) Len() int {
    50  	return len(additions)
    51  }
    52  
    53  func (additions Additions) Less(i, j int) bool {
    54  	return additions[i].AdditionType() < additions[j].AdditionType()
    55  }
    56  
    57  func (additions Additions) Swap(i, j int) {
    58  	additions[i], additions[j] = additions[j], additions[i]
    59  }
    60  
    61  func AsAddition(expr SqlExpr) *OtherAddition {
    62  	return &OtherAddition{
    63  		SqlExpr: expr,
    64  	}
    65  }
    66  
    67  type OtherAddition struct {
    68  	SqlExpr
    69  }
    70  
    71  func (OtherAddition) AdditionType() AdditionType {
    72  	return AdditionOther
    73  }
    74  
    75  func (a *OtherAddition) IsNil() bool {
    76  	return a == nil || IsNilExpr(a.SqlExpr)
    77  }