91 lines
2.2 KiB
Go
91 lines
2.2 KiB
Go
// Copyright 2022 The Xorm Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package statements
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"xorm.io/builder"
|
|
)
|
|
|
|
func (statement *Statement) HasOrderBy() bool {
|
|
return statement.orderStr != ""
|
|
}
|
|
|
|
// ResetOrderBy reset ordery conditions
|
|
func (statement *Statement) ResetOrderBy() {
|
|
statement.orderStr = ""
|
|
statement.orderArgs = nil
|
|
}
|
|
|
|
// WriteOrderBy write order by to writer
|
|
func (statement *Statement) WriteOrderBy(w builder.Writer) error {
|
|
if len(statement.orderStr) > 0 {
|
|
if _, err := fmt.Fprintf(w, " ORDER BY %s", statement.orderStr); err != nil {
|
|
return err
|
|
}
|
|
w.Append(statement.orderArgs...)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// OrderBy generate "Order By order" statement
|
|
func (statement *Statement) OrderBy(order interface{}, args ...interface{}) *Statement {
|
|
if len(statement.orderStr) > 0 {
|
|
statement.orderStr += ", "
|
|
}
|
|
var rawOrder string
|
|
switch t := order.(type) {
|
|
case (*builder.Expression):
|
|
rawOrder = t.Content()
|
|
args = t.Args()
|
|
case string:
|
|
rawOrder = t
|
|
default:
|
|
statement.LastError = ErrUnSupportedSQLType
|
|
return statement
|
|
}
|
|
statement.orderStr += statement.ReplaceQuote(rawOrder)
|
|
if len(args) > 0 {
|
|
statement.orderArgs = append(statement.orderArgs, args...)
|
|
}
|
|
return statement
|
|
}
|
|
|
|
// Desc generate `ORDER BY xx DESC`
|
|
func (statement *Statement) Desc(colNames ...string) *Statement {
|
|
var buf strings.Builder
|
|
if len(statement.orderStr) > 0 {
|
|
fmt.Fprint(&buf, statement.orderStr, ", ")
|
|
}
|
|
for i, col := range colNames {
|
|
if i > 0 {
|
|
fmt.Fprint(&buf, ", ")
|
|
}
|
|
_ = statement.dialect.Quoter().QuoteTo(&buf, col)
|
|
fmt.Fprint(&buf, " DESC")
|
|
}
|
|
statement.orderStr = buf.String()
|
|
return statement
|
|
}
|
|
|
|
// Asc provide asc order by query condition, the input parameters are columns.
|
|
func (statement *Statement) Asc(colNames ...string) *Statement {
|
|
var buf strings.Builder
|
|
if len(statement.orderStr) > 0 {
|
|
fmt.Fprint(&buf, statement.orderStr, ", ")
|
|
}
|
|
for i, col := range colNames {
|
|
if i > 0 {
|
|
fmt.Fprint(&buf, ", ")
|
|
}
|
|
_ = statement.dialect.Quoter().QuoteTo(&buf, col)
|
|
fmt.Fprint(&buf, " ASC")
|
|
}
|
|
statement.orderStr = buf.String()
|
|
return statement
|
|
}
|