From d9d800cfc4f8d49af632418494ae50f2bcff7880 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 10 Jan 2024 17:09:15 +0800 Subject: [PATCH] add index for sorting by saved_at --- packages/api/src/services/library_item.ts | 8 ++++++-- .../0153.do.library_item_user_id_saved_at_idx.sql | 6 ++++++ .../0153.undo.library_item_user_id_saved_at_idx.sql | 9 +++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100755 packages/db/migrations/0153.do.library_item_user_id_saved_at_idx.sql create mode 100755 packages/db/migrations/0153.undo.library_item_user_id_saved_at_idx.sql diff --git a/packages/api/src/services/library_item.ts b/packages/api/src/services/library_item.ts index 8478f33f3..339c7a26d 100644 --- a/packages/api/src/services/library_item.ts +++ b/packages/api/src/services/library_item.ts @@ -93,6 +93,7 @@ export enum SortOrder { export interface Sort { by: string order?: SortOrder + nulls?: 'NULLS FIRST' | 'NULLS LAST' } interface Select { @@ -332,8 +333,10 @@ export const buildQuery = ( const order = sortOrder === 'asc' ? SortOrder.ASCENDING : SortOrder.DESCENDING + const nulls = + order === SortOrder.ASCENDING ? 'NULLS FIRST' : 'NULLS LAST' - orders.push({ by: `library_item.${column}`, order }) + orders.push({ by: `library_item.${column}`, order, nulls }) return null } case 'has': @@ -613,12 +616,13 @@ export const searchLibraryItems = async ( orders.push({ by: 'library_item.saved_at', order: SortOrder.DESCENDING, + nulls: 'NULLS LAST', }) } // add order by orders.forEach((order) => { - queryBuilder.addOrderBy(order.by, order.order, 'NULLS LAST') + queryBuilder.addOrderBy(order.by, order.order, order.nulls) }) const libraryItems = await queryBuilder.skip(from).take(size).getMany() diff --git a/packages/db/migrations/0153.do.library_item_user_id_saved_at_idx.sql b/packages/db/migrations/0153.do.library_item_user_id_saved_at_idx.sql new file mode 100755 index 000000000..9161f6bcf --- /dev/null +++ b/packages/db/migrations/0153.do.library_item_user_id_saved_at_idx.sql @@ -0,0 +1,6 @@ +-- Type: DO +-- Name: library_item_user_id_saved_at_idx +-- Description: Add library_item_user_id_saved_at_idx index on library_item table for user_id and saved_at + +-- create index for sorting concurrently to avoid locking +CREATE INDEX CONCURRENTLY IF NOT EXISTS library_item_user_id_saved_at_idx ON omnivore.library_item (user_id, saved_at DESC NULLS LAST); diff --git a/packages/db/migrations/0153.undo.library_item_user_id_saved_at_idx.sql b/packages/db/migrations/0153.undo.library_item_user_id_saved_at_idx.sql new file mode 100755 index 000000000..7fc17a292 --- /dev/null +++ b/packages/db/migrations/0153.undo.library_item_user_id_saved_at_idx.sql @@ -0,0 +1,9 @@ +-- Type: UNDO +-- Name: library_item_user_id_saved_at_idx +-- Description: Add library_item_user_id_saved_at_idx index on library_item table for user_id and saved_at + +BEGIN; + +DROP INDEX IF EXISTS omnivore.library_item_user_id_saved_at_idx; + +COMMIT;