Skip to content

Commit 008ec0e

Browse files
committed
feat(query_builder): add orderByRandom
1 parent 8c333e0 commit 008ec0e

File tree

3 files changed

+65
-0
lines changed

3 files changed

+65
-0
lines changed

src/database/query_builder/database.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,27 @@ export class DatabaseQueryBuilder extends Chainable implements DatabaseQueryBuil
281281
return this
282282
}
283283

284+
/**
285+
* Order results by random value.
286+
*/
287+
orderByRandom(seed = '') {
288+
switch (this.client.dialect.name) {
289+
case 'sqlite3':
290+
case 'better-sqlite3':
291+
case 'postgres':
292+
case 'redshift':
293+
return this.orderByRaw('RANDOM()')
294+
case 'mysql':
295+
return this.orderByRaw(`RAND(${seed})`)
296+
case 'mssql':
297+
return this.orderByRaw('NEWID()')
298+
case 'oracledb':
299+
return this.orderByRaw('dbms_random.value')
300+
default:
301+
throw new Error(`Cannot order by random for the given dialect ${this.client.dialect.name}`)
302+
}
303+
}
304+
284305
/**
285306
* Executes the query
286307
*/

src/types/querybuilder.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,7 @@ export interface ChainableContract {
651651

652652
orderBy: OrderBy<this>
653653
orderByRaw: RawQueryFn<this>
654+
orderByRandom: (seed?: string) => this
654655

655656
union: Union<this>
656657
unionAll: UnionAll<this>

test/database/query_builder.spec.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5439,6 +5439,49 @@ test.group('Query Builder | orderByRaw', (group) => {
54395439
})
54405440
})
54415441

5442+
test.group('Query Builder | orderByRandom', (group) => {
5443+
group.setup(async () => {
5444+
await setup()
5445+
})
5446+
5447+
group.teardown(async () => {
5448+
await cleanup()
5449+
})
5450+
5451+
group.each.teardown(async () => {
5452+
await resetTables()
5453+
})
5454+
5455+
test('define order by random value', async ({ assert }) => {
5456+
const connection = new Connection('primary', getConfig(), logger)
5457+
connection.connect()
5458+
5459+
const db = getQueryBuilder(getQueryClient(connection))
5460+
await getInsertBuilder(getQueryClient(connection))
5461+
.table('users')
5462+
.multiInsert([
5463+
{
5464+
username: 'virk',
5465+
5466+
},
5467+
{
5468+
username: 'romain',
5469+
5470+
},
5471+
{
5472+
username: 'nikk',
5473+
5474+
},
5475+
])
5476+
5477+
const users = await db.from('users').orderByRandom()
5478+
const users2 = await db.from('users').orderByRandom()
5479+
5480+
assert.notEqual(users[0].id, users2[0].id)
5481+
await connection.disconnect()
5482+
}).retry(3)
5483+
})
5484+
54425485
test.group('Query Builder | offset', (group) => {
54435486
group.setup(async () => {
54445487
await setup()

0 commit comments

Comments
 (0)