add order clause
This commit is contained in:
parent
9524036aab
commit
9bd2934e42
@ -16,6 +16,7 @@ package orm
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/astaxie/beego/client/orm/structs"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
@ -421,7 +422,7 @@ func (t *dbTables) getGroupSQL(groups []string) (groupSQL string) {
|
||||
}
|
||||
|
||||
// generate order sql.
|
||||
func (t *dbTables) getOrderSQL(orders []string) (orderSQL string) {
|
||||
func (t *dbTables) getOrderSQL(orders []*structs.OrderClause) (orderSQL string) {
|
||||
if len(orders) == 0 {
|
||||
return
|
||||
}
|
||||
@ -430,16 +431,16 @@ func (t *dbTables) getOrderSQL(orders []string) (orderSQL string) {
|
||||
|
||||
orderSqls := make([]string, 0, len(orders))
|
||||
for _, order := range orders {
|
||||
column := order.Column
|
||||
asc := "ASC"
|
||||
if order[0] == '-' {
|
||||
if order.Sort == structs.DESCENDING {
|
||||
asc = "DESC"
|
||||
order = order[1:]
|
||||
}
|
||||
exprs := strings.Split(order, ExprSep)
|
||||
clause := strings.Split(column, ExprSep)
|
||||
|
||||
index, _, fi, suc := t.parseExprs(t.mi, exprs)
|
||||
index, _, fi, suc := t.parseExprs(t.mi, clause)
|
||||
if !suc {
|
||||
panic(fmt.Errorf("unknown field/column name `%s`", strings.Join(exprs, ExprSep)))
|
||||
panic(fmt.Errorf("unknown field/column name `%s`", strings.Join(clause, ExprSep)))
|
||||
}
|
||||
|
||||
orderSqls = append(orderSqls, fmt.Sprintf("%s.%s%s%s %s", index, Q, fi.column, Q, asc))
|
||||
|
||||
@ -58,6 +58,7 @@ import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/astaxie/beego/client/orm/structs"
|
||||
"os"
|
||||
"reflect"
|
||||
"time"
|
||||
@ -351,7 +352,7 @@ func (o *ormBase) LoadRelatedWithCtx(ctx context.Context, md interface{}, name s
|
||||
qs.relDepth = relDepth
|
||||
|
||||
if len(order) > 0 {
|
||||
qs.orders = []string{order}
|
||||
qs.orders = structs.ParseOrderClause(order)
|
||||
}
|
||||
|
||||
find := ind.FieldByIndex(fi.fieldIndex)
|
||||
|
||||
@ -17,8 +17,8 @@ package orm
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/astaxie/beego/client/orm/hints"
|
||||
"github.com/astaxie/beego/client/orm/structs"
|
||||
)
|
||||
|
||||
type colValue struct {
|
||||
@ -71,7 +71,7 @@ type querySet struct {
|
||||
limit int64
|
||||
offset int64
|
||||
groups []string
|
||||
orders []string
|
||||
orders []*structs.OrderClause
|
||||
distinct bool
|
||||
forUpdate bool
|
||||
useIndex int
|
||||
@ -139,8 +139,11 @@ func (o querySet) GroupBy(exprs ...string) QuerySeter {
|
||||
|
||||
// add ORDER expression.
|
||||
// "column" means ASC, "-column" means DESC.
|
||||
func (o querySet) OrderBy(exprs ...string) QuerySeter {
|
||||
o.orders = exprs
|
||||
func (o querySet) OrderBy(expressions ...string) QuerySeter {
|
||||
if len(expressions) <= 0 {
|
||||
return &o
|
||||
}
|
||||
o.orders = structs.ParseOrderClause(expressions...)
|
||||
return &o
|
||||
}
|
||||
|
||||
|
||||
48
client/orm/structs/order_phrase.go
Normal file
48
client/orm/structs/order_phrase.go
Normal file
@ -0,0 +1,48 @@
|
||||
package structs
|
||||
|
||||
import "fmt"
|
||||
|
||||
type Sort int8
|
||||
|
||||
const (
|
||||
ASCENDING Sort = 1
|
||||
DESCENDING Sort = 2
|
||||
)
|
||||
|
||||
type OrderClause struct {
|
||||
Column string
|
||||
Sort Sort
|
||||
}
|
||||
|
||||
var _ fmt.Stringer = new(OrderClause)
|
||||
|
||||
func (o *OrderClause) String() string {
|
||||
sort := ``
|
||||
if o.Sort == ASCENDING {
|
||||
sort = `ASC`
|
||||
} else if o.Sort == DESCENDING {
|
||||
sort = `DESC`
|
||||
} else {
|
||||
return fmt.Sprintf("%s", o.Column)
|
||||
}
|
||||
return fmt.Sprintf("%s %s", o.Column, sort)
|
||||
}
|
||||
|
||||
func ParseOrderClause(expressions ...string) []*OrderClause {
|
||||
var orders []*OrderClause
|
||||
for _, expression := range expressions {
|
||||
sort := ASCENDING
|
||||
column := expression
|
||||
if expression[0] == '-' {
|
||||
sort = DESCENDING
|
||||
column = expression[1:]
|
||||
}
|
||||
|
||||
orders = append(orders, &OrderClause{
|
||||
Column: column,
|
||||
Sort: sort,
|
||||
})
|
||||
}
|
||||
|
||||
return orders
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user