@revealui/db 0.3.0 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cleanup/cross-db-cleanup.d.ts +19 -0
- package/dist/cleanup/cross-db-cleanup.d.ts.map +1 -1
- package/dist/cleanup/cross-db-cleanup.js +40 -1
- package/dist/cleanup/cross-db-cleanup.js.map +1 -1
- package/dist/cleanup/index.d.ts +2 -1
- package/dist/cleanup/index.d.ts.map +1 -1
- package/dist/cleanup/index.js +2 -1
- package/dist/cleanup/index.js.map +1 -1
- package/dist/cleanup/rag-site-cleanup.d.ts +58 -0
- package/dist/cleanup/rag-site-cleanup.d.ts.map +1 -0
- package/dist/cleanup/rag-site-cleanup.js +68 -0
- package/dist/cleanup/rag-site-cleanup.js.map +1 -0
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -6
- package/dist/client/index.js.map +1 -1
- package/dist/client/types.d.ts.map +1 -1
- package/dist/pool.d.ts +4 -0
- package/dist/pool.d.ts.map +1 -1
- package/dist/pool.js +46 -20
- package/dist/pool.js.map +1 -1
- package/dist/queries/conversations.d.ts +29 -0
- package/dist/queries/conversations.d.ts.map +1 -0
- package/dist/queries/conversations.js +80 -0
- package/dist/queries/conversations.js.map +1 -0
- package/dist/queries/orders.d.ts +91 -0
- package/dist/queries/orders.d.ts.map +1 -0
- package/dist/queries/orders.js +36 -0
- package/dist/queries/orders.js.map +1 -0
- package/dist/queries/pages.d.ts.map +1 -1
- package/dist/queries/pages.js +0 -5
- package/dist/queries/pages.js.map +1 -1
- package/dist/queries/posts.d.ts +31 -0
- package/dist/queries/posts.d.ts.map +1 -1
- package/dist/queries/posts.js +21 -0
- package/dist/queries/posts.js.map +1 -1
- package/dist/queries/products.d.ts +102 -0
- package/dist/queries/products.d.ts.map +1 -0
- package/dist/queries/products.js +55 -0
- package/dist/queries/products.js.map +1 -0
- package/dist/queries/ticket-comments.d.ts +25 -0
- package/dist/queries/ticket-comments.d.ts.map +1 -1
- package/dist/queries/ticket-comments.js +28 -1
- package/dist/queries/ticket-comments.js.map +1 -1
- package/dist/queries/tickets.d.ts +41 -0
- package/dist/queries/tickets.d.ts.map +1 -1
- package/dist/queries/tickets.js +24 -0
- package/dist/queries/tickets.js.map +1 -1
- package/dist/queries/users.d.ts +118 -0
- package/dist/queries/users.d.ts.map +1 -1
- package/dist/queries/users.js +51 -1
- package/dist/queries/users.js.map +1 -1
- package/dist/schema/accounts.d.ts.map +1 -1
- package/dist/schema/accounts.js +2 -0
- package/dist/schema/accounts.js.map +1 -1
- package/dist/schema/agents.d.ts +133 -0
- package/dist/schema/agents.d.ts.map +1 -1
- package/dist/schema/agents.js +28 -2
- package/dist/schema/agents.js.map +1 -1
- package/dist/schema/circuit-breaker.d.ts +139 -0
- package/dist/schema/circuit-breaker.d.ts.map +1 -0
- package/dist/schema/circuit-breaker.js +28 -0
- package/dist/schema/circuit-breaker.js.map +1 -0
- package/dist/schema/crdt-operations.d.ts.map +1 -1
- package/dist/schema/crdt-operations.js +5 -2
- package/dist/schema/crdt-operations.js.map +1 -1
- package/dist/schema/index.d.ts +7 -0
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +24 -4
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/licenses.d.ts +34 -0
- package/dist/schema/licenses.d.ts.map +1 -1
- package/dist/schema/licenses.js +7 -1
- package/dist/schema/licenses.js.map +1 -1
- package/dist/schema/marketplace.d.ts.map +1 -1
- package/dist/schema/marketplace.js +6 -2
- package/dist/schema/marketplace.js.map +1 -1
- package/dist/schema/passkeys.d.ts.map +1 -1
- package/dist/schema/passkeys.js +1 -0
- package/dist/schema/passkeys.js.map +1 -1
- package/dist/schema/products.d.ts +536 -0
- package/dist/schema/products.d.ts.map +1 -0
- package/dist/schema/products.js +104 -0
- package/dist/schema/products.js.map +1 -0
- package/dist/schema/rest.d.ts +4 -1
- package/dist/schema/rest.d.ts.map +1 -1
- package/dist/schema/rest.js +6 -3
- package/dist/schema/rest.js.map +1 -1
- package/dist/schema/revealcoin.d.ts +267 -0
- package/dist/schema/revealcoin.d.ts.map +1 -0
- package/dist/schema/revealcoin.js +54 -0
- package/dist/schema/revealcoin.js.map +1 -0
- package/dist/schema/sites.d.ts.map +1 -1
- package/dist/schema/sites.js +2 -7
- package/dist/schema/sites.js.map +1 -1
- package/dist/schema/tenants.d.ts.map +1 -1
- package/dist/schema/tenants.js +0 -1
- package/dist/schema/tenants.js.map +1 -1
- package/dist/schema/tickets.d.ts.map +1 -1
- package/dist/schema/tickets.js +5 -2
- package/dist/schema/tickets.js.map +1 -1
- package/dist/schema/users.d.ts +17 -0
- package/dist/schema/users.d.ts.map +1 -1
- package/dist/schema/users.js +2 -2
- package/dist/schema/users.js.map +1 -1
- package/dist/schema/vector.d.ts +10 -4
- package/dist/schema/vector.d.ts.map +1 -1
- package/dist/schema/vector.js +14 -5
- package/dist/schema/vector.js.map +1 -1
- package/dist/types/database.d.ts +80 -2
- package/dist/types/database.d.ts.map +1 -1
- package/dist/types/database.js +17 -1
- package/dist/types/database.js.map +1 -1
- package/dist/types/generate-contracts.js +1 -1
- package/dist/validation/cross-db.d.ts +6 -6
- package/dist/validation/cross-db.d.ts.map +1 -1
- package/dist/validation/cross-db.js.map +1 -1
- package/package.json +38 -9
- package/dist/queries/optimized-queries.d.ts +0 -89
- package/dist/queries/optimized-queries.d.ts.map +0 -1
- package/dist/queries/optimized-queries.js +0 -371
- package/dist/queries/optimized-queries.js.map +0 -1
- package/dist/queries/todos.d.ts +0 -37
- package/dist/queries/todos.d.ts.map +0 -1
- package/dist/queries/todos.js +0 -37
- package/dist/queries/todos.js.map +0 -1
- package/dist/schema/query.d.ts +0 -11
- package/dist/schema/query.d.ts.map +0 -1
- package/dist/schema/query.js +0 -11
- package/dist/schema/query.js.map +0 -1
- package/dist/schema/todos.d.ts +0 -98
- package/dist/schema/todos.d.ts.map +0 -1
- package/dist/schema/todos.js +0 -12
- package/dist/schema/todos.js.map +0 -1
- package/dist/security-audit-storage.d.ts +0 -54
- package/dist/security-audit-storage.d.ts.map +0 -1
- package/dist/security-audit-storage.js +0 -100
- package/dist/security-audit-storage.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,23 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@revealui/db",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"files": [
|
|
6
|
-
"dist"
|
|
7
|
-
],
|
|
8
5
|
"dependencies": {
|
|
9
6
|
"@neondatabase/serverless": "^1.0.2",
|
|
10
|
-
"drizzle-orm": "^0.45.1",
|
|
11
|
-
"drizzle-zod": "^0.8.3",
|
|
12
7
|
"pg": "^8.18.0",
|
|
13
8
|
"zod": "^4.3.6",
|
|
14
|
-
"@revealui/
|
|
15
|
-
"@revealui/
|
|
9
|
+
"@revealui/utils": "0.3.0",
|
|
10
|
+
"@revealui/config": "0.3.0"
|
|
16
11
|
},
|
|
17
12
|
"devDependencies": {
|
|
18
13
|
"drizzle-kit": "^0.31.8",
|
|
14
|
+
"drizzle-orm": "^0.45.2",
|
|
15
|
+
"drizzle-zod": "^0.8.3",
|
|
19
16
|
"tsx": "^4.21.0",
|
|
20
|
-
"typescript": "^
|
|
17
|
+
"typescript": "^6.0.2",
|
|
21
18
|
"dev": "0.0.1"
|
|
22
19
|
},
|
|
23
20
|
"engines": {
|
|
@@ -144,6 +141,26 @@
|
|
|
144
141
|
"types": "./dist/queries/pages.d.ts",
|
|
145
142
|
"import": "./dist/queries/pages.js"
|
|
146
143
|
},
|
|
144
|
+
"./queries/users": {
|
|
145
|
+
"types": "./dist/queries/users.d.ts",
|
|
146
|
+
"import": "./dist/queries/users.js"
|
|
147
|
+
},
|
|
148
|
+
"./queries/conversations": {
|
|
149
|
+
"types": "./dist/queries/conversations.d.ts",
|
|
150
|
+
"import": "./dist/queries/conversations.js"
|
|
151
|
+
},
|
|
152
|
+
"./queries/products": {
|
|
153
|
+
"types": "./dist/queries/products.d.ts",
|
|
154
|
+
"import": "./dist/queries/products.js"
|
|
155
|
+
},
|
|
156
|
+
"./queries/orders": {
|
|
157
|
+
"types": "./dist/queries/orders.d.ts",
|
|
158
|
+
"import": "./dist/queries/orders.js"
|
|
159
|
+
},
|
|
160
|
+
"./schema/products": {
|
|
161
|
+
"types": "./dist/schema/products.d.ts",
|
|
162
|
+
"import": "./dist/schema/products.js"
|
|
163
|
+
},
|
|
147
164
|
"./schema/yjs-documents": {
|
|
148
165
|
"types": "./dist/schema/yjs-documents.d.ts",
|
|
149
166
|
"import": "./dist/schema/yjs-documents.js"
|
|
@@ -165,7 +182,19 @@
|
|
|
165
182
|
"import": "./dist/validation/cross-db.js"
|
|
166
183
|
}
|
|
167
184
|
},
|
|
185
|
+
"files": [
|
|
186
|
+
"dist"
|
|
187
|
+
],
|
|
168
188
|
"main": "./dist/index.js",
|
|
189
|
+
"peerDependencies": {
|
|
190
|
+
"drizzle-orm": "^0.45.2",
|
|
191
|
+
"drizzle-zod": "^0.8.3"
|
|
192
|
+
},
|
|
193
|
+
"peerDependenciesMeta": {
|
|
194
|
+
"drizzle-zod": {
|
|
195
|
+
"optional": true
|
|
196
|
+
}
|
|
197
|
+
},
|
|
169
198
|
"publishConfig": {
|
|
170
199
|
"access": "public",
|
|
171
200
|
"registry": "https://registry.npmjs.org"
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Optimized Database Queries
|
|
3
|
-
*
|
|
4
|
-
* Examples of N+1 query elimination and query optimization
|
|
5
|
-
* NOTE: This is example/documentation code - not actively used in production
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* BAD: N+1 Query Pattern
|
|
9
|
-
* Fetches posts, then makes separate query for each author
|
|
10
|
-
*/
|
|
11
|
-
export declare function getPostsWithAuthorsN1(): Promise<any>;
|
|
12
|
-
/**
|
|
13
|
-
* GOOD: Optimized with JOIN
|
|
14
|
-
* Single query with all necessary data
|
|
15
|
-
*/
|
|
16
|
-
export declare function getPostsWithAuthorsOptimized(): Promise<any>;
|
|
17
|
-
/**
|
|
18
|
-
* BETTER: Optimized with caching
|
|
19
|
-
*/
|
|
20
|
-
export declare function getPostsWithAuthorsCached(): Promise<unknown>;
|
|
21
|
-
/**
|
|
22
|
-
* BAD: OFFSET-based pagination (slow for large offsets)
|
|
23
|
-
*/
|
|
24
|
-
export declare function getPostsPaginatedOffset(page: number, perPage: number): Promise<any>;
|
|
25
|
-
/**
|
|
26
|
-
* GOOD: Cursor-based pagination (faster for all positions)
|
|
27
|
-
*/
|
|
28
|
-
export declare function getPostsPaginatedCursor(cursor?: string, perPage?: number): Promise<{
|
|
29
|
-
items: any;
|
|
30
|
-
nextCursor: any;
|
|
31
|
-
}>;
|
|
32
|
-
/**
|
|
33
|
-
* BAD: Multiple count queries
|
|
34
|
-
*/
|
|
35
|
-
export declare function getPostStatsN1(): Promise<{
|
|
36
|
-
total: any;
|
|
37
|
-
published: any;
|
|
38
|
-
draft: any;
|
|
39
|
-
}>;
|
|
40
|
-
/**
|
|
41
|
-
* GOOD: Single aggregation query
|
|
42
|
-
*/
|
|
43
|
-
export declare function getPostStatsOptimized(): Promise<any>;
|
|
44
|
-
/**
|
|
45
|
-
* BAD: Individual queries in loop
|
|
46
|
-
*/
|
|
47
|
-
export declare function getUsersByIdsN1(ids: string[]): Promise<any[]>;
|
|
48
|
-
/**
|
|
49
|
-
* GOOD: Single query with IN clause
|
|
50
|
-
*/
|
|
51
|
-
export declare function getUsersByIdsOptimized(ids: string[]): Promise<any>;
|
|
52
|
-
/**
|
|
53
|
-
* GOOD: Fetch posts with authors and comments in one query
|
|
54
|
-
*/
|
|
55
|
-
export declare function getPostsWithRelations(): Promise<any>;
|
|
56
|
-
/**
|
|
57
|
-
* BAD: LIKE query without index
|
|
58
|
-
*/
|
|
59
|
-
export declare function searchPostsSlow(query: string): Promise<any>;
|
|
60
|
-
/**
|
|
61
|
-
* GOOD: Full-text search with GIN index
|
|
62
|
-
*/
|
|
63
|
-
export declare function searchPostsOptimized(query: string): Promise<any>;
|
|
64
|
-
/**
|
|
65
|
-
* Build dynamic query with proper indexing
|
|
66
|
-
*/
|
|
67
|
-
export declare function getPostsFiltered(filters: {
|
|
68
|
-
status?: string;
|
|
69
|
-
authorId?: string;
|
|
70
|
-
fromDate?: Date;
|
|
71
|
-
toDate?: Date;
|
|
72
|
-
}): Promise<any>;
|
|
73
|
-
/**
|
|
74
|
-
* Create materialized view for expensive aggregations
|
|
75
|
-
*/
|
|
76
|
-
export declare function createPostStatsMaterializedView(): Promise<void>;
|
|
77
|
-
/**
|
|
78
|
-
* Refresh materialized view
|
|
79
|
-
*/
|
|
80
|
-
export declare function refreshPostStats(): Promise<void>;
|
|
81
|
-
/**
|
|
82
|
-
* Query materialized view (fast)
|
|
83
|
-
*/
|
|
84
|
-
export declare function getPostStatsByDate(fromDate: Date, toDate: Date): Promise<any>;
|
|
85
|
-
/**
|
|
86
|
-
* Efficient JSON aggregation
|
|
87
|
-
*/
|
|
88
|
-
export declare function getUsersWithPostCounts(): Promise<any>;
|
|
89
|
-
//# sourceMappingURL=optimized-queries.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"optimized-queries.d.ts","sourceRoot":"","sources":["../../src/queries/optimized-queries.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAoBH;;;GAGG;AACH,wBAAsB,qBAAqB,iBAW1C;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,iBA0BjD;AAED;;GAEG;AACH,wBAAsB,yBAAyB,qBAO9C;AAMD;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAY1E;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,MAAW;;;GA2BlF;AAMD;;GAEG;AACH,wBAAsB,cAAc;;;;GAUnC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,iBAa1C;AAMD;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,kBAOlD;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,gBAMzD;AAMD;;GAEG;AACH,wBAAsB,qBAAqB,iBA0C1C;AAMD;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,gBASlD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM,gBAoBvD;AAMD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,IAAI,CAAA;IACf,MAAM,CAAC,EAAE,IAAI,CAAA;CACd,gBA0CA;AAMD;;GAEG;AACH,wBAAsB,+BAA+B,kBAkBpD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,kBAErC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,gBASpE;AAMD;;GAEG;AACH,wBAAsB,sBAAsB,iBAqB3C"}
|
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
/* eslint-disable */
|
|
2
|
-
// @ts-nocheck
|
|
3
|
-
/**
|
|
4
|
-
* Optimized Database Queries
|
|
5
|
-
*
|
|
6
|
-
* Examples of N+1 query elimination and query optimization
|
|
7
|
-
* NOTE: This is example/documentation code - not actively used in production
|
|
8
|
-
*/
|
|
9
|
-
import { getClient } from '../client/index.js';
|
|
10
|
-
// TODO: Import from @revealui/core package once exports are configured
|
|
11
|
-
// import { monitorQuery } from '@revealui/core/monitoring/query-monitor'
|
|
12
|
-
// import { cacheQuery, cacheList } from '@revealui/core/cache/query-cache'
|
|
13
|
-
// Temporary stubs for build - replace with actual imports once core package exports are set up
|
|
14
|
-
const monitorQuery = (_name, fn) => fn();
|
|
15
|
-
const _cacheQuery = (_key, fn) => fn();
|
|
16
|
-
const cacheList = (_key, fn) => fn();
|
|
17
|
-
// Get db client instance
|
|
18
|
-
const db = getClient();
|
|
19
|
-
// ============================================================================
|
|
20
|
-
// N+1 QUERY ELIMINATION
|
|
21
|
-
// ============================================================================
|
|
22
|
-
/**
|
|
23
|
-
* BAD: N+1 Query Pattern
|
|
24
|
-
* Fetches posts, then makes separate query for each author
|
|
25
|
-
*/
|
|
26
|
-
export async function getPostsWithAuthorsN1() {
|
|
27
|
-
// First query: Get all posts
|
|
28
|
-
const posts = await db.query('SELECT * FROM posts WHERE status = $1', ['published']);
|
|
29
|
-
// N additional queries: One for each post's author
|
|
30
|
-
for (const post of posts.rows) {
|
|
31
|
-
const author = await db.query('SELECT * FROM users WHERE id = $1', [post.author_id]);
|
|
32
|
-
post.author = author.rows[0];
|
|
33
|
-
}
|
|
34
|
-
return posts.rows;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* GOOD: Optimized with JOIN
|
|
38
|
-
* Single query with all necessary data
|
|
39
|
-
*/
|
|
40
|
-
export async function getPostsWithAuthorsOptimized() {
|
|
41
|
-
return monitorQuery('getPostsWithAuthors', async () => {
|
|
42
|
-
const query = `
|
|
43
|
-
SELECT
|
|
44
|
-
p.id,
|
|
45
|
-
p.title,
|
|
46
|
-
p.slug,
|
|
47
|
-
p.content,
|
|
48
|
-
p.published_at,
|
|
49
|
-
p.created_at,
|
|
50
|
-
p.updated_at,
|
|
51
|
-
json_build_object(
|
|
52
|
-
'id', u.id,
|
|
53
|
-
'name', u.name,
|
|
54
|
-
'email', u.email,
|
|
55
|
-
'avatar', u.avatar
|
|
56
|
-
) as author
|
|
57
|
-
FROM posts p
|
|
58
|
-
INNER JOIN users u ON u.id = p.author_id
|
|
59
|
-
WHERE p.status = 'published'
|
|
60
|
-
ORDER BY p.published_at DESC
|
|
61
|
-
`;
|
|
62
|
-
const result = await db.query(query);
|
|
63
|
-
return result.rows;
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* BETTER: Optimized with caching
|
|
68
|
-
*/
|
|
69
|
-
export async function getPostsWithAuthorsCached() {
|
|
70
|
-
return cacheList('posts', { status: 'published' }, () => getPostsWithAuthorsOptimized(), 300);
|
|
71
|
-
}
|
|
72
|
-
// ============================================================================
|
|
73
|
-
// PAGINATION OPTIMIZATION
|
|
74
|
-
// ============================================================================
|
|
75
|
-
/**
|
|
76
|
-
* BAD: OFFSET-based pagination (slow for large offsets)
|
|
77
|
-
*/
|
|
78
|
-
export async function getPostsPaginatedOffset(page, perPage) {
|
|
79
|
-
const offset = (page - 1) * perPage;
|
|
80
|
-
const query = `
|
|
81
|
-
SELECT * FROM posts
|
|
82
|
-
WHERE status = 'published'
|
|
83
|
-
ORDER BY published_at DESC
|
|
84
|
-
LIMIT $1 OFFSET $2
|
|
85
|
-
`;
|
|
86
|
-
const result = await db.query(query, [perPage, offset]);
|
|
87
|
-
return result.rows;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* GOOD: Cursor-based pagination (faster for all positions)
|
|
91
|
-
*/
|
|
92
|
-
export async function getPostsPaginatedCursor(cursor, perPage = 20) {
|
|
93
|
-
return monitorQuery('getPostsPaginated', async () => {
|
|
94
|
-
const query = cursor
|
|
95
|
-
? `
|
|
96
|
-
SELECT * FROM posts
|
|
97
|
-
WHERE status = 'published'
|
|
98
|
-
AND published_at < (
|
|
99
|
-
SELECT published_at FROM posts WHERE id = $1
|
|
100
|
-
)
|
|
101
|
-
ORDER BY published_at DESC
|
|
102
|
-
LIMIT $2
|
|
103
|
-
`
|
|
104
|
-
: `
|
|
105
|
-
SELECT * FROM posts
|
|
106
|
-
WHERE status = 'published'
|
|
107
|
-
ORDER BY published_at DESC
|
|
108
|
-
LIMIT $1
|
|
109
|
-
`;
|
|
110
|
-
const params = cursor ? [cursor, perPage] : [perPage];
|
|
111
|
-
const result = await db.query(query, params);
|
|
112
|
-
return {
|
|
113
|
-
items: result.rows,
|
|
114
|
-
nextCursor: result.rows.length === perPage ? result.rows[result.rows.length - 1].id : null,
|
|
115
|
-
};
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
// ============================================================================
|
|
119
|
-
// AGGREGATION OPTIMIZATION
|
|
120
|
-
// ============================================================================
|
|
121
|
-
/**
|
|
122
|
-
* BAD: Multiple count queries
|
|
123
|
-
*/
|
|
124
|
-
export async function getPostStatsN1() {
|
|
125
|
-
const totalPosts = await db.query('SELECT COUNT(*) FROM posts');
|
|
126
|
-
const publishedPosts = await db.query("SELECT COUNT(*) FROM posts WHERE status = 'published'");
|
|
127
|
-
const draftPosts = await db.query("SELECT COUNT(*) FROM posts WHERE status = 'draft'");
|
|
128
|
-
return {
|
|
129
|
-
total: totalPosts.rows[0].count,
|
|
130
|
-
published: publishedPosts.rows[0].count,
|
|
131
|
-
draft: draftPosts.rows[0].count,
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* GOOD: Single aggregation query
|
|
136
|
-
*/
|
|
137
|
-
export async function getPostStatsOptimized() {
|
|
138
|
-
return monitorQuery('getPostStats', async () => {
|
|
139
|
-
const query = `
|
|
140
|
-
SELECT
|
|
141
|
-
COUNT(*) as total,
|
|
142
|
-
COUNT(*) FILTER (WHERE status = 'published') as published,
|
|
143
|
-
COUNT(*) FILTER (WHERE status = 'draft') as draft
|
|
144
|
-
FROM posts
|
|
145
|
-
`;
|
|
146
|
-
const result = await db.query(query);
|
|
147
|
-
return result.rows[0];
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
// ============================================================================
|
|
151
|
-
// BATCH LOADING
|
|
152
|
-
// ============================================================================
|
|
153
|
-
/**
|
|
154
|
-
* BAD: Individual queries in loop
|
|
155
|
-
*/
|
|
156
|
-
export async function getUsersByIdsN1(ids) {
|
|
157
|
-
const users = [];
|
|
158
|
-
for (const id of ids) {
|
|
159
|
-
const result = await db.query('SELECT * FROM users WHERE id = $1', [id]);
|
|
160
|
-
users.push(result.rows[0]);
|
|
161
|
-
}
|
|
162
|
-
return users;
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* GOOD: Single query with IN clause
|
|
166
|
-
*/
|
|
167
|
-
export async function getUsersByIdsOptimized(ids) {
|
|
168
|
-
return monitorQuery('getUsersByIds', async () => {
|
|
169
|
-
const query = 'SELECT * FROM users WHERE id = ANY($1)';
|
|
170
|
-
const result = await db.query(query, [ids]);
|
|
171
|
-
return result.rows;
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
// ============================================================================
|
|
175
|
-
// NESTED RELATIONSHIPS
|
|
176
|
-
// ============================================================================
|
|
177
|
-
/**
|
|
178
|
-
* GOOD: Fetch posts with authors and comments in one query
|
|
179
|
-
*/
|
|
180
|
-
export async function getPostsWithRelations() {
|
|
181
|
-
return monitorQuery('getPostsWithRelations', async () => {
|
|
182
|
-
const query = `
|
|
183
|
-
SELECT
|
|
184
|
-
p.id,
|
|
185
|
-
p.title,
|
|
186
|
-
p.slug,
|
|
187
|
-
p.content,
|
|
188
|
-
p.published_at,
|
|
189
|
-
json_build_object(
|
|
190
|
-
'id', u.id,
|
|
191
|
-
'name', u.name,
|
|
192
|
-
'email', u.email
|
|
193
|
-
) as author,
|
|
194
|
-
COALESCE(
|
|
195
|
-
json_agg(
|
|
196
|
-
json_build_object(
|
|
197
|
-
'id', c.id,
|
|
198
|
-
'content', c.content,
|
|
199
|
-
'created_at', c.created_at,
|
|
200
|
-
'author', json_build_object(
|
|
201
|
-
'id', cu.id,
|
|
202
|
-
'name', cu.name
|
|
203
|
-
)
|
|
204
|
-
)
|
|
205
|
-
ORDER BY c.created_at DESC
|
|
206
|
-
) FILTER (WHERE c.id IS NOT NULL),
|
|
207
|
-
'[]'
|
|
208
|
-
) as comments
|
|
209
|
-
FROM posts p
|
|
210
|
-
INNER JOIN users u ON u.id = p.author_id
|
|
211
|
-
LEFT JOIN comments c ON c.post_id = p.id AND c.approved_at IS NOT NULL
|
|
212
|
-
LEFT JOIN users cu ON cu.id = c.author_id
|
|
213
|
-
WHERE p.status = 'published'
|
|
214
|
-
GROUP BY p.id, u.id
|
|
215
|
-
ORDER BY p.published_at DESC
|
|
216
|
-
LIMIT 20
|
|
217
|
-
`;
|
|
218
|
-
const result = await db.query(query);
|
|
219
|
-
return result.rows;
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
// ============================================================================
|
|
223
|
-
// SEARCH OPTIMIZATION
|
|
224
|
-
// ============================================================================
|
|
225
|
-
/**
|
|
226
|
-
* BAD: LIKE query without index
|
|
227
|
-
*/
|
|
228
|
-
export async function searchPostsSlow(query) {
|
|
229
|
-
const sql = `
|
|
230
|
-
SELECT * FROM posts
|
|
231
|
-
WHERE title ILIKE $1 OR content ILIKE $1
|
|
232
|
-
ORDER BY published_at DESC
|
|
233
|
-
`;
|
|
234
|
-
const result = await db.query(sql, [`%${query}%`]);
|
|
235
|
-
return result.rows;
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* GOOD: Full-text search with GIN index
|
|
239
|
-
*/
|
|
240
|
-
export async function searchPostsOptimized(query) {
|
|
241
|
-
return monitorQuery('searchPosts', async () => {
|
|
242
|
-
const sql = `
|
|
243
|
-
SELECT
|
|
244
|
-
p.*,
|
|
245
|
-
ts_rank(
|
|
246
|
-
to_tsvector('english', coalesce(p.title, '') || ' ' || coalesce(p.content, '')),
|
|
247
|
-
plainto_tsquery('english', $1)
|
|
248
|
-
) as rank
|
|
249
|
-
FROM posts p
|
|
250
|
-
WHERE to_tsvector('english', coalesce(p.title, '') || ' ' || coalesce(p.content, ''))
|
|
251
|
-
@@ plainto_tsquery('english', $1)
|
|
252
|
-
AND p.status = 'published'
|
|
253
|
-
ORDER BY rank DESC, p.published_at DESC
|
|
254
|
-
LIMIT 50
|
|
255
|
-
`;
|
|
256
|
-
const result = await db.query(sql, [query]);
|
|
257
|
-
return result.rows;
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
// ============================================================================
|
|
261
|
-
// CONDITIONAL QUERIES
|
|
262
|
-
// ============================================================================
|
|
263
|
-
/**
|
|
264
|
-
* Build dynamic query with proper indexing
|
|
265
|
-
*/
|
|
266
|
-
export async function getPostsFiltered(filters) {
|
|
267
|
-
return monitorQuery('getPostsFiltered', async () => {
|
|
268
|
-
const conditions = [];
|
|
269
|
-
const params = [];
|
|
270
|
-
let paramCount = 1;
|
|
271
|
-
if (filters.status) {
|
|
272
|
-
conditions.push(`status = $${paramCount}`);
|
|
273
|
-
params.push(filters.status);
|
|
274
|
-
paramCount++;
|
|
275
|
-
}
|
|
276
|
-
if (filters.authorId) {
|
|
277
|
-
conditions.push(`author_id = $${paramCount}`);
|
|
278
|
-
params.push(filters.authorId);
|
|
279
|
-
paramCount++;
|
|
280
|
-
}
|
|
281
|
-
if (filters.fromDate) {
|
|
282
|
-
conditions.push(`published_at >= $${paramCount}`);
|
|
283
|
-
params.push(filters.fromDate);
|
|
284
|
-
paramCount++;
|
|
285
|
-
}
|
|
286
|
-
if (filters.toDate) {
|
|
287
|
-
conditions.push(`published_at <= $${paramCount}`);
|
|
288
|
-
params.push(filters.toDate);
|
|
289
|
-
paramCount++;
|
|
290
|
-
}
|
|
291
|
-
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
292
|
-
const query = `
|
|
293
|
-
SELECT * FROM posts
|
|
294
|
-
${whereClause}
|
|
295
|
-
ORDER BY published_at DESC
|
|
296
|
-
LIMIT 100
|
|
297
|
-
`;
|
|
298
|
-
const result = await db.query(query, params);
|
|
299
|
-
return result.rows;
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
// ============================================================================
|
|
303
|
-
// MATERIALIZED VIEWS
|
|
304
|
-
// ============================================================================
|
|
305
|
-
/**
|
|
306
|
-
* Create materialized view for expensive aggregations
|
|
307
|
-
*/
|
|
308
|
-
export async function createPostStatsMaterializedView() {
|
|
309
|
-
const query = `
|
|
310
|
-
CREATE MATERIALIZED VIEW IF NOT EXISTS post_stats_mv AS
|
|
311
|
-
SELECT
|
|
312
|
-
DATE_TRUNC('day', published_at) as date,
|
|
313
|
-
COUNT(*) as post_count,
|
|
314
|
-
COUNT(DISTINCT author_id) as author_count,
|
|
315
|
-
AVG(LENGTH(content)) as avg_content_length
|
|
316
|
-
FROM posts
|
|
317
|
-
WHERE status = 'published'
|
|
318
|
-
GROUP BY DATE_TRUNC('day', published_at)
|
|
319
|
-
ORDER BY date DESC;
|
|
320
|
-
|
|
321
|
-
CREATE UNIQUE INDEX IF NOT EXISTS idx_post_stats_mv_date
|
|
322
|
-
ON post_stats_mv(date);
|
|
323
|
-
`;
|
|
324
|
-
await db.query(query);
|
|
325
|
-
}
|
|
326
|
-
/**
|
|
327
|
-
* Refresh materialized view
|
|
328
|
-
*/
|
|
329
|
-
export async function refreshPostStats() {
|
|
330
|
-
await db.query('REFRESH MATERIALIZED VIEW CONCURRENTLY post_stats_mv');
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Query materialized view (fast)
|
|
334
|
-
*/
|
|
335
|
-
export async function getPostStatsByDate(fromDate, toDate) {
|
|
336
|
-
const query = `
|
|
337
|
-
SELECT * FROM post_stats_mv
|
|
338
|
-
WHERE date BETWEEN $1 AND $2
|
|
339
|
-
ORDER BY date DESC
|
|
340
|
-
`;
|
|
341
|
-
const result = await db.query(query, [fromDate, toDate]);
|
|
342
|
-
return result.rows;
|
|
343
|
-
}
|
|
344
|
-
// ============================================================================
|
|
345
|
-
// QUERY RESULT TRANSFORMATION
|
|
346
|
-
// ============================================================================
|
|
347
|
-
/**
|
|
348
|
-
* Efficient JSON aggregation
|
|
349
|
-
*/
|
|
350
|
-
export async function getUsersWithPostCounts() {
|
|
351
|
-
return monitorQuery('getUsersWithPostCounts', async () => {
|
|
352
|
-
const query = `
|
|
353
|
-
SELECT
|
|
354
|
-
u.id,
|
|
355
|
-
u.name,
|
|
356
|
-
u.email,
|
|
357
|
-
json_build_object(
|
|
358
|
-
'total', COUNT(p.id),
|
|
359
|
-
'published', COUNT(p.id) FILTER (WHERE p.status = 'published'),
|
|
360
|
-
'draft', COUNT(p.id) FILTER (WHERE p.status = 'draft')
|
|
361
|
-
) as post_stats
|
|
362
|
-
FROM users u
|
|
363
|
-
LEFT JOIN posts p ON p.author_id = u.id
|
|
364
|
-
GROUP BY u.id
|
|
365
|
-
ORDER BY COUNT(p.id) DESC
|
|
366
|
-
`;
|
|
367
|
-
const result = await db.query(query);
|
|
368
|
-
return result.rows;
|
|
369
|
-
});
|
|
370
|
-
}
|
|
371
|
-
//# sourceMappingURL=optimized-queries.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"optimized-queries.js","sourceRoot":"","sources":["../../src/queries/optimized-queries.ts"],"names":[],"mappings":"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"}
|
package/dist/queries/todos.d.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Todo database queries
|
|
3
|
-
*/
|
|
4
|
-
import type { DatabaseClient } from '../client/types.js';
|
|
5
|
-
export declare function getAllTodos(db: DatabaseClient): Promise<{
|
|
6
|
-
id: string;
|
|
7
|
-
text: string;
|
|
8
|
-
completed: boolean;
|
|
9
|
-
createdAt: Date;
|
|
10
|
-
updatedAt: Date;
|
|
11
|
-
}[]>;
|
|
12
|
-
export declare function getTodoById(db: DatabaseClient, id: string): Promise<{
|
|
13
|
-
id: string;
|
|
14
|
-
text: string;
|
|
15
|
-
completed: boolean;
|
|
16
|
-
createdAt: Date;
|
|
17
|
-
updatedAt: Date;
|
|
18
|
-
} | null>;
|
|
19
|
-
export declare function createTodo(db: DatabaseClient, text: string): Promise<{
|
|
20
|
-
id: string;
|
|
21
|
-
createdAt: Date;
|
|
22
|
-
updatedAt: Date;
|
|
23
|
-
text: string;
|
|
24
|
-
completed: boolean;
|
|
25
|
-
} | undefined>;
|
|
26
|
-
export declare function updateTodo(db: DatabaseClient, id: string, data: {
|
|
27
|
-
text?: string;
|
|
28
|
-
completed?: boolean;
|
|
29
|
-
}): Promise<{
|
|
30
|
-
id: string;
|
|
31
|
-
text: string;
|
|
32
|
-
completed: boolean;
|
|
33
|
-
createdAt: Date;
|
|
34
|
-
updatedAt: Date;
|
|
35
|
-
} | null>;
|
|
36
|
-
export declare function deleteTodo(db: DatabaseClient, id: string): Promise<void>;
|
|
37
|
-
//# sourceMappingURL=todos.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"todos.d.ts","sourceRoot":"","sources":["../../src/queries/todos.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGxD,wBAAsB,WAAW,CAAC,EAAE,EAAE,cAAc;;;;;;KAEnD;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM;;;;;;UAG/D;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM;;;;;;eAUhE;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,cAAc,EAClB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE;;;;;;UAY7C;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,iBAE9D"}
|
package/dist/queries/todos.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Todo database queries
|
|
3
|
-
*/
|
|
4
|
-
import { eq } from 'drizzle-orm';
|
|
5
|
-
import { todos } from '../schema/todos.js';
|
|
6
|
-
export async function getAllTodos(db) {
|
|
7
|
-
return db.select().from(todos).orderBy(todos.createdAt);
|
|
8
|
-
}
|
|
9
|
-
export async function getTodoById(db, id) {
|
|
10
|
-
const result = await db.select().from(todos).where(eq(todos.id, id)).limit(1);
|
|
11
|
-
return result[0] ?? null;
|
|
12
|
-
}
|
|
13
|
-
export async function createTodo(db, text) {
|
|
14
|
-
const result = await db
|
|
15
|
-
.insert(todos)
|
|
16
|
-
.values({
|
|
17
|
-
text,
|
|
18
|
-
completed: false,
|
|
19
|
-
})
|
|
20
|
-
.returning();
|
|
21
|
-
return result[0];
|
|
22
|
-
}
|
|
23
|
-
export async function updateTodo(db, id, data) {
|
|
24
|
-
const result = await db
|
|
25
|
-
.update(todos)
|
|
26
|
-
.set({
|
|
27
|
-
...data,
|
|
28
|
-
updatedAt: new Date(),
|
|
29
|
-
})
|
|
30
|
-
.where(eq(todos.id, id))
|
|
31
|
-
.returning();
|
|
32
|
-
return result[0] ?? null;
|
|
33
|
-
}
|
|
34
|
-
export async function deleteTodo(db, id) {
|
|
35
|
-
await db.delete(todos).where(eq(todos.id, id));
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=todos.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"todos.js","sourceRoot":"","sources":["../../src/queries/todos.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAkB;IAClD,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAkB,EAAE,EAAU;IAC9D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC7E,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAkB,EAAE,IAAY;IAC/D,MAAM,MAAM,GAAG,MAAM,EAAE;SACpB,MAAM,CAAC,KAAK,CAAC;SACb,MAAM,CAAC;QACN,IAAI;QACJ,SAAS,EAAE,KAAK;KACjB,CAAC;SACD,SAAS,EAAE,CAAA;IAEd,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAkB,EAClB,EAAU,EACV,IAA4C;IAE5C,MAAM,MAAM,GAAG,MAAM,EAAE;SACpB,MAAM,CAAC,KAAK,CAAC;SACb,GAAG,CAAC;QACH,GAAG,IAAI;QACP,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC;SACD,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;SACvB,SAAS,EAAE,CAAA;IAEd,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAkB,EAAE,EAAU;IAC7D,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;AAChD,CAAC"}
|
package/dist/schema/query.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Query Builder Utilities
|
|
3
|
-
*
|
|
4
|
-
* Re-exports drizzle-orm query builder functions to ensure all packages
|
|
5
|
-
* use the same drizzle instance, avoiding pnpm hoisting issues.
|
|
6
|
-
*
|
|
7
|
-
* Instead of importing from 'drizzle-orm' directly, import from '@revealui/db/schema/query'
|
|
8
|
-
*/
|
|
9
|
-
export type { SQL } from 'drizzle-orm';
|
|
10
|
-
export { and, asc, avg, count, desc, eq, gt, gte, ilike, inArray, isNotNull, isNull, like, lt, lte, max, min, ne, not, notInArray, or, sql, sum, } from 'drizzle-orm';
|
|
11
|
-
//# sourceMappingURL=query.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/schema/query.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,YAAY,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAEtC,OAAO,EACL,GAAG,EACH,GAAG,EACH,GAAG,EACH,KAAK,EACL,IAAI,EACJ,EAAE,EACF,EAAE,EACF,GAAG,EACH,KAAK,EACL,OAAO,EACP,SAAS,EACT,MAAM,EACN,IAAI,EACJ,EAAE,EACF,GAAG,EACH,GAAG,EACH,GAAG,EACH,EAAE,EACF,GAAG,EACH,UAAU,EACV,EAAE,EACF,GAAG,EACH,GAAG,GACJ,MAAM,aAAa,CAAA"}
|
package/dist/schema/query.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Query Builder Utilities
|
|
3
|
-
*
|
|
4
|
-
* Re-exports drizzle-orm query builder functions to ensure all packages
|
|
5
|
-
* use the same drizzle instance, avoiding pnpm hoisting issues.
|
|
6
|
-
*
|
|
7
|
-
* Instead of importing from 'drizzle-orm' directly, import from '@revealui/db/schema/query'
|
|
8
|
-
*/
|
|
9
|
-
// Re-export commonly used query builder functions
|
|
10
|
-
export { and, asc, avg, count, desc, eq, gt, gte, ilike, inArray, isNotNull, isNull, like, lt, lte, max, min, ne, not, notInArray, or, sql, sum, } from 'drizzle-orm';
|
|
11
|
-
//# sourceMappingURL=query.js.map
|
package/dist/schema/query.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/schema/query.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,kDAAkD;AAClD,OAAO,EACL,GAAG,EACH,GAAG,EACH,GAAG,EACH,KAAK,EACL,IAAI,EACJ,EAAE,EACF,EAAE,EACF,GAAG,EACH,KAAK,EACL,OAAO,EACP,SAAS,EACT,MAAM,EACN,IAAI,EACJ,EAAE,EACF,GAAG,EACH,GAAG,EACH,GAAG,EACH,EAAE,EACF,GAAG,EACH,UAAU,EACV,EAAE,EACF,GAAG,EACH,GAAG,GACJ,MAAM,aAAa,CAAA"}
|