104 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package order_clause
 | 
						|
 | 
						|
import (
 | 
						|
	"github.com/beego/beego/v2/client/orm/clauses"
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
type Sort int8
 | 
						|
 | 
						|
const (
 | 
						|
	None       Sort = 0
 | 
						|
	Ascending  Sort = 1
 | 
						|
	Descending Sort = 2
 | 
						|
)
 | 
						|
 | 
						|
type Option func(order *Order)
 | 
						|
 | 
						|
type Order struct {
 | 
						|
	column string
 | 
						|
	sort   Sort
 | 
						|
	isRaw  bool
 | 
						|
}
 | 
						|
 | 
						|
func Clause(options ...Option) *Order {
 | 
						|
	o := &Order{}
 | 
						|
	for _, option := range options {
 | 
						|
		option(o)
 | 
						|
	}
 | 
						|
 | 
						|
	return o
 | 
						|
}
 | 
						|
 | 
						|
func (o *Order) GetColumn() string {
 | 
						|
	return o.column
 | 
						|
}
 | 
						|
 | 
						|
func (o *Order) GetSort() Sort {
 | 
						|
	return o.sort
 | 
						|
}
 | 
						|
 | 
						|
func (o *Order) SortString() string {
 | 
						|
	switch o.GetSort() {
 | 
						|
	case Ascending:
 | 
						|
		return "ASC"
 | 
						|
	case Descending:
 | 
						|
		return "DESC"
 | 
						|
	}
 | 
						|
 | 
						|
	return ``
 | 
						|
}
 | 
						|
 | 
						|
func (o *Order) IsRaw() bool {
 | 
						|
	return o.isRaw
 | 
						|
}
 | 
						|
 | 
						|
func ParseOrder(expressions ...string) []*Order {
 | 
						|
	var orders []*Order
 | 
						|
	for _, expression := range expressions {
 | 
						|
		sort := Ascending
 | 
						|
		column := strings.ReplaceAll(expression, clauses.ExprSep, clauses.ExprDot)
 | 
						|
		if column[0] == '-' {
 | 
						|
			sort = Descending
 | 
						|
			column = column[1:]
 | 
						|
		}
 | 
						|
 | 
						|
		orders = append(orders, &Order{
 | 
						|
			column: column,
 | 
						|
			sort:   sort,
 | 
						|
		})
 | 
						|
	}
 | 
						|
 | 
						|
	return orders
 | 
						|
}
 | 
						|
 | 
						|
func Column(column string) Option {
 | 
						|
	return func(order *Order) {
 | 
						|
		order.column = strings.ReplaceAll(column, clauses.ExprSep, clauses.ExprDot)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func sort(sort Sort) Option {
 | 
						|
	return func(order *Order) {
 | 
						|
		order.sort = sort
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func SortAscending() Option {
 | 
						|
	return sort(Ascending)
 | 
						|
}
 | 
						|
 | 
						|
func SortDescending() Option {
 | 
						|
	return sort(Descending)
 | 
						|
}
 | 
						|
 | 
						|
func SortNone() Option {
 | 
						|
	return sort(None)
 | 
						|
}
 | 
						|
 | 
						|
func Raw() Option {
 | 
						|
	return func(order *Order) {
 | 
						|
		order.isRaw = true
 | 
						|
	}
 | 
						|
}
 |