From 206412267ac4abbd0617e11dd74fc843f1c4a026 Mon Sep 17 00:00:00 2001
From: sudbrack <andrewsuds@gmail.com>
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 2d5da4d381..72e8a6941d 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 a309f76e01..76b6653e3d 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<AssetEntity[]> {
     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[];
   }