Skip to content

Commit 8c2a219

Browse files
committed
Chain builder
1 parent 2138b9e commit 8c2a219

9 files changed

Lines changed: 508 additions & 486 deletions

File tree

benchmarks/concurrent_test.go

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -44,58 +44,64 @@ func Benchmark_Concurrent(b *testing.B) {
4444
Query query.Query[*User]
4545
}{
4646
{
47-
Name: "is_online = true",
48-
Query: query.NewBuilder[*User](query.WhereBool(userIsOnline, where.EQ, true)).Query(),
47+
Name: "is_online = true",
48+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
49+
AddWhere(query.WhereBool(userIsOnline, where.EQ, true)).
50+
Query(),
4951
},
5052
{
5153
Name: "is_online = true offset 1000 limit 100",
52-
Query: query.NewBuilder[*User](
53-
query.WhereBool(userIsOnline, where.EQ, true),
54-
query.Offset(1000),
55-
query.Limit(100),
56-
).Query(),
54+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
55+
AddWhere(query.WhereBool(userIsOnline, where.EQ, true)).
56+
Offset(1000).
57+
Limit(100).
58+
Query(),
5759
},
5860
{
59-
Name: "id <= 5000",
60-
Query: query.NewBuilder[*User](query.Where(userID, where.LE, 5000)).Query(),
61+
Name: "id <= 5000",
62+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
63+
AddWhere(query.Where(userID, where.LE, 5000)).
64+
Query(),
6165
},
6266
{
63-
Name: "id > 1000",
64-
Query: query.NewBuilder[*User](query.Where(userID, where.GT, 1000)).Query(),
67+
Name: "id > 1000",
68+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
69+
AddWhere(query.Where(userID, where.GT, 1000)).
70+
Query(),
6571
},
6672
{
6773
Name: "id > 1000 limit 100 asc",
68-
Query: query.NewBuilder[*User](
69-
query.Where(userID, where.GT, 1000),
70-
query.Limit(100),
71-
query.Sort(sort.Asc[*User](userID)),
72-
).Query(),
74+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
75+
AddWhere(query.Where(userID, where.GT, 1000)).
76+
Limit(100).
77+
Sort(sort.Asc[*User](userID)).
78+
Query(),
7379
},
7480
{
7581
Name: "id > 1000 limit 100 desc",
76-
Query: query.NewBuilder[*User](
77-
query.Where(userID, where.GT, 1000),
78-
query.Limit(100),
79-
query.Sort(sort.Desc[*User](userID)),
80-
).Query(),
82+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
83+
AddWhere(query.Where(userID, where.GT, 1000)).
84+
Limit(100).
85+
Sort(sort.Desc[*User](userID)).
86+
Query(),
8187
},
8288
{
8389
Name: "id > 1000 and is_online = true and status = ACTIVE",
84-
Query: query.NewBuilder[*User](
85-
query.Where(userID, where.GT, 1000),
86-
query.WhereBool(userIsOnline, where.EQ, true),
87-
query.Where(userStatus, where.EQ, StatusActive),
88-
).Query(),
90+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
91+
AddWhere(query.Where(userID, where.GT, 1000)).
92+
AddWhere(query.WhereBool(userIsOnline, where.EQ, true)).
93+
AddWhere(query.Where(userStatus, where.EQ, StatusActive)).
94+
Query(),
8995
},
9096
{
9197
Name: "id > 1000 and is_online = true and status = ACTIVE limit 100 desc",
92-
Query: query.NewBuilder[*User](
93-
query.Where(userID, where.GT, 1000),
94-
query.WhereBool(userIsOnline, where.EQ, true),
95-
query.Where(userStatus, where.EQ, StatusActive),
96-
query.Sort(sort.Asc[*User](userID)),
97-
query.Limit(100),
98-
).Query(),
98+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
99+
AddWhere(query.Where(userID, where.GT, 1000)).
100+
AddWhere(query.WhereBool(userIsOnline, where.EQ, true)).
101+
AddWhere(query.Where(userStatus, where.EQ, StatusActive)).
102+
Sort(sort.Asc[*User](userID)).
103+
Limit(100).
104+
Query(),
99105
},
100106
}
101107

