sof-mssql 1.0.1 → 2.1.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 +175 -35
- package/dist/fhirpath/transpiler.d.ts +40 -2
- package/dist/fhirpath/transpiler.d.ts.map +1 -1
- package/dist/fhirpath/transpiler.js +85 -15
- package/dist/fhirpath/transpiler.js.map +1 -1
- package/dist/load.d.ts.map +1 -1
- package/dist/load.js +3 -0
- package/dist/load.js.map +1 -1
- package/dist/loader/connection.d.ts.map +1 -1
- package/dist/loader/connection.js +6 -0
- package/dist/loader/connection.js.map +1 -1
- package/dist/loader/tables.d.ts.map +1 -1
- package/dist/loader/tables.js +7 -0
- package/dist/loader/tables.js.map +1 -1
- package/dist/loader/types.d.ts +2 -0
- package/dist/loader/types.d.ts.map +1 -1
- package/dist/parser.d.ts +22 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +101 -10
- package/dist/parser.js.map +1 -1
- package/dist/queryGenerator/RepeatProcessor.d.ts +177 -0
- package/dist/queryGenerator/RepeatProcessor.d.ts.map +1 -0
- package/dist/queryGenerator/RepeatProcessor.js +336 -0
- package/dist/queryGenerator/RepeatProcessor.js.map +1 -0
- package/dist/queryGenerator/SelectClauseBuilder.d.ts +45 -0
- package/dist/queryGenerator/SelectClauseBuilder.d.ts.map +1 -1
- package/dist/queryGenerator/SelectClauseBuilder.js +150 -0
- package/dist/queryGenerator/SelectClauseBuilder.js.map +1 -1
- package/dist/queryGenerator/WhereClauseBuilder.d.ts +1 -0
- package/dist/queryGenerator/WhereClauseBuilder.d.ts.map +1 -1
- package/dist/queryGenerator/WhereClauseBuilder.js +6 -2
- package/dist/queryGenerator/WhereClauseBuilder.js.map +1 -1
- package/dist/queryGenerator/index.d.ts +1 -0
- package/dist/queryGenerator/index.d.ts.map +1 -1
- package/dist/queryGenerator/index.js +3 -1
- package/dist/queryGenerator/index.js.map +1 -1
- package/dist/queryGenerator.d.ts +61 -1
- package/dist/queryGenerator.d.ts.map +1 -1
- package/dist/queryGenerator.js +176 -13
- package/dist/queryGenerator.js.map +1 -1
- package/dist/tests/utils/generator.js +11 -11
- package/dist/tests/utils/generator.js.map +1 -1
- package/dist/tests/utils/sqlOnFhir.d.ts.map +1 -1
- package/dist/tests/utils/sqlOnFhir.js +39 -4
- package/dist/tests/utils/sqlOnFhir.js.map +1 -1
- package/dist/tests/utils/testContext.d.ts +3 -6
- package/dist/tests/utils/testContext.d.ts.map +1 -1
- package/dist/tests/utils/testContext.js +5 -9
- package/dist/tests/utils/testContext.js.map +1 -1
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/validation.d.ts +66 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +449 -0
- package/dist/validation.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Processes repeat operations and generates recursive CTEs.
|
|
4
|
+
*
|
|
5
|
+
* The repeat directive recursively traverses a tree structure by following
|
|
6
|
+
* one or more FHIRPath expressions at each level. This is implemented using
|
|
7
|
+
* SQL Server recursive Common Table Expressions (CTEs).
|
|
8
|
+
*
|
|
9
|
+
* @author John Grimes
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.RepeatProcessor = void 0;
|
|
13
|
+
/**
|
|
14
|
+
* Handles all repeat-related processing and recursive CTE generation.
|
|
15
|
+
*
|
|
16
|
+
* The repeat directive works similarly to forEach but traverses tree structures
|
|
17
|
+
* of arbitrary depth. For example, `repeat: ["item"]` follows the `item` array
|
|
18
|
+
* at each level until no more items exist.
|
|
19
|
+
*
|
|
20
|
+
* Multiple paths can be specified (e.g., `["item", "answer.item"]`) to follow
|
|
21
|
+
* different traversal patterns at each level, with results unioned together.
|
|
22
|
+
*/
|
|
23
|
+
class RepeatProcessor {
|
|
24
|
+
/**
|
|
25
|
+
* Check if a specific combination has repeat operations.
|
|
26
|
+
*
|
|
27
|
+
* @param combination - The select combination to check.
|
|
28
|
+
* @returns True if any select in the combination has repeat.
|
|
29
|
+
*/
|
|
30
|
+
combinationHasRepeat(combination) {
|
|
31
|
+
for (let i = 0; i < combination.selects.length; i++) {
|
|
32
|
+
const select = combination.selects[i];
|
|
33
|
+
const unionChoice = combination.unionChoices[i];
|
|
34
|
+
if (this.selectHasRepeat(select)) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
// If this select has a unionAll choice, also check the chosen branch.
|
|
38
|
+
if (unionChoice >= 0 && select.unionAll?.[unionChoice]) {
|
|
39
|
+
const chosenBranch = select.unionAll[unionChoice];
|
|
40
|
+
if (this.selectHasRepeat(chosenBranch)) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Check if a single select has repeat operations (including nested).
|
|
49
|
+
*
|
|
50
|
+
* @param select - The select element to check.
|
|
51
|
+
* @returns True if the select or any nested select has repeat.
|
|
52
|
+
*/
|
|
53
|
+
selectHasRepeat(select) {
|
|
54
|
+
if (this.isRepeatSelect(select)) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
if (select.select && this.hasRepeatInSelects(select.select)) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
return !!(select.unionAll && this.unionAllHasRepeat(select.unionAll));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if any select in the array has repeat operations.
|
|
64
|
+
*/
|
|
65
|
+
hasRepeatInSelects(selects) {
|
|
66
|
+
return selects.some((select) => this.selectHasRepeat(select));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if any unionAll option has repeat operations.
|
|
70
|
+
*/
|
|
71
|
+
unionAllHasRepeat(unionAllOptions) {
|
|
72
|
+
return unionAllOptions.some((unionOption) => this.isRepeatSelect(unionOption) ||
|
|
73
|
+
(unionOption.select && this.hasRepeatInSelects(unionOption.select)));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Check if a select is a repeat select.
|
|
77
|
+
*/
|
|
78
|
+
isRepeatSelect(select) {
|
|
79
|
+
return !!(select.repeat && select.repeat.length > 0);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Build the repeat context map by generating contexts for all repeat operations.
|
|
83
|
+
*
|
|
84
|
+
* @param selects - The top-level select elements.
|
|
85
|
+
* @param context - The base transpiler context.
|
|
86
|
+
* @param combination - Optional combination for unionAll handling.
|
|
87
|
+
* @param externalCounter - Optional external counter for shared CTE aliases across combinations.
|
|
88
|
+
* @returns Map of repeat selects to their contexts and list of top-level repeats.
|
|
89
|
+
*/
|
|
90
|
+
buildRepeatContextMap(selects, context, combination, externalCounter) {
|
|
91
|
+
const repeatContextMap = new Map();
|
|
92
|
+
// Use external counter if provided, otherwise create a local one.
|
|
93
|
+
const counterState = externalCounter ?? { value: 0 };
|
|
94
|
+
const topLevelRepeat = this.collectTopLevelRepeat(selects, combination);
|
|
95
|
+
for (const select of topLevelRepeat) {
|
|
96
|
+
this.generateRepeatContext(select, context.resourceAlias + ".json", context, repeatContextMap, counterState);
|
|
97
|
+
}
|
|
98
|
+
return { repeatContextMap, topLevelRepeat };
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Collect all repeat selects that should be treated as top-level.
|
|
102
|
+
*/
|
|
103
|
+
collectTopLevelRepeat(selects, combination) {
|
|
104
|
+
const topLevelRepeat = [];
|
|
105
|
+
for (const select of selects) {
|
|
106
|
+
this.processSelectRepeat(select, topLevelRepeat);
|
|
107
|
+
// Also process unionAll choices if present and parent doesn't have repeat.
|
|
108
|
+
if (combination && !this.isRepeatSelect(select)) {
|
|
109
|
+
this.processUnionAllChoice(select, combination, topLevelRepeat);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return topLevelRepeat;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Process a select for repeat, handling both direct repeat and nested selects.
|
|
116
|
+
*/
|
|
117
|
+
processSelectRepeat(select, topLevelRepeat) {
|
|
118
|
+
if (this.isRepeatSelect(select)) {
|
|
119
|
+
topLevelRepeat.push(select);
|
|
120
|
+
}
|
|
121
|
+
else if (select.select) {
|
|
122
|
+
this.addRepeatFromSelectArray(select.select, topLevelRepeat);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Process a select with a unionAll choice from a combination.
|
|
127
|
+
*/
|
|
128
|
+
processUnionAllChoice(select, combination, topLevelRepeat) {
|
|
129
|
+
const selectIndex = combination.selects.indexOf(select);
|
|
130
|
+
const unionChoice = selectIndex >= 0 ? combination.unionChoices[selectIndex] : -1;
|
|
131
|
+
if (unionChoice >= 0 && select.unionAll?.[unionChoice]) {
|
|
132
|
+
const chosenBranch = select.unionAll[unionChoice];
|
|
133
|
+
if (this.isRepeatSelect(chosenBranch)) {
|
|
134
|
+
topLevelRepeat.push(chosenBranch);
|
|
135
|
+
}
|
|
136
|
+
else if (chosenBranch.select) {
|
|
137
|
+
this.addRepeatFromSelectArray(chosenBranch.select, topLevelRepeat);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Add repeat selects from a select array to the topLevelRepeat list.
|
|
143
|
+
*/
|
|
144
|
+
addRepeatFromSelectArray(selects, topLevelRepeat) {
|
|
145
|
+
for (const nestedSelect of selects) {
|
|
146
|
+
if (this.isRepeatSelect(nestedSelect)) {
|
|
147
|
+
topLevelRepeat.push(nestedSelect);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Generate repeat context for a single repeat select.
|
|
153
|
+
*/
|
|
154
|
+
generateRepeatContext(repeatSelect, sourceExpression, baseContext, repeatContextMap, counterState) {
|
|
155
|
+
const cteAlias = `repeat_${counterState.value++}`;
|
|
156
|
+
const paths = repeatSelect.repeat ?? [];
|
|
157
|
+
const repeatContext = {
|
|
158
|
+
cteAlias,
|
|
159
|
+
paths,
|
|
160
|
+
sourceExpression,
|
|
161
|
+
transpilerContext: {
|
|
162
|
+
...baseContext,
|
|
163
|
+
// The iteration context points to the CTE's item_json column.
|
|
164
|
+
iterationContext: `${cteAlias}.item_json`,
|
|
165
|
+
currentForEachAlias: cteAlias,
|
|
166
|
+
forEachSource: sourceExpression,
|
|
167
|
+
forEachPath: paths.join(", "),
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
repeatContextMap.set(repeatSelect, repeatContext);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Generate CTE definitions as an array for repeat operations.
|
|
174
|
+
*
|
|
175
|
+
* This method returns the CTE definitions without the WITH keyword,
|
|
176
|
+
* allowing them to be consolidated when multiple unionAll branches
|
|
177
|
+
* each have their own repeat CTEs.
|
|
178
|
+
*
|
|
179
|
+
* @param repeatContextMap - Map of repeat selects to their contexts.
|
|
180
|
+
* @param topLevelRepeat - List of top-level repeat selects.
|
|
181
|
+
* @param resourceAlias - The alias for the resource table (e.g., "r").
|
|
182
|
+
* @param resourceType - The FHIR resource type.
|
|
183
|
+
* @param testId - Optional test ID for filtering.
|
|
184
|
+
* @param tableName - The fully qualified table name (e.g., "[dbo].[fhir_resources]").
|
|
185
|
+
* @returns Array of CTE definition strings (without WITH keyword).
|
|
186
|
+
*/
|
|
187
|
+
buildRepeatCteDefinitions(repeatContextMap, topLevelRepeat, resourceAlias, resourceType, testId, tableName = "[dbo].[fhir_resources]") {
|
|
188
|
+
if (topLevelRepeat.length === 0) {
|
|
189
|
+
return [];
|
|
190
|
+
}
|
|
191
|
+
const cteDefinitions = [];
|
|
192
|
+
for (const select of topLevelRepeat) {
|
|
193
|
+
const repeatContext = repeatContextMap.get(select);
|
|
194
|
+
if (!repeatContext) {
|
|
195
|
+
throw new Error("Repeat context not found for select.");
|
|
196
|
+
}
|
|
197
|
+
const cteDef = this.generateSingleCte(repeatContext, resourceAlias, resourceType, testId, tableName);
|
|
198
|
+
cteDefinitions.push(cteDef);
|
|
199
|
+
}
|
|
200
|
+
return cteDefinitions;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Generate a single recursive CTE definition.
|
|
204
|
+
*
|
|
205
|
+
* The CTE has the following structure:
|
|
206
|
+
* - Anchor member: Selects initial items using the FIRST path from the root.
|
|
207
|
+
* Only the first path is used for the anchor because subsequent paths
|
|
208
|
+
* (like `answer.item`) represent traversal patterns that should only be
|
|
209
|
+
* followed during recursion, not at the root level.
|
|
210
|
+
* - Recursive member: For each path in repeat, follows that path from the
|
|
211
|
+
* current level and unions all results.
|
|
212
|
+
*
|
|
213
|
+
* The CTE columns are:
|
|
214
|
+
* - resource_id: Links back to the source resource.
|
|
215
|
+
* - item_json: The JSON content of the current item (used for column extraction).
|
|
216
|
+
* - depth: Recursion depth (used to prevent infinite loops).
|
|
217
|
+
*/
|
|
218
|
+
generateSingleCte(repeatContext, resourceAlias, resourceType, testId, tableName = "[dbo].[fhir_resources]") {
|
|
219
|
+
const { cteAlias, paths, sourceExpression } = repeatContext;
|
|
220
|
+
// Build anchor member using only the FIRST path.
|
|
221
|
+
// The anchor represents the entry point into the tree structure.
|
|
222
|
+
// For example, with `repeat: ["item", "answer.item"]`, the anchor uses
|
|
223
|
+
// `$.item` to get the root items. The `answer.item` path is only followed
|
|
224
|
+
// during recursion when traversing from an item that has answers.
|
|
225
|
+
const firstPath = paths[0];
|
|
226
|
+
const anchorJsonPath = this.buildJsonPath(firstPath);
|
|
227
|
+
const anchorSql = `SELECT
|
|
228
|
+
[${resourceAlias}].[id] AS resource_id,
|
|
229
|
+
anchor.value AS item_json,
|
|
230
|
+
0 AS depth
|
|
231
|
+
FROM ${tableName} AS [${resourceAlias}]
|
|
232
|
+
CROSS APPLY OPENJSON(${sourceExpression}, '${anchorJsonPath}') AS anchor
|
|
233
|
+
WHERE [${resourceAlias}].[resource_type] = '${resourceType}'${this.buildTestIdCondition(resourceAlias, testId)}`;
|
|
234
|
+
// Build recursive member: for each path, follows that path from current item.
|
|
235
|
+
// All paths are used during recursion to traverse the tree structure.
|
|
236
|
+
// Multi-segment paths like "answer.item" require nested CROSS APPLY.
|
|
237
|
+
const recursiveMembers = paths.map((path, index) => {
|
|
238
|
+
return this.buildRecursiveMember(path, cteAlias, index);
|
|
239
|
+
});
|
|
240
|
+
const recursiveSql = recursiveMembers.join("\n UNION ALL\n");
|
|
241
|
+
return `${cteAlias} AS (
|
|
242
|
+
${anchorSql}
|
|
243
|
+
UNION ALL
|
|
244
|
+
${recursiveSql}
|
|
245
|
+
)`;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Build a recursive member for a single path.
|
|
249
|
+
*
|
|
250
|
+
* Multi-segment paths like "answer.item" require nested CROSS APPLY clauses
|
|
251
|
+
* to traverse through each array. For example, "answer.item" means:
|
|
252
|
+
* 1. Iterate over the `answer` array
|
|
253
|
+
* 2. For each answer, iterate over the `item` array within it
|
|
254
|
+
*
|
|
255
|
+
* @param path - The FHIRPath expression (e.g., "item" or "answer.item").
|
|
256
|
+
* @param cteAlias - The alias of the recursive CTE.
|
|
257
|
+
* @param index - Index of this path for alias generation.
|
|
258
|
+
* @returns SQL fragment for the recursive member.
|
|
259
|
+
*/
|
|
260
|
+
buildRecursiveMember(path, cteAlias, index) {
|
|
261
|
+
const segments = path.split(".");
|
|
262
|
+
if (segments.length === 1) {
|
|
263
|
+
// Simple path: single CROSS APPLY.
|
|
264
|
+
const jsonPath = `$.${segments[0]}`;
|
|
265
|
+
const alias = `child_${index}`;
|
|
266
|
+
return `SELECT
|
|
267
|
+
cte.resource_id,
|
|
268
|
+
${alias}.value AS item_json,
|
|
269
|
+
cte.depth + 1
|
|
270
|
+
FROM ${cteAlias} AS cte
|
|
271
|
+
CROSS APPLY OPENJSON(cte.item_json, '${jsonPath}') AS ${alias}`;
|
|
272
|
+
}
|
|
273
|
+
// Multi-segment path: nested CROSS APPLY for each segment.
|
|
274
|
+
// Build from inside out: the last segment is the final result.
|
|
275
|
+
let crossApplies = "";
|
|
276
|
+
let currentSource = "cte.item_json";
|
|
277
|
+
for (let i = 0; i < segments.length; i++) {
|
|
278
|
+
const segment = segments[i];
|
|
279
|
+
const alias = `child_${index}_${i}`;
|
|
280
|
+
crossApplies += `\n CROSS APPLY OPENJSON(${currentSource}, '$.${segment}') AS ${alias}`;
|
|
281
|
+
currentSource = `${alias}.value`;
|
|
282
|
+
}
|
|
283
|
+
const finalAlias = `child_${index}_${segments.length - 1}`;
|
|
284
|
+
return `SELECT
|
|
285
|
+
cte.resource_id,
|
|
286
|
+
${finalAlias}.value AS item_json,
|
|
287
|
+
cte.depth + 1
|
|
288
|
+
FROM ${cteAlias} AS cte${crossApplies}`;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Build a JSON path from a FHIRPath expression.
|
|
292
|
+
* Handles simple paths and dot-separated paths like "answer.item".
|
|
293
|
+
*/
|
|
294
|
+
buildJsonPath(fhirPath) {
|
|
295
|
+
// Convert FHIRPath to JSON path (simple case: just prefix with $.).
|
|
296
|
+
return `$.${fhirPath}`;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Build the test ID condition for filtering test data.
|
|
300
|
+
*
|
|
301
|
+
* @param resourceAlias - The alias for the resource table.
|
|
302
|
+
* @param testId - Optional test ID for filtering.
|
|
303
|
+
* @returns SQL condition string or empty string if no testId.
|
|
304
|
+
*/
|
|
305
|
+
buildTestIdCondition(resourceAlias, testId) {
|
|
306
|
+
if (!testId) {
|
|
307
|
+
return "";
|
|
308
|
+
}
|
|
309
|
+
return `\n AND [${resourceAlias}].[test_id] = '${testId}'`;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Build CROSS APPLY clause to join CTE results to the main query.
|
|
313
|
+
*
|
|
314
|
+
* @param repeatContextMap - Map of repeat selects to their contexts.
|
|
315
|
+
* @param topLevelRepeat - List of top-level repeat selects.
|
|
316
|
+
* @param resourceAlias - The alias for the resource table.
|
|
317
|
+
* @returns The CROSS APPLY clause(s) for joining CTE results.
|
|
318
|
+
*/
|
|
319
|
+
buildRepeatApplyClauses(repeatContextMap, topLevelRepeat, resourceAlias) {
|
|
320
|
+
if (topLevelRepeat.length === 0) {
|
|
321
|
+
return "";
|
|
322
|
+
}
|
|
323
|
+
const applyClauses = [];
|
|
324
|
+
for (const select of topLevelRepeat) {
|
|
325
|
+
const repeatContext = repeatContextMap.get(select);
|
|
326
|
+
if (!repeatContext) {
|
|
327
|
+
throw new Error("Repeat context not found for select.");
|
|
328
|
+
}
|
|
329
|
+
// Join the CTE to the resource table by resource_id.
|
|
330
|
+
applyClauses.push(`\nINNER JOIN ${repeatContext.cteAlias} ON ${repeatContext.cteAlias}.resource_id = [${resourceAlias}].[id]`);
|
|
331
|
+
}
|
|
332
|
+
return applyClauses.join("");
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
exports.RepeatProcessor = RepeatProcessor;
|
|
336
|
+
//# sourceMappingURL=RepeatProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RepeatProcessor.js","sourceRoot":"","sources":["../../src/queryGenerator/RepeatProcessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { TranspilerContext } from "../fhirpath/transpiler.js";
|
|
|
5
5
|
import { ViewDefinitionSelect } from "../types.js";
|
|
6
6
|
import { SelectCombination } from "./SelectCombinationExpander.js";
|
|
7
7
|
import { ColumnExpressionGenerator } from "./ColumnExpressionGenerator.js";
|
|
8
|
+
import { RepeatContext } from "./RepeatProcessor.js";
|
|
8
9
|
/**
|
|
9
10
|
* Handles generation of SELECT clauses.
|
|
10
11
|
*/
|
|
@@ -19,6 +20,50 @@ export declare class SelectClauseBuilder {
|
|
|
19
20
|
* Generate SELECT clause specifically for forEach statements.
|
|
20
21
|
*/
|
|
21
22
|
generateForEachSelectClause(combination: SelectCombination, context: TranspilerContext, forEachContextMap: Map<ViewDefinitionSelect, TranspilerContext>): string;
|
|
23
|
+
/**
|
|
24
|
+
* Generate SELECT clause for repeat statements.
|
|
25
|
+
*
|
|
26
|
+
* For repeat selects, columns are extracted from the CTE's item_json column.
|
|
27
|
+
* Non-repeat columns use the base context (resource JSON).
|
|
28
|
+
* If forEach is also present, those columns use the forEach context.
|
|
29
|
+
*
|
|
30
|
+
* @param combination - The select combination being processed.
|
|
31
|
+
* @param context - The base transpiler context.
|
|
32
|
+
* @param repeatContextMap - Map of repeat selects to their contexts.
|
|
33
|
+
* @param forEachContextMap - Optional map of forEach selects to their contexts.
|
|
34
|
+
* @returns The generated SELECT clause.
|
|
35
|
+
*/
|
|
36
|
+
generateRepeatSelectClause(combination: SelectCombination, context: TranspilerContext, repeatContextMap: Map<ViewDefinitionSelect, RepeatContext>, forEachContextMap?: Map<ViewDefinitionSelect, TranspilerContext>): string;
|
|
37
|
+
/**
|
|
38
|
+
* Add columns for a repeat select.
|
|
39
|
+
*
|
|
40
|
+
* Columns within the repeat use the repeat context (CTE item_json).
|
|
41
|
+
* Nested forEach within the repeat use their forEach context.
|
|
42
|
+
*/
|
|
43
|
+
private addRepeatSelectColumns;
|
|
44
|
+
/**
|
|
45
|
+
* Add nested select columns for a repeat select.
|
|
46
|
+
*
|
|
47
|
+
* Nested forEach selects use their own context, while other nested selects
|
|
48
|
+
* use the repeat context.
|
|
49
|
+
*/
|
|
50
|
+
private addNestedSelectColumnsForRepeat;
|
|
51
|
+
/**
|
|
52
|
+
* Add columns for unionAll branches within a repeat select.
|
|
53
|
+
*/
|
|
54
|
+
private addRepeatUnionAllColumns;
|
|
55
|
+
/**
|
|
56
|
+
* Add columns for a non-repeat select (when repeat is present elsewhere).
|
|
57
|
+
*/
|
|
58
|
+
private addNonRepeatSelectColumns;
|
|
59
|
+
/**
|
|
60
|
+
* Add unionAll columns when repeat context is available.
|
|
61
|
+
*/
|
|
62
|
+
private addUnionAllColumnsForRepeatContext;
|
|
63
|
+
/**
|
|
64
|
+
* Check if a select is a repeat select.
|
|
65
|
+
*/
|
|
66
|
+
private isRepeatSelect;
|
|
22
67
|
/**
|
|
23
68
|
* Add columns from a select element to the column parts array.
|
|
24
69
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectClauseBuilder.d.ts","sourceRoot":"","sources":["../../src/queryGenerator/SelectClauseBuilder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAwB,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"SelectClauseBuilder.d.ts","sourceRoot":"","sources":["../../src/queryGenerator/SelectClauseBuilder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAwB,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4B;gBAEhD,eAAe,EAAE,yBAAyB;IAItD;;OAEG;IACH,0BAA0B,CACxB,WAAW,EAAE,iBAAiB,EAC9B,OAAO,EAAE,iBAAiB,GACzB,MAAM;IAcT;;OAEG;IACH,2BAA2B,CACzB,WAAW,EAAE,iBAAiB,EAC9B,OAAO,EAAE,iBAAiB,EAC1B,iBAAiB,EAAE,GAAG,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,GAC9D,MAAM;IA4BT;;;;;;;;;;;;OAYG;IACH,0BAA0B,CACxB,WAAW,EAAE,iBAAiB,EAC9B,OAAO,EAAE,iBAAiB,EAC1B,gBAAgB,EAAE,GAAG,CAAC,oBAAoB,EAAE,aAAa,CAAC,EAC1D,iBAAiB,CAAC,EAAE,GAAG,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,GAC/D,MAAM;IAqCT;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAqC9B;;;;;OAKG;IACH,OAAO,CAAC,+BAA+B;IAgCvC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAyBhC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAiDjC;;OAEG;IACH,OAAO,CAAC,kCAAkC;IAmC1C;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAyB/B;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAuBpC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA8B/B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA0BlC;;OAEG;IACH,OAAO,CAAC,gCAAgC;IA0BxC;;OAEG;IACH,OAAO,CAAC,mCAAmC;IA0B3C;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAyBnC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;OAEG;IACH,OAAO,CAAC,eAAe;CAGxB"}
|
|
@@ -42,6 +42,156 @@ class SelectClauseBuilder {
|
|
|
42
42
|
}
|
|
43
43
|
return `SELECT\n ${columnParts.join(",\n ")}`;
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Generate SELECT clause for repeat statements.
|
|
47
|
+
*
|
|
48
|
+
* For repeat selects, columns are extracted from the CTE's item_json column.
|
|
49
|
+
* Non-repeat columns use the base context (resource JSON).
|
|
50
|
+
* If forEach is also present, those columns use the forEach context.
|
|
51
|
+
*
|
|
52
|
+
* @param combination - The select combination being processed.
|
|
53
|
+
* @param context - The base transpiler context.
|
|
54
|
+
* @param repeatContextMap - Map of repeat selects to their contexts.
|
|
55
|
+
* @param forEachContextMap - Optional map of forEach selects to their contexts.
|
|
56
|
+
* @returns The generated SELECT clause.
|
|
57
|
+
*/
|
|
58
|
+
generateRepeatSelectClause(combination, context, repeatContextMap, forEachContextMap) {
|
|
59
|
+
const columnParts = [];
|
|
60
|
+
for (let i = 0; i < combination.selects.length; i++) {
|
|
61
|
+
const select = combination.selects[i];
|
|
62
|
+
const unionChoice = combination.unionChoices[i];
|
|
63
|
+
if (this.isRepeatSelect(select)) {
|
|
64
|
+
this.addRepeatSelectColumns(select, unionChoice, columnParts, repeatContextMap, forEachContextMap);
|
|
65
|
+
}
|
|
66
|
+
else if (this.isForEachSelect(select) && forEachContextMap) {
|
|
67
|
+
this.addForEachSelectColumns(select, unionChoice, columnParts, forEachContextMap);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
this.addNonRepeatSelectColumns(select, unionChoice, columnParts, context, repeatContextMap, forEachContextMap);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return `SELECT\n ${columnParts.join(",\n ")}`;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Add columns for a repeat select.
|
|
77
|
+
*
|
|
78
|
+
* Columns within the repeat use the repeat context (CTE item_json).
|
|
79
|
+
* Nested forEach within the repeat use their forEach context.
|
|
80
|
+
*/
|
|
81
|
+
addRepeatSelectColumns(select, unionChoice, columnParts, repeatContextMap, forEachContextMap) {
|
|
82
|
+
const repeatContext = repeatContextMap.get(select);
|
|
83
|
+
if (!repeatContext) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// Add columns from the repeat select using its transpiler context.
|
|
87
|
+
if (select.column) {
|
|
88
|
+
this.addColumnsToList(select.column, columnParts, repeatContext.transpilerContext);
|
|
89
|
+
}
|
|
90
|
+
this.addNestedSelectColumnsForRepeat(select, columnParts, repeatContext.transpilerContext, forEachContextMap);
|
|
91
|
+
this.addRepeatUnionAllColumns(select, unionChoice, columnParts, repeatContext.transpilerContext, repeatContextMap);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Add nested select columns for a repeat select.
|
|
95
|
+
*
|
|
96
|
+
* Nested forEach selects use their own context, while other nested selects
|
|
97
|
+
* use the repeat context.
|
|
98
|
+
*/
|
|
99
|
+
addNestedSelectColumnsForRepeat(select, columnParts, repeatTranspilerContext, forEachContextMap) {
|
|
100
|
+
if (!select.select) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
for (const nestedSelect of select.select) {
|
|
104
|
+
if (this.isForEachSelect(nestedSelect) && forEachContextMap) {
|
|
105
|
+
// Nested forEach uses its own context (source updated to use repeat CTE).
|
|
106
|
+
const nestedContext = forEachContextMap.get(nestedSelect);
|
|
107
|
+
if (nestedContext && nestedSelect.column) {
|
|
108
|
+
this.addColumnsToList(nestedSelect.column, columnParts, nestedContext);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if (nestedSelect.column) {
|
|
112
|
+
// Non-forEach nested selects use the repeat context.
|
|
113
|
+
this.addColumnsToList(nestedSelect.column, columnParts, repeatTranspilerContext);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Add columns for unionAll branches within a repeat select.
|
|
119
|
+
*/
|
|
120
|
+
addRepeatUnionAllColumns(select, unionChoice, columnParts, defaultContext, repeatContextMap) {
|
|
121
|
+
if (unionChoice < 0 || !select.unionAll?.[unionChoice]) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const chosenBranch = select.unionAll[unionChoice];
|
|
125
|
+
if (!chosenBranch.column) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
// Check if the chosen branch is also a repeat.
|
|
129
|
+
const branchRepeatContext = repeatContextMap.get(chosenBranch);
|
|
130
|
+
const branchContext = branchRepeatContext
|
|
131
|
+
? branchRepeatContext.transpilerContext
|
|
132
|
+
: defaultContext;
|
|
133
|
+
this.addColumnsToList(chosenBranch.column, columnParts, branchContext);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Add columns for a non-repeat select (when repeat is present elsewhere).
|
|
137
|
+
*/
|
|
138
|
+
addNonRepeatSelectColumns(select, unionChoice, columnParts, context, repeatContextMap, forEachContextMap) {
|
|
139
|
+
if (select.column) {
|
|
140
|
+
this.addColumnsToList(select.column, columnParts, context);
|
|
141
|
+
}
|
|
142
|
+
// Handle nested selects.
|
|
143
|
+
if (select.select) {
|
|
144
|
+
for (const nestedSelect of select.select) {
|
|
145
|
+
if (this.isRepeatSelect(nestedSelect)) {
|
|
146
|
+
this.addRepeatSelectColumns(nestedSelect, -1, columnParts, repeatContextMap, forEachContextMap);
|
|
147
|
+
}
|
|
148
|
+
else if (this.isForEachSelect(nestedSelect) && forEachContextMap) {
|
|
149
|
+
const nestedContext = forEachContextMap.get(nestedSelect);
|
|
150
|
+
if (nestedContext && nestedSelect.column) {
|
|
151
|
+
this.addColumnsToList(nestedSelect.column, columnParts, nestedContext);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
else if (nestedSelect.column) {
|
|
155
|
+
this.addColumnsToList(nestedSelect.column, columnParts, context);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Handle unionAll within non-repeat select.
|
|
160
|
+
this.addUnionAllColumnsForRepeatContext(select, unionChoice, columnParts, context, repeatContextMap, forEachContextMap);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Add unionAll columns when repeat context is available.
|
|
164
|
+
*/
|
|
165
|
+
addUnionAllColumnsForRepeatContext(select, unionChoice, columnParts, defaultContext, repeatContextMap, forEachContextMap) {
|
|
166
|
+
if (unionChoice < 0 || !select.unionAll?.[unionChoice]) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const chosenBranch = select.unionAll[unionChoice];
|
|
170
|
+
if (!chosenBranch.column) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
// Determine context based on directive type.
|
|
174
|
+
let branchContext = defaultContext;
|
|
175
|
+
if (this.isRepeatSelect(chosenBranch)) {
|
|
176
|
+
const repeatContext = repeatContextMap.get(chosenBranch);
|
|
177
|
+
if (repeatContext) {
|
|
178
|
+
branchContext = repeatContext.transpilerContext;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else if (this.isForEachSelect(chosenBranch) && forEachContextMap) {
|
|
182
|
+
const forEachContext = forEachContextMap.get(chosenBranch);
|
|
183
|
+
if (forEachContext) {
|
|
184
|
+
branchContext = forEachContext;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
this.addColumnsToList(chosenBranch.column, columnParts, branchContext);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Check if a select is a repeat select.
|
|
191
|
+
*/
|
|
192
|
+
isRepeatSelect(select) {
|
|
193
|
+
return !!(select.repeat && select.repeat.length > 0);
|
|
194
|
+
}
|
|
45
195
|
/**
|
|
46
196
|
* Add columns from a select element to the column parts array.
|
|
47
197
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectClauseBuilder.js","sourceRoot":"","sources":["../../src/queryGenerator/SelectClauseBuilder.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SelectClauseBuilder.js","sourceRoot":"","sources":["../../src/queryGenerator/SelectClauseBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ export declare class WhereClauseBuilder {
|
|
|
10
10
|
/**
|
|
11
11
|
* Build complete WHERE clause combining resource type filter and view-level filters.
|
|
12
12
|
* For test execution, testId is used to filter test data in the test table.
|
|
13
|
+
* Validates inputs to prevent SQL injection.
|
|
13
14
|
*/
|
|
14
15
|
buildWhereClause(resourceType: string, resourceAlias: string, testId: string | undefined, whereConditions: ViewDefinitionWhere[] | undefined, context: TranspilerContext): string | null;
|
|
15
16
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WhereClauseBuilder.d.ts","sourceRoot":"","sources":["../../src/queryGenerator/WhereClauseBuilder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAc,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"WhereClauseBuilder.d.ts","sourceRoot":"","sources":["../../src/queryGenerator/WhereClauseBuilder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAc,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGlD;;GAEG;AACH,qBAAa,kBAAkB;IAC7B;;;;OAIG;IACH,gBAAgB,CACd,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,eAAe,EAAE,mBAAmB,EAAE,GAAG,SAAS,EAClD,OAAO,EAAE,iBAAiB,GACzB,MAAM,GAAG,IAAI;IA6BhB;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAoChC"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.WhereClauseBuilder = void 0;
|
|
7
7
|
const transpiler_js_1 = require("../fhirpath/transpiler.js");
|
|
8
|
+
const validation_js_1 = require("../validation.js");
|
|
8
9
|
/**
|
|
9
10
|
* Handles generation of WHERE clauses.
|
|
10
11
|
*/
|
|
@@ -12,13 +13,16 @@ class WhereClauseBuilder {
|
|
|
12
13
|
/**
|
|
13
14
|
* Build complete WHERE clause combining resource type filter and view-level filters.
|
|
14
15
|
* For test execution, testId is used to filter test data in the test table.
|
|
16
|
+
* Validates inputs to prevent SQL injection.
|
|
15
17
|
*/
|
|
16
18
|
buildWhereClause(resourceType, resourceAlias, testId, whereConditions, context) {
|
|
17
19
|
const conditions = [];
|
|
18
|
-
//
|
|
20
|
+
// Validate and add resource type filter.
|
|
21
|
+
(0, validation_js_1.validateResourceType)(resourceType);
|
|
19
22
|
conditions.push(`[${resourceAlias}].[resource_type] = '${resourceType}'`);
|
|
20
|
-
//
|
|
23
|
+
// Validate and add test_id filter for test isolation (only used in test table which has test_id column).
|
|
21
24
|
if (testId) {
|
|
25
|
+
(0, validation_js_1.validateTestId)(testId);
|
|
22
26
|
conditions.push(`[${resourceAlias}].[test_id] = '${testId}'`);
|
|
23
27
|
}
|
|
24
28
|
// Add view-level WHERE conditions.
|