sof-mssql 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.
Files changed (135) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +346 -0
  3. package/dist/cli.d.ts +7 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +85 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/fhirpath/transpiler.d.ts +18 -0
  8. package/dist/fhirpath/transpiler.d.ts.map +1 -0
  9. package/dist/fhirpath/transpiler.js +82 -0
  10. package/dist/fhirpath/transpiler.js.map +1 -0
  11. package/dist/fhirpath/visitor.d.ts +153 -0
  12. package/dist/fhirpath/visitor.d.ts.map +1 -0
  13. package/dist/fhirpath/visitor.js +1295 -0
  14. package/dist/fhirpath/visitor.js.map +1 -0
  15. package/dist/generated/grammar/fhirpathLexer.d.ts +88 -0
  16. package/dist/generated/grammar/fhirpathLexer.d.ts.map +1 -0
  17. package/dist/generated/grammar/fhirpathLexer.js +598 -0
  18. package/dist/generated/grammar/fhirpathLexer.js.map +1 -0
  19. package/dist/generated/grammar/fhirpathListener.d.ts +589 -0
  20. package/dist/generated/grammar/fhirpathListener.d.ts.map +1 -0
  21. package/dist/generated/grammar/fhirpathListener.js +4 -0
  22. package/dist/generated/grammar/fhirpathListener.js.map +1 -0
  23. package/dist/generated/grammar/fhirpathParser.d.ts +470 -0
  24. package/dist/generated/grammar/fhirpathParser.d.ts.map +1 -0
  25. package/dist/generated/grammar/fhirpathParser.js +3022 -0
  26. package/dist/generated/grammar/fhirpathParser.js.map +1 -0
  27. package/dist/generated/grammar/fhirpathVisitor.d.ts +372 -0
  28. package/dist/generated/grammar/fhirpathVisitor.d.ts.map +1 -0
  29. package/dist/generated/grammar/fhirpathVisitor.js +4 -0
  30. package/dist/generated/grammar/fhirpathVisitor.js.map +1 -0
  31. package/dist/index.d.ts +28 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +42 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/load.d.ts +14 -0
  36. package/dist/load.d.ts.map +1 -0
  37. package/dist/load.js +115 -0
  38. package/dist/load.js.map +1 -0
  39. package/dist/loader/connection.d.ts +36 -0
  40. package/dist/loader/connection.d.ts.map +1 -0
  41. package/dist/loader/connection.js +106 -0
  42. package/dist/loader/connection.js.map +1 -0
  43. package/dist/loader/discovery.d.ts +38 -0
  44. package/dist/loader/discovery.d.ts.map +1 -0
  45. package/dist/loader/discovery.js +107 -0
  46. package/dist/loader/discovery.js.map +1 -0
  47. package/dist/loader/index.d.ts +24 -0
  48. package/dist/loader/index.d.ts.map +1 -0
  49. package/dist/loader/index.js +193 -0
  50. package/dist/loader/index.js.map +1 -0
  51. package/dist/loader/progress.d.ts +70 -0
  52. package/dist/loader/progress.d.ts.map +1 -0
  53. package/dist/loader/progress.js +206 -0
  54. package/dist/loader/progress.js.map +1 -0
  55. package/dist/loader/stream.d.ts +21 -0
  56. package/dist/loader/stream.d.ts.map +1 -0
  57. package/dist/loader/stream.js +103 -0
  58. package/dist/loader/stream.js.map +1 -0
  59. package/dist/loader/tables.d.ts +43 -0
  60. package/dist/loader/tables.d.ts.map +1 -0
  61. package/dist/loader/tables.js +88 -0
  62. package/dist/loader/tables.js.map +1 -0
  63. package/dist/loader/types.d.ts +134 -0
  64. package/dist/loader/types.d.ts.map +1 -0
  65. package/dist/loader/types.js +8 -0
  66. package/dist/loader/types.js.map +1 -0
  67. package/dist/parser.d.ts +60 -0
  68. package/dist/parser.d.ts.map +1 -0
  69. package/dist/parser.js +226 -0
  70. package/dist/parser.js.map +1 -0
  71. package/dist/queryGenerator/ColumnExpressionGenerator.d.ts +52 -0
  72. package/dist/queryGenerator/ColumnExpressionGenerator.d.ts.map +1 -0
  73. package/dist/queryGenerator/ColumnExpressionGenerator.js +144 -0
  74. package/dist/queryGenerator/ColumnExpressionGenerator.js.map +1 -0
  75. package/dist/queryGenerator/ForEachProcessor.d.ts +127 -0
  76. package/dist/queryGenerator/ForEachProcessor.d.ts.map +1 -0
  77. package/dist/queryGenerator/ForEachProcessor.js +351 -0
  78. package/dist/queryGenerator/ForEachProcessor.js.map +1 -0
  79. package/dist/queryGenerator/PathParser.d.ts +64 -0
  80. package/dist/queryGenerator/PathParser.d.ts.map +1 -0
  81. package/dist/queryGenerator/PathParser.js +164 -0
  82. package/dist/queryGenerator/PathParser.js.map +1 -0
  83. package/dist/queryGenerator/SelectClauseBuilder.d.ts +63 -0
  84. package/dist/queryGenerator/SelectClauseBuilder.d.ts.map +1 -0
  85. package/dist/queryGenerator/SelectClauseBuilder.js +196 -0
  86. package/dist/queryGenerator/SelectClauseBuilder.js.map +1 -0
  87. package/dist/queryGenerator/SelectCombinationExpander.d.ts +42 -0
  88. package/dist/queryGenerator/SelectCombinationExpander.d.ts.map +1 -0
  89. package/dist/queryGenerator/SelectCombinationExpander.js +95 -0
  90. package/dist/queryGenerator/SelectCombinationExpander.js.map +1 -0
  91. package/dist/queryGenerator/WhereClauseBuilder.d.ts +20 -0
  92. package/dist/queryGenerator/WhereClauseBuilder.d.ts.map +1 -0
  93. package/dist/queryGenerator/WhereClauseBuilder.js +63 -0
  94. package/dist/queryGenerator/WhereClauseBuilder.js.map +1 -0
  95. package/dist/queryGenerator/index.d.ts +10 -0
  96. package/dist/queryGenerator/index.d.ts.map +1 -0
  97. package/dist/queryGenerator/index.js +19 -0
  98. package/dist/queryGenerator/index.js.map +1 -0
  99. package/dist/queryGenerator.d.ts +61 -0
  100. package/dist/queryGenerator.d.ts.map +1 -0
  101. package/dist/queryGenerator.js +187 -0
  102. package/dist/queryGenerator.js.map +1 -0
  103. package/dist/tests/sqlOnFhir.test.d.ts +11 -0
  104. package/dist/tests/sqlOnFhir.test.d.ts.map +1 -0
  105. package/dist/tests/sqlOnFhir.test.js +24 -0
  106. package/dist/tests/sqlOnFhir.test.js.map +1 -0
  107. package/dist/tests/utils/database.d.ts +38 -0
  108. package/dist/tests/utils/database.d.ts.map +1 -0
  109. package/dist/tests/utils/database.js +258 -0
  110. package/dist/tests/utils/database.js.map +1 -0
  111. package/dist/tests/utils/generator.d.ts +58 -0
  112. package/dist/tests/utils/generator.d.ts.map +1 -0
  113. package/dist/tests/utils/generator.js +195 -0
  114. package/dist/tests/utils/generator.js.map +1 -0
  115. package/dist/tests/utils/reporter.d.ts +83 -0
  116. package/dist/tests/utils/reporter.d.ts.map +1 -0
  117. package/dist/tests/utils/reporter.js +245 -0
  118. package/dist/tests/utils/reporter.js.map +1 -0
  119. package/dist/tests/utils/sqlOnFhir.d.ts +33 -0
  120. package/dist/tests/utils/sqlOnFhir.d.ts.map +1 -0
  121. package/dist/tests/utils/sqlOnFhir.js +281 -0
  122. package/dist/tests/utils/sqlOnFhir.js.map +1 -0
  123. package/dist/tests/utils/testContext.d.ts +18 -0
  124. package/dist/tests/utils/testContext.d.ts.map +1 -0
  125. package/dist/tests/utils/testContext.js +25 -0
  126. package/dist/tests/utils/testContext.js.map +1 -0
  127. package/dist/tests/utils/types.d.ts +31 -0
  128. package/dist/tests/utils/types.d.ts.map +1 -0
  129. package/dist/tests/utils/types.js +9 -0
  130. package/dist/tests/utils/types.js.map +1 -0
  131. package/dist/types.d.ts +288 -0
  132. package/dist/types.d.ts.map +1 -0
  133. package/dist/types.js +6 -0
  134. package/dist/types.js.map +1 -0
  135. package/package.json +76 -0
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Parses and interprets FHIRPath expressions for SQL generation.
3
+ */
4
+ import { TranspilerContext } from "../fhirpath/transpiler.js";
5
+ /**
6
+ * Result of parsing a FHIRPath expression with .where() function.
7
+ */
8
+ export interface FhirPathWhereResult {
9
+ path: string;
10
+ whereCondition: string | null;
11
+ useFirst: boolean;
12
+ }
13
+ /**
14
+ * Result of parsing array indexing from a path.
15
+ */
16
+ export interface ArrayIndexingResult {
17
+ path: string;
18
+ arrayIndex: number | null;
19
+ }
20
+ /**
21
+ * Result of parsing a path segment with array indexing.
22
+ */
23
+ export interface SegmentIndexingResult {
24
+ cleanSegment: string;
25
+ segmentIndex: number | null;
26
+ }
27
+ /**
28
+ * Handles parsing and interpretation of FHIRPath expressions.
29
+ */
30
+ export declare class PathParser {
31
+ private static readonly knownArrayFields;
32
+ /**
33
+ * Find the matching closing parenthesis for .where() using balanced counting.
34
+ */
35
+ private findWhereClosingParen;
36
+ /**
37
+ * Transpile a where condition to SQL.
38
+ */
39
+ private transpileWhereCondition;
40
+ /**
41
+ * Parse FHIRPath .where() function from a forEach path.
42
+ * Transpiles the where condition to SQL using the FHIRPath transpiler.
43
+ */
44
+ parseFhirPathWhere(path: string, context: TranspilerContext): FhirPathWhereResult;
45
+ /**
46
+ * Parse array indexing from a forEach path.
47
+ * For paths like "contact.telecom[0]", interpret as "contact[0].telecom[0]" - apply index to all array segments.
48
+ */
49
+ parseArrayIndexing(path: string): ArrayIndexingResult;
50
+ /**
51
+ * Parse array indexing from a path segment.
52
+ */
53
+ parseSegmentIndexing(pathSegment: string): SegmentIndexingResult;
54
+ /**
55
+ * Detect if a forEach path requires array flattening.
56
+ * Returns array of path segments that are arrays in FHIR Patient resource.
57
+ */
58
+ detectArrayFlatteningPaths(path: string): string[];
59
+ /**
60
+ * Extract path segment for a specific level in array paths.
61
+ */
62
+ extractPathSegment(arrayPaths: string[], index: number): string;
63
+ }
64
+ //# sourceMappingURL=PathParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PathParser.d.ts","sourceRoot":"","sources":["../../src/queryGenerator/PathParser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAc,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAQtC;IAEF;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAmB/B;;;OAGG;IACH,kBAAkB,CAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,iBAAiB,GACzB,mBAAmB;IAyCtB;;;OAGG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB;IAmCrD;;OAEG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,qBAAqB;IAQhE;;;OAGG;IACH,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAgBlD;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;CAOhE"}
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ /**
3
+ * Parses and interprets FHIRPath expressions for SQL generation.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PathParser = void 0;
7
+ const transpiler_js_1 = require("../fhirpath/transpiler.js");
8
+ /**
9
+ * Handles parsing and interpretation of FHIRPath expressions.
10
+ */
11
+ class PathParser {
12
+ static knownArrayFields = [
13
+ "name",
14
+ "telecom",
15
+ "address",
16
+ "contact",
17
+ "identifier",
18
+ "communication",
19
+ "link",
20
+ ];
21
+ /**
22
+ * Find the matching closing parenthesis for .where() using balanced counting.
23
+ */
24
+ findWhereClosingParen(path, whereStart) {
25
+ let parenCount = 0;
26
+ for (let i = whereStart; i < path.length; i++) {
27
+ if (path[i] === "(") {
28
+ parenCount++;
29
+ }
30
+ else if (path[i] === ")") {
31
+ if (parenCount === 0) {
32
+ return i;
33
+ }
34
+ parenCount--;
35
+ }
36
+ }
37
+ return -1;
38
+ }
39
+ /**
40
+ * Transpile a where condition to SQL.
41
+ */
42
+ transpileWhereCondition(condition, context) {
43
+ const itemContext = {
44
+ resourceAlias: "forEach_item",
45
+ constants: context.constants,
46
+ iterationContext: "value",
47
+ };
48
+ try {
49
+ return transpiler_js_1.Transpiler.transpile(condition, itemContext);
50
+ }
51
+ catch (error) {
52
+ throw new Error(`Failed to transpile .where() condition "${condition}": ${error instanceof Error ? error.message : String(error)}`);
53
+ }
54
+ }
55
+ /**
56
+ * Parse FHIRPath .where() function from a forEach path.
57
+ * Transpiles the where condition to SQL using the FHIRPath transpiler.
58
+ */
59
+ parseFhirPathWhere(path, context) {
60
+ const whereIndex = path.indexOf(".where(");
61
+ if (whereIndex === -1) {
62
+ return { path, whereCondition: null, useFirst: false };
63
+ }
64
+ const basePath = path.substring(0, whereIndex);
65
+ const whereStart = whereIndex + 7; // Position after ".where(".
66
+ const conditionEnd = this.findWhereClosingParen(path, whereStart);
67
+ if (conditionEnd === -1) {
68
+ throw new Error(`Unmatched parentheses in .where() function: ${path}`);
69
+ }
70
+ const condition = path.substring(whereStart, conditionEnd).trim();
71
+ let remainingPath = path.substring(conditionEnd + 1);
72
+ // Detect .first() to apply TOP 1 in SQL generation.
73
+ const useFirst = remainingPath === ".first()";
74
+ if (useFirst) {
75
+ remainingPath = ""; // Remove .first() from path - it will be handled via TOP 1
76
+ }
77
+ const fullPath = remainingPath ? `${basePath}${remainingPath}` : basePath;
78
+ // Handle .where(false) - filter out everything.
79
+ if (condition === "false") {
80
+ return {
81
+ path: fullPath,
82
+ whereCondition: "1 = 0",
83
+ useFirst: false,
84
+ };
85
+ }
86
+ return {
87
+ path: fullPath,
88
+ whereCondition: this.transpileWhereCondition(condition, context),
89
+ useFirst,
90
+ };
91
+ }
92
+ /**
93
+ * Parse array indexing from a forEach path.
94
+ * For paths like "contact.telecom[0]", interpret as "contact[0].telecom[0]" - apply index to all array segments.
95
+ */
96
+ parseArrayIndexing(path) {
97
+ const match = /^(.+)\[(\d+)]$/.exec(path);
98
+ if (!match) {
99
+ return { path, arrayIndex: null };
100
+ }
101
+ const basePath = match[1];
102
+ const arrayIndex = parseInt(match[2], 10);
103
+ // Check if this is a multi-segment path (e.g., contact.telecom[0]).
104
+ const segments = basePath.split(".");
105
+ if (segments.length > 1) {
106
+ // For contact.telecom[0], interpret as contact[0].telecom[0].
107
+ const indexedPath = segments
108
+ .map((seg) => {
109
+ const cleanSeg = seg.replace(/\[.*]/, "");
110
+ if (PathParser.knownArrayFields.includes(cleanSeg)) {
111
+ return `${cleanSeg}[${arrayIndex}]`;
112
+ }
113
+ return cleanSeg;
114
+ })
115
+ .join(".");
116
+ return {
117
+ path: indexedPath,
118
+ arrayIndex: null, // Index already applied in path.
119
+ };
120
+ }
121
+ return {
122
+ path: basePath,
123
+ arrayIndex: arrayIndex,
124
+ };
125
+ }
126
+ /**
127
+ * Parse array indexing from a path segment.
128
+ */
129
+ parseSegmentIndexing(pathSegment) {
130
+ const segmentMatch = /^(.+)\[(\d+)]$/.exec(pathSegment);
131
+ return {
132
+ cleanSegment: segmentMatch ? segmentMatch[1] : pathSegment,
133
+ segmentIndex: segmentMatch ? parseInt(segmentMatch[2], 10) : null,
134
+ };
135
+ }
136
+ /**
137
+ * Detect if a forEach path requires array flattening.
138
+ * Returns array of path segments that are arrays in FHIR Patient resource.
139
+ */
140
+ detectArrayFlatteningPaths(path) {
141
+ const segments = path.split(".");
142
+ const arraySegments = [];
143
+ for (let i = 0; i < segments.length; i++) {
144
+ const segment = segments[i];
145
+ const cleanSegment = segment.replace(/\[.*]/, "");
146
+ if (PathParser.knownArrayFields.includes(cleanSegment)) {
147
+ arraySegments.push(segments.slice(0, i + 1).join("."));
148
+ }
149
+ }
150
+ return arraySegments;
151
+ }
152
+ /**
153
+ * Extract path segment for a specific level in array paths.
154
+ */
155
+ extractPathSegment(arrayPaths, index) {
156
+ const fullPath = arrayPaths[index];
157
+ const previousPath = index > 0 ? arrayPaths[index - 1] : "";
158
+ return previousPath
159
+ ? fullPath.substring(previousPath.length + 1)
160
+ : fullPath;
161
+ }
162
+ }
163
+ exports.PathParser = PathParser;
164
+ //# sourceMappingURL=PathParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PathParser.js","sourceRoot":"","sources":["../../src/queryGenerator/PathParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Builds SELECT clauses for SQL queries.
3
+ */
4
+ import { TranspilerContext } from "../fhirpath/transpiler.js";
5
+ import { ViewDefinitionSelect } from "../types.js";
6
+ import { SelectCombination } from "./SelectCombinationExpander.js";
7
+ import { ColumnExpressionGenerator } from "./ColumnExpressionGenerator.js";
8
+ /**
9
+ * Handles generation of SELECT clauses.
10
+ */
11
+ export declare class SelectClauseBuilder {
12
+ private readonly columnGenerator;
13
+ constructor(columnGenerator: ColumnExpressionGenerator);
14
+ /**
15
+ * Generate SELECT clause for a simple (non-forEach) statement.
16
+ */
17
+ generateSimpleSelectClause(combination: SelectCombination, context: TranspilerContext): string;
18
+ /**
19
+ * Generate SELECT clause specifically for forEach statements.
20
+ */
21
+ generateForEachSelectClause(combination: SelectCombination, context: TranspilerContext, forEachContextMap: Map<ViewDefinitionSelect, TranspilerContext>): string;
22
+ /**
23
+ * Add columns from a select element to the column parts array.
24
+ */
25
+ private addSelectElementColumns;
26
+ /**
27
+ * Generate column expressions for a select element (used for nested selects).
28
+ */
29
+ private generateSelectElementColumns;
30
+ /**
31
+ * Add unionAll columns for the chosen combination.
32
+ */
33
+ private addUnionAllColumns;
34
+ /**
35
+ * Add columns for a forEach select.
36
+ */
37
+ private addForEachSelectColumns;
38
+ /**
39
+ * Add columns for a non-forEach select.
40
+ */
41
+ private addNonForEachSelectColumns;
42
+ /**
43
+ * Add nested select columns for forEach select.
44
+ */
45
+ private addNestedSelectColumnsForForEach;
46
+ /**
47
+ * Add nested select columns for non-forEach select.
48
+ */
49
+ private addNestedSelectColumnsForNonForEach;
50
+ /**
51
+ * Add unionAll columns for a select.
52
+ */
53
+ private addUnionAllColumnsForSelect;
54
+ /**
55
+ * Add columns to the column parts list.
56
+ */
57
+ private addColumnsToList;
58
+ /**
59
+ * Check if a select is a forEach or forEachOrNull.
60
+ */
61
+ private isForEachSelect;
62
+ }
63
+ //# sourceMappingURL=SelectClauseBuilder.d.ts.map
@@ -0,0 +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;AAE3E;;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;;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"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ /**
3
+ * Builds SELECT clauses for SQL queries.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SelectClauseBuilder = void 0;
7
+ /**
8
+ * Handles generation of SELECT clauses.
9
+ */
10
+ class SelectClauseBuilder {
11
+ columnGenerator;
12
+ constructor(columnGenerator) {
13
+ this.columnGenerator = columnGenerator;
14
+ }
15
+ /**
16
+ * Generate SELECT clause for a simple (non-forEach) statement.
17
+ */
18
+ generateSimpleSelectClause(combination, context) {
19
+ const columnParts = [];
20
+ for (let i = 0; i < combination.selects.length; i++) {
21
+ const select = combination.selects[i];
22
+ const unionChoice = combination.unionChoices[i];
23
+ this.addSelectElementColumns(select, columnParts, context);
24
+ this.addUnionAllColumns(select, unionChoice, columnParts, context);
25
+ }
26
+ return `SELECT\n ${columnParts.join(",\n ")}`;
27
+ }
28
+ /**
29
+ * Generate SELECT clause specifically for forEach statements.
30
+ */
31
+ generateForEachSelectClause(combination, context, forEachContextMap) {
32
+ const columnParts = [];
33
+ for (let i = 0; i < combination.selects.length; i++) {
34
+ const select = combination.selects[i];
35
+ const unionChoice = combination.unionChoices[i];
36
+ if (this.isForEachSelect(select)) {
37
+ this.addForEachSelectColumns(select, unionChoice, columnParts, forEachContextMap);
38
+ }
39
+ else {
40
+ this.addNonForEachSelectColumns(select, unionChoice, columnParts, context, forEachContextMap);
41
+ }
42
+ }
43
+ return `SELECT\n ${columnParts.join(",\n ")}`;
44
+ }
45
+ /**
46
+ * Add columns from a select element to the column parts array.
47
+ */
48
+ addSelectElementColumns(select, columnParts, context) {
49
+ // Skip forEach selects - handled separately.
50
+ if (this.isForEachSelect(select)) {
51
+ return;
52
+ }
53
+ if (select.column) {
54
+ this.addColumnsToList(select.column, columnParts, context);
55
+ }
56
+ if (select.select) {
57
+ for (const nestedSelect of select.select) {
58
+ const nestedColumns = this.generateSelectElementColumns(nestedSelect, context);
59
+ columnParts.push(...nestedColumns);
60
+ }
61
+ }
62
+ }
63
+ /**
64
+ * Generate column expressions for a select element (used for nested selects).
65
+ */
66
+ generateSelectElementColumns(select, context) {
67
+ const columnParts = [];
68
+ if (select.column) {
69
+ this.addColumnsToList(select.column, columnParts, context);
70
+ }
71
+ if (select.select) {
72
+ for (const nestedSelect of select.select) {
73
+ const nestedColumns = this.generateSelectElementColumns(nestedSelect, context);
74
+ columnParts.push(...nestedColumns);
75
+ }
76
+ }
77
+ return columnParts;
78
+ }
79
+ /**
80
+ * Add unionAll columns for the chosen combination.
81
+ */
82
+ addUnionAllColumns(select, unionChoice, columnParts, context, forEachContextMap) {
83
+ if (!select.unionAll ||
84
+ unionChoice < 0 ||
85
+ unionChoice >= select.unionAll.length) {
86
+ return;
87
+ }
88
+ const chosenUnion = select.unionAll[unionChoice];
89
+ if (this.isForEachSelect(chosenUnion) && forEachContextMap) {
90
+ const unionForEachContext = forEachContextMap.get(chosenUnion);
91
+ if (unionForEachContext && chosenUnion.column) {
92
+ this.addColumnsToList(chosenUnion.column, columnParts, unionForEachContext);
93
+ }
94
+ }
95
+ else if (chosenUnion.column) {
96
+ this.addColumnsToList(chosenUnion.column, columnParts, context);
97
+ }
98
+ }
99
+ /**
100
+ * Add columns for a forEach select.
101
+ */
102
+ addForEachSelectColumns(select, unionChoice, columnParts, forEachContextMap) {
103
+ const forEachContext = forEachContextMap.get(select);
104
+ if (!forEachContext) {
105
+ return;
106
+ }
107
+ if (select.column) {
108
+ this.addColumnsToList(select.column, columnParts, forEachContext);
109
+ }
110
+ this.addNestedSelectColumnsForForEach(select, columnParts, forEachContext, forEachContextMap);
111
+ this.addUnionAllColumnsForSelect(select, unionChoice, columnParts, forEachContext, forEachContextMap);
112
+ }
113
+ /**
114
+ * Add columns for a non-forEach select.
115
+ */
116
+ addNonForEachSelectColumns(select, unionChoice, columnParts, context, forEachContextMap) {
117
+ if (select.column) {
118
+ this.addColumnsToList(select.column, columnParts, context);
119
+ }
120
+ this.addNestedSelectColumnsForNonForEach(select, columnParts, context, forEachContextMap);
121
+ this.addUnionAllColumnsForSelect(select, unionChoice, columnParts, context, forEachContextMap);
122
+ }
123
+ /**
124
+ * Add nested select columns for forEach select.
125
+ */
126
+ addNestedSelectColumnsForForEach(select, columnParts, parentContext, forEachContextMap) {
127
+ if (!select.select) {
128
+ return;
129
+ }
130
+ for (const nestedSelect of select.select) {
131
+ if (this.isForEachSelect(nestedSelect)) {
132
+ const nestedContext = forEachContextMap.get(nestedSelect);
133
+ if (nestedContext && nestedSelect.column) {
134
+ this.addColumnsToList(nestedSelect.column, columnParts, nestedContext);
135
+ }
136
+ }
137
+ else if (nestedSelect.column) {
138
+ this.addColumnsToList(nestedSelect.column, columnParts, parentContext);
139
+ }
140
+ }
141
+ }
142
+ /**
143
+ * Add nested select columns for non-forEach select.
144
+ */
145
+ addNestedSelectColumnsForNonForEach(select, columnParts, context, forEachContextMap) {
146
+ if (!select.select) {
147
+ return;
148
+ }
149
+ for (const nestedSelect of select.select) {
150
+ if (this.isForEachSelect(nestedSelect)) {
151
+ const forEachContext = forEachContextMap.get(nestedSelect);
152
+ if (forEachContext && nestedSelect.column) {
153
+ this.addColumnsToList(nestedSelect.column, columnParts, forEachContext);
154
+ }
155
+ }
156
+ else if (nestedSelect.column) {
157
+ this.addColumnsToList(nestedSelect.column, columnParts, context);
158
+ }
159
+ }
160
+ }
161
+ /**
162
+ * Add unionAll columns for a select.
163
+ */
164
+ addUnionAllColumnsForSelect(select, unionChoice, columnParts, defaultContext, forEachContextMap) {
165
+ if (unionChoice < 0 || !select.unionAll?.[unionChoice]) {
166
+ return;
167
+ }
168
+ const chosenBranch = select.unionAll[unionChoice];
169
+ if (!chosenBranch.column) {
170
+ return;
171
+ }
172
+ const branchContext = this.isForEachSelect(chosenBranch)
173
+ ? forEachContextMap.get(chosenBranch)
174
+ : defaultContext;
175
+ if (branchContext) {
176
+ this.addColumnsToList(chosenBranch.column, columnParts, branchContext);
177
+ }
178
+ }
179
+ /**
180
+ * Add columns to the column parts list.
181
+ */
182
+ addColumnsToList(columns, columnParts, context) {
183
+ for (const column of columns) {
184
+ const columnSql = this.columnGenerator.generateExpression(column, context);
185
+ columnParts.push(`${columnSql} AS [${column.name}]`);
186
+ }
187
+ }
188
+ /**
189
+ * Check if a select is a forEach or forEachOrNull.
190
+ */
191
+ isForEachSelect(select) {
192
+ return !!(select.forEach ?? select.forEachOrNull);
193
+ }
194
+ }
195
+ exports.SelectClauseBuilder = SelectClauseBuilder;
196
+ //# sourceMappingURL=SelectClauseBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectClauseBuilder.js","sourceRoot":"","sources":["../../src/queryGenerator/SelectClauseBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Expands unionAll combinations from ViewDefinition select elements.
3
+ */
4
+ import { ViewDefinitionSelect } from "../types.js";
5
+ /**
6
+ * Represents a specific combination of selects with their unionAll choices.
7
+ */
8
+ export interface SelectCombination {
9
+ selects: ViewDefinitionSelect[];
10
+ unionChoices: number[];
11
+ }
12
+ /**
13
+ * Handles expansion of all possible unionAll combinations.
14
+ */
15
+ export declare class SelectCombinationExpander {
16
+ /**
17
+ * Expand all possible unionAll combinations from select elements.
18
+ */
19
+ expandCombinations(selects: ViewDefinitionSelect[]): SelectCombination[];
20
+ /**
21
+ * Expand combinations for a single select element.
22
+ * Handles nested unionAll by recursively expanding them.
23
+ */
24
+ private expandSelectCombinations;
25
+ /**
26
+ * Expand unionAll options for a select.
27
+ */
28
+ private expandUnionAllOptions;
29
+ /**
30
+ * Expand nested unionAll within a unionAll option.
31
+ */
32
+ private expandNestedUnion;
33
+ /**
34
+ * Add a simple unionAll combination (no nested unionAll).
35
+ */
36
+ private addSimpleUnionCombination;
37
+ /**
38
+ * Add a combination for a select without unionAll.
39
+ */
40
+ private addNonUnionCombination;
41
+ }
42
+ //# sourceMappingURL=SelectCombinationExpander.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectCombinationExpander.d.ts","sourceRoot":"","sources":["../../src/queryGenerator/SelectCombinationExpander.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,yBAAyB;IACpC;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,iBAAiB,EAAE;IAUxE;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAiBhC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwBzB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAajC;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAW/B"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ /**
3
+ * Expands unionAll combinations from ViewDefinition select elements.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SelectCombinationExpander = void 0;
7
+ /**
8
+ * Handles expansion of all possible unionAll combinations.
9
+ */
10
+ class SelectCombinationExpander {
11
+ /**
12
+ * Expand all possible unionAll combinations from select elements.
13
+ */
14
+ expandCombinations(selects) {
15
+ let combinations = [{ selects: [], unionChoices: [] }];
16
+ for (const select of selects) {
17
+ combinations = this.expandSelectCombinations(select, combinations);
18
+ }
19
+ return combinations;
20
+ }
21
+ /**
22
+ * Expand combinations for a single select element.
23
+ * Handles nested unionAll by recursively expanding them.
24
+ */
25
+ expandSelectCombinations(select, currentCombinations) {
26
+ const newCombinations = [];
27
+ for (const combination of currentCombinations) {
28
+ if (select.unionAll && select.unionAll.length > 0) {
29
+ this.expandUnionAllOptions(select, combination, newCombinations);
30
+ }
31
+ else {
32
+ this.addNonUnionCombination(select, combination, newCombinations);
33
+ }
34
+ }
35
+ return newCombinations;
36
+ }
37
+ /**
38
+ * Expand unionAll options for a select.
39
+ */
40
+ expandUnionAllOptions(select, combination, newCombinations) {
41
+ const unionAll = select.unionAll;
42
+ if (!unionAll)
43
+ return;
44
+ for (let i = 0; i < unionAll.length; i++) {
45
+ const unionOption = unionAll[i];
46
+ if (unionOption.unionAll && unionOption.unionAll.length > 0) {
47
+ this.expandNestedUnion(select, i, unionOption, combination, newCombinations);
48
+ }
49
+ else {
50
+ this.addSimpleUnionCombination(select, i, combination, newCombinations);
51
+ }
52
+ }
53
+ }
54
+ /**
55
+ * Expand nested unionAll within a unionAll option.
56
+ */
57
+ expandNestedUnion(select, unionIndex, unionOption, combination, newCombinations) {
58
+ const nestedCombinations = this.expandSelectCombinations(unionOption, [
59
+ { selects: [], unionChoices: [] },
60
+ ]);
61
+ for (const nestedComb of nestedCombinations) {
62
+ const newCombination = {
63
+ selects: [...combination.selects, select, ...nestedComb.selects],
64
+ unionChoices: [
65
+ ...combination.unionChoices,
66
+ unionIndex,
67
+ ...nestedComb.unionChoices,
68
+ ],
69
+ };
70
+ newCombinations.push(newCombination);
71
+ }
72
+ }
73
+ /**
74
+ * Add a simple unionAll combination (no nested unionAll).
75
+ */
76
+ addSimpleUnionCombination(select, unionIndex, combination, newCombinations) {
77
+ const newCombination = {
78
+ selects: [...combination.selects, select],
79
+ unionChoices: [...combination.unionChoices, unionIndex],
80
+ };
81
+ newCombinations.push(newCombination);
82
+ }
83
+ /**
84
+ * Add a combination for a select without unionAll.
85
+ */
86
+ addNonUnionCombination(select, combination, newCombinations) {
87
+ const newCombination = {
88
+ selects: [...combination.selects, select],
89
+ unionChoices: [...combination.unionChoices, -1],
90
+ };
91
+ newCombinations.push(newCombination);
92
+ }
93
+ }
94
+ exports.SelectCombinationExpander = SelectCombinationExpander;
95
+ //# sourceMappingURL=SelectCombinationExpander.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectCombinationExpander.js","sourceRoot":"","sources":["../../src/queryGenerator/SelectCombinationExpander.ts"],"names":[],"mappings":"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"}