Skip to content

Commit 86a7356

Browse files
committed
feat: add bracket query
1 parent 36a1bad commit 86a7356

File tree

6 files changed

+72
-15
lines changed

6 files changed

+72
-15
lines changed

constants/constants.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package constants
22

33
const (
4-
COMMA = ","
4+
Comma = ","
5+
LeftBracket = "("
6+
RightBracket = ")"
57
)

example/example_select_test.go

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,18 @@ func TestSelectOne2(t *testing.T) {
7070
log.Println(string(marshal))
7171
}
7272

73-
func TestSelectList1(t *testing.T) {
74-
q := &gormplus.Query[User]{}
73+
func f(q *gormplus.Query[User]) *gormplus.Query[User] {
74+
q.Eq(UserColumn.Address, "上海").Or().Eq(UserColumn.Address, "北京")
75+
return q
76+
}
77+
func aa(q1 *gormplus.Query[User]) func(q *gormplus.Query[User]) *gormplus.Query[User] {
78+
return func(q *gormplus.Query[User]) *gormplus.Query[User] {
79+
return q1
80+
}
81+
}
82+
83+
func TestSelectList(t *testing.T) {
84+
q := gormplus.NewQuery[User]()
7585
q.Eq(UserColumn.Username, "zhangsan")
7686
users, resultDb := gormplus.SelectList(q)
7787
if resultDb.Error != nil {
@@ -83,6 +93,21 @@ func TestSelectList1(t *testing.T) {
8393
}
8494
}
8595

96+
func TestSelectBracketList(t *testing.T) {
97+
q := gormplus.NewQuery[User]()
98+
bracketQuery := gormplus.NewQuery[User]()
99+
bracketQuery.Eq(UserColumn.Address, "上海").Or().Eq(UserColumn.Address, "北京")
100+
q.Eq(UserColumn.Username, "zhangsan").AndBracket(bracketQuery)
101+
users, resultDb := gormplus.SelectList(q)
102+
if resultDb.Error != nil {
103+
log.Fatalln("error:", resultDb.Error)
104+
}
105+
for _, u := range users {
106+
marshal, _ := json.Marshal(u)
107+
log.Println(string(marshal))
108+
}
109+
}
110+
86111
func TestSelectTableList(t *testing.T) {
87112
type deptCount struct {
88113
Dept string

example/user.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ type User struct {
66
ID int64 `gorm:"primaryKey"`
77
Username string `gorm:"column:username"`
88
Password string
9+
Address string
910
Age int
1011
Phone string
1112
Score int

example/zz_gen_column.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var UserColumn = struct {
44
ID string
55
Username string
66
Password string
7+
Address string
78
Age string
89
Phone string
910
Score string
@@ -14,6 +15,7 @@ var UserColumn = struct {
1415
ID: "id",
1516
Username: "username",
1617
Password: "password",
18+
Address: "address",
1719
Age: "age",
1820
Phone: "phone",
1921
Score: "score",

gormplus/mapper.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,17 @@ func buildCondition[T any](q *Query[T]) *gorm.DB {
166166
}
167167

168168
if q.QueryBuilder.Len() > 0 {
169+
170+
if q.AndBracketBuilder.Len() > 0 {
171+
q.QueryArgs = append(q.QueryArgs, q.AndBracketArgs...)
172+
q.QueryBuilder.WriteString(q.AndBracketBuilder.String())
173+
}
174+
175+
if q.OrBracketBuilder.Len() > 0 {
176+
q.QueryArgs = append(q.QueryArgs, q.OrBracketArgs...)
177+
q.QueryBuilder.WriteString(q.OrBracketBuilder.String())
178+
}
179+
169180
resultDb.Where(q.QueryBuilder.String(), q.QueryArgs...)
170181
}
171182

gormplus/query.go

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,20 @@ import (
77
)
88

99
type Query[T any] struct {
10-
SelectColumns []string
11-
DistinctColumns []string
12-
QueryBuilder strings.Builder
13-
QueryArgs []any
14-
OrderBuilder strings.Builder
15-
GroupBuilder strings.Builder
16-
HavingBuilder strings.Builder
17-
HavingArgs []any
18-
LastCond string
19-
UpdateMap map[string]any
10+
SelectColumns []string
11+
DistinctColumns []string
12+
QueryBuilder strings.Builder
13+
OrBracketBuilder strings.Builder
14+
OrBracketArgs []any
15+
AndBracketBuilder strings.Builder
16+
AndBracketArgs []any
17+
QueryArgs []any
18+
OrderBuilder strings.Builder
19+
GroupBuilder strings.Builder
20+
HavingBuilder strings.Builder
21+
HavingArgs []any
22+
LastCond string
23+
UpdateMap map[string]any
2024
}
2125

2226
func NewQuery[T any]() *Query[T] {
@@ -129,13 +133,25 @@ func (q *Query[T]) And() *Query[T] {
129133
return q
130134
}
131135

136+
func (q *Query[T]) AndBracket(bracketQuery *Query[T]) *Query[T] {
137+
q.AndBracketBuilder.WriteString(constants.And + " " + constants.LeftBracket + bracketQuery.QueryBuilder.String() + constants.RightBracket + " ")
138+
q.AndBracketArgs = append(q.AndBracketArgs, bracketQuery.QueryArgs...)
139+
return q
140+
}
141+
132142
func (q *Query[T]) Or() *Query[T] {
133143
q.QueryBuilder.WriteString(constants.Or)
134144
q.QueryBuilder.WriteString(" ")
135145
q.LastCond = constants.Or
136146
return q
137147
}
138148

149+
func (q *Query[T]) OrBracket(bracketQuery *Query[T]) *Query[T] {
150+
q.OrBracketBuilder.WriteString(constants.Or + " " + constants.LeftBracket + bracketQuery.QueryBuilder.String() + constants.RightBracket + " ")
151+
q.OrBracketArgs = append(q.OrBracketArgs, bracketQuery.QueryArgs...)
152+
return q
153+
}
154+
139155
func (q *Query[T]) Select(columns ...string) *Query[T] {
140156
q.SelectColumns = append(q.SelectColumns, columns...)
141157
return q
@@ -154,7 +170,7 @@ func (q *Query[T]) OrderByAsc(columns ...string) *Query[T] {
154170
func (q *Query[T]) Group(columns ...string) *Query[T] {
155171
for _, v := range columns {
156172
if q.GroupBuilder.Len() > 0 {
157-
q.GroupBuilder.WriteString(constants.COMMA)
173+
q.GroupBuilder.WriteString(constants.Comma)
158174
}
159175
q.GroupBuilder.WriteString(v)
160176
}
@@ -194,7 +210,7 @@ func (q *Query[T]) buildAndIfNeed() {
194210
func (q *Query[T]) buildOrder(orderType string, columns ...string) {
195211
for _, v := range columns {
196212
if q.OrderBuilder.Len() > 0 {
197-
q.OrderBuilder.WriteString(constants.COMMA)
213+
q.OrderBuilder.WriteString(constants.Comma)
198214
}
199215
q.OrderBuilder.WriteString(v)
200216
q.OrderBuilder.WriteString(" ")

0 commit comments

Comments
 (0)