add order clause

This commit is contained in:
Anker Jam 2020-10-25 21:07:03 +08:00
parent 9524036aab
commit 9bd2934e42
4 changed files with 64 additions and 11 deletions

View File

@ -16,6 +16,7 @@ package orm
import ( import (
"fmt" "fmt"
"github.com/astaxie/beego/client/orm/structs"
"strings" "strings"
"time" "time"
) )
@ -421,7 +422,7 @@ func (t *dbTables) getGroupSQL(groups []string) (groupSQL string) {
} }
// generate order sql. // generate order sql.
func (t *dbTables) getOrderSQL(orders []string) (orderSQL string) { func (t *dbTables) getOrderSQL(orders []*structs.OrderClause) (orderSQL string) {
if len(orders) == 0 { if len(orders) == 0 {
return return
} }
@ -430,16 +431,16 @@ func (t *dbTables) getOrderSQL(orders []string) (orderSQL string) {
orderSqls := make([]string, 0, len(orders)) orderSqls := make([]string, 0, len(orders))
for _, order := range orders { for _, order := range orders {
column := order.Column
asc := "ASC" asc := "ASC"
if order[0] == '-' { if order.Sort == structs.DESCENDING {
asc = "DESC" 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 { 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)) orderSqls = append(orderSqls, fmt.Sprintf("%s.%s%s%s %s", index, Q, fi.column, Q, asc))

View File

@ -58,6 +58,7 @@ import (
"database/sql" "database/sql"
"errors" "errors"
"fmt" "fmt"
"github.com/astaxie/beego/client/orm/structs"
"os" "os"
"reflect" "reflect"
"time" "time"
@ -351,7 +352,7 @@ func (o *ormBase) LoadRelatedWithCtx(ctx context.Context, md interface{}, name s
qs.relDepth = relDepth qs.relDepth = relDepth
if len(order) > 0 { if len(order) > 0 {
qs.orders = []string{order} qs.orders = structs.ParseOrderClause(order)
} }
find := ind.FieldByIndex(fi.fieldIndex) find := ind.FieldByIndex(fi.fieldIndex)

View File

@ -17,8 +17,8 @@ package orm
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/astaxie/beego/client/orm/hints" "github.com/astaxie/beego/client/orm/hints"
"github.com/astaxie/beego/client/orm/structs"
) )
type colValue struct { type colValue struct {
@ -71,7 +71,7 @@ type querySet struct {
limit int64 limit int64
offset int64 offset int64
groups []string groups []string
orders []string orders []*structs.OrderClause
distinct bool distinct bool
forUpdate bool forUpdate bool
useIndex int useIndex int
@ -139,8 +139,11 @@ func (o querySet) GroupBy(exprs ...string) QuerySeter {
// add ORDER expression. // add ORDER expression.
// "column" means ASC, "-column" means DESC. // "column" means ASC, "-column" means DESC.
func (o querySet) OrderBy(exprs ...string) QuerySeter { func (o querySet) OrderBy(expressions ...string) QuerySeter {
o.orders = exprs if len(expressions) <= 0 {
return &o
}
o.orders = structs.ParseOrderClause(expressions...)
return &o return &o
} }

View 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
}