support OrderClauses for QuerySeter

This commit is contained in:
Anker Jam 2020-10-25 23:49:21 +08:00
parent b1d5ba8ece
commit 56fa213a6e
4 changed files with 91 additions and 0 deletions

View File

@ -147,6 +147,15 @@ func (o querySet) OrderBy(expressions ...string) QuerySeter {
return &o return &o
} }
// add ORDER expression.
func (o querySet) OrderClauses(orders ...*clauses.Order) QuerySeter {
if len(orders) <= 0 {
return &o
}
o.orders = orders
return &o
}
// add DISTINCT to SELECT // add DISTINCT to SELECT
func (o querySet) Distinct() QuerySeter { func (o querySet) Distinct() QuerySeter {
o.distinct = true o.distinct = true

View File

@ -8,9 +8,21 @@ const (
SortDescending Sort = 2 SortDescending Sort = 2
) )
type OrderOption func(order *Order)
type Order struct { type Order struct {
column string column string
sort Sort sort Sort
isRaw bool
}
func OrderClause(options ...OrderOption) *Order {
o := &Order{}
for _, option := range options {
option(o)
}
return o
} }
func (o *Order) GetColumn() string { func (o *Order) GetColumn() string {
@ -21,6 +33,10 @@ func (o *Order) GetSort() Sort {
return o.sort return o.sort
} }
func (o *Order) IsRaw() bool {
return o.isRaw
}
func ParseOrder(expressions ...string) []*Order { func ParseOrder(expressions ...string) []*Order {
var orders []*Order var orders []*Order
for _, expression := range expressions { for _, expression := range expressions {
@ -39,3 +55,21 @@ func ParseOrder(expressions ...string) []*Order {
return orders return orders
} }
func OrderColumn(column string) OrderOption {
return func(order *Order) {
order.column = column
}
}
func OrderSort(sort Sort) OrderOption {
return func(order *Order) {
order.sort = sort
}
}
func OrderRaw(isRaw bool) OrderOption {
return func(order *Order) {
order.isRaw = isRaw
}
}

View File

@ -0,0 +1,29 @@
package clauses
import "testing"
func TestOrderClause(t *testing.T) {
var (
column = `a`
sort = SortDescending
raw = true
)
o := OrderClause(
OrderColumn(column),
OrderSort(sort),
OrderRaw(raw),
)
if o.GetColumn() != column {
t.Error()
}
if o.GetSort() != sort {
t.Error()
}
if o.IsRaw() != raw {
t.Error()
}
}

View File

@ -17,6 +17,7 @@ package orm
import ( import (
"context" "context"
"database/sql" "database/sql"
"github.com/astaxie/beego/client/orm/structs/clauses"
"reflect" "reflect"
"time" "time"
@ -289,6 +290,24 @@ type QuerySeter interface {
// for example: // for example:
// qs.OrderBy("-status") // qs.OrderBy("-status")
OrderBy(exprs ...string) QuerySeter OrderBy(exprs ...string) QuerySeter
// add ORDER expression by order clauses
// for example:
// OrderClauses(clauses.OrderClause(
// clauses.OrderColumn(`status`),
// clauses.OrderSort(clauses.SortAscending),
// clauses.OrderRaw(false),
// ))
// OrderClauses(clauses.OrderClause(
// clauses.OrderColumn(`user__status`),
// clauses.OrderSort(clauses.SortAscending),
// clauses.OrderRaw(false),
// ))
// OrderClauses(clauses.OrderClause(
// clauses.OrderColumn(`random()`),
// clauses.OrderSort(clauses.SortNone),
// clauses.OrderRaw(true),
// ))
OrderClauses(orders ...*clauses.Order) QuerySeter
// add FORCE INDEX expression. // add FORCE INDEX expression.
// for example: // for example:
// qs.ForceIndex(`idx_name1`,`idx_name2`) // qs.ForceIndex(`idx_name1`,`idx_name2`)