[ENG-1132] Disable pagination for ordering by file path size (#1365)

* disable pagination for order by size

* disable 'take' when paginating on size
This commit is contained in:
Brendan Allan
2023-09-22 18:12:30 +08:00
committed by GitHub
parent 8765f95e00
commit 3b8ac34d34
4 changed files with 28 additions and 38 deletions

View File

@@ -205,7 +205,7 @@ pub enum FilePathObjectCursor {
pub enum FilePathCursorVariant {
None,
Name(CursorOrderItem<String>),
// SizeInBytes(CursorOrderItem<Vec<u8>>),
SizeInBytes(SortOrder),
DateCreated(CursorOrderItem<DateTime<FixedOffset>>),
DateModified(CursorOrderItem<DateTime<FixedOffset>>),
DateIndexed(CursorOrderItem<DateTime<FixedOffset>>),
@@ -394,7 +394,8 @@ pub fn mount() -> AlphaRouter<Ctx> {
#[derive(Deserialize, Type, Debug)]
#[serde(rename_all = "camelCase")]
struct FilePathSearchArgs {
take: u8,
#[specta(optional)]
take: Option<u8>,
#[specta(optional)]
order_and_pagination:
Option<OrderAndPagination<file_path::id::Type, FilePathOrder, FilePathCursor>>,
@@ -418,12 +419,11 @@ pub fn mount() -> AlphaRouter<Ctx> {
}| 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<Ctx> {
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)

View File

@@ -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];
},

View File

@@ -156,7 +156,7 @@ export function isCut(item: ExplorerItem, cutCopyState: ReadonlyDeep<CutCopyStat
export const filePathOrderingKeysSchema = z.union([
z.literal('name').describe('Name'),
// z.literal('sizeInBytes').describe('Size'),
z.literal('sizeInBytes').describe('Size'),
z.literal('dateModified').describe('Date Modified'),
z.literal('dateIndexed').describe('Date Indexed'),
z.literal('dateCreated').describe('Date Created'),

View File

@@ -168,7 +168,7 @@ export type FilePath = { id: number; pub_id: number[]; is_dir: boolean | null; c
export type FilePathCursor = { isDir: boolean; variant: FilePathCursorVariant }
export type FilePathCursorVariant = "none" | { name: CursorOrderItem<string> } | { dateCreated: CursorOrderItem<string> } | { dateModified: CursorOrderItem<string> } | { dateIndexed: CursorOrderItem<string> } | { object: FilePathObjectCursor }
export type FilePathCursorVariant = "none" | { name: CursorOrderItem<string> } | { sizeInBytes: SortOrder } | { dateCreated: CursorOrderItem<string> } | { dateModified: CursorOrderItem<string> } | { dateIndexed: CursorOrderItem<string> } | { object: FilePathObjectCursor }
export type FilePathFilterArgs = { locationId?: number | null; search?: string | null; extension?: string | null; createdAt?: OptionalRange<string>; path?: string | null; object?: ObjectFilterArgs | null }
@@ -176,7 +176,7 @@ export type FilePathObjectCursor = { dateAccessed: CursorOrderItem<string> } | {
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<number, FilePathOrder, FilePathCursor> | null; filter?: FilePathFilterArgs; groupDirectories?: boolean }
export type FilePathSearchArgs = { take?: number | null; orderAndPagination?: OrderAndPagination<number, FilePathOrder, FilePathCursor> | 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 }