From 206412267ac4abbd0617e11dd74fc843f1c4a026 Mon Sep 17 00:00:00 2001 From: sudbrack Date: Sun, 26 Jan 2025 08:06:18 -0600 Subject: [PATCH] fix(server): /search/random API returns same assets every call (#15682) * Fix for server searchRandom function not returning random results * Fix lint --- server/src/queries/search.repository.sql | 4 ++-- server/src/repositories/search.repository.ts | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/server/src/queries/search.repository.sql b/server/src/queries/search.repository.sql index 2d5da4d381112..72e8a6941d362 100644 --- a/server/src/queries/search.repository.sql +++ b/server/src/queries/search.repository.sql @@ -36,7 +36,7 @@ offset and "assets"."deletedAt" is null and "assets"."id" < $6 order by - "assets"."id" + random() limit $7 ) @@ -56,7 +56,7 @@ union all and "assets"."deletedAt" is null and "assets"."id" > $13 order by - "assets"."id" + random() limit $14 ) diff --git a/server/src/repositories/search.repository.ts b/server/src/repositories/search.repository.ts index a309f76e012ff..76b6653e3d73e 100644 --- a/server/src/repositories/search.repository.ts +++ b/server/src/repositories/search.repository.ts @@ -72,8 +72,14 @@ export class SearchRepository implements ISearchRepository { async searchRandom(size: number, options: AssetSearchOptions): Promise { const uuid = randomUUID(); const builder = searchAssetBuilder(this.db, options); - const lessThan = builder.where('assets.id', '<', uuid).orderBy('assets.id').limit(size); - const greaterThan = builder.where('assets.id', '>', uuid).orderBy('assets.id').limit(size); + const lessThan = builder + .where('assets.id', '<', uuid) + .orderBy(sql`random()`) + .limit(size); + const greaterThan = builder + .where('assets.id', '>', uuid) + .orderBy(sql`random()`) + .limit(size); const { rows } = await sql`${lessThan} union all ${greaterThan} limit ${size}`.execute(this.db); return rows as any as AssetEntity[]; }