gitee.com/h79/goutils@v1.22.10/dao/wrapper/order.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  const (
    10  	kDesc = "DESC"
    11  	kAsc  = "ASC"
    12  )
    13  
    14  var _ IBuilder = (*OrderBy)(nil)
    15  
    16  // OrderBy 排序(降序(大=>小)desc, 升序(小=>大)asc
    17  // example: "orderBy:[{"col:"create_at","desc":true}, {"col":"id","desc":false}]
    18  //
    19  //	"orderBy:[{"col:"create_at,id","desc":true}]
    20  type OrderBy []Column
    21  
    22  func (ob *OrderBy) Is() bool {
    23  	return len(*ob) > 0
    24  }
    25  
    26  func (ob *OrderBy) Build(opts ...commonoption.Option) string {
    27  	var ii = 0
    28  	var m = 6
    29  	var full = false
    30  	var convert option.ColumnConvertFunc
    31  	commonoption.Filter(func(opt commonoption.Option) bool {
    32  		if opt.Type() == option.TypeMaxColumn {
    33  			m = opt.Value().(int)
    34  			ii++
    35  		} else if opt.Type() == option.TypeFullSql {
    36  			full = opt.Value().(bool)
    37  			ii++
    38  		} else if opt.Type() == option.TypeSqlColumnConvert {
    39  			convert = opt.Value().(option.ColumnConvertFunc)
    40  			ii++
    41  		}
    42  		return ii == 3
    43  	}, opts...)
    44  	return ob.buildOpt(full, convert, m)
    45  }
    46  
    47  func (ob *OrderBy) Check(filters []FField, opts ...commonoption.Option) {
    48  	length := len(*ob)
    49  	var m = option.MaxColumnExist(opts...)
    50  	if length > m { //防止多
    51  		length = m
    52  	}
    53  	cols := (*ob)[:length]
    54  	for i := range cols {
    55  		cols[i].Check(filters)
    56  	}
    57  }
    58  
    59  func (ob *OrderBy) buildOpt(full bool, convert option.ColumnConvertFunc, max int) string {
    60  	count := 0
    61  	builder := strings.Builder{}
    62  	for i := range *ob {
    63  		if count >= max {
    64  			//后面不要接入
    65  			break
    66  		}
    67  		if c := ob.build(&(*ob)[i], convert); len(c) > 0 {
    68  			if count == 0 {
    69  				if full {
    70  					builder.WriteString(" ORDER BY ")
    71  				}
    72  			} else if count > 0 {
    73  				builder.WriteByte(',')
    74  			}
    75  			builder.WriteString(c)
    76  			count++
    77  		}
    78  	}
    79  	return builder.String()
    80  }
    81  
    82  func (ob *OrderBy) build(col *Column, convert option.ColumnConvertFunc) string {
    83  	var cc = false
    84  	var builder = strings.Builder{}
    85  	if convert != nil {
    86  		cc = SqlColumn(&builder, convert(col.Column))
    87  	} else {
    88  		cc = SqlColumn(&builder, col.Column)
    89  	}
    90  	if cc && col.Desc {
    91  		builder.WriteByte(' ')
    92  		builder.WriteString(kDesc)
    93  	}
    94  	return builder.String()
    95  }