mongo-query-dsl 1.0.0
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/README.md +339 -0
- package/dist/examples/usage.d.ts +13 -0
- package/dist/examples/usage.d.ts.map +1 -0
- package/dist/examples/usage.js +162 -0
- package/dist/examples/usage.js.map +1 -0
- package/dist/src/__tests__/executor.test.d.ts +2 -0
- package/dist/src/__tests__/executor.test.d.ts.map +1 -0
- package/dist/src/__tests__/executor.test.js +602 -0
- package/dist/src/__tests__/executor.test.js.map +1 -0
- package/dist/src/__tests__/integration.test.d.ts +2 -0
- package/dist/src/__tests__/integration.test.d.ts.map +1 -0
- package/dist/src/__tests__/integration.test.js +320 -0
- package/dist/src/__tests__/integration.test.js.map +1 -0
- package/dist/src/__tests__/parser.test.d.ts +2 -0
- package/dist/src/__tests__/parser.test.d.ts.map +1 -0
- package/dist/src/__tests__/parser.test.js +320 -0
- package/dist/src/__tests__/parser.test.js.map +1 -0
- package/dist/src/__tests__/resolver.test.d.ts +2 -0
- package/dist/src/__tests__/resolver.test.d.ts.map +1 -0
- package/dist/src/__tests__/resolver.test.js +178 -0
- package/dist/src/__tests__/resolver.test.js.map +1 -0
- package/dist/src/errors.d.ts +26 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +44 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/executor.d.ts +32 -0
- package/dist/src/executor.d.ts.map +1 -0
- package/dist/src/executor.js +214 -0
- package/dist/src/executor.js.map +1 -0
- package/dist/src/index.d.ts +43 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +120 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/parser.d.ts +42 -0
- package/dist/src/parser.d.ts.map +1 -0
- package/dist/src/parser.js +194 -0
- package/dist/src/parser.js.map +1 -0
- package/dist/src/resolver.d.ts +22 -0
- package/dist/src/resolver.d.ts.map +1 -0
- package/dist/src/resolver.js +55 -0
- package/dist/src/resolver.js.map +1 -0
- package/dist/src/types.d.ts +92 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +3 -0
- package/dist/src/types.js.map +1 -0
- package/examples/usage.ts +190 -0
- package/jest.config.js +13 -0
- package/package.json +34 -0
- package/src/__tests__/executor.test.ts +694 -0
- package/src/__tests__/integration.test.ts +392 -0
- package/src/__tests__/parser.test.ts +377 -0
- package/src/__tests__/resolver.test.ts +218 -0
- package/src/errors.ts +47 -0
- package/src/executor.ts +276 -0
- package/src/index.ts +118 -0
- package/src/parser.ts +216 -0
- package/src/resolver.ts +58 -0
- package/src/types.ts +107 -0
- package/tsconfig.json +30 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { NoQL } from "../src/index";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Example usage of the MongoDB Query DSL
|
|
5
|
+
*
|
|
6
|
+
* This file demonstrates both JSON and DSL query syntax
|
|
7
|
+
*
|
|
8
|
+
* IMPORTANT: This is an example file. To run it, you need:
|
|
9
|
+
* 1. A running MongoDB instance
|
|
10
|
+
* 2. Sample data loaded into your database
|
|
11
|
+
* 3. Update the connection string below
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
async function main() {
|
|
15
|
+
// Connect to MongoDB
|
|
16
|
+
const connectionString =
|
|
17
|
+
process.env.MONGODB_URI || "mongodb://localhost:27017";
|
|
18
|
+
const noql = await NoQL.connect(connectionString);
|
|
19
|
+
|
|
20
|
+
console.log("MongoDB Query DSL Examples\n");
|
|
21
|
+
console.log("=".repeat(50));
|
|
22
|
+
|
|
23
|
+
// Example 1: Simple JSON Query
|
|
24
|
+
console.log("\n1. Simple JSON Query - Get document by _id");
|
|
25
|
+
console.log("-".repeat(50));
|
|
26
|
+
|
|
27
|
+
const jsonQuery1 = {
|
|
28
|
+
output: "value" as const,
|
|
29
|
+
start: {
|
|
30
|
+
collection: "documents",
|
|
31
|
+
db: "myDb",
|
|
32
|
+
where: { _id: "doc_123" },
|
|
33
|
+
},
|
|
34
|
+
steps: [{ type: "get" as const, fields: ["title", "content"] }],
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const result1 = await noql.executeJson(jsonQuery1);
|
|
38
|
+
console.log("Query:", JSON.stringify(jsonQuery1, null, 2));
|
|
39
|
+
console.log("Result:", JSON.stringify(result1, null, 2));
|
|
40
|
+
|
|
41
|
+
// Example 2: JSON Query with LOOKUP
|
|
42
|
+
console.log("\n2. JSON Query with LOOKUP step");
|
|
43
|
+
console.log("-".repeat(50));
|
|
44
|
+
|
|
45
|
+
const jsonQuery2 = {
|
|
46
|
+
output: "document" as const,
|
|
47
|
+
start: {
|
|
48
|
+
collection: "documents",
|
|
49
|
+
db: "myDb",
|
|
50
|
+
where: { _id: "doc_123" },
|
|
51
|
+
},
|
|
52
|
+
steps: [
|
|
53
|
+
{
|
|
54
|
+
type: "lookup" as const,
|
|
55
|
+
collection: "users",
|
|
56
|
+
db: "myDb",
|
|
57
|
+
by: "userId",
|
|
58
|
+
},
|
|
59
|
+
{ type: "get" as const, fields: ["name", "email"] },
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const result2 = await noql.executeJson(jsonQuery2);
|
|
64
|
+
console.log("Query:", JSON.stringify(jsonQuery2, null, 2));
|
|
65
|
+
console.log("Result:", JSON.stringify(result2, null, 2));
|
|
66
|
+
|
|
67
|
+
// Example 3: JSON Query with Dynamic Lookups
|
|
68
|
+
console.log("\n3. JSON Query with Dynamic Lookups (using :prefixed values)");
|
|
69
|
+
console.log("-".repeat(50));
|
|
70
|
+
|
|
71
|
+
const jsonQuery3 = {
|
|
72
|
+
output: "trace" as const,
|
|
73
|
+
start: {
|
|
74
|
+
collection: "documents",
|
|
75
|
+
db: "myDb",
|
|
76
|
+
where: { _id: "doc_123" },
|
|
77
|
+
},
|
|
78
|
+
steps: [
|
|
79
|
+
{
|
|
80
|
+
type: "lookup" as const,
|
|
81
|
+
collection: "parentCollection",
|
|
82
|
+
db: "myDb",
|
|
83
|
+
by: "parentId",
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
type: "get" as const,
|
|
87
|
+
fields: ["ownerId", "ownerType", "ownerSource"],
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
type: "lookup" as const,
|
|
91
|
+
collection: ":ownerType",
|
|
92
|
+
db: ":ownerSource",
|
|
93
|
+
by: "ownerId",
|
|
94
|
+
},
|
|
95
|
+
{ type: "get" as const, fields: ["salesId", "name"] },
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const result3 = await noql.executeJson(jsonQuery3);
|
|
100
|
+
console.log("Query:", JSON.stringify(jsonQuery3, null, 2));
|
|
101
|
+
console.log("Result:", JSON.stringify(result3, null, 2));
|
|
102
|
+
|
|
103
|
+
// Example 4: DSL Query - Simple
|
|
104
|
+
console.log("\n4. DSL Query - Simple");
|
|
105
|
+
console.log("-".repeat(50));
|
|
106
|
+
|
|
107
|
+
const dslQuery1 = `
|
|
108
|
+
FROM documents IN myDb WHERE _id = "doc_123"
|
|
109
|
+
-> GET title, content
|
|
110
|
+
`.trim();
|
|
111
|
+
|
|
112
|
+
const result4 = await noql.executeDSL(dslQuery1);
|
|
113
|
+
console.log("DSL:", dslQuery1);
|
|
114
|
+
console.log("Result:", JSON.stringify(result4, null, 2));
|
|
115
|
+
|
|
116
|
+
// Example 5: DSL Query - With LOOKUP
|
|
117
|
+
console.log("\n5. DSL Query - With LOOKUP");
|
|
118
|
+
console.log("-".repeat(50));
|
|
119
|
+
|
|
120
|
+
const dslQuery2 = `
|
|
121
|
+
FROM documents IN myDb WHERE _id = "doc_123"
|
|
122
|
+
-> LOOKUP users IN myDb BY userId
|
|
123
|
+
-> GET name, email
|
|
124
|
+
`.trim();
|
|
125
|
+
|
|
126
|
+
const result5 = await noql.executeDSL(dslQuery2);
|
|
127
|
+
console.log("DSL:", dslQuery2);
|
|
128
|
+
console.log("Result:", JSON.stringify(result5, null, 2));
|
|
129
|
+
|
|
130
|
+
// Example 6: DSL Query - With Dynamic Lookups and Trace
|
|
131
|
+
console.log("\n6. DSL Query - With Dynamic Lookups and Trace");
|
|
132
|
+
console.log("-".repeat(50));
|
|
133
|
+
|
|
134
|
+
const dslQuery3 = `
|
|
135
|
+
WITH output: "trace"
|
|
136
|
+
FROM documents IN myDb WHERE _id = "doc_123"
|
|
137
|
+
-> LOOKUP parentCollection IN myDb BY parentId
|
|
138
|
+
-> GET ownerId, ownerType, ownerSource
|
|
139
|
+
-> LOOKUP :ownerType IN :ownerSource BY ownerId
|
|
140
|
+
-> GET salesId, name
|
|
141
|
+
`.trim();
|
|
142
|
+
|
|
143
|
+
const result6 = await noql.executeDSL(dslQuery3);
|
|
144
|
+
console.log("DSL:", dslQuery3);
|
|
145
|
+
console.log("Result:", JSON.stringify(result6, null, 2));
|
|
146
|
+
|
|
147
|
+
// Example 7: DSL Query - With WHERE conditions
|
|
148
|
+
console.log("\n7. DSL Query - With WHERE conditions in LOOKUP");
|
|
149
|
+
console.log("-".repeat(50));
|
|
150
|
+
|
|
151
|
+
const dslQuery4 = `
|
|
152
|
+
FROM documents IN myDb WHERE _id = "doc_123"
|
|
153
|
+
-> LOOKUP users IN myDb BY userId WHERE status = "active" AND verified = true
|
|
154
|
+
-> GET name, email
|
|
155
|
+
`.trim();
|
|
156
|
+
|
|
157
|
+
const result7 = await noql.executeDSL(dslQuery4);
|
|
158
|
+
console.log("DSL:", dslQuery4);
|
|
159
|
+
console.log("Result:", JSON.stringify(result7, null, 2));
|
|
160
|
+
|
|
161
|
+
// Example 8: Parse DSL without executing
|
|
162
|
+
console.log("\n8. Parse DSL (without executing)");
|
|
163
|
+
console.log("-".repeat(50));
|
|
164
|
+
|
|
165
|
+
const dslToParse = `
|
|
166
|
+
WITH output: "document"
|
|
167
|
+
FROM documents IN myDb WHERE _id = "doc_123"
|
|
168
|
+
-> LOOKUP users IN myDb BY userId
|
|
169
|
+
-> GET name, email
|
|
170
|
+
`.trim();
|
|
171
|
+
|
|
172
|
+
const parsedQuery = noql.parseDSL(dslToParse);
|
|
173
|
+
console.log("DSL:", dslToParse);
|
|
174
|
+
console.log("Parsed to JSON:", JSON.stringify(parsedQuery, null, 2));
|
|
175
|
+
|
|
176
|
+
// Close connection
|
|
177
|
+
await noql.close();
|
|
178
|
+
console.log("\n" + "=".repeat(50));
|
|
179
|
+
console.log("Connection closed");
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Run examples
|
|
183
|
+
if (require.main === module) {
|
|
184
|
+
main().catch((error) => {
|
|
185
|
+
console.error("Error running examples:", error);
|
|
186
|
+
process.exit(1);
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export { main };
|
package/jest.config.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
preset: 'ts-jest',
|
|
3
|
+
testEnvironment: 'node',
|
|
4
|
+
roots: ['<rootDir>/src'],
|
|
5
|
+
testMatch: ['**/__tests__/**/*.test.ts'],
|
|
6
|
+
collectCoverageFrom: [
|
|
7
|
+
'src/**/*.ts',
|
|
8
|
+
'!src/**/*.d.ts',
|
|
9
|
+
'!src/examples/**',
|
|
10
|
+
],
|
|
11
|
+
coverageDirectory: 'coverage',
|
|
12
|
+
coverageReporters: ['text', 'lcov', 'html'],
|
|
13
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mongo-query-dsl",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A domain-specific language (DSL) for traversing and querying MongoDB documents with dynamic lookups",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"dev": "tsc --watch",
|
|
10
|
+
"example": "npm run build && node dist/examples/usage.js",
|
|
11
|
+
"test": "jest",
|
|
12
|
+
"test:watch": "jest --watch",
|
|
13
|
+
"test:coverage": "jest --coverage"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"mongodb",
|
|
17
|
+
"dsl",
|
|
18
|
+
"query",
|
|
19
|
+
"lookup",
|
|
20
|
+
"traverse"
|
|
21
|
+
],
|
|
22
|
+
"author": "",
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"mongodb": "^6.3.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/jest": "^30.0.0",
|
|
29
|
+
"@types/node": "^20.10.0",
|
|
30
|
+
"jest": "^30.2.0",
|
|
31
|
+
"ts-jest": "^29.4.6",
|
|
32
|
+
"typescript": "^5.3.0"
|
|
33
|
+
}
|
|
34
|
+
}
|