benchmarks/indexes_test.go

Lines changed: 75 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -65,100 +65,116 @@ func Benchmark_Indexes(b *testing.B) {
6565
Query query.Query[*User]
6666
}{
6767
{
68-
Name: "id = 500",
69-
Query: query.NewBuilder[*User](query.Where(userID, where.EQ, 500)).Query(),
68+
Name: "id = 500",
69+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
70+
AddWhere(query.Where(userID, where.EQ, 500)).
71+
Query(),
7072
},
7173
{
72-
Name: "id IN (500, 1000, 1500)",
73-
Query: query.NewBuilder[*User](query.Where(userID, where.InArray, 500, 1000, 1500)).Query(),
74+
Name: "id IN (500, 1000, 1500)",
75+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
76+
AddWhere(query.Where(userID, where.InArray, 500, 1000, 1500)).
77+
Query(),
7478
},
7579
{
76-
Name: "id <= 1000",
77-
Query: query.NewBuilder[*User](query.Where(userID, where.LE, 1000)).Query(),
80+
Name: "id <= 1000",
81+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
82+
AddWhere(query.Where(userID, where.LE, 1000)).
83+
Query(),
7884
},
7985
{
80-
Name: "id > 1000",
81-
Query: query.NewBuilder[*User](query.Where(userID, where.GT, 1000)).Query(),
86+
Name: "id > 1000",
87+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
88+
AddWhere(query.Where(userID, where.GT, 1000)).
89+
Query(),
8290
},
8391
{
84-
Name: "id <= 5000",
85-
Query: query.NewBuilder[*User](query.Where(userID, where.LE, 5000)).Query(),
92+
Name: "id <= 5000",
93+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
94+
AddWhere(query.Where(userID, where.LE, 5000)).
95+
Query(),
8696
},
8797
{
88-
Name: "id > 5000",
89-
Query: query.NewBuilder[*User](query.Where(userID, where.GT, 5000)).Query(),
98+
Name: "id > 5000",
99+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
100+
AddWhere(query.Where(userID, where.GT, 5000)).
101+
Query(),
90102
},
91103
{
92104
Name: "id > 2000 and id < 3000",
93-
Query: query.NewBuilder[*User](
94-
query.Where(userID, where.GT, 2000),
95-
query.Where(userID, where.LT, 3000),
96-
).Query(),
105+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
106+
AddWhere(query.Where(userID, where.GT, 2000)).
107+
AddWhere(query.Where(userID, where.LT, 3000)).
108+
Query(),
97109
},
98110
{
99111
Name: "id < 2000 or id > 8000",
100-
Query: query.NewBuilder[*User](
101-
query.Where(userID, where.LT, 2000),
102-
query.Or(),
103-
query.Where(userID, where.GT, 8000),
104-
).Query(),
112+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
113+
AddWhere(query.Where(userID, where.LT, 2000)).
114+
Or().
115+
AddWhere(query.Where(userID, where.GT, 8000)).
116+
Query(),
105117
},
106118
{
107119
Name: "id < 1000 limit 100 asc",
108-
Query: query.NewBuilder[*User](
109-
query.Where(userID, where.LT, 1000),
110-
query.Limit(100),
111-
query.Sort(sort.Asc[*User](userID)),
112-
).Query(),
120+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
121+
AddWhere(query.Where(userID, where.LT, 1000)).
122+
Limit(100).
123+
Sort(sort.Asc[*User](userID)).
124+
Query(),
113125
},
114126
{
115127
Name: "id < 1000 limit 100 desc",
116-
Query: query.NewBuilder[*User](
117-
query.Where(userID, where.LT, 1000),
118-
query.Limit(100),
119-
query.Sort(sort.Desc[*User](userID)),
120-
).Query(),
128+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
129+
AddWhere(query.Where(userID, where.LT, 1000)).
130+
Limit(100).
131+
Sort(sort.Desc[*User](userID)).
132+
Query(),
121133
},
122134
{
123135
Name: "id < 1000 limit 100 offset 50 asc",
124-
Query: query.NewBuilder[*User](
125-
query.Where(userID, where.LT, 1000),
126-
query.Limit(100),
127-
query.Offset(50),
128-
query.Sort(sort.Asc[*User](userID)),
129-
).Query(),
136+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
137+
AddWhere(query.Where(userID, where.LT, 1000)).
138+
Limit(100).
139+
Offset(50).
140+
Sort(sort.Asc[*User](userID)).
141+
Query(),
130142
},
131143
{
132144
Name: "id < 1000 limit 100 offset 50 desc",
133-
Query: query.NewBuilder[*User](
134-
query.Where(userID, where.LT, 1000),
135-
query.Limit(100),
136-
query.Offset(50),
137-
query.Sort(sort.Desc[*User](userID)),
138-
).Query(),
145+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
146+
AddWhere(query.Where(userID, where.LT, 1000)).
147+
Limit(100).
148+
Offset(50).
149+
Sort(sort.Desc[*User](userID)).
150+
Query(),
139151
},
140152
{
141-
Name: "age < 18",
142-
Query: query.NewBuilder[*User](query.Where(userAge, where.LT, 18)).Query(),
153+
Name: "age < 18",
154+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
155+
AddWhere(query.Where(userAge, where.LT, 18)).
156+
Query(),
143157
},
144158
{
145-
Name: "age <= 17",
146-
Query: query.NewBuilder[*User](query.Where(userAge, where.LE, 17)).Query(),
159+
Name: "age <= 17",
160+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
161+
AddWhere(query.Where(userAge, where.LE, 17)).
162+
Query(),
147163
},
148164
{
149165
Name: "age > 18 and age < 45",
150-
Query: query.NewBuilder[*User](
151-
query.Where(userAge, where.GT, 18),
152-
query.Where(userAge, where.LT, 45),
153-
).Query(),
166+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
167+
AddWhere(query.Where(userAge, where.GT, 18)).
168+
AddWhere(query.Where(userAge, where.LT, 45)).
169+
Query(),
154170
},
155171
{
156172
Name: "age > 18 and age < 45 and id > 2000",
157-
Query: query.NewBuilder[*User](
158-
query.Where(userAge, where.GT, 18),
159-
query.Where(userAge, where.LT, 45),
160-
query.Where(userID, where.GT, 2000),
161-
).Query(),
173+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
174+
AddWhere(query.Where(userAge, where.GT, 18)).
175+
AddWhere(query.Where(userAge, where.LT, 45)).
176+
AddWhere(query.Where(userID, where.GT, 2000)).
177+
Query(),
162178
},
163179
}
164180

@@ -230,7 +246,9 @@ func Benchmark_BTreeIndexesMaxChildren(b *testing.B) {
230246
}
231247
}
232248

233-
q := query.NewBuilder[*User](query.Where(userAge, where.LT, 5)).Query()
249+
q := query.NewChainBuilder(query.NewBuilder[*User]()).
250+
AddWhere(query.Where(userAge, where.LT, 5)).
251+
Query()
234252

235253
for i, store := range stores {
236254
exec := executor.CreateQueryExecutor[*User](store)

benchmarks/query_test.go

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -41,58 +41,64 @@ func Benchmark_Query(b *testing.B) {
4141
Query query.Query[*User]
4242
}{
4343
{
44-
Name: "is_online = true",
45-
Query: query.NewBuilder[*User](query.WhereBool(userIsOnline, where.EQ, true)).Query(),
44+
Name: "is_online = true",
45+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
46+
AddWhere(query.WhereBool(userIsOnline, where.EQ, true)).
47+
Query(),
4648
},
4749
{
4850
Name: "is_online = true offset 1000 limit 100",
49-
Query: query.NewBuilder[*User](
50-
query.WhereBool(userIsOnline, where.EQ, true),
51-
query.Offset(1000),
52-
query.Limit(100),
53-
).Query(),
51+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
52+
AddWhere(query.WhereBool(userIsOnline, where.EQ, true)).
53+
Offset(1000).
54+
Limit(100).
55+
Query(),
5456
},
5557
{
56-
Name: "id <= 5000",
57-
Query: query.NewBuilder[*User](query.Where(userID, where.LE, 5000)).Query(),
58+
Name: "id <= 5000",
59+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
60+
AddWhere(query.Where(userID, where.LE, 5000)).
61+
Query(),
5862
},
5963
{
60-
Name: "id > 1000",
61-
Query: query.NewBuilder[*User](query.Where(userID, where.GT, 1000)).Query(),
64+
Name: "id > 1000",
65+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
66+
AddWhere(query.Where(userID, where.GT, 1000)).
67+
Query(),
6268
},
6369
{
6470
Name: "id > 1000 limit 100 asc",
65-
Query: query.NewBuilder[*User](
66-
query.Where(userID, where.GT, 1000),
67-
query.Limit(100),
68-
query.Sort(sort.Asc[*User](userID)),
69-
).Query(),
71+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
72+
AddWhere(query.Where(userID, where.GT, 1000)).
73+
Limit(100).
74+
Sort(sort.Asc[*User](userID)).
75+
Query(),
7076
},
7177
{
7278
Name: "id > 1000 limit 100 desc",
73-
Query: query.NewBuilder[*User](
74-
query.Where(userID, where.GT, 1000),
75-
query.Limit(100),
76-
query.Sort(sort.Desc[*User](userID)),
77-
).Query(),
79+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
80+
AddWhere(query.Where(userID, where.GT, 1000)).
81+
Limit(100).
82+
Sort(sort.Desc[*User](userID)).
83+
Query(),
7884
},
7985
{
8086
Name: "id > 1000 and is_online = true and status = ACTIVE",
81-
Query: query.NewBuilder[*User](
82-
query.Where(userID, where.GT, 1000),
83-
query.WhereBool(userIsOnline, where.EQ, true),
84-
query.Where(userStatus, where.EQ, StatusActive),
85-
).Query(),
87+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
88+
AddWhere(query.Where(userID, where.GT, 1000)).
89+
AddWhere(query.WhereBool(userIsOnline, where.EQ, true)).
90+
AddWhere(query.Where(userStatus, where.EQ, StatusActive)).
91+
Query(),
8692
},
8793
{
8894
Name: "id > 1000 and is_online = true and status = ACTIVE limit 100 desc",
89-
Query: query.NewBuilder[*User](
90-
query.Where(userID, where.GT, 1000),
91-
query.WhereBool(userIsOnline, where.EQ, true),
92-
query.Where(userStatus, where.EQ, StatusActive),
93-
query.Sort(sort.Asc[*User](userID)),
94-
query.Limit(100),
95-
).Query(),
95+
Query: query.NewChainBuilder(query.NewBuilder[*User]()).
96+
AddWhere(query.Where(userID, where.GT, 1000)).
97+
AddWhere(query.WhereBool(userIsOnline, where.EQ, true)).
98+
AddWhere(query.Where(userStatus, where.EQ, StatusActive)).
99+
Sort(sort.Asc[*User](userID)).
100+
Limit(100).
101+
Query(),
96102
},
97103
}
98104

benchmarks/sqlite_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,9 @@ func Benchmark_SIMDVsSQLite(b *testing.B) { //nolint:gocognit,cyclop
8585
for i := 1; i < usersCount/4; i++ {
8686
cur, err := qe.FetchAll(
8787
context.Background(),
88-
query.NewBuilder[*User](
89-
query.Where(userID, where.EQ, int64(i)),
90-
).Query(),
88+
query.NewChainBuilder(query.NewBuilder[*User]()).
89+
AddWhere(query.Where(userID, where.EQ, int64(i))).
90+
Query(),
9191
)
9292
if nil != err {
9393
b.Fatalf("query: %s", err)

0 commit comments

Comments
 (0)