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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WhereClauseBuilder.js","sourceRoot":"","sources":["../../src/queryGenerator/WhereClauseBuilder.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,6DAA0E;
|
|
1
|
+
{"version":3,"file":"WhereClauseBuilder.js","sourceRoot":"","sources":["../../src/queryGenerator/WhereClauseBuilder.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,6DAA0E;AAE1E,oDAAwE;AAExE;;GAEG;AACH,MAAa,kBAAkB;IAC7B;;;;OAIG;IACH,gBAAgB,CACd,YAAoB,EACpB,aAAqB,EACrB,MAA0B,EAC1B,eAAkD,EAClD,OAA0B;QAE1B,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,yCAAyC;QACzC,IAAA,oCAAoB,EAAC,YAAY,CAAC,CAAC;QACnC,UAAU,CAAC,IAAI,CAAC,IAAI,aAAa,wBAAwB,YAAY,GAAG,CAAC,CAAC;QAE1E,yGAAyG;QACzG,IAAI,MAAM,EAAE,CAAC;YACX,IAAA,8BAAc,EAAC,MAAM,CAAC,CAAC;YACvB,UAAU,CAAC,IAAI,CAAC,IAAI,aAAa,kBAAkB,MAAM,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,mCAAmC;QACnC,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB,CAClD,eAAe,EACf,OAAO,CACR,CAAC;QACF,IAAI,eAAe,EAAE,CAAC;YACpB,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,SAAS,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7C,CAAC;IAED;;OAEG;IACK,uBAAuB,CAC7B,eAAkD,EAClD,OAA0B;QAE1B,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QAE9D,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,0BAAU,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAE5D,mFAAmF;gBACnF,MAAM,yBAAyB,GAAG,IAAI,MAAM,CAC1C,mCAAmC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CACnE,CAAC;gBAEF,IAAI,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;oBACrD,UAAU,CAAC,IAAI,CACb,cAAc,SAAS,kCAAkC,CAC1D,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,wCAAwC,KAAK,CAAC,IAAI,MAAM,KAAK,EAAE,CAChE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;IAC3C,CAAC;CACF;AAhFD,gDAgFC"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
export { PathParser } from "./PathParser.js";
|
|
5
5
|
export { SelectCombination, SelectCombinationExpander, } from "./SelectCombinationExpander.js";
|
|
6
6
|
export { ForEachProcessor } from "./ForEachProcessor.js";
|
|
7
|
+
export { RepeatProcessor, RepeatContext } from "./RepeatProcessor.js";
|
|
7
8
|
export { SelectClauseBuilder } from "./SelectClauseBuilder.js";
|
|
8
9
|
export { WhereClauseBuilder } from "./WhereClauseBuilder.js";
|
|
9
10
|
export { ColumnExpressionGenerator } from "./ColumnExpressionGenerator.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queryGenerator/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queryGenerator/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -3,13 +3,15 @@
|
|
|
3
3
|
* Query generator components for building T-SQL from ViewDefinitions.
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.ColumnExpressionGenerator = exports.WhereClauseBuilder = exports.SelectClauseBuilder = exports.ForEachProcessor = exports.SelectCombinationExpander = exports.PathParser = void 0;
|
|
6
|
+
exports.ColumnExpressionGenerator = exports.WhereClauseBuilder = exports.SelectClauseBuilder = exports.RepeatProcessor = exports.ForEachProcessor = exports.SelectCombinationExpander = exports.PathParser = void 0;
|
|
7
7
|
var PathParser_js_1 = require("./PathParser.js");
|
|
8
8
|
Object.defineProperty(exports, "PathParser", { enumerable: true, get: function () { return PathParser_js_1.PathParser; } });
|
|
9
9
|
var SelectCombinationExpander_js_1 = require("./SelectCombinationExpander.js");
|
|
10
10
|
Object.defineProperty(exports, "SelectCombinationExpander", { enumerable: true, get: function () { return SelectCombinationExpander_js_1.SelectCombinationExpander; } });
|
|
11
11
|
var ForEachProcessor_js_1 = require("./ForEachProcessor.js");
|
|
12
12
|
Object.defineProperty(exports, "ForEachProcessor", { enumerable: true, get: function () { return ForEachProcessor_js_1.ForEachProcessor; } });
|
|
13
|
+
var RepeatProcessor_js_1 = require("./RepeatProcessor.js");
|
|
14
|
+
Object.defineProperty(exports, "RepeatProcessor", { enumerable: true, get: function () { return RepeatProcessor_js_1.RepeatProcessor; } });
|
|
13
15
|
var SelectClauseBuilder_js_1 = require("./SelectClauseBuilder.js");
|
|
14
16
|
Object.defineProperty(exports, "SelectClauseBuilder", { enumerable: true, get: function () { return SelectClauseBuilder_js_1.SelectClauseBuilder; } });
|
|
15
17
|
var WhereClauseBuilder_js_1 = require("./WhereClauseBuilder.js");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/queryGenerator/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,iDAA6C;AAApC,2GAAA,UAAU,OAAA;AACnB,+EAGwC;AADtC,yIAAA,yBAAyB,OAAA;AAE3B,6DAAyD;AAAhD,uHAAA,gBAAgB,OAAA;AACzB,mEAA+D;AAAtD,6HAAA,mBAAmB,OAAA;AAC5B,iEAA6D;AAApD,2HAAA,kBAAkB,OAAA;AAC3B,+EAA2E;AAAlE,yIAAA,yBAAyB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/queryGenerator/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,iDAA6C;AAApC,2GAAA,UAAU,OAAA;AACnB,+EAGwC;AADtC,yIAAA,yBAAyB,OAAA;AAE3B,6DAAyD;AAAhD,uHAAA,gBAAgB,OAAA;AACzB,2DAAsE;AAA7D,qHAAA,eAAe,OAAA;AACxB,mEAA+D;AAAtD,6HAAA,mBAAmB,OAAA;AAC5B,iEAA6D;AAApD,2HAAA,kBAAkB,OAAA;AAC3B,+EAA2E;AAAlE,yIAAA,yBAAyB,OAAA"}
|
package/dist/queryGenerator.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export declare class QueryGenerator {
|
|
|
17
17
|
private readonly pathParser;
|
|
18
18
|
private readonly combinationExpander;
|
|
19
19
|
private readonly forEachProcessor;
|
|
20
|
+
private readonly repeatProcessor;
|
|
20
21
|
private readonly selectClauseBuilder;
|
|
21
22
|
private readonly whereClauseBuilder;
|
|
22
23
|
private readonly columnGenerator;
|
|
@@ -26,11 +27,24 @@ export declare class QueryGenerator {
|
|
|
26
27
|
*/
|
|
27
28
|
generateQuery(viewDef: ViewDefinition, testId?: string): TranspilationResult;
|
|
28
29
|
/**
|
|
29
|
-
*
|
|
30
|
+
* Result of generating all SELECT statements.
|
|
30
31
|
*/
|
|
31
32
|
private generateAllSelectStatements;
|
|
32
33
|
/**
|
|
33
34
|
* Generate a complete SQL statement for a specific combination.
|
|
35
|
+
*
|
|
36
|
+
* Routes to the appropriate statement generator based on the directives
|
|
37
|
+
* present in the combination:
|
|
38
|
+
* - Repeat statements use recursive CTEs.
|
|
39
|
+
* - ForEach statements use CROSS APPLY.
|
|
40
|
+
* - Simple statements have neither.
|
|
41
|
+
*
|
|
42
|
+
* @param combination - The select combination to generate.
|
|
43
|
+
* @param viewDef - The ViewDefinition being processed.
|
|
44
|
+
* @param context - The transpiler context.
|
|
45
|
+
* @param isMultiUnion - If true, CTEs are returned separately for consolidation.
|
|
46
|
+
* @param cteCounter - Shared counter for unique CTE aliases across combinations.
|
|
47
|
+
* @returns The statement and any CTE definitions (empty if not repeat or single statement).
|
|
34
48
|
*/
|
|
35
49
|
private generateStatementForCombination;
|
|
36
50
|
/**
|
|
@@ -41,6 +55,52 @@ export declare class QueryGenerator {
|
|
|
41
55
|
* Generate a SELECT statement with forEach using CROSS APPLY.
|
|
42
56
|
*/
|
|
43
57
|
private generateForEachStatement;
|
|
58
|
+
/**
|
|
59
|
+
* Generate a SELECT statement with repeat using recursive CTEs.
|
|
60
|
+
*
|
|
61
|
+
* The repeat directive generates a recursive CTE that traverses a tree
|
|
62
|
+
* structure by following one or more paths at each level. The CTE is then
|
|
63
|
+
* joined to the main query using INNER JOIN.
|
|
64
|
+
*
|
|
65
|
+
* If the combination also contains forEach, the forEach is processed after
|
|
66
|
+
* the repeat CTE, using the repeat context as its source.
|
|
67
|
+
*
|
|
68
|
+
* @param combination - The select combination being processed.
|
|
69
|
+
* @param viewDef - The ViewDefinition.
|
|
70
|
+
* @param context - The transpiler context.
|
|
71
|
+
* @param isMultiUnion - If true, return CTE definitions separately for consolidation.
|
|
72
|
+
* @param cteCounter - Shared counter for unique CTE aliases across combinations.
|
|
73
|
+
* @returns Statement and CTE definitions.
|
|
74
|
+
*/
|
|
75
|
+
private generateRepeatStatement;
|
|
76
|
+
/**
|
|
77
|
+
* Build select clause and forEach apply clauses for repeat statements.
|
|
78
|
+
*/
|
|
79
|
+
private buildRepeatSelectAndForEach;
|
|
80
|
+
/**
|
|
81
|
+
* Assemble the final repeat statement from its components.
|
|
82
|
+
*/
|
|
83
|
+
private assembleRepeatStatement;
|
|
84
|
+
/**
|
|
85
|
+
* Update forEach source expressions to use repeat CTE instead of resource JSON.
|
|
86
|
+
*
|
|
87
|
+
* When forEach is nested inside repeat, the forEach should iterate over
|
|
88
|
+
* arrays within the repeat context (e.g., repeat_0.item_json) rather than
|
|
89
|
+
* the root resource JSON.
|
|
90
|
+
*/
|
|
91
|
+
private updateForEachSourcesForRepeat;
|
|
92
|
+
/**
|
|
93
|
+
* Find the repeat select that contains a given forEach select.
|
|
94
|
+
*/
|
|
95
|
+
private findContainingRepeat;
|
|
96
|
+
/**
|
|
97
|
+
* Check if a forEach select is nested within a repeat select.
|
|
98
|
+
*/
|
|
99
|
+
private isForEachNestedInRepeat;
|
|
100
|
+
/**
|
|
101
|
+
* Recursively check if a select is nested within a list of selects.
|
|
102
|
+
*/
|
|
103
|
+
private isSelectNestedIn;
|
|
44
104
|
/**
|
|
45
105
|
* Generate the FROM clause.
|
|
46
106
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryGenerator.d.ts","sourceRoot":"","sources":["../src/queryGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"queryGenerator.d.ts","sourceRoot":"","sources":["../src/queryGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,OAAO,EAEL,mBAAmB,EACnB,cAAc,EAGf,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAC1D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA4B;IAChE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsB;IAC1D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4B;gBAEhD,OAAO,GAAE,qBAA0B;IAmB/C;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,mBAAmB;IA8B5E;;OAEG;IACH,OAAO,CAAC,2BAA2B;IA+BnC;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,+BAA+B;IAgCvC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA0B/B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAsChC;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,uBAAuB;IAgD/B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IA2CnC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAmB/B;;;;;;OAMG;IACH,OAAO,CAAC,6BAA6B;IAqBrC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAa5B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAU/B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA8CxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CA0B1B"}
|
package/dist/queryGenerator.js
CHANGED
|
@@ -15,6 +15,7 @@ class QueryGenerator {
|
|
|
15
15
|
pathParser;
|
|
16
16
|
combinationExpander;
|
|
17
17
|
forEachProcessor;
|
|
18
|
+
repeatProcessor;
|
|
18
19
|
selectClauseBuilder;
|
|
19
20
|
whereClauseBuilder;
|
|
20
21
|
columnGenerator;
|
|
@@ -31,6 +32,7 @@ class QueryGenerator {
|
|
|
31
32
|
this.combinationExpander = new index_js_1.SelectCombinationExpander();
|
|
32
33
|
this.columnGenerator = new index_js_1.ColumnExpressionGenerator();
|
|
33
34
|
this.forEachProcessor = new index_js_1.ForEachProcessor(this.pathParser);
|
|
35
|
+
this.repeatProcessor = new index_js_1.RepeatProcessor();
|
|
34
36
|
this.selectClauseBuilder = new index_js_1.SelectClauseBuilder(this.columnGenerator);
|
|
35
37
|
this.whereClauseBuilder = new index_js_1.WhereClauseBuilder();
|
|
36
38
|
}
|
|
@@ -41,10 +43,22 @@ class QueryGenerator {
|
|
|
41
43
|
try {
|
|
42
44
|
const context = this.createBaseContext(viewDef, testId);
|
|
43
45
|
const columns = this.collectAllColumns(viewDef.select);
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
const { statements, allCteDefinitions } = this.generateAllSelectStatements(viewDef, context);
|
|
47
|
+
let sql;
|
|
48
|
+
if (statements.length > 1) {
|
|
49
|
+
// Multiple statements (unionAll). If any have CTEs, consolidate them.
|
|
50
|
+
if (allCteDefinitions.length > 0) {
|
|
51
|
+
const withClause = `WITH\n${allCteDefinitions.join(",\n")}\n`;
|
|
52
|
+
sql = withClause + statements.join("\nUNION ALL\n");
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
sql = statements.join("\nUNION ALL\n");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Single statement. If it has CTEs, they're already included.
|
|
60
|
+
sql = statements[0];
|
|
61
|
+
}
|
|
48
62
|
return {
|
|
49
63
|
sql,
|
|
50
64
|
columns,
|
|
@@ -55,20 +69,57 @@ class QueryGenerator {
|
|
|
55
69
|
}
|
|
56
70
|
}
|
|
57
71
|
/**
|
|
58
|
-
*
|
|
72
|
+
* Result of generating all SELECT statements.
|
|
59
73
|
*/
|
|
60
74
|
generateAllSelectStatements(viewDef, context) {
|
|
61
75
|
const unionCombinations = this.combinationExpander.expandCombinations(viewDef.select);
|
|
62
|
-
|
|
76
|
+
const statements = [];
|
|
77
|
+
const allCteDefinitions = [];
|
|
78
|
+
const isMultiUnion = unionCombinations.length > 1;
|
|
79
|
+
// Shared counter state to ensure unique CTE aliases across all combinations.
|
|
80
|
+
const cteCounter = { value: 0 };
|
|
81
|
+
for (const combination of unionCombinations) {
|
|
82
|
+
const { statement, cteDefinitions } = this.generateStatementForCombination(combination, viewDef, context, isMultiUnion, cteCounter);
|
|
83
|
+
statements.push(statement);
|
|
84
|
+
allCteDefinitions.push(...cteDefinitions);
|
|
85
|
+
}
|
|
86
|
+
return { statements, allCteDefinitions };
|
|
63
87
|
}
|
|
64
88
|
/**
|
|
65
89
|
* Generate a complete SQL statement for a specific combination.
|
|
90
|
+
*
|
|
91
|
+
* Routes to the appropriate statement generator based on the directives
|
|
92
|
+
* present in the combination:
|
|
93
|
+
* - Repeat statements use recursive CTEs.
|
|
94
|
+
* - ForEach statements use CROSS APPLY.
|
|
95
|
+
* - Simple statements have neither.
|
|
96
|
+
*
|
|
97
|
+
* @param combination - The select combination to generate.
|
|
98
|
+
* @param viewDef - The ViewDefinition being processed.
|
|
99
|
+
* @param context - The transpiler context.
|
|
100
|
+
* @param isMultiUnion - If true, CTEs are returned separately for consolidation.
|
|
101
|
+
* @param cteCounter - Shared counter for unique CTE aliases across combinations.
|
|
102
|
+
* @returns The statement and any CTE definitions (empty if not repeat or single statement).
|
|
66
103
|
*/
|
|
67
|
-
generateStatementForCombination(combination, viewDef, context) {
|
|
104
|
+
generateStatementForCombination(combination, viewDef, context, isMultiUnion, cteCounter) {
|
|
105
|
+
const hasRepeat = this.repeatProcessor.combinationHasRepeat(combination);
|
|
68
106
|
const hasForEach = this.forEachProcessor.combinationHasForEach(combination);
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
107
|
+
// Repeat takes precedence if both are present (forEach will be nested).
|
|
108
|
+
if (hasRepeat) {
|
|
109
|
+
return this.generateRepeatStatement(combination, viewDef, context, isMultiUnion, cteCounter);
|
|
110
|
+
}
|
|
111
|
+
else if (hasForEach) {
|
|
112
|
+
return {
|
|
113
|
+
statement: this.generateForEachStatement(combination, viewDef, context),
|
|
114
|
+
cteDefinitions: [],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
return {
|
|
119
|
+
statement: this.generateSimpleStatement(combination, viewDef, context),
|
|
120
|
+
cteDefinitions: [],
|
|
121
|
+
};
|
|
122
|
+
}
|
|
72
123
|
}
|
|
73
124
|
/**
|
|
74
125
|
* Generate a simple SELECT statement without forEach.
|
|
@@ -78,7 +129,7 @@ class QueryGenerator {
|
|
|
78
129
|
const fromClause = this.generateFromClause(context);
|
|
79
130
|
const whereClause = this.whereClauseBuilder.buildWhereClause(viewDef.resource, context.resourceAlias, context.testId, viewDef.where, context);
|
|
80
131
|
let statement = `${selectClause}\n${fromClause}`;
|
|
81
|
-
if (whereClause) {
|
|
132
|
+
if (whereClause !== null) {
|
|
82
133
|
statement += `\n${whereClause}`;
|
|
83
134
|
}
|
|
84
135
|
return statement;
|
|
@@ -93,11 +144,123 @@ class QueryGenerator {
|
|
|
93
144
|
const selectClause = this.selectClauseBuilder.generateForEachSelectClause(combination, context, forEachContextMap);
|
|
94
145
|
const whereClause = this.whereClauseBuilder.buildWhereClause(viewDef.resource, context.resourceAlias, context.testId, viewDef.where, context);
|
|
95
146
|
let statement = `${selectClause}\n${fromClause}${applyClauses}`;
|
|
96
|
-
if (whereClause) {
|
|
147
|
+
if (whereClause !== null) {
|
|
97
148
|
statement += `\n${whereClause}`;
|
|
98
149
|
}
|
|
99
150
|
return statement;
|
|
100
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* Generate a SELECT statement with repeat using recursive CTEs.
|
|
154
|
+
*
|
|
155
|
+
* The repeat directive generates a recursive CTE that traverses a tree
|
|
156
|
+
* structure by following one or more paths at each level. The CTE is then
|
|
157
|
+
* joined to the main query using INNER JOIN.
|
|
158
|
+
*
|
|
159
|
+
* If the combination also contains forEach, the forEach is processed after
|
|
160
|
+
* the repeat CTE, using the repeat context as its source.
|
|
161
|
+
*
|
|
162
|
+
* @param combination - The select combination being processed.
|
|
163
|
+
* @param viewDef - The ViewDefinition.
|
|
164
|
+
* @param context - The transpiler context.
|
|
165
|
+
* @param isMultiUnion - If true, return CTE definitions separately for consolidation.
|
|
166
|
+
* @param cteCounter - Shared counter for unique CTE aliases across combinations.
|
|
167
|
+
* @returns Statement and CTE definitions.
|
|
168
|
+
*/
|
|
169
|
+
generateRepeatStatement(combination, viewDef, context, isMultiUnion, cteCounter) {
|
|
170
|
+
// Build repeat contexts and CTEs.
|
|
171
|
+
const { repeatContextMap, topLevelRepeat } = this.repeatProcessor.buildRepeatContextMap(combination.selects, context, combination, cteCounter);
|
|
172
|
+
const tableName = `[${this.options.schemaName}].[${this.options.tableName}]`;
|
|
173
|
+
const cteDefinitions = this.repeatProcessor.buildRepeatCteDefinitions(repeatContextMap, topLevelRepeat, context.resourceAlias, viewDef.resource, context.testId, tableName);
|
|
174
|
+
const joinClauses = this.repeatProcessor.buildRepeatApplyClauses(repeatContextMap, topLevelRepeat, context.resourceAlias);
|
|
175
|
+
const { selectClause, forEachApplyClauses } = this.buildRepeatSelectAndForEach(combination, context, repeatContextMap);
|
|
176
|
+
const fromClause = this.generateFromClause(context);
|
|
177
|
+
const statement = this.assembleRepeatStatement(selectClause, fromClause, joinClauses, forEachApplyClauses, cteDefinitions, isMultiUnion);
|
|
178
|
+
return { statement, cteDefinitions: isMultiUnion ? cteDefinitions : [] };
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Build select clause and forEach apply clauses for repeat statements.
|
|
182
|
+
*/
|
|
183
|
+
buildRepeatSelectAndForEach(combination, context, repeatContextMap) {
|
|
184
|
+
const hasNestedForEach = this.forEachProcessor.combinationHasForEach(combination);
|
|
185
|
+
if (!hasNestedForEach) {
|
|
186
|
+
return {
|
|
187
|
+
selectClause: this.selectClauseBuilder.generateRepeatSelectClause(combination, context, repeatContextMap),
|
|
188
|
+
forEachApplyClauses: "",
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
const { forEachContextMap, topLevelForEach } = this.forEachProcessor.buildForEachContextMap(combination.selects, context, combination);
|
|
192
|
+
this.updateForEachSourcesForRepeat(forEachContextMap, repeatContextMap);
|
|
193
|
+
return {
|
|
194
|
+
selectClause: this.selectClauseBuilder.generateRepeatSelectClause(combination, context, repeatContextMap, forEachContextMap),
|
|
195
|
+
forEachApplyClauses: this.forEachProcessor.buildApplyClauses(forEachContextMap, topLevelForEach, combination),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Assemble the final repeat statement from its components.
|
|
200
|
+
*/
|
|
201
|
+
assembleRepeatStatement(selectClause, fromClause, joinClauses, forEachApplyClauses, cteDefinitions, isMultiUnion) {
|
|
202
|
+
const baseStatement = `${selectClause}\n${fromClause}${joinClauses}${forEachApplyClauses}`;
|
|
203
|
+
if (isMultiUnion) {
|
|
204
|
+
return baseStatement;
|
|
205
|
+
}
|
|
206
|
+
const withClause = cteDefinitions.length > 0 ? `WITH\n${cteDefinitions.join(",\n")}\n` : "";
|
|
207
|
+
return `${withClause}${baseStatement}`;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Update forEach source expressions to use repeat CTE instead of resource JSON.
|
|
211
|
+
*
|
|
212
|
+
* When forEach is nested inside repeat, the forEach should iterate over
|
|
213
|
+
* arrays within the repeat context (e.g., repeat_0.item_json) rather than
|
|
214
|
+
* the root resource JSON.
|
|
215
|
+
*/
|
|
216
|
+
updateForEachSourcesForRepeat(forEachContextMap, repeatContextMap) {
|
|
217
|
+
// Find the repeat select that contains each forEach.
|
|
218
|
+
for (const [forEachSelect, forEachContext] of forEachContextMap) {
|
|
219
|
+
const containingRepeat = this.findContainingRepeat(forEachSelect, repeatContextMap);
|
|
220
|
+
if (containingRepeat) {
|
|
221
|
+
const repeatContext = repeatContextMap.get(containingRepeat);
|
|
222
|
+
if (repeatContext) {
|
|
223
|
+
// Update the forEach source to use the repeat CTE's item_json.
|
|
224
|
+
forEachContext.forEachSource = `${repeatContext.cteAlias}.item_json`;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Find the repeat select that contains a given forEach select.
|
|
231
|
+
*/
|
|
232
|
+
findContainingRepeat(forEachSelect, repeatContextMap) {
|
|
233
|
+
// Check each repeat select to see if the forEach is nested within it.
|
|
234
|
+
for (const [repeatSelect] of repeatContextMap) {
|
|
235
|
+
if (this.isForEachNestedInRepeat(forEachSelect, repeatSelect)) {
|
|
236
|
+
return repeatSelect;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return undefined;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Check if a forEach select is nested within a repeat select.
|
|
243
|
+
*/
|
|
244
|
+
isForEachNestedInRepeat(forEachSelect, repeatSelect) {
|
|
245
|
+
if (!repeatSelect.select) {
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
return this.isSelectNestedIn(forEachSelect, repeatSelect.select);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Recursively check if a select is nested within a list of selects.
|
|
252
|
+
*/
|
|
253
|
+
isSelectNestedIn(target, selects) {
|
|
254
|
+
for (const select of selects) {
|
|
255
|
+
if (select === target) {
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
if (select.select && this.isSelectNestedIn(target, select.select)) {
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
101
264
|
/**
|
|
102
265
|
* Generate the FROM clause.
|
|
103
266
|
*/
|
|
@@ -167,7 +330,7 @@ class QueryGenerator {
|
|
|
167
330
|
for (const column of select.column) {
|
|
168
331
|
columns.push({
|
|
169
332
|
name: column.name,
|
|
170
|
-
type: transpiler_js_1.Transpiler.inferSqlType(column.type),
|
|
333
|
+
type: transpiler_js_1.Transpiler.inferSqlType(column.type, column.tag),
|
|
171
334
|
nullable: true, // FHIR data is generally nullable.
|
|
172
335
|
description: column.description,
|
|
173
336
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryGenerator.js","sourceRoot":"","sources":["../src/queryGenerator.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,4DAAyE;AACzE,
|
|
1
|
+
{"version":3,"file":"queryGenerator.js","sourceRoot":"","sources":["../src/queryGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,7 +37,7 @@ class DynamicVitestGenerator {
|
|
|
37
37
|
generateTestsFromDirectory(directoryPath) {
|
|
38
38
|
const files = (0, fs_1.readdirSync)(directoryPath)
|
|
39
39
|
.filter((file) => file.endsWith(".json"))
|
|
40
|
-
.sort() // Sort to ensure consistent ordering
|
|
40
|
+
.sort((a, b) => a.localeCompare(b)) // Sort alphabetically to ensure consistent ordering
|
|
41
41
|
.map((file) => (0, path_1.join)(directoryPath, file));
|
|
42
42
|
for (const filePath of files) {
|
|
43
43
|
this.generateTestsFromFile(filePath);
|
|
@@ -59,9 +59,9 @@ class DynamicVitestGenerator {
|
|
|
59
59
|
(0, vitest_1.afterAll)(async () => {
|
|
60
60
|
await (0, database_js_1.cleanupDatabase)();
|
|
61
61
|
// Store results for report generation using the filename as the key
|
|
62
|
-
if (typeof
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
if (typeof globalThis !== "undefined") {
|
|
63
|
+
globalThis.testResults = globalThis.testResults ?? {};
|
|
64
|
+
globalThis.testResults[reportFileName] = { tests: suiteResults };
|
|
65
65
|
}
|
|
66
66
|
});
|
|
67
67
|
// Note: beforeEach/afterEach are handled per-test for parallel execution
|
|
@@ -132,19 +132,19 @@ class DynamicVitestGenerator {
|
|
|
132
132
|
await (0, database_js_1.setupTestData)(testSuite.resources, testId);
|
|
133
133
|
const result = await (0, sqlOnFhir_1.executeViewDefinition)(testCase.view, testId);
|
|
134
134
|
const passed = (0, sqlOnFhir_1.compareResults)(result.results, testCase.expect || [], testCase.expectColumns, result.columns);
|
|
135
|
-
if (
|
|
136
|
-
const errorMessage = `Results don't match. Expected: ${JSON.stringify(testCase.expect)}, Actual: ${JSON.stringify(result.results)}`;
|
|
135
|
+
if (passed) {
|
|
137
136
|
suiteResults.push({
|
|
138
137
|
name: testCase.title, // Use plain title for report
|
|
139
|
-
result: { passed:
|
|
138
|
+
result: { passed: true },
|
|
140
139
|
});
|
|
141
|
-
vitest_1.expect.fail(errorMessage);
|
|
142
140
|
}
|
|
143
141
|
else {
|
|
142
|
+
const errorMessage = `Results don't match. Expected: ${JSON.stringify(testCase.expect)}, Actual: ${JSON.stringify(result.results)}`;
|
|
144
143
|
suiteResults.push({
|
|
145
144
|
name: testCase.title, // Use plain title for report
|
|
146
|
-
result: { passed:
|
|
145
|
+
result: { passed: false, error: errorMessage },
|
|
147
146
|
});
|
|
147
|
+
vitest_1.expect.fail(errorMessage);
|
|
148
148
|
}
|
|
149
149
|
(0, vitest_1.expect)(passed).toBe(true);
|
|
150
150
|
}
|
|
@@ -165,8 +165,8 @@ class DynamicVitestGenerator {
|
|
|
165
165
|
* Clear test results.
|
|
166
166
|
*/
|
|
167
167
|
clearTestResults() {
|
|
168
|
-
if (typeof
|
|
169
|
-
|
|
168
|
+
if (typeof globalThis !== "undefined") {
|
|
169
|
+
globalThis.testResults = {};
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
172
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/tests/utils/generator.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AA6NH,gDAoBC;AA/OD,2BAAyD;AACzD,+BAA4B;AAC5B,mCAAmE;AACnE,yCAAoD;AAEpD,+CAKuB;AAEvB,2CAAoE;AACpE,qDAAkD;AASlD;;GAEG;AACH,MAAa,sBAAsB;IACjC;;OAEG;IACH,qBAAqB,CAAC,QAAgB;QACpC,MAAM,aAAa,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,6BAAoB,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC;QAElC,8EAA8E;QAC9E,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;QAEvD,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,0BAA0B,CAAC,aAAqB;QAC9C,MAAM,KAAK,GAAG,IAAA,gBAAW,EAAC,aAAa,CAAC;aACrC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aACxC,IAAI,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/tests/utils/generator.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AA6NH,gDAoBC;AA/OD,2BAAyD;AACzD,+BAA4B;AAC5B,mCAAmE;AACnE,yCAAoD;AAEpD,+CAKuB;AAEvB,2CAAoE;AACpE,qDAAkD;AASlD;;GAEG;AACH,MAAa,sBAAsB;IACjC;;OAEG;IACH,qBAAqB,CAAC,QAAgB;QACpC,MAAM,aAAa,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,6BAAoB,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC;QAElC,8EAA8E;QAC9E,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;QAEvD,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,0BAA0B,CAAC,aAAqB;QAC9C,MAAM,KAAK,GAAG,IAAA,gBAAW,EAAC,aAAa,CAAC;aACrC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aACxC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,oDAAoD;aACvF,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,WAAI,EAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;QAE5C,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,iBAAiB,CACvB,SAAoB,EACpB,SAAiB,EACjB,cAAsB;QAEtB,MAAM,YAAY,GAAsB,EAAE,CAAC;QAE3C,IAAA,iBAAQ,EAAC,SAAS,EAAE,GAAG,EAAE;YACvB,IAAA,kBAAS,EAAC,KAAK,IAAI,EAAE;gBACnB,MAAM,IAAA,2BAAa,GAAE,CAAC;YACxB,CAAC,CAAC,CAAC;YAEH,IAAA,iBAAQ,EAAC,KAAK,IAAI,EAAE;gBAClB,MAAM,IAAA,6BAAe,GAAE,CAAC;gBAExB,oEAAoE;gBACpE,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;oBACtC,UAAU,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,IAAI,EAAE,CAAC;oBACtD,UAAU,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;gBACnE,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,yEAAyE;YAEzE,iCAAiC;YACjC,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBACvC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACtE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,gBAAgB,CACtB,QAAkB,EAClB,YAA+B,EAC/B,SAAiB,EACjB,SAAoB;QAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEzD,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YACzB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,SAAiB,EAAE,QAAkB;QACzD,MAAM,SAAS,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI;YACxB,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAC9C,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,IAAI,SAAS,KAAK,QAAQ,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC;IACnD,CAAC;IAED;;OAEG;IACK,iBAAiB,CACvB,QAAgB,EAChB,QAAkB,EAClB,YAA+B,EAC/B,SAAoB;QAEpB,WAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YACjC,MAAM,MAAM,GAAG,IAAA,+BAAc,GAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,IAAA,2BAAa,EAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBACjD,MAAM,IAAA,iCAAqB,EAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAEnD,yDAAyD;gBACzD,MAAM,YAAY,GAAG,uCAAuC,CAAC;gBAC7D,YAAY,CAAC,IAAI,CAAC;oBAChB,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,6BAA6B;oBACnD,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE;iBAC/C,CAAC,CAAC;gBACH,eAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,qCAAqC;gBACrC,YAAY,CAAC,IAAI,CAAC;oBAChB,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,6BAA6B;oBACnD,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;iBACzB,CAAC,CAAC;YACL,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAA,6BAAe,EAAC,MAAM,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,mBAAmB,CACzB,QAAgB,EAChB,QAAkB,EAClB,YAA+B,EAC/B,SAAoB;QAEpB,WAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YACjC,MAAM,MAAM,GAAG,IAAA,+BAAc,GAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,IAAA,2BAAa,EAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBACjD,MAAM,MAAM,GAAG,MAAM,IAAA,iCAAqB,EAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAClE,MAAM,MAAM,GAAG,IAAA,0BAAc,EAC3B,MAAM,CAAC,OAAO,EACd,QAAQ,CAAC,MAAM,IAAI,EAAE,EACrB,QAAQ,CAAC,aAAa,EACtB,MAAM,CAAC,OAAO,CACf,CAAC;gBAEF,IAAI,MAAM,EAAE,CAAC;oBACX,YAAY,CAAC,IAAI,CAAC;wBAChB,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,6BAA6B;wBACnD,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;qBACzB,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,MAAM,YAAY,GAAG,kCAAkC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBACpI,YAAY,CAAC,IAAI,CAAC;wBAChB,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,6BAA6B;wBACnD,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE;qBAC/C,CAAC,CAAC;oBACH,eAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC5B,CAAC;gBAED,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACzD,YAAY,CAAC,IAAI,CAAC;oBAChB,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,6BAA6B;oBACnD,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE;iBAC/C,CAAC,CAAC;gBACH,MAAM,KAAK,CAAC;YACd,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAA,6BAAe,EAAC,MAAM,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;YACtC,UAAU,CAAC,WAAW,GAAG,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;CACF;AA5LD,wDA4LC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,QAAgB;IACjD,MAAM,SAAS,GAAG,IAAI,sBAAsB,EAAE,CAAC;IAE/C,6BAA6B;IAC7B,SAAS,CAAC,gBAAgB,EAAE,CAAC;IAE7B,+CAA+C;IAC/C,MAAM,IAAI,GAAG,IAAA,aAAQ,EAAC,QAAQ,CAAC,CAAC;IAEhC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,SAAS,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,SAAS,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CACb,sBAAsB,QAAQ,2DAA2D,CAC1F,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlOnFhir.d.ts","sourceRoot":"","sources":["../../../src/tests/utils/sqlOnFhir.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAkB7C;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC,CAqC/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,GAAG,EAAE,EACpB,eAAe,EAAE,GAAG,EAAE,EACtB,eAAe,CAAC,EAAE,MAAM,EAAE,EAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,OAAO,
|
|
1
|
+
{"version":3,"file":"sqlOnFhir.d.ts","sourceRoot":"","sources":["../../../src/tests/utils/sqlOnFhir.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAkB7C;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC,CAqC/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,GAAG,EAAE,EACpB,eAAe,EAAE,GAAG,EAAE,EACtB,eAAe,CAAC,EAAE,MAAM,EAAE,EAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,OAAO,CAgDT"}
|
|
@@ -88,11 +88,9 @@ function compareResults(actualResults, expectedResults, expectedColumns, actualC
|
|
|
88
88
|
if (Array.isArray(obj))
|
|
89
89
|
return obj.map(normalizeObject);
|
|
90
90
|
const sorted = {};
|
|
91
|
-
Object.keys(obj)
|
|
92
|
-
.sort((a, b) => a.localeCompare(b))
|
|
93
|
-
.forEach((key) => {
|
|
91
|
+
for (const key of Object.keys(obj).sort((a, b) => a.localeCompare(b))) {
|
|
94
92
|
sorted[key] = normalizeObject(obj[key]);
|
|
95
|
-
}
|
|
93
|
+
}
|
|
96
94
|
return sorted;
|
|
97
95
|
};
|
|
98
96
|
// Sort both arrays to ignore row ordering, using normalized objects for consistent sorting
|
|
@@ -124,6 +122,10 @@ function deepEqual(a, b) {
|
|
|
124
122
|
return true;
|
|
125
123
|
if (eitherNullOrUndefined(a, b))
|
|
126
124
|
return false;
|
|
125
|
+
// Handle numeric comparisons (number vs numeric string)
|
|
126
|
+
if (isNumericComparison(a, b)) {
|
|
127
|
+
return compareNumericValues(a, b);
|
|
128
|
+
}
|
|
127
129
|
if (typeof a !== typeof b) {
|
|
128
130
|
return handleBooleanNumberConversion(a, b);
|
|
129
131
|
}
|
|
@@ -132,6 +134,39 @@ function deepEqual(a, b) {
|
|
|
132
134
|
}
|
|
133
135
|
return false;
|
|
134
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Check if we're comparing numeric values (number vs number, or number vs numeric string).
|
|
139
|
+
*/
|
|
140
|
+
function isNumericComparison(a, b) {
|
|
141
|
+
const aIsNumber = typeof a === "number";
|
|
142
|
+
const bIsNumber = typeof b === "number";
|
|
143
|
+
const aIsNumericString = typeof a === "string" && isNumericString(a);
|
|
144
|
+
const bIsNumericString = typeof b === "string" && isNumericString(b);
|
|
145
|
+
return ((aIsNumber && bIsNumber) ||
|
|
146
|
+
(aIsNumber && bIsNumericString) ||
|
|
147
|
+
(aIsNumericString && bIsNumber) ||
|
|
148
|
+
(aIsNumericString && bIsNumericString));
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Check if a string represents a valid number.
|
|
152
|
+
*/
|
|
153
|
+
function isNumericString(value) {
|
|
154
|
+
if (value.trim() === "")
|
|
155
|
+
return false;
|
|
156
|
+
const num = Number(value);
|
|
157
|
+
return !Number.isNaN(num) && Number.isFinite(num);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Compare two numeric values with tolerance for floating point precision.
|
|
161
|
+
* Handles comparisons between numbers and numeric strings.
|
|
162
|
+
*/
|
|
163
|
+
function compareNumericValues(a, b) {
|
|
164
|
+
const numA = typeof a === "number" ? a : Number(a);
|
|
165
|
+
const numB = typeof b === "number" ? b : Number(b);
|
|
166
|
+
// Use a small epsilon for floating point comparison
|
|
167
|
+
const epsilon = 1e-10;
|
|
168
|
+
return Math.abs(numA - numB) < epsilon;
|
|
169
|
+
}
|
|
135
170
|
/**
|
|
136
171
|
* Check if both values are null or undefined.
|
|
137
172
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlOnFhir.js","sourceRoot":"","sources":["../../../src/tests/utils/sqlOnFhir.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAqCH,sDAwCC;AAWD,
|
|
1
|
+
{"version":3,"file":"sqlOnFhir.js","sourceRoot":"","sources":["../../../src/tests/utils/sqlOnFhir.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAqCH,sDAwCC;AAWD,wCAqDC;AA3ID,iCAAgC;AAChC,yDAAsD;AAEtD,yCAA6C;AAE7C,IAAI,sBAAsB,GAA0B,IAAI,CAAC;AAEzD;;GAEG;AACH,SAAS,yBAAyB;IAChC,sBAAsB,KAAK,IAAI,+BAAc,CAAC;QAC5C,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,qBAAqB;QAChE,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,KAAK;QAC7C,gBAAgB,EAAE,IAAI;QACtB,kBAAkB,EAAE,MAAM;KAC3B,CAAC,CAAC;IACH,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAUD;;;;;;GAMG;AACI,KAAK,UAAU,qBAAqB,CACzC,cAA8B,EAC9B,MAAc;IAEd,IAAI,CAAC;QACH,0BAA0B;QAC1B,MAAM,IAAI,GAAG,IAAA,0BAAe,GAAE,CAAC;QAC/B,MAAM,cAAc,GAAG,yBAAyB,EAAE,CAAC;QAEnD,2CAA2C;QAC3C,MAAM,mBAAmB,GAAG,cAAc,CAAC,aAAa,CACtD,cAAc,EACd,MAAM,CACP,CAAC;QACF,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC;QAEpC,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QAEnC,oBAAoB;QACpB,MAAM,OAAO,GAAG,IAAI,eAAO,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE7C,sDAAsD;QACtD,6CAA6C;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAEjE,mDAAmD;QACnD,MAAM,cAAc,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;QAE7D,4DAA4D;QAC5D,OAAO;YACL,OAAO,EAAE,yBAAyB,CAAC,WAAW,CAAC,SAAS,EAAE,cAAc,CAAC;YACzE,OAAO;SACR,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,qCAAqC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC9F,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,cAAc,CAC5B,aAAoB,EACpB,eAAsB,EACtB,eAA0B,EAC1B,aAAwB;IAExB,qCAAqC;IACrC,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,sFAAsF;QACtF,MAAM,cAAc,GAClB,aAAa;YACb,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,eAAe,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,MAAM,eAAe,GAAG,CAAC,GAAQ,EAAO,EAAE;QACxC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;QACxD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAExD,MAAM,MAAM,GAAQ,EAAE,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,MAAM,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,2FAA2F;IAC3F,MAAM,YAAY,GAAG,CAAC,GAAG,aAAa,CAAC;SACpC,GAAG,CAAC,eAAe,CAAC;SACpB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,cAAc,GAAG,CAAC,GAAG,eAAe,CAAC;SACxC,GAAG,CAAC,eAAe,CAAC;SACpB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtE,yBAAyB;IACzB,IAAI,YAAY,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6BAA6B;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,CAAM,EAAE,CAAM;IAC/B,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAE9C,wDAAwD;IACxD,IAAI,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC9B,OAAO,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,OAAO,CAAC,EAAE,CAAC;QAC1B,OAAO,6BAA6B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,CAAM,EAAE,CAAM;IACzC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC;IACxC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC;IACxC,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,QAAQ,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,QAAQ,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC;IAErE,OAAO,CACL,CAAC,SAAS,IAAI,SAAS,CAAC;QACxB,CAAC,SAAS,IAAI,gBAAgB,CAAC;QAC/B,CAAC,gBAAgB,IAAI,SAAS,CAAC;QAC/B,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,CACvC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,CAAM,EAAE,CAAM;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAEnD,oDAAoD;IACpD,MAAM,OAAO,GAAG,KAAK,CAAC;IACtB,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,CAAM,EAAE,CAAM;IACzC,OAAO,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;AAC5E,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,CAAM,EAAE,CAAM;IAC3C,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,SAAS,6BAA6B,CAAC,CAAM,EAAE,CAAM;IACnD,IAAI,OAAO,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QACpD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QACpD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,CAAM,EAAE,CAAM;IACpC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAExD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,CAAQ,EAAE,CAAQ;IACvC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,CAAM,EAAE,CAAM;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAChD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAI,CAAM,EAAE,CAAM;IACpC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,cAA8B;IAC3D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,sDAAsD;IACtD,SAAS,iBAAiB,CAAC,SAAc;QACvC,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACrB,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACnC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC3B,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACrB,KAAK,MAAM,YAAY,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBAC5C,iBAAiB,CAAC,YAAY,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACtB,KAAK,MAAM,UAAU,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBAC3C,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;YACvB,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;gBAC1C,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;QAC1B,KAAK,MAAM,SAAS,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;YAC9C,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,yBAAyB,CAChC,OAAc,EACd,cAA2B;IAE3B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACzB,MAAM,SAAS,GAAQ,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,oDAAoD;YACpD,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACzD,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7D,IAAI,CAAC;oBACH,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACrC,CAAC;gBAAC,MAAM,CAAC;oBACP,6CAA6C;oBAC7C,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACzB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACzB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC5D,CAAC"}
|