Skip to content

Commit db2d404

Browse files
committed
Handle large queries
1 parent 748dc38 commit db2d404

File tree

3 files changed

+54
-4
lines changed

3 files changed

+54
-4
lines changed

src/api/servers.remote.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,8 @@ export const updateMany = command(
207207
},
208208
);
209209

210-
// Count documents matching a filter
211-
export const countDocuments = query(
210+
// Count documents matching a filter - uses `command` to avoid URL length limits
211+
export const countDocuments = command(
212212
z.object({
213213
server: z.string(),
214214
database: z.string(),
@@ -462,8 +462,8 @@ export const retryConnection = command(z.string(), async (serverId) => {
462462
return { ok: true };
463463
});
464464

465-
// Load documents from a collection
466-
export const loadDocuments = query(
465+
// Load documents from a collection - uses `command` to avoid URL length limits
466+
export const loadDocuments = command(
467467
z.object({
468468
server: z.string(),
469469
database: z.string(),

src/lib/components/SearchBox.svelte

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,17 @@
1212
import { formatNumber } from "$lib/utils/filters";
1313
import { tick } from "svelte";
1414
15+
// Threshold for URL length before switching to remote function call - see https://stackoverflow.com/questions/32763165/node-js-http-get-url-length-limitation
16+
const URL_LENGTH_THRESHOLD = 20_000;
17+
1518
interface Props {
1619
params: SearchParams;
1720
editMode?: boolean;
1821
readonly: boolean;
1922
explainLoading?: boolean;
2023
onexplain?: () => void;
24+
/** Callback for when URL would be too long - called with params instead of navigating */
25+
onsearch?: (params: SearchParams) => void;
2126
server?: string;
2227
database?: string;
2328
collection?: string;
@@ -29,6 +34,7 @@
2934
readonly = $bindable(false),
3035
explainLoading = false,
3136
onexplain,
37+
onsearch,
3238
server,
3339
database,
3440
collection,
@@ -128,6 +134,18 @@
128134
129135
const formData = new FormData(form);
130136
137+
const queryString = [...formData.entries()]
138+
.map((e) => encodeURIComponent(e[0]) + "=" + encodeURIComponent(e[1] as string))
139+
.join("&");
140+
141+
const fullUrl = page.url.pathname + "?" + queryString;
142+
143+
// If URL is too long and we have a callback, use remote function instead
144+
if (fullUrl.length > URL_LENGTH_THRESHOLD && onsearch) {
145+
onsearch(params);
146+
return;
147+
}
148+
131149
await goto(
132150
resolve(
133151
(page.url.pathname +

src/routes/servers/[server]/databases/[database]/collections/[collection]/documents/+page.svelte

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,37 @@
445445
explainLoading = false;
446446
}
447447
}
448+
449+
function handleSearch(searchParams: SearchParams) {
450+
// Ensure field is always a string (server expects it)
451+
const normalizedParams = { ...searchParams, field: searchParams.field ?? "" };
452+
453+
// Update local state
454+
data.params = normalizedParams;
455+
params = normalizedParams;
456+
457+
// Load documents via remote function (avoids URL length limits)
458+
dataPromise = loadDocuments({
459+
server: data.server,
460+
database: data.database,
461+
collection: data.collection,
462+
query: normalizedParams.query,
463+
sort: normalizedParams.sort,
464+
project: normalizedParams.project,
465+
skip: normalizedParams.skip,
466+
limit: normalizedParams.limit,
467+
mode: normalizedParams.mode,
468+
field: normalizedParams.field,
469+
});
470+
471+
// Also update the count
472+
data.count = countDocuments({
473+
server: data.server,
474+
database: data.database,
475+
collection: data.collection,
476+
filter: normalizedParams.query,
477+
});
478+
}
448479
</script>
449480

450481
{#snippet previousButton(url: string, onClick: (e: MouseEvent) => void)}
@@ -499,6 +530,7 @@
499530
readonly={data.readOnly}
500531
{explainLoading}
501532
onexplain={handleExplain}
533+
onsearch={handleSearch}
502534
server={data.server}
503535
database={data.database}
504536
collection={data.collection}

0 commit comments

Comments
 (0)