Skip to content

Commit ed88c5d

Browse files
committed
refactor: update OrderBy clause to use Exprs instead of Columns
1 parent 9f27377 commit ed88c5d

File tree

4 files changed

+43
-33
lines changed

4 files changed

+43
-33
lines changed

chainable_api.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -318,12 +318,12 @@ func (db *DB) Order(value interface{}) (tx *DB) {
318318
tx.Statement.AddClause(v)
319319
case clause.OrderByColumn:
320320
tx.Statement.AddClause(clause.OrderBy{
321-
Columns: []clause.OrderByColumn{v},
321+
Exprs: []clause.Expression{v},
322322
})
323323
case string:
324324
if v != "" {
325325
tx.Statement.AddClause(clause.OrderBy{
326-
Columns: []clause.OrderByColumn{{
326+
Exprs: []clause.Expression{clause.OrderByColumn{
327327
Column: clause.Column{Name: v, Raw: true},
328328
}},
329329
})
@@ -448,9 +448,10 @@ func (db *DB) Assign(attrs ...interface{}) (tx *DB) {
448448
// Unscoped allows queries to include records marked as deleted,
449449
// overriding the soft deletion behavior.
450450
// Example:
451-
// var users []User
452-
// db.Unscoped().Find(&users)
453-
// // Retrieves all users, including deleted ones.
451+
//
452+
// var users []User
453+
// db.Unscoped().Find(&users)
454+
// // Retrieves all users, including deleted ones.
454455
func (db *DB) Unscoped() (tx *DB) {
455456
tx = db.getInstance()
456457
tx.Statement.Unscoped = true

clause/benchmarks_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func BenchmarkComplexSelect(b *testing.B) {
4545
}},
4646
clause.GroupBy{Columns: []clause.Column{{Name: "role"}}, Having: []clause.Expression{clause.Eq{"role", "admin"}}},
4747
clause.Limit{Limit: &limit10, Offset: 20},
48-
clause.OrderBy{Columns: []clause.OrderByColumn{{Column: clause.PrimaryColumn, Desc: true}}},
48+
clause.OrderBy{Exprs: []clause.Expression{clause.OrderByColumn{Column: clause.PrimaryColumn, Desc: true}}},
4949
}
5050

5151
for _, clause := range clauses {

clause/order_by.go

+18-21
Original file line numberDiff line numberDiff line change
@@ -6,48 +6,45 @@ type OrderByColumn struct {
66
Reorder bool
77
}
88

9+
func (column OrderByColumn) Build(builder Builder) {
10+
builder.WriteQuoted(column.Column)
11+
if column.Desc {
12+
builder.WriteString(" DESC")
13+
}
14+
}
15+
916
type OrderBy struct {
10-
Columns []OrderByColumn
11-
Expression Expression
17+
Exprs []Expression
1218
}
1319

14-
// Name where clause name
1520
func (orderBy OrderBy) Name() string {
1621
return "ORDER BY"
1722
}
1823

1924
// Build build where clause
2025
func (orderBy OrderBy) Build(builder Builder) {
21-
if orderBy.Expression != nil {
22-
orderBy.Expression.Build(builder)
23-
} else {
24-
for idx, column := range orderBy.Columns {
25-
if idx > 0 {
26-
builder.WriteByte(',')
27-
}
28-
29-
builder.WriteQuoted(column.Column)
30-
if column.Desc {
31-
builder.WriteString(" DESC")
32-
}
26+
for idx, expression := range orderBy.Exprs {
27+
if idx > 0 {
28+
builder.WriteByte(',')
3329
}
30+
expression.Build(builder)
3431
}
3532
}
3633

3734
// MergeClause merge order by clauses
3835
func (orderBy OrderBy) MergeClause(clause *Clause) {
3936
if v, ok := clause.Expression.(OrderBy); ok {
40-
for i := len(orderBy.Columns) - 1; i >= 0; i-- {
41-
if orderBy.Columns[i].Reorder {
42-
orderBy.Columns = orderBy.Columns[i:]
37+
for i := len(orderBy.Exprs) - 1; i >= 0; i-- {
38+
if asColumn, ok := orderBy.Exprs[i].(OrderByColumn); ok && asColumn.Reorder {
39+
orderBy.Exprs = orderBy.Exprs[i:]
4340
clause.Expression = orderBy
4441
return
4542
}
4643
}
4744

48-
copiedColumns := make([]OrderByColumn, len(v.Columns))
49-
copy(copiedColumns, v.Columns)
50-
orderBy.Columns = append(copiedColumns, orderBy.Columns...)
45+
copiedColumns := make([]Expression, len(v.Exprs))
46+
copy(copiedColumns, v.Exprs)
47+
orderBy.Exprs = append(copiedColumns, orderBy.Exprs...)
5148
}
5249

5350
clause.Expression = orderBy

clause/order_by_test.go

+18-6
Original file line numberDiff line numberDiff line change
@@ -15,39 +15,51 @@ func TestOrderBy(t *testing.T) {
1515
}{
1616
{
1717
[]clause.Interface{clause.Select{}, clause.From{}, clause.OrderBy{
18-
Columns: []clause.OrderByColumn{{Column: clause.PrimaryColumn, Desc: true}},
18+
Exprs: []clause.Expression{clause.OrderByColumn{Column: clause.PrimaryColumn, Desc: true}},
1919
}},
2020
"SELECT * FROM `users` ORDER BY `users`.`id` DESC", nil,
2121
},
2222
{
2323
[]clause.Interface{
2424
clause.Select{}, clause.From{}, clause.OrderBy{
25-
Columns: []clause.OrderByColumn{{Column: clause.PrimaryColumn, Desc: true}},
25+
Exprs: []clause.Expression{clause.OrderByColumn{Column: clause.PrimaryColumn, Desc: true}},
2626
}, clause.OrderBy{
27-
Columns: []clause.OrderByColumn{{Column: clause.Column{Name: "name"}}},
27+
Exprs: []clause.Expression{clause.OrderByColumn{Column: clause.Column{Name: "name"}}},
2828
},
2929
},
3030
"SELECT * FROM `users` ORDER BY `users`.`id` DESC,`name`", nil,
3131
},
3232
{
3333
[]clause.Interface{
3434
clause.Select{}, clause.From{}, clause.OrderBy{
35-
Columns: []clause.OrderByColumn{{Column: clause.PrimaryColumn, Desc: true}},
35+
Exprs: []clause.Expression{clause.OrderByColumn{Column: clause.PrimaryColumn, Desc: true}},
3636
}, clause.OrderBy{
37-
Columns: []clause.OrderByColumn{{Column: clause.Column{Name: "name"}, Reorder: true}},
37+
Exprs: []clause.Expression{clause.OrderByColumn{Column: clause.Column{Name: "name"}, Reorder: true}},
3838
},
3939
},
4040
"SELECT * FROM `users` ORDER BY `name`", nil,
4141
},
4242
{
4343
[]clause.Interface{
4444
clause.Select{}, clause.From{}, clause.OrderBy{
45-
Expression: clause.Expr{SQL: "FIELD(id, ?)", Vars: []interface{}{[]int{1, 2, 3}}, WithoutParentheses: true},
45+
Exprs: []clause.Expression{clause.Expr{SQL: "FIELD(id, ?)", Vars: []interface{}{[]int{1, 2, 3}}, WithoutParentheses: true}},
4646
},
4747
},
4848
"SELECT * FROM `users` ORDER BY FIELD(id, ?,?,?)",
4949
[]interface{}{1, 2, 3},
5050
},
51+
{
52+
[]clause.Interface{
53+
clause.Select{}, clause.From{}, clause.OrderBy{
54+
Exprs: []clause.Expression{
55+
clause.Expr{SQL: "FIELD(id, ?)", Vars: []interface{}{[]int{1, 2, 3}}, WithoutParentheses: true},
56+
clause.OrderByColumn{Column: clause.PrimaryColumn, Desc: true},
57+
},
58+
},
59+
},
60+
"SELECT * FROM `users` ORDER BY FIELD(id, ?,?,?),`users`.`id` DESC",
61+
[]interface{}{1, 2, 3},
62+
},
5163
}
5264

5365
for idx, result := range results {

0 commit comments

Comments
 (0)