mirror of
https://github.com/spacedriveapp/spacedrive.git
synced 2026-05-18 13:26:00 -04:00
[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:
@@ -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)
|
||||
|
||||
@@ -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];
|
||||
},
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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 }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user