gitee.com/h79/goutils@v1.22.10/dao/wrapper/group.go (about)

     1  package wrapper
     2  
     3  import (
     4  	commonoption "gitee.com/h79/goutils/common/option"
     5  	"gitee.com/h79/goutils/dao/option"
     6  	"strings"
     7  )
     8  
     9  type GroupBy []Column
    10  
    11  var _ IBuilder = (*GroupBy)(nil)
    12  
    13  func (g *GroupBy) Is() bool {
    14  	return len(*g) > 0
    15  }
    16  
    17  func (g *GroupBy) Build(opts ...commonoption.Option) string {
    18  	var ii = 0
    19  	var m = 6
    20  	var full = true
    21  	var convert option.ColumnConvertFunc
    22  	commonoption.Filter(func(opt commonoption.Option) bool {
    23  		if opt.Type() == option.TypeMaxColumn {
    24  			m = opt.Value().(int)
    25  			ii++
    26  		} else if opt.Type() == option.TypeFullSql {
    27  			full = opt.Value().(bool)
    28  			ii++
    29  		} else if opt.Type() == option.TypeSqlColumnConvert {
    30  			convert = opt.Value().(option.ColumnConvertFunc)
    31  			ii++
    32  		}
    33  		return ii == 3
    34  	}, opts...)
    35  	return g.buildOpt(full, convert, m)
    36  }
    37  
    38  func (g *GroupBy) Check(filters []FField, opts ...commonoption.Option) {
    39  	length := len(*g)
    40  	m := option.MaxColumnExist(opts...)
    41  	if length > m { //防止多
    42  		length = m
    43  	}
    44  	cols := (*g)[:length]
    45  	for i := range cols {
    46  		cols[i].Check(filters)
    47  	}
    48  }
    49  
    50  func (g *GroupBy) buildOpt(full bool, convert option.ColumnConvertFunc, max int) string {
    51  	count := 0
    52  	builder := strings.Builder{}
    53  	expr := false
    54  	cc := false
    55  	for i := range *g {
    56  		if count >= max {
    57  			//后面不要接入
    58  			break
    59  		}
    60  		if count == 0 {
    61  			if full {
    62  				builder.WriteString(" GROUP BY ")
    63  			}
    64  		} else if count > 0 {
    65  			builder.WriteByte(',')
    66  		}
    67  		expr = (*g)[i].Expr != ""
    68  		if (*g)[i].Column != "" {
    69  			if convert != nil {
    70  				cc = SqlColumn(&builder, convert((*g)[i].Column))
    71  			} else {
    72  				cc = SqlColumn(&builder, (*g)[i].Column)
    73  			}
    74  			if expr && cc {
    75  				builder.WriteByte(' ')
    76  			}
    77  		}
    78  		if expr {
    79  			builder.WriteString((*g)[i].Expr)
    80  		}
    81  		count++
    82  	}
    83  	return builder.String()
    84  }