Skip to content

Commit 26bf427

Browse files
authored
Add .all() and .one() to modular selects (#56)
1 parent 172d8aa commit 26bf427

7 files changed

Lines changed: 104 additions & 36 deletions

File tree

docs/pages/modular-selects.md

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,13 @@ const result = await qb
3333
.fields(['id', 'name'])
3434
.where('field = ?1', 'test')
3535
.join({ type: JoinTypes.LEFT, table: 'employees', on: 'testTable.employee_id = employees.id' })
36-
.execute()
36+
.all()
3737
```
3838

39+
### Execution Methods
40+
41+
#### .count()
42+
3943
Count method is also available for the modular selects
4044

4145
```ts
@@ -50,3 +54,39 @@ const result = await qb
5054

5155
console.log(`Total results: ${result.results.total}`)
5256
```
57+
58+
#### .all()
59+
60+
This is the same as calling `qb.fetchAll()` or calling `qb.select().execute()`
61+
62+
```ts
63+
const qb = new D1QB(env.DB)
64+
65+
const result = await qb.select('testTable').fields(['id', 'name']).where('field = ?1', 'test').all()
66+
67+
console.log(`Total results: ${result.results.length}`)
68+
```
69+
70+
#### .execute()
71+
72+
This is the same as calling `qb.fetchAll()` or calling `qb.select().all()`
73+
74+
```ts
75+
const qb = new D1QB(env.DB)
76+
77+
const result = await qb.select('testTable').fields(['id', 'name']).where('field = ?1', 'test').execute()
78+
79+
console.log(`Total results: ${result.results.length}`)
80+
```
81+
82+
#### .one()
83+
84+
This is the same as calling `qb.fetchOne()`
85+
86+
```ts
87+
const qb = new D1QB(env.DB)
88+
89+
const result = await qb.select('testTable').fields(['id', 'name']).where('field = ?1', 'test').one()
90+
91+
console.log(`Result: ${result.results}`)
92+
```

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "workers-qb",
3-
"version": "1.5.0",
3+
"version": "1.5.1",
44
"description": "Zero dependencies Query Builder for Cloudflare Workers",
55
"main": "./dist/index.js",
66
"module": "./dist/index.mjs",

src/builder.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ export class QueryBuilder<GenericResultWrapper> {
108108
},
109109
(params: SelectAll) => {
110110
return this.fetchAll<GenericResult>(params)
111+
},
112+
(params: SelectOne) => {
113+
return this.fetchOne<GenericResult>(params)
111114
}
112115
)
113116
}

src/modularBuilder.ts

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
1-
import { ArrayResult, CountResult, DefaultReturnObject, Primitive, SelectAll } from './interfaces'
1+
import { ArrayResult, CountResult, DefaultReturnObject, OneResult, Primitive, SelectAll, SelectOne } from './interfaces'
22
import { Query, QueryWithExtra } from './tools'
33

44
export class SelectBuilder<GenericResultWrapper, GenericResult = DefaultReturnObject> {
55
_debugger = false
66
private _options: Partial<SelectAll> = {}
7-
private _queryBuilder: (params: SelectAll) => QueryWithExtra<GenericResultWrapper>
8-
9-
constructor(options: Partial<SelectAll>, queryBuilder: (params: SelectAll) => QueryWithExtra<GenericResultWrapper>) {
7+
private _fetchAll: (params: SelectAll) => QueryWithExtra<GenericResultWrapper>
8+
private _fetchOne: (params: SelectOne) => QueryWithExtra<GenericResultWrapper>
9+
10+
constructor(
11+
options: Partial<SelectAll>,
12+
fetchAll: (params: SelectAll) => QueryWithExtra<GenericResultWrapper>,
13+
fetchOne: (params: SelectOne) => QueryWithExtra<GenericResultWrapper>
14+
) {
1015
this._options = options
11-
this._queryBuilder = queryBuilder
16+
this._fetchAll = fetchAll
17+
this._fetchOne = fetchOne
1218
}
1319

1420
setDebugger(state: boolean): void {
@@ -21,7 +27,8 @@ export class SelectBuilder<GenericResultWrapper, GenericResult = DefaultReturnOb
2127
...this._options,
2228
tableName: tableName,
2329
},
24-
this._queryBuilder
30+
this._fetchAll,
31+
this._fetchOne
2532
)
2633
}
2734

@@ -57,7 +64,8 @@ export class SelectBuilder<GenericResultWrapper, GenericResult = DefaultReturnOb
5764
params: params,
5865
},
5966
},
60-
this._queryBuilder
67+
this._fetchAll,
68+
this._fetchOne
6169
)
6270
}
6371

@@ -83,7 +91,8 @@ export class SelectBuilder<GenericResultWrapper, GenericResult = DefaultReturnOb
8391
...this._options,
8492
offset: offset,
8593
},
86-
this._queryBuilder
94+
this._fetchAll,
95+
this._fetchOne
8796
)
8897
}
8998

@@ -93,7 +102,8 @@ export class SelectBuilder<GenericResultWrapper, GenericResult = DefaultReturnOb
93102
...this._options,
94103
limit: limit,
95104
},
96-
this._queryBuilder
105+
this._fetchAll,
106+
this._fetchOne
97107
)
98108
}
99109

@@ -114,19 +124,32 @@ export class SelectBuilder<GenericResultWrapper, GenericResult = DefaultReturnOb
114124
...this._options,
115125
[fieldName]: val as Array<string>,
116126
},
117-
this._queryBuilder
127+
this._fetchAll,
128+
this._fetchOne
118129
)
119130
}
120131

121-
getQuery(): Query<ArrayResult<GenericResultWrapper, GenericResult>> {
122-
return this._queryBuilder(this._options as SelectAll)
132+
getQueryAll(): Query<ArrayResult<GenericResultWrapper, GenericResult>> {
133+
return this._fetchAll(this._options as SelectAll)
134+
}
135+
136+
getQueryOne(): Query<OneResult<GenericResultWrapper, GenericResult>> {
137+
return this._fetchOne(this._options as SelectAll)
123138
}
124139

125140
async execute(): Promise<ArrayResult<GenericResultWrapper, GenericResult>> {
126-
return this._queryBuilder(this._options as SelectAll).execute()
141+
return this._fetchAll(this._options as SelectAll).execute()
142+
}
143+
144+
async all(): Promise<ArrayResult<GenericResultWrapper, GenericResult>> {
145+
return this._fetchAll(this._options as SelectAll).execute()
146+
}
147+
148+
async one(): Promise<OneResult<GenericResultWrapper, GenericResult>> {
149+
return this._fetchOne(this._options as SelectOne).execute()
127150
}
128151

129152
async count(): Promise<CountResult<GenericResultWrapper>> {
130-
return this._queryBuilder(this._options as SelectAll).count()
153+
return this._fetchOne(this._options as SelectOne).count()
131154
}
132155
}

tests/builder/select.test.ts

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ describe('Select Builder', () => {
88
tableName: 'testTable',
99
fields: '*',
1010
}),
11-
new QuerybuilderTest().select('testTable').fields('*').getQuery(),
11+
new QuerybuilderTest().select('testTable').fields('*').getQueryAll(),
1212
]) {
1313
expect(result.query).toEqual('SELECT * FROM testTable')
1414
expect(result.arguments).toBeUndefined()
@@ -21,7 +21,7 @@ describe('Select Builder', () => {
2121
new QuerybuilderTest().fetchAll({
2222
tableName: 'testTable',
2323
}),
24-
new QuerybuilderTest().select('testTable').getQuery(),
24+
new QuerybuilderTest().select('testTable').getQueryAll(),
2525
]) {
2626
expect(result.query).toEqual('SELECT * FROM testTable')
2727
expect(result.arguments).toBeUndefined()
@@ -34,6 +34,7 @@ describe('Select Builder', () => {
3434
new QuerybuilderTest().fetchOne({
3535
tableName: 'testTable',
3636
}),
37+
new QuerybuilderTest().select('testTable').getQueryOne(),
3738
]) {
3839
expect(result.query).toEqual('SELECT * FROM testTable LIMIT 1')
3940
expect(result.arguments).toBeUndefined()
@@ -47,12 +48,13 @@ describe('Select Builder', () => {
4748
tableName: 'testTable',
4849
fields: '*',
4950
where: {
50-
conditions: 'field = ?1',
51+
conditions: 'field = ?',
5152
params: ['test'],
5253
},
5354
}),
55+
new QuerybuilderTest().select('testTable').where('field = ?', 'test').getQueryOne(),
5456
]) {
55-
expect(result.query).toEqual('SELECT * FROM testTable WHERE field = ?1 LIMIT 1')
57+
expect(result.query).toEqual('SELECT * FROM testTable WHERE field = ? LIMIT 1')
5658
expect(result.arguments).toEqual(['test'])
5759
expect(result.fetchType).toEqual('ONE')
5860
}
@@ -156,7 +158,7 @@ describe('Select Builder', () => {
156158
.fields('*')
157159
.where('field = ?1', 'test')
158160
.join({ table: 'employees', on: 'testTable.employee_id = employees.id' })
159-
.getQuery(),
161+
.getQueryAll(),
160162
]) {
161163
expect(result.query).toEqual(
162164
'SELECT * FROM testTable JOIN employees ON testTable.employee_id = employees.id ' + 'WHERE field = ?1'
@@ -268,7 +270,7 @@ describe('Select Builder', () => {
268270
.fields(['id', 'name'])
269271
.where('field = ?1', 'test')
270272
.join({ type: JoinTypes.LEFT, table: 'employees', on: 'testTable.employee_id = employees.id' })
271-
.getQuery(),
273+
.getQueryAll(),
272274
]) {
273275
expect(result.query).toEqual(
274276
'SELECT id, name FROM testTable LEFT JOIN employees ON testTable.employee_id = employees.id WHERE field = ?1'
@@ -310,7 +312,7 @@ describe('Select Builder', () => {
310312
on: 'testTable.id = otherTableGrouped.test_table_id',
311313
alias: 'otherTableGrouped',
312314
})
313-
.getQuery(),
315+
.getQueryAll(),
314316
]) {
315317
expect(result.query).toEqual(
316318
'SELECT * FROM testTable JOIN (SELECT test_table_id, GROUP_CONCAT(attribute) ' +
@@ -426,7 +428,7 @@ describe('Select Builder', () => {
426428
on: 'testTable.id = otherTableGrouped.test_table_id',
427429
alias: 'otherTableGrouped',
428430
})
429-
.getQuery(),
431+
.getQueryAll(),
430432
]) {
431433
expect(result.query).toEqual(
432434
'SELECT * FROM testTable JOIN (SELECT test_table_id, GROUP_CONCAT(attribute) ' +
@@ -471,7 +473,7 @@ describe('Select Builder', () => {
471473
.fields('*')
472474
.where('field = ?', 'test')
473475
.where('test = ?', 123)
474-
.getQuery(),
476+
.getQueryAll(),
475477
]) {
476478
expect(result.query).toEqual('SELECT * FROM testTable WHERE field = ? AND test = ?')
477479
expect(result.arguments).toEqual(['test', 123])
@@ -496,7 +498,7 @@ describe('Select Builder', () => {
496498
.where('field = ?1', 'test')
497499
.where('test = ?2', 123)
498500
.groupBy('type')
499-
.getQuery(),
501+
.getQueryAll(),
500502
]) {
501503
expect(result.query).toEqual('SELECT * FROM testTable WHERE field = ?1 AND test = ?2 GROUP BY type')
502504
expect(result.arguments).toEqual(['test', 123])
@@ -522,7 +524,7 @@ describe('Select Builder', () => {
522524
.where('test = ?2', 123)
523525
.groupBy('type')
524526
.groupBy('day')
525-
.getQuery(),
527+
.getQueryAll(),
526528
]) {
527529
expect(result.query).toEqual('SELECT * FROM testTable WHERE field = ?1 AND test = ?2 GROUP BY type, day')
528530
expect(result.arguments).toEqual(['test', 123])
@@ -549,7 +551,7 @@ describe('Select Builder', () => {
549551
.where('test = ?2', 123)
550552
.groupBy('type')
551553
.having('COUNT(trackid) > 15')
552-
.getQuery(),
554+
.getQueryAll(),
553555
]) {
554556
expect(result.query).toEqual(
555557
'SELECT * FROM testTable WHERE field = ?1 AND test = ?2 GROUP BY type HAVING COUNT(trackid) > 15'
@@ -579,7 +581,7 @@ describe('Select Builder', () => {
579581
.groupBy('type')
580582
.having('COUNT(trackid) > 15')
581583
.having('COUNT(trackid) < 30')
582-
.getQuery(),
584+
.getQueryAll(),
583585
]) {
584586
expect(result.query).toEqual(
585587
'SELECT * FROM testTable WHERE field = ?1 AND test = ?2 GROUP BY type HAVING COUNT(trackid) > 15 AND COUNT(trackid) < 30'
@@ -608,7 +610,7 @@ describe('Select Builder', () => {
608610
.where('test = ?2', 123)
609611
.groupBy('type')
610612
.orderBy('id')
611-
.getQuery(),
613+
.getQueryAll(),
612614
]) {
613615
expect(result.query).toEqual('SELECT * FROM testTable WHERE field = ?1 AND test = ?2 GROUP BY type ORDER BY id')
614616
expect(result.arguments).toEqual(['test', 123])
@@ -636,7 +638,7 @@ describe('Select Builder', () => {
636638
.groupBy('type')
637639
.orderBy('id')
638640
.orderBy('timestamp')
639-
.getQuery(),
641+
.getQueryAll(),
640642
]) {
641643
expect(result.query).toEqual(
642644
'SELECT * FROM testTable WHERE field = ?1 AND test = ?2 GROUP BY type ORDER BY id, timestamp'
@@ -669,7 +671,7 @@ describe('Select Builder', () => {
669671
.groupBy('type')
670672
.orderBy({ id: 'ASC' })
671673
.orderBy({ timestamp: OrderTypes.DESC })
672-
.getQuery(),
674+
.getQueryAll(),
673675
]) {
674676
expect(result.query).toEqual(
675677
'SELECT * FROM testTable WHERE field = ?1 AND test = ?2 GROUP BY type ORDER BY id ASC, timestamp DESC'
@@ -700,7 +702,7 @@ describe('Select Builder', () => {
700702
.groupBy('type')
701703
.limit(10)
702704
.offset(15)
703-
.getQuery(),
705+
.getQueryAll(),
704706
]) {
705707
expect(result.query).toEqual(
706708
'SELECT * FROM testTable WHERE field = ?1 AND test = ?2 GROUP BY type LIMIT 10 OFFSET 15'

tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99
"noUncheckedIndexedAccess": true,
1010
"noEmit": true
1111
},
12-
"include": ["src/*.ts", "src/databases/*.ts"]
12+
"include": ["src/*.ts", "src/databases/*.ts", "tests/*.ts", "tests/builder/*.ts"]
1313
}

0 commit comments

Comments
 (0)