sof-mssql 2.0.0 → 2.2.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.
Files changed (91) hide show
  1. package/dist/load.d.ts.map +1 -1
  2. package/dist/load.js +3 -0
  3. package/dist/load.js.map +1 -1
  4. package/dist/loader/connection.d.ts.map +1 -1
  5. package/dist/loader/connection.js +6 -0
  6. package/dist/loader/connection.js.map +1 -1
  7. package/dist/loader/types.d.ts +2 -0
  8. package/dist/loader/types.d.ts.map +1 -1
  9. package/dist/parser.d.ts +10 -1
  10. package/dist/parser.d.ts.map +1 -1
  11. package/dist/parser.js +35 -1
  12. package/dist/parser.js.map +1 -1
  13. package/dist/queryGenerator/index.d.ts +0 -3
  14. package/dist/queryGenerator/index.d.ts.map +1 -1
  15. package/dist/queryGenerator/index.js +1 -7
  16. package/dist/queryGenerator/index.js.map +1 -1
  17. package/dist/queryGenerator/treeWalker/aliasGenerator.d.ts +26 -0
  18. package/dist/queryGenerator/treeWalker/aliasGenerator.d.ts.map +1 -0
  19. package/dist/queryGenerator/treeWalker/aliasGenerator.js +31 -0
  20. package/dist/queryGenerator/treeWalker/aliasGenerator.js.map +1 -0
  21. package/dist/queryGenerator/treeWalker/classify.d.ts +19 -0
  22. package/dist/queryGenerator/treeWalker/classify.d.ts.map +1 -0
  23. package/dist/queryGenerator/treeWalker/classify.js +36 -0
  24. package/dist/queryGenerator/treeWalker/classify.js.map +1 -0
  25. package/dist/queryGenerator/treeWalker/compile.d.ts +29 -0
  26. package/dist/queryGenerator/treeWalker/compile.d.ts.map +1 -0
  27. package/dist/queryGenerator/treeWalker/compile.js +98 -0
  28. package/dist/queryGenerator/treeWalker/compile.js.map +1 -0
  29. package/dist/queryGenerator/treeWalker/cteTemplates.d.ts +50 -0
  30. package/dist/queryGenerator/treeWalker/cteTemplates.d.ts.map +1 -0
  31. package/dist/queryGenerator/treeWalker/cteTemplates.js +95 -0
  32. package/dist/queryGenerator/treeWalker/cteTemplates.js.map +1 -0
  33. package/dist/queryGenerator/treeWalker/index.d.ts +6 -0
  34. package/dist/queryGenerator/treeWalker/index.d.ts.map +1 -0
  35. package/dist/queryGenerator/treeWalker/index.js +9 -0
  36. package/dist/queryGenerator/treeWalker/index.js.map +1 -0
  37. package/dist/queryGenerator/treeWalker/mergeSiblings.d.ts +28 -0
  38. package/dist/queryGenerator/treeWalker/mergeSiblings.d.ts.map +1 -0
  39. package/dist/queryGenerator/treeWalker/mergeSiblings.js +54 -0
  40. package/dist/queryGenerator/treeWalker/mergeSiblings.js.map +1 -0
  41. package/dist/queryGenerator/treeWalker/operators/columnsOnly.d.ts +40 -0
  42. package/dist/queryGenerator/treeWalker/operators/columnsOnly.d.ts.map +1 -0
  43. package/dist/queryGenerator/treeWalker/operators/columnsOnly.js +56 -0
  44. package/dist/queryGenerator/treeWalker/operators/columnsOnly.js.map +1 -0
  45. package/dist/queryGenerator/treeWalker/operators/forEach.d.ts +45 -0
  46. package/dist/queryGenerator/treeWalker/operators/forEach.d.ts.map +1 -0
  47. package/dist/queryGenerator/treeWalker/operators/forEach.js +144 -0
  48. package/dist/queryGenerator/treeWalker/operators/forEach.js.map +1 -0
  49. package/dist/queryGenerator/treeWalker/operators/group.d.ts +35 -0
  50. package/dist/queryGenerator/treeWalker/operators/group.d.ts.map +1 -0
  51. package/dist/queryGenerator/treeWalker/operators/group.js +56 -0
  52. package/dist/queryGenerator/treeWalker/operators/group.js.map +1 -0
  53. package/dist/queryGenerator/treeWalker/operators/repeat.d.ts +45 -0
  54. package/dist/queryGenerator/treeWalker/operators/repeat.d.ts.map +1 -0
  55. package/dist/queryGenerator/treeWalker/operators/repeat.js +110 -0
  56. package/dist/queryGenerator/treeWalker/operators/repeat.js.map +1 -0
  57. package/dist/queryGenerator/treeWalker/operators/unionAll.d.ts +54 -0
  58. package/dist/queryGenerator/treeWalker/operators/unionAll.d.ts.map +1 -0
  59. package/dist/queryGenerator/treeWalker/operators/unionAll.js +121 -0
  60. package/dist/queryGenerator/treeWalker/operators/unionAll.js.map +1 -0
  61. package/dist/queryGenerator/treeWalker/render.d.ts +34 -0
  62. package/dist/queryGenerator/treeWalker/render.d.ts.map +1 -0
  63. package/dist/queryGenerator/treeWalker/render.js +41 -0
  64. package/dist/queryGenerator/treeWalker/render.js.map +1 -0
  65. package/dist/queryGenerator/treeWalker/types.d.ts +66 -0
  66. package/dist/queryGenerator/treeWalker/types.d.ts.map +1 -0
  67. package/dist/queryGenerator/treeWalker/types.js +14 -0
  68. package/dist/queryGenerator/treeWalker/types.js.map +1 -0
  69. package/dist/queryGenerator/treeWalker/walker.d.ts +36 -0
  70. package/dist/queryGenerator/treeWalker/walker.d.ts.map +1 -0
  71. package/dist/queryGenerator/treeWalker/walker.js +58 -0
  72. package/dist/queryGenerator/treeWalker/walker.js.map +1 -0
  73. package/dist/queryGenerator.d.ts +8 -34
  74. package/dist/queryGenerator.d.ts.map +1 -1
  75. package/dist/queryGenerator.js +16 -110
  76. package/dist/queryGenerator.js.map +1 -1
  77. package/dist/types.d.ts +2 -0
  78. package/dist/types.d.ts.map +1 -1
  79. package/package.json +1 -1
  80. package/dist/queryGenerator/ForEachProcessor.d.ts +0 -127
  81. package/dist/queryGenerator/ForEachProcessor.d.ts.map +0 -1
  82. package/dist/queryGenerator/ForEachProcessor.js +0 -351
  83. package/dist/queryGenerator/ForEachProcessor.js.map +0 -1
  84. package/dist/queryGenerator/SelectClauseBuilder.d.ts +0 -63
  85. package/dist/queryGenerator/SelectClauseBuilder.d.ts.map +0 -1
  86. package/dist/queryGenerator/SelectClauseBuilder.js +0 -196
  87. package/dist/queryGenerator/SelectClauseBuilder.js.map +0 -1
  88. package/dist/queryGenerator/SelectCombinationExpander.d.ts +0 -42
  89. package/dist/queryGenerator/SelectCombinationExpander.d.ts.map +0 -1
  90. package/dist/queryGenerator/SelectCombinationExpander.js +0 -95
  91. package/dist/queryGenerator/SelectCombinationExpander.js.map +0 -1
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ /**
3
+ * SQL string templates for the recursive CTE produced by `repeat`.
4
+ *
5
+ * Builds the anchor + recursive members, propagating partition keys and
6
+ * baked scalar columns through both. Multi-segment paths chain CROSS APPLY
7
+ * OPENJSON per segment.
8
+ *
9
+ * Note: `__path` is built by string-concatenating each child's `[key]`.
10
+ * If a JSON object key contains a literal `.`, two distinct nodes could
11
+ * theoretically produce equal `__path` strings. FHIR JSON keys do not
12
+ * contain dots in practice; not a blocker.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.buildRepeatCte = buildRepeatCte;
16
+ /**
17
+ * Builds the SQL body of the recursive CTE used by the Repeat operator.
18
+ *
19
+ * Produces a `CteDefinition` whose body is an anchor SELECT followed by one
20
+ * `UNION ALL` recursive SELECT per path in `args.paths`. The anchor starts
21
+ * at the resource root and expands each array element via `OPENJSON`; each
22
+ * recursive member re-expands from the CTE's own `item_json` column,
23
+ * appending `.[key]` to the `__path` accumulator for stable per-element
24
+ * identity. Multi-segment paths (e.g. `"a.b.c"`) produce a chain of nested
25
+ * `CROSS APPLY OPENJSON` calls.
26
+ *
27
+ * @param args - Parameters controlling CTE generation: the CTE alias, the
28
+ * FHIRPath repeat paths, the JSON source expression for the anchor, the
29
+ * resource table FROM clause, any ancestor APPLY chain, the partition keys
30
+ * to propagate, and an optional resource-level WHERE predicate for the
31
+ * anchor.
32
+ * @returns A `CteDefinition` with `alias` set to `args.cteAlias` and `body`
33
+ * containing the full anchor + recursive SQL (without the outer
34
+ * `alias AS (...)` wrapper, which `renderRoot` adds).
35
+ */
36
+ function buildRepeatCte(args) {
37
+ const anchor = buildAnchorMember(args);
38
+ const recBlocks = args.paths.map((p, i) => buildRecursiveMember(args, p, i));
39
+ const body = `${anchor}
40
+ UNION ALL
41
+ ${recBlocks.join("\n UNION ALL\n")}`;
42
+ return { alias: args.cteAlias, body };
43
+ }
44
+ function buildAnchorMember(args) {
45
+ const { paths, source, fromClause, ancestorApplies, partitionKeys, resourcePredicate, } = args;
46
+ const projLines = partitionKeys
47
+ .map((k) => `${k.sqlExpr} AS [${k.name}]`)
48
+ .join(",\n ");
49
+ const chain = buildOpenJsonChain(source, paths[0], "anchor");
50
+ const wherePart = resourcePredicate ? `\n ${resourcePredicate}` : "";
51
+ return ` SELECT
52
+ ${projLines},
53
+ CAST(${chain.lastAlias}.[key] AS NVARCHAR(MAX)) AS __path,
54
+ ${chain.lastAlias}.value AS item_json,
55
+ 0 AS depth
56
+ ${fromClause}${ancestorApplies}
57
+ ${chain.applyClauses}${wherePart}`;
58
+ }
59
+ function buildRecursiveMember(args, path, index) {
60
+ const { cteAlias, partitionKeys } = args;
61
+ const head = partitionKeys.map((k) => `cte.[${k.name}]`).join(", ");
62
+ const chain = buildOpenJsonChain("cte.item_json", path, `child_${index}`);
63
+ return ` SELECT
64
+ ${head},
65
+ cte.__path + '.' + CAST(${chain.lastAlias}.[key] AS NVARCHAR(4000)) AS __path,
66
+ ${chain.lastAlias}.value AS item_json,
67
+ cte.depth + 1
68
+ FROM ${cteAlias} AS cte
69
+ ${chain.applyClauses}`;
70
+ }
71
+ /**
72
+ * Builds the CROSS APPLY OPENJSON chain for a (possibly multi-segment) path.
73
+ * For "a.b.c" produces three chained APPLYs; the last alias is `finalAlias`.
74
+ */
75
+ function buildOpenJsonChain(source, path, finalAlias) {
76
+ const segments = path.split(".");
77
+ if (segments.length === 1) {
78
+ return {
79
+ applyClauses: `CROSS APPLY OPENJSON(${source}, '$.${segments[0]}') AS ${finalAlias}`,
80
+ lastAlias: finalAlias,
81
+ };
82
+ }
83
+ let chain = "";
84
+ let currentSource = source;
85
+ for (let i = 0; i < segments.length; i++) {
86
+ const isLast = i === segments.length - 1;
87
+ const alias = isLast ? finalAlias : `${finalAlias}_${i}`;
88
+ if (i > 0)
89
+ chain += "\n ";
90
+ chain += `CROSS APPLY OPENJSON(${currentSource}, '$.${segments[i]}') AS ${alias}`;
91
+ currentSource = `${alias}.value`;
92
+ }
93
+ return { applyClauses: chain, lastAlias: finalAlias };
94
+ }
95
+ //# sourceMappingURL=cteTemplates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cteTemplates.js","sourceRoot":"","sources":["../../../src/queryGenerator/treeWalker/cteTemplates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Tree-walker query generator.
3
+ */
4
+ export { compileViewDefinition } from "./compile.js";
5
+ export type { CompileOptions } from "./compile.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/queryGenerator/treeWalker/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * Tree-walker query generator.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.compileViewDefinition = void 0;
7
+ var compile_js_1 = require("./compile.js");
8
+ Object.defineProperty(exports, "compileViewDefinition", { enumerable: true, get: function () { return compile_js_1.compileViewDefinition; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/queryGenerator/treeWalker/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,2CAAqD;AAA5C,mHAAA,qBAAqB,OAAA"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Merges sibling fragments produced by walking children of a Group.
3
+ *
4
+ * Flattens CTE lists, concatenates `fromExtensions` strings and `columns`
5
+ * arrays in order, and passes `partitionKeys` through unchanged from `ctx`.
6
+ */
7
+ import type { Context, Fragment } from "./types.js";
8
+ /**
9
+ * Merges sibling Fragments produced by walking children of a Group node.
10
+ *
11
+ * Flattens each fragment's `ctes` list, concatenates `fromExtensions` strings
12
+ * (preserving order so aliases are introduced before they are referenced), and
13
+ * concatenates `columns` arrays in lexical order. `partitionKeys` are passed
14
+ * through unchanged from `ctx` — siblings share the same partition scope.
15
+ *
16
+ * Returns an empty Fragment (no CTEs, no extensions, no columns) when
17
+ * `fragments` is empty, and returns the sole fragment unchanged when only one
18
+ * is provided.
19
+ *
20
+ * @param fragments - Ordered array of sibling Fragments to merge.
21
+ * @param ctx - The context of the parent Group node, used to supply
22
+ * `partitionKeys` for the merged result and as the base for the empty-array
23
+ * case.
24
+ * @returns A single merged Fragment whose columns, CTEs, and FROM extensions
25
+ * are the ordered union of all input fragments.
26
+ */
27
+ export declare function mergeSiblings(fragments: Fragment[], ctx: Context): Fragment;
28
+ //# sourceMappingURL=mergeSiblings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeSiblings.d.ts","sourceRoot":"","sources":["../../../src/queryGenerator/treeWalker/mergeSiblings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,QAAQ,CA0B3E"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * Merges sibling fragments produced by walking children of a Group.
4
+ *
5
+ * Flattens CTE lists, concatenates `fromExtensions` strings and `columns`
6
+ * arrays in order, and passes `partitionKeys` through unchanged from `ctx`.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.mergeSiblings = mergeSiblings;
10
+ /**
11
+ * Merges sibling Fragments produced by walking children of a Group node.
12
+ *
13
+ * Flattens each fragment's `ctes` list, concatenates `fromExtensions` strings
14
+ * (preserving order so aliases are introduced before they are referenced), and
15
+ * concatenates `columns` arrays in lexical order. `partitionKeys` are passed
16
+ * through unchanged from `ctx` — siblings share the same partition scope.
17
+ *
18
+ * Returns an empty Fragment (no CTEs, no extensions, no columns) when
19
+ * `fragments` is empty, and returns the sole fragment unchanged when only one
20
+ * is provided.
21
+ *
22
+ * @param fragments - Ordered array of sibling Fragments to merge.
23
+ * @param ctx - The context of the parent Group node, used to supply
24
+ * `partitionKeys` for the merged result and as the base for the empty-array
25
+ * case.
26
+ * @returns A single merged Fragment whose columns, CTEs, and FROM extensions
27
+ * are the ordered union of all input fragments.
28
+ */
29
+ function mergeSiblings(fragments, ctx) {
30
+ if (fragments.length === 0) {
31
+ return {
32
+ ctes: [],
33
+ fromExtensions: "",
34
+ columns: [],
35
+ partitionKeys: ctx.partitionKeys,
36
+ };
37
+ }
38
+ if (fragments.length === 1)
39
+ return fragments[0];
40
+ const ctes = fragments.flatMap((f) => f.ctes);
41
+ const fromExtensions = fragments.map((f) => f.fromExtensions).join("");
42
+ const columns = fragments.flatMap((f) => f.columns);
43
+ // Row siblings + zero or more set siblings: each set fragment already carries
44
+ // its own INNER JOIN to its CTE, joined on the partition keys it inherited
45
+ // from `ctx`. The outer FROM stays as the resource table so row siblings can
46
+ // keep their references to `r` valid.
47
+ return {
48
+ ctes,
49
+ fromExtensions,
50
+ columns,
51
+ partitionKeys: ctx.partitionKeys,
52
+ };
53
+ }
54
+ //# sourceMappingURL=mergeSiblings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeSiblings.js","sourceRoot":"","sources":["../../../src/queryGenerator/treeWalker/mergeSiblings.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAuBH,sCA0BC;AA7CD;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,aAAa,CAAC,SAAqB,EAAE,GAAY;IAC/D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,EAAE;YACR,cAAc,EAAE,EAAE;YAClB,OAAO,EAAE,EAAE;YACX,aAAa,EAAE,GAAG,CAAC,aAAa;SACjC,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IAEhD,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEpD,8EAA8E;IAC9E,2EAA2E;IAC3E,6EAA6E;IAC7E,sCAAsC;IACtC,OAAO;QACL,IAAI;QACJ,cAAc;QACd,OAAO;QACP,aAAa,EAAE,GAAG,CAAC,aAAa;KACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Walker for ColumnsOnly nodes — emits the projected columns for the
3
+ * select.column[] array using the current transpiler context.
4
+ */
5
+ import type { ViewDefinitionColumn, ViewDefinitionSelect } from "../../../types.js";
6
+ import type { ColumnExpressionGenerator } from "../../ColumnExpressionGenerator.js";
7
+ import type { Context, Fragment, ProjectedColumn } from "../types.js";
8
+ /**
9
+ * Projects an array of ViewDefinition column descriptors into SQL expressions.
10
+ *
11
+ * Delegates expression generation to `ColumnExpressionGenerator`, which
12
+ * translates each column's FHIRPath expression into a T-SQL expression
13
+ * relative to the current transpiler context (iteration source, aliases, etc.).
14
+ *
15
+ * @param columns - The column descriptors from the ViewDefinition select node.
16
+ * @param ctx - The current walker context supplying the transpiler context
17
+ * used for FHIRPath-to-SQL translation.
18
+ * @param columnGenerator - The generator that converts each column descriptor
19
+ * into its SQL expression string.
20
+ * @returns An ordered array of `ProjectedColumn` objects, each pairing the
21
+ * column's logical name with its SQL expression.
22
+ */
23
+ export declare function projectColumns(columns: ViewDefinitionColumn[], ctx: Context, columnGenerator: ColumnExpressionGenerator): ProjectedColumn[];
24
+ /**
25
+ * Walker for ColumnsOnly nodes — emits the projected columns for a leaf select node.
26
+ *
27
+ * Produces a Fragment with no CTEs, no FROM extensions, and columns derived
28
+ * from `node.column[]` via `projectColumns`. If `node.column` is absent or
29
+ * empty, the returned Fragment has an empty columns array.
30
+ *
31
+ * @param node - The leaf select node whose `column[]` array is projected.
32
+ * @param ctx - The current walker context supplying partition keys and the
33
+ * transpiler context for expression generation.
34
+ * @param columnGenerator - The generator that converts column descriptors into
35
+ * T-SQL expressions.
36
+ * @returns A Fragment carrying only projected columns; `ctes` and
37
+ * `fromExtensions` are always empty.
38
+ */
39
+ export declare function walkColumnsOnly(node: ViewDefinitionSelect, ctx: Context, columnGenerator: ColumnExpressionGenerator): Fragment;
40
+ //# sourceMappingURL=columnsOnly.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columnsOnly.d.ts","sourceRoot":"","sources":["../../../../src/queryGenerator/treeWalker/operators/columnsOnly.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEtE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,oBAAoB,EAAE,EAC/B,GAAG,EAAE,OAAO,EACZ,eAAe,EAAE,yBAAyB,GACzC,eAAe,EAAE,CAKnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,oBAAoB,EAC1B,GAAG,EAAE,OAAO,EACZ,eAAe,EAAE,yBAAyB,GACzC,QAAQ,CAUV"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ /**
3
+ * Walker for ColumnsOnly nodes — emits the projected columns for the
4
+ * select.column[] array using the current transpiler context.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.projectColumns = projectColumns;
8
+ exports.walkColumnsOnly = walkColumnsOnly;
9
+ /**
10
+ * Projects an array of ViewDefinition column descriptors into SQL expressions.
11
+ *
12
+ * Delegates expression generation to `ColumnExpressionGenerator`, which
13
+ * translates each column's FHIRPath expression into a T-SQL expression
14
+ * relative to the current transpiler context (iteration source, aliases, etc.).
15
+ *
16
+ * @param columns - The column descriptors from the ViewDefinition select node.
17
+ * @param ctx - The current walker context supplying the transpiler context
18
+ * used for FHIRPath-to-SQL translation.
19
+ * @param columnGenerator - The generator that converts each column descriptor
20
+ * into its SQL expression string.
21
+ * @returns An ordered array of `ProjectedColumn` objects, each pairing the
22
+ * column's logical name with its SQL expression.
23
+ */
24
+ function projectColumns(columns, ctx, columnGenerator) {
25
+ return columns.map((column) => ({
26
+ name: column.name,
27
+ sqlExpr: columnGenerator.generateExpression(column, ctx.transpilerCtx),
28
+ }));
29
+ }
30
+ /**
31
+ * Walker for ColumnsOnly nodes — emits the projected columns for a leaf select node.
32
+ *
33
+ * Produces a Fragment with no CTEs, no FROM extensions, and columns derived
34
+ * from `node.column[]` via `projectColumns`. If `node.column` is absent or
35
+ * empty, the returned Fragment has an empty columns array.
36
+ *
37
+ * @param node - The leaf select node whose `column[]` array is projected.
38
+ * @param ctx - The current walker context supplying partition keys and the
39
+ * transpiler context for expression generation.
40
+ * @param columnGenerator - The generator that converts column descriptors into
41
+ * T-SQL expressions.
42
+ * @returns A Fragment carrying only projected columns; `ctes` and
43
+ * `fromExtensions` are always empty.
44
+ */
45
+ function walkColumnsOnly(node, ctx, columnGenerator) {
46
+ const columns = node.column
47
+ ? projectColumns(node.column, ctx, columnGenerator)
48
+ : [];
49
+ return {
50
+ ctes: [],
51
+ fromExtensions: "",
52
+ columns,
53
+ partitionKeys: ctx.partitionKeys,
54
+ };
55
+ }
56
+ //# sourceMappingURL=columnsOnly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columnsOnly.js","sourceRoot":"","sources":["../../../../src/queryGenerator/treeWalker/operators/columnsOnly.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAwBH,wCASC;AAiBD,0CAcC;AAvDD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,cAAc,CAC5B,OAA+B,EAC/B,GAAY,EACZ,eAA0C;IAE1C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,eAAe,CAAC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,aAAa,CAAC;KACvE,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,eAAe,CAC7B,IAA0B,EAC1B,GAAY,EACZ,eAA0C;IAE1C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM;QACzB,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,eAAe,CAAC;QACnD,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;QACL,IAAI,EAAE,EAAE;QACR,cAAc,EAAE,EAAE;QAClB,OAAO;QACP,aAAa,EAAE,GAAG,CAAC,aAAa;KACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Walker for ForEach / ForEachOrNull nodes.
3
+ *
4
+ * Emits a CROSS APPLY (or OUTER APPLY) clause that iterates over a JSON
5
+ * array. Threads `ctx.source` and `ctx.transpilerCtx` so child nodes
6
+ * project columns relative to the iteration value, and appends a
7
+ * `<alias>_key` partition key.
8
+ *
9
+ * Path-handling parity is delegated to PathParser (`.where()`, `.first()`,
10
+ * array indexing, multi-segment array flattening).
11
+ */
12
+ import type { ViewDefinitionSelect } from "../../../types.js";
13
+ import type { PathParser } from "../../PathParser.js";
14
+ import { type Context, type Fragment } from "../types.js";
15
+ interface ForEachDeps {
16
+ pathParser: PathParser;
17
+ }
18
+ /**
19
+ * Walker for ForEach and ForEachOrNull nodes.
20
+ *
21
+ * Emits a `CROSS APPLY` (or `OUTER APPLY` for `forEachOrNull`) clause that
22
+ * iterates over a JSON array identified by the node's FHIRPath expression.
23
+ * Updates `ctx.source`, `ctx.transpilerCtx`, and `ctx.partitionKeys` so that
24
+ * child nodes project columns relative to each iteration value, then walks
25
+ * the child sub-tree (`column`, `select`, `unionAll`) in that inner context.
26
+ * The apply clause is prepended to the inner Fragment's `fromExtensions`.
27
+ *
28
+ * Path features handled via `PathParser`: `.where()` filters, `.first()`
29
+ * selectors, array indexing, and multi-segment array flattening (nested
30
+ * `CROSS APPLY OPENJSON` chains).
31
+ *
32
+ * @param node - The ForEach or ForEachOrNull select node. `node.forEach` or
33
+ * `node.forEachOrNull` supplies the FHIRPath expression to iterate.
34
+ * @param ctx - The current walker context; the inner context is derived from
35
+ * it by updating `source`, `partitionKeys`, `ancestorApplies`, `nullable`,
36
+ * and `transpilerCtx`.
37
+ * @param walk - The recursive walk function used to visit the inner sub-tree.
38
+ * @param deps - Dependencies containing the `PathParser` used to parse and
39
+ * decompose the FHIRPath expression.
40
+ * @returns A Fragment whose `fromExtensions` begins with the generated APPLY
41
+ * clause followed by any extensions produced by the inner walk.
42
+ */
43
+ export declare function walkForEach(node: ViewDefinitionSelect, ctx: Context, walk: (n: ViewDefinitionSelect, c: Context) => Fragment, deps: ForEachDeps): Fragment;
44
+ export {};
45
+ //# sourceMappingURL=forEach.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forEach.d.ts","sourceRoot":"","sources":["../../../../src/queryGenerator/treeWalker/operators/forEach.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,QAAQ,EAGd,MAAM,aAAa,CAAC;AAErB,UAAU,WAAW;IACnB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,oBAAoB,EAC1B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,OAAO,KAAK,QAAQ,EACvD,IAAI,EAAE,WAAW,GAChB,QAAQ,CA2BV"}
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ /**
3
+ * Walker for ForEach / ForEachOrNull nodes.
4
+ *
5
+ * Emits a CROSS APPLY (or OUTER APPLY) clause that iterates over a JSON
6
+ * array. Threads `ctx.source` and `ctx.transpilerCtx` so child nodes
7
+ * project columns relative to the iteration value, and appends a
8
+ * `<alias>_key` partition key.
9
+ *
10
+ * Path-handling parity is delegated to PathParser (`.where()`, `.first()`,
11
+ * array indexing, multi-segment array flattening).
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.walkForEach = walkForEach;
15
+ const aliasGenerator_js_1 = require("../aliasGenerator.js");
16
+ const types_js_1 = require("../types.js");
17
+ /**
18
+ * Walker for ForEach and ForEachOrNull nodes.
19
+ *
20
+ * Emits a `CROSS APPLY` (or `OUTER APPLY` for `forEachOrNull`) clause that
21
+ * iterates over a JSON array identified by the node's FHIRPath expression.
22
+ * Updates `ctx.source`, `ctx.transpilerCtx`, and `ctx.partitionKeys` so that
23
+ * child nodes project columns relative to each iteration value, then walks
24
+ * the child sub-tree (`column`, `select`, `unionAll`) in that inner context.
25
+ * The apply clause is prepended to the inner Fragment's `fromExtensions`.
26
+ *
27
+ * Path features handled via `PathParser`: `.where()` filters, `.first()`
28
+ * selectors, array indexing, and multi-segment array flattening (nested
29
+ * `CROSS APPLY OPENJSON` chains).
30
+ *
31
+ * @param node - The ForEach or ForEachOrNull select node. `node.forEach` or
32
+ * `node.forEachOrNull` supplies the FHIRPath expression to iterate.
33
+ * @param ctx - The current walker context; the inner context is derived from
34
+ * it by updating `source`, `partitionKeys`, `ancestorApplies`, `nullable`,
35
+ * and `transpilerCtx`.
36
+ * @param walk - The recursive walk function used to visit the inner sub-tree.
37
+ * @param deps - Dependencies containing the `PathParser` used to parse and
38
+ * decompose the FHIRPath expression.
39
+ * @returns A Fragment whose `fromExtensions` begins with the generated APPLY
40
+ * clause followed by any extensions produced by the inner walk.
41
+ */
42
+ function walkForEach(node, ctx, walk, deps) {
43
+ const isOrNull = node.forEachOrNull !== undefined;
44
+ const rawPath = node.forEach ?? node.forEachOrNull ?? "";
45
+ const applyType = isOrNull ? "OUTER APPLY" : "CROSS APPLY";
46
+ const alias = (0, aliasGenerator_js_1.freshAlias)(ctx, "forEach");
47
+ const applyClause = buildForEachApply(rawPath, ctx.source, alias, applyType, ctx.transpilerCtx, deps.pathParser);
48
+ const innerCtx = buildInnerCtx(ctx, alias, rawPath, applyClause, isOrNull);
49
+ const innerNode = {
50
+ column: node.column,
51
+ select: node.select,
52
+ unionAll: node.unionAll,
53
+ };
54
+ const inner = walk(innerNode, innerCtx);
55
+ return {
56
+ ...inner,
57
+ fromExtensions: applyClause + inner.fromExtensions,
58
+ };
59
+ }
60
+ function buildInnerCtx(ctx, alias, rawPath, applyClause, isOrNull) {
61
+ const innerTranspilerCtx = {
62
+ ...ctx.transpilerCtx,
63
+ iterationContext: `${alias}.value`,
64
+ currentForEachAlias: alias,
65
+ forEachSource: ctx.source,
66
+ forEachPath: `$.${rawPath}`,
67
+ };
68
+ const innerKey = {
69
+ name: `${alias}_key`,
70
+ sqlExpr: `${alias}.[key]`,
71
+ sqlType: types_js_1.SQL_NVARCHAR_4000,
72
+ };
73
+ return {
74
+ ...ctx,
75
+ source: `${alias}.value`,
76
+ partitionKeys: [...ctx.partitionKeys, innerKey],
77
+ ancestorApplies: ctx.ancestorApplies + applyClause,
78
+ nullable: ctx.nullable || isOrNull,
79
+ transpilerCtx: innerTranspilerCtx,
80
+ };
81
+ }
82
+ /**
83
+ * Builds the CROSS/OUTER APPLY clause string for a forEach path, handling
84
+ * `.where()`, `.first()`, array indexing, and multi-segment array
85
+ * flattening.
86
+ */
87
+ function buildForEachApply(rawPath, source, alias, applyType, transpilerCtx, pathParser) {
88
+ const { path: pathWithoutWhere, whereCondition, useFirst, } = pathParser.parseFhirPathWhere(rawPath, transpilerCtx);
89
+ const { path: forEachPath, arrayIndex } = pathParser.parseArrayIndexing(pathWithoutWhere);
90
+ const arrayPaths = pathParser.detectArrayFlatteningPaths(forEachPath);
91
+ if (arrayPaths.length > 1) {
92
+ return buildNestedApply(arrayPaths, source, alias, applyType, pathParser, arrayIndex, whereCondition);
93
+ }
94
+ return buildSimpleApply(applyType, source, forEachPath, alias, arrayIndex, whereCondition, useFirst);
95
+ }
96
+ function buildSimpleApply(applyType, source, path, alias, arrayIndex, whereCondition, useFirst) {
97
+ const whereClauses = [];
98
+ if (arrayIndex !== null)
99
+ whereClauses.push(`[key] = '${arrayIndex}'`);
100
+ if (whereCondition !== null)
101
+ whereClauses.push(whereCondition);
102
+ if (whereClauses.length > 0 || useFirst) {
103
+ const topClause = useFirst ? "TOP 1 " : "";
104
+ const orderBy = useFirst ? " ORDER BY [key]" : "";
105
+ const whereClause = whereClauses.length > 0 ? `WHERE ${whereClauses.join(" AND ")}` : "";
106
+ return `\n${applyType} (
107
+ SELECT ${topClause}* FROM OPENJSON(${source}, '$.${path}')
108
+ ${whereClause}${orderBy}
109
+ ) AS ${alias}`;
110
+ }
111
+ return `\n${applyType} OPENJSON(${source}, '$.${path}') AS ${alias}`;
112
+ }
113
+ function buildNestedApply(arrayPaths, source, finalAlias, applyType, pathParser, arrayIndex, whereCondition) {
114
+ let clauses = "";
115
+ let currentSource = source;
116
+ for (let i = 0; i < arrayPaths.length; i++) {
117
+ const isLast = i === arrayPaths.length - 1;
118
+ const alias = isLast ? finalAlias : `${finalAlias}_nest${i}`;
119
+ const segment = pathParser.extractPathSegment(arrayPaths, i);
120
+ const { cleanSegment, segmentIndex } = pathParser.parseSegmentIndexing(segment);
121
+ const jsonPath = `$.${cleanSegment}`;
122
+ const whereClauses = [];
123
+ if (segmentIndex !== null) {
124
+ whereClauses.push(`[key] = '${segmentIndex}'`);
125
+ }
126
+ else if (isLast && arrayIndex !== null) {
127
+ whereClauses.push(`[key] = '${arrayIndex}'`);
128
+ }
129
+ if (isLast && whereCondition !== null)
130
+ whereClauses.push(whereCondition);
131
+ if (whereClauses.length > 0) {
132
+ clauses += `\n${applyType} (
133
+ SELECT * FROM OPENJSON(${currentSource}, '${jsonPath}')
134
+ WHERE ${whereClauses.join(" AND ")}
135
+ ) AS ${alias}`;
136
+ }
137
+ else {
138
+ clauses += `\n${applyType} OPENJSON(${currentSource}, '${jsonPath}') AS ${alias}`;
139
+ }
140
+ currentSource = `${alias}.value`;
141
+ }
142
+ return clauses;
143
+ }
144
+ //# sourceMappingURL=forEach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forEach.js","sourceRoot":"","sources":["../../../../src/queryGenerator/treeWalker/operators/forEach.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Walker for Group nodes — visits each child and merges their fragments.
3
+ *
4
+ * If the node has both `column` and `select`, the columns are emitted as
5
+ * an implicit first ColumnsOnly child so they appear before the children's
6
+ * projections in lexical order.
7
+ */
8
+ import type { ViewDefinitionSelect } from "../../../types.js";
9
+ import type { ColumnExpressionGenerator } from "../../ColumnExpressionGenerator.js";
10
+ import type { Context, Fragment } from "../types.js";
11
+ import { projectColumns } from "./columnsOnly.js";
12
+ /**
13
+ * Walker for Group nodes — visits each child select and merges their Fragments.
14
+ *
15
+ * If the node has both `column[]` and `select[]`, the columns are emitted as
16
+ * an implicit first ColumnsOnly child so they appear before the child select
17
+ * projections in lexical order. All children are walked with the same
18
+ * unmodified `ctx`; their Fragments are merged via `mergeSiblings`.
19
+ *
20
+ * Returns an empty Fragment when the node has neither `column[]` nor
21
+ * `select[]` children.
22
+ *
23
+ * @param node - The Group select node, which may carry `column[]`, `select[]`,
24
+ * or both.
25
+ * @param ctx - The current walker context passed unchanged to every child.
26
+ * @param walk - The recursive walk function used to visit each child select
27
+ * node.
28
+ * @param columnGenerator - The generator forwarded to `walkColumnsOnly` when
29
+ * the node also carries inline `column[]` entries.
30
+ * @returns A merged Fragment whose columns, CTEs, and FROM extensions are the
31
+ * ordered union of all child Fragments.
32
+ */
33
+ export declare function walkGroup(node: ViewDefinitionSelect, ctx: Context, walk: (n: ViewDefinitionSelect, c: Context) => Fragment, columnGenerator: ColumnExpressionGenerator): Fragment;
34
+ export { projectColumns };
35
+ //# sourceMappingURL=group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../../../src/queryGenerator/treeWalker/operators/group.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAEpF,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,cAAc,EAAmB,MAAM,kBAAkB,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,oBAAoB,EAC1B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,OAAO,KAAK,QAAQ,EACvD,eAAe,EAAE,yBAAyB,GACzC,QAAQ,CAuBV;AAGD,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ /**
3
+ * Walker for Group nodes — visits each child and merges their fragments.
4
+ *
5
+ * If the node has both `column` and `select`, the columns are emitted as
6
+ * an implicit first ColumnsOnly child so they appear before the children's
7
+ * projections in lexical order.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.projectColumns = void 0;
11
+ exports.walkGroup = walkGroup;
12
+ const mergeSiblings_js_1 = require("../mergeSiblings.js");
13
+ const columnsOnly_js_1 = require("./columnsOnly.js");
14
+ Object.defineProperty(exports, "projectColumns", { enumerable: true, get: function () { return columnsOnly_js_1.projectColumns; } });
15
+ /**
16
+ * Walker for Group nodes — visits each child select and merges their Fragments.
17
+ *
18
+ * If the node has both `column[]` and `select[]`, the columns are emitted as
19
+ * an implicit first ColumnsOnly child so they appear before the child select
20
+ * projections in lexical order. All children are walked with the same
21
+ * unmodified `ctx`; their Fragments are merged via `mergeSiblings`.
22
+ *
23
+ * Returns an empty Fragment when the node has neither `column[]` nor
24
+ * `select[]` children.
25
+ *
26
+ * @param node - The Group select node, which may carry `column[]`, `select[]`,
27
+ * or both.
28
+ * @param ctx - The current walker context passed unchanged to every child.
29
+ * @param walk - The recursive walk function used to visit each child select
30
+ * node.
31
+ * @param columnGenerator - The generator forwarded to `walkColumnsOnly` when
32
+ * the node also carries inline `column[]` entries.
33
+ * @returns A merged Fragment whose columns, CTEs, and FROM extensions are the
34
+ * ordered union of all child Fragments.
35
+ */
36
+ function walkGroup(node, ctx, walk, columnGenerator) {
37
+ const children = [];
38
+ if (node.column && node.column.length > 0) {
39
+ children.push((0, columnsOnly_js_1.walkColumnsOnly)(node, ctx, columnGenerator));
40
+ }
41
+ if (node.select) {
42
+ for (const child of node.select) {
43
+ children.push(walk(child, ctx));
44
+ }
45
+ }
46
+ if (children.length === 0) {
47
+ return {
48
+ ctes: [],
49
+ fromExtensions: "",
50
+ columns: [],
51
+ partitionKeys: ctx.partitionKeys,
52
+ };
53
+ }
54
+ return (0, mergeSiblings_js_1.mergeSiblings)(children, ctx);
55
+ }
56
+ //# sourceMappingURL=group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group.js","sourceRoot":"","sources":["../../../../src/queryGenerator/treeWalker/operators/group.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AA6BH,8BA4BC;AArDD,0DAAoD;AAEpD,qDAAmE;AAsD1D,+FAtDA,+BAAc,OAsDA;AApDvB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAgB,SAAS,CACvB,IAA0B,EAC1B,GAAY,EACZ,IAAuD,EACvD,eAA0C;IAE1C,MAAM,QAAQ,GAAe,EAAE,CAAC;IAEhC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,IAAA,gCAAe,EAAC,IAAI,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,IAAI,EAAE,EAAE;YACR,cAAc,EAAE,EAAE;YAClB,OAAO,EAAE,EAAE;YACX,aAAa,EAAE,GAAG,CAAC,aAAa;SACjC,CAAC;IACJ,CAAC;IAED,OAAO,IAAA,gCAAa,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC"}