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
}
// 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
func (o querySet) Distinct() QuerySeter {
o.distinct = true

View File

@ -8,9 +8,21 @@ const (
SortDescending Sort = 2
)
type OrderOption func(order *Order)
type Order struct {
column string
sort Sort
isRaw bool
}
func OrderClause(options ...OrderOption) *Order {
o := &Order{}
for _, option := range options {
option(o)
}
return o
}
func (o *Order) GetColumn() string {
@ -21,6 +33,10 @@ func (o *Order) GetSort() Sort {
return o.sort
}
func (o *Order) IsRaw() bool {
return o.isRaw
}
func ParseOrder(expressions ...string) []*Order {
var orders []*Order
for _, expression := range expressions {
@ -39,3 +55,21 @@ func ParseOrder(expressions ...string) []*Order {
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 (
"context"
"database/sql"
"github.com/astaxie/beego/client/orm/structs/clauses"
"reflect"
"time"
@ -289,6 +290,24 @@ type QuerySeter interface {
// for example:
// qs.OrderBy("-status")
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.
// for example:
// qs.ForceIndex(`idx_name1`,`idx_name2`)