Skip to content

Commit 6fb93f2

Browse files
authored
Merge pull request #2075 from appwrite/relatonship-lazy-queries
Lazy loading relationship support
2 parents 8381af6 + fea2aae commit 6fb93f2

File tree

4 files changed

+36
-9
lines changed

4 files changed

+36
-9
lines changed

src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ import { sdk } from '$lib/stores/sdk';
44
import { Query } from '@appwrite.io/console';
55
import type { PageLoad } from './$types';
66
import { queries, queryParamToMap } from '$lib/components/filters';
7+
import { buildWildcardAttributesQuery } from './document-[document]/attributes/store';
78

8-
export const load: PageLoad = async ({ params, depends, url, route }) => {
9+
export const load: PageLoad = async ({ params, depends, url, route, parent }) => {
10+
const { collection } = await parent();
911
depends(Dependencies.DOCUMENTS);
12+
1013
const page = getPage(url);
1114
const limit = getLimit(url, route, PAGE_LIMIT);
1215
const view = getView(url, route, View.Grid);
@@ -15,6 +18,7 @@ export const load: PageLoad = async ({ params, depends, url, route }) => {
1518

1619
const paramQueries = url.searchParams.get('query');
1720
const parsedQueries = queryParamToMap(paramQueries || '[]');
21+
1822
queries.set(parsedQueries);
1923

2024
return {
@@ -28,7 +32,8 @@ export const load: PageLoad = async ({ params, depends, url, route }) => {
2832
Query.limit(limit),
2933
Query.offset(offset),
3034
Query.orderDesc(''),
31-
...parsedQueries.values()
35+
...parsedQueries.values(),
36+
...buildWildcardAttributesQuery(collection)
3237
])
3338
};
3439
};

src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/+layout.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,20 @@ import type { LayoutLoad } from './$types';
44
import Breadcrumbs from './breadcrumbs.svelte';
55
import Header from './header.svelte';
66
import type { Attributes } from '../store';
7+
import { buildWildcardAttributesQuery } from './attributes/store';
78

89
export const load: LayoutLoad = async ({ params, parent, depends }) => {
9-
depends(Dependencies.DOCUMENT);
1010
const { collection } = await parent();
11+
depends(Dependencies.DOCUMENT);
1112

1213
const document = await sdk
1314
.forProject(params.region, params.project)
14-
.databases.getDocument(params.database, params.collection, params.document);
15+
.databases.getDocument(
16+
params.database,
17+
params.collection,
18+
params.document,
19+
buildWildcardAttributesQuery(collection)
20+
);
1521

1622
/**
1723
* Sanitize DateTime to remove UTC Timezone section.

src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/relationship.svelte

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@
3939
}
4040
}
4141
42-
documentList = await getDocuments();
43-
4442
if (editing && $doc?.[attribute.key]) {
4543
if ($doc[attribute.key]?.length) {
4644
relatedList =
@@ -59,7 +57,10 @@
5957
});
6058
6159
async function getDocuments(search: string = null) {
62-
const queries = search ? [Query.startsWith('$id', search), Query.orderDesc('')] : [];
60+
const queries = search
61+
? [Query.select(['$id']), Query.startsWith('$id', search), Query.orderDesc('')]
62+
: [Query.select(['$id'])];
63+
6364
return await sdk
6465
.forProject(page.params.region, page.params.project)
6566
.databases.listDocuments(databaseId, attribute.relatedCollection, queries);
@@ -103,7 +104,7 @@
103104
showInput = false;
104105
}
105106
106-
//Reactive statements
107+
// Reactive statements
107108
$: getDocuments(search).then((res) => (documentList = res));
108109
109110
$: paginatedItems = editing

src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/store.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { Models } from '@appwrite.io/console';
1+
import { type Models, Query } from '@appwrite.io/console';
22
import type { Attributes } from '../../store';
33

44
export function isRelationshipToMany(attribute: Models.AttributeRelationship) {
@@ -20,3 +20,18 @@ export function isString(attribute: Attributes): attribute is Models.AttributeSt
2020
if (!attribute) return false;
2121
return attribute?.type === 'string';
2222
}
23+
24+
/**
25+
* Returns select queries for all main and related fields in a collection.
26+
*/
27+
export function buildWildcardAttributesQuery(
28+
collection: Models.Collection | null = null
29+
): string[] {
30+
return [
31+
...(collection?.attributes
32+
?.filter((attr) => isRelationship(attr))
33+
?.map((attr) => Query.select([`${attr.key}.*`])) ?? []),
34+
35+
Query.select(['*'])
36+
];
37+
}

0 commit comments

Comments
 (0)