This commit is contained in:
Lunny Xiao 2023-07-22 19:23:43 +08:00
parent cf658a940c
commit 2623c1b73f
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
3 changed files with 23 additions and 15 deletions

View File

@ -14,7 +14,7 @@ import (
"xorm.io/xorm/schemas" "xorm.io/xorm/schemas"
) )
func (statement *Statement) writeDeleteOrder(w builder.Writer) error { func (statement *Statement) writeDeleteOrder(w *builder.BytesWriter) error {
if err := statement.writeOrderBys(w); err != nil { if err := statement.writeOrderBys(w); err != nil {
return err return err
} }

View File

@ -10,6 +10,12 @@ import (
"xorm.io/builder" "xorm.io/builder"
) )
type orderBy struct {
orderStr interface{}
orderArgs []interface{}
direction string // ASC, DESC or "", "" means raw orderStr
}
func (statement *Statement) HasOrderBy() bool { func (statement *Statement) HasOrderBy() bool {
return len(statement.orderBy) > 0 return len(statement.orderBy) > 0
} }
@ -19,27 +25,34 @@ func (statement *Statement) ResetOrderBy() {
statement.orderBy = []orderBy{} statement.orderBy = []orderBy{}
} }
func (statement *Statement) writeOrderBy(w builder.Writer, orderBy orderBy) error { func (statement *Statement) writeOrderBy(w *builder.BytesWriter, orderBy orderBy) error {
switch t := orderBy.orderStr.(type) { switch t := orderBy.orderStr.(type) {
case (*builder.Expression): case (*builder.Expression):
if _, err := fmt.Fprint(w, statement.ReplaceQuote(t.Content())); err != nil { if _, err := fmt.Fprint(w.Builder, statement.dialect.Quoter().Replace(t.Content())); err != nil {
return err return err
} }
w.Append(t.Args()...) w.Append(t.Args()...)
return nil return nil
case string: case string:
if _, err := fmt.Fprint(w, statement.dialect.Quoter().Quote(t)); err != nil { if orderBy.direction == "" {
if _, err := fmt.Fprint(w.Builder, statement.dialect.Quoter().Replace(t)); err != nil {
return err return err
} }
w.Append(orderBy.orderArgs...) w.Append(orderBy.orderArgs...)
return nil return nil
}
if err := statement.dialect.Quoter().QuoteTo(w.Builder, t); err != nil {
return err
}
_, err := fmt.Fprint(w, " ", orderBy.direction)
return err
default: default:
return ErrUnSupportedSQLType return ErrUnSupportedSQLType
} }
} }
// WriteOrderBy write order by to writer // WriteOrderBy write order by to writer
func (statement *Statement) writeOrderBys(w builder.Writer) error { func (statement *Statement) writeOrderBys(w *builder.BytesWriter) error {
if len(statement.orderBy) == 0 { if len(statement.orderBy) == 0 {
return nil return nil
} }
@ -62,14 +75,14 @@ func (statement *Statement) writeOrderBys(w builder.Writer) error {
// OrderBy generate "Order By order" statement // OrderBy generate "Order By order" statement
func (statement *Statement) OrderBy(order interface{}, args ...interface{}) *Statement { func (statement *Statement) OrderBy(order interface{}, args ...interface{}) *Statement {
statement.orderBy = append(statement.orderBy, orderBy{order, args}) statement.orderBy = append(statement.orderBy, orderBy{order, args, ""})
return statement return statement
} }
// Desc generate `ORDER BY xx DESC` // Desc generate `ORDER BY xx DESC`
func (statement *Statement) Desc(colNames ...string) *Statement { func (statement *Statement) Desc(colNames ...string) *Statement {
for _, colName := range colNames { for _, colName := range colNames {
statement.orderBy = append(statement.orderBy, orderBy{colName + " DESC", nil}) statement.orderBy = append(statement.orderBy, orderBy{colName, nil, "DESC"})
} }
return statement return statement
} }
@ -77,7 +90,7 @@ func (statement *Statement) Desc(colNames ...string) *Statement {
// Asc provide asc order by query condition, the input parameters are columns. // Asc provide asc order by query condition, the input parameters are columns.
func (statement *Statement) Asc(colNames ...string) *Statement { func (statement *Statement) Asc(colNames ...string) *Statement {
for _, colName := range colNames { for _, colName := range colNames {
statement.orderBy = append(statement.orderBy, orderBy{colName + " ASC", nil}) statement.orderBy = append(statement.orderBy, orderBy{colName, nil, "ASC"})
} }
return statement return statement
} }

View File

@ -41,11 +41,6 @@ type join struct {
args []interface{} args []interface{}
} }
type orderBy struct {
orderStr interface{}
orderArgs []interface{}
}
// Statement save all the sql info for executing SQL // Statement save all the sql info for executing SQL
type Statement struct { type Statement struct {
RefTable *schemas.Table RefTable *schemas.Table