From 3b8ac34d343632b552eb964f69fd9790be73fd65 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 22 Sep 2023 18:12:30 +0800 Subject: [PATCH] [ENG-1132] Disable pagination for ordering by file path size (#1365) * disable pagination for order by size * disable 'take' when paginating on size --- core/src/api/search.rs | 19 +++++---- .../Explorer/queries/usePathsInfiniteQuery.ts | 41 ++++++------------- interface/app/$libraryId/Explorer/store.ts | 2 +- packages/client/src/core.ts | 4 +- 4 files changed, 28 insertions(+), 38 deletions(-) diff --git a/core/src/api/search.rs b/core/src/api/search.rs index c4261ac91..48a309490 100644 --- a/core/src/api/search.rs +++ b/core/src/api/search.rs @@ -205,7 +205,7 @@ pub enum FilePathObjectCursor { pub enum FilePathCursorVariant { None, Name(CursorOrderItem), - // SizeInBytes(CursorOrderItem>), + SizeInBytes(SortOrder), DateCreated(CursorOrderItem>), DateModified(CursorOrderItem>), DateIndexed(CursorOrderItem>), @@ -394,7 +394,8 @@ pub fn mount() -> AlphaRouter { #[derive(Deserialize, Type, Debug)] #[serde(rename_all = "camelCase")] struct FilePathSearchArgs { - take: u8, + #[specta(optional)] + take: Option, #[specta(optional)] order_and_pagination: Option>, @@ -418,12 +419,11 @@ pub fn mount() -> AlphaRouter { }| async move { let Library { db, .. } = library.as_ref(); - let take = take.min(MAX_TAKE); + let mut query = db.file_path().find_many(filter.into_params(db).await?); - let mut query = db - .file_path() - .find_many(filter.into_params(db).await?) - .take(take as i64); + if let Some(take) = take { + query = query.take(take as i64); + } // WARN: this order_by for grouping directories MUST always come before the other order_by if group_directories { @@ -483,6 +483,11 @@ pub fn mount() -> AlphaRouter { FilePathCursorVariant::None => { query.add_where(file_path::id::gt(id)); } + FilePathCursorVariant::SizeInBytes(order) => { + query = query.order_by( + file_path::size_in_bytes_bytes::order(order.into()), + ); + } FilePathCursorVariant::Name(item) => arm!(name, item), FilePathCursorVariant::DateCreated(item) => { arm!(date_created, item) diff --git a/interface/app/$libraryId/Explorer/queries/usePathsInfiniteQuery.ts b/interface/app/$libraryId/Explorer/queries/usePathsInfiniteQuery.ts index 7598caa4e..f3b16fa76 100644 --- a/interface/app/$libraryId/Explorer/queries/usePathsInfiniteQuery.ts +++ b/interface/app/$libraryId/Explorer/queries/usePathsInfiniteQuery.ts @@ -22,6 +22,7 @@ export function usePathsInfiniteQuery({ if (explorerSettings.order) { arg.orderAndPagination = { orderOnly: explorerSettings.order }; + if (arg.orderAndPagination.orderOnly.field === 'sizeInBytes') delete arg.take; } return useInfiniteQuery({ @@ -44,21 +45,19 @@ export function usePathsInfiniteQuery({ const data = cItem.item.name; if (data !== null) variant = { - name: { - order: order.value, - data - } + name: { order: order.value, data } }; break; } + case 'sizeInBytes': { + variant = { sizeInBytes: order.value }; + break; + } case 'dateCreated': { const data = cItem.item.date_created; if (data !== null) variant = { - dateCreated: { - order: order.value, - data - } + dateCreated: { order: order.value, data } }; break; } @@ -66,10 +65,7 @@ export function usePathsInfiniteQuery({ const data = cItem.item.date_modified; if (data !== null) variant = { - dateModified: { - order: order.value, - data - } + dateModified: { order: order.value, data } }; break; } @@ -77,10 +73,7 @@ export function usePathsInfiniteQuery({ const data = cItem.item.date_indexed; if (data !== null) variant = { - dateIndexed: { - order: order.value, - data - } + dateIndexed: { order: order.value, data } }; break; } @@ -95,10 +88,7 @@ export function usePathsInfiniteQuery({ const data = object.date_accessed; if (data !== null) objectCursor = { - dateAccessed: { - order: order.value.value, - data - } + dateAccessed: { order: order.value.value, data } }; break; } @@ -106,19 +96,13 @@ export function usePathsInfiniteQuery({ const data = object.kind; if (data !== null) objectCursor = { - kind: { - order: order.value.value, - data - } + kind: { order: order.value.value, data } }; break; } } - if (objectCursor) - variant = { - object: objectCursor - }; + if (objectCursor) variant = { object: objectCursor }; break; } @@ -138,6 +122,7 @@ export function usePathsInfiniteQuery({ return ctx.client.query(['search.paths', arg]); }, getNextPageParam: (lastPage) => { + if (arg.take === null || arg.take === undefined) return undefined; if (lastPage.items.length < arg.take) return undefined; else return lastPage.items[arg.take - 1]; }, diff --git a/interface/app/$libraryId/Explorer/store.ts b/interface/app/$libraryId/Explorer/store.ts index 6db25745f..3164179cc 100644 --- a/interface/app/$libraryId/Explorer/store.ts +++ b/interface/app/$libraryId/Explorer/store.ts @@ -156,7 +156,7 @@ export function isCut(item: ExplorerItem, cutCopyState: ReadonlyDeep } | { dateCreated: CursorOrderItem } | { dateModified: CursorOrderItem } | { dateIndexed: CursorOrderItem } | { object: FilePathObjectCursor } +export type FilePathCursorVariant = "none" | { name: CursorOrderItem } | { sizeInBytes: SortOrder } | { dateCreated: CursorOrderItem } | { dateModified: CursorOrderItem } | { dateIndexed: CursorOrderItem } | { object: FilePathObjectCursor } export type FilePathFilterArgs = { locationId?: number | null; search?: string | null; extension?: string | null; createdAt?: OptionalRange; path?: string | null; object?: ObjectFilterArgs | null } @@ -176,7 +176,7 @@ export type FilePathObjectCursor = { dateAccessed: CursorOrderItem } | { export type FilePathOrder = { field: "name"; value: SortOrder } | { field: "sizeInBytes"; value: SortOrder } | { field: "dateCreated"; value: SortOrder } | { field: "dateModified"; value: SortOrder } | { field: "dateIndexed"; value: SortOrder } | { field: "object"; value: ObjectOrder } -export type FilePathSearchArgs = { take: number; orderAndPagination?: OrderAndPagination | null; filter?: FilePathFilterArgs; groupDirectories?: boolean } +export type FilePathSearchArgs = { take?: number | null; orderAndPagination?: OrderAndPagination | null; filter?: FilePathFilterArgs; groupDirectories?: boolean } export type FilePathWithObject = { id: number; pub_id: number[]; is_dir: boolean | null; cas_id: string | null; integrity_checksum: string | null; location_id: number | null; materialized_path: string | null; name: string | null; extension: string | null; hidden: boolean | null; size_in_bytes: string | null; size_in_bytes_bytes: number[] | null; inode: number[] | null; device: number[] | null; object_id: number | null; key_id: number | null; date_created: string | null; date_modified: string | null; date_indexed: string | null; object: Object | null }