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.
- package/LICENSE +202 -0
- package/README.md +346 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +85 -0
- package/dist/cli.js.map +1 -0
- package/dist/fhirpath/transpiler.d.ts +18 -0
- package/dist/fhirpath/transpiler.d.ts.map +1 -0
- package/dist/fhirpath/transpiler.js +82 -0
- package/dist/fhirpath/transpiler.js.map +1 -0
- package/dist/fhirpath/visitor.d.ts +153 -0
- package/dist/fhirpath/visitor.d.ts.map +1 -0
- package/dist/fhirpath/visitor.js +1295 -0
- package/dist/fhirpath/visitor.js.map +1 -0
- package/dist/generated/grammar/fhirpathLexer.d.ts +88 -0
- package/dist/generated/grammar/fhirpathLexer.d.ts.map +1 -0
- package/dist/generated/grammar/fhirpathLexer.js +598 -0
- package/dist/generated/grammar/fhirpathLexer.js.map +1 -0
- package/dist/generated/grammar/fhirpathListener.d.ts +589 -0
- package/dist/generated/grammar/fhirpathListener.d.ts.map +1 -0
- package/dist/generated/grammar/fhirpathListener.js +4 -0
- package/dist/generated/grammar/fhirpathListener.js.map +1 -0
- package/dist/generated/grammar/fhirpathParser.d.ts +470 -0
- package/dist/generated/grammar/fhirpathParser.d.ts.map +1 -0
- package/dist/generated/grammar/fhirpathParser.js +3022 -0
- package/dist/generated/grammar/fhirpathParser.js.map +1 -0
- package/dist/generated/grammar/fhirpathVisitor.d.ts +372 -0
- package/dist/generated/grammar/fhirpathVisitor.d.ts.map +1 -0
- package/dist/generated/grammar/fhirpathVisitor.js +4 -0
- package/dist/generated/grammar/fhirpathVisitor.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/load.d.ts +14 -0
- package/dist/load.d.ts.map +1 -0
- package/dist/load.js +115 -0
- package/dist/load.js.map +1 -0
- package/dist/loader/connection.d.ts +36 -0
- package/dist/loader/connection.d.ts.map +1 -0
- package/dist/loader/connection.js +106 -0
- package/dist/loader/connection.js.map +1 -0
- package/dist/loader/discovery.d.ts +38 -0
- package/dist/loader/discovery.d.ts.map +1 -0
- package/dist/loader/discovery.js +107 -0
- package/dist/loader/discovery.js.map +1 -0
- package/dist/loader/index.d.ts +24 -0
- package/dist/loader/index.d.ts.map +1 -0
- package/dist/loader/index.js +193 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/loader/progress.d.ts +70 -0
- package/dist/loader/progress.d.ts.map +1 -0
- package/dist/loader/progress.js +206 -0
- package/dist/loader/progress.js.map +1 -0
- package/dist/loader/stream.d.ts +21 -0
- package/dist/loader/stream.d.ts.map +1 -0
- package/dist/loader/stream.js +103 -0
- package/dist/loader/stream.js.map +1 -0
- package/dist/loader/tables.d.ts +43 -0
- package/dist/loader/tables.d.ts.map +1 -0
- package/dist/loader/tables.js +88 -0
- package/dist/loader/tables.js.map +1 -0
- package/dist/loader/types.d.ts +134 -0
- package/dist/loader/types.d.ts.map +1 -0
- package/dist/loader/types.js +8 -0
- package/dist/loader/types.js.map +1 -0
- package/dist/parser.d.ts +60 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +226 -0
- package/dist/parser.js.map +1 -0
- package/dist/queryGenerator/ColumnExpressionGenerator.d.ts +52 -0
- package/dist/queryGenerator/ColumnExpressionGenerator.d.ts.map +1 -0
- package/dist/queryGenerator/ColumnExpressionGenerator.js +144 -0
- package/dist/queryGenerator/ColumnExpressionGenerator.js.map +1 -0
- package/dist/queryGenerator/ForEachProcessor.d.ts +127 -0
- package/dist/queryGenerator/ForEachProcessor.d.ts.map +1 -0
- package/dist/queryGenerator/ForEachProcessor.js +351 -0
- package/dist/queryGenerator/ForEachProcessor.js.map +1 -0
- package/dist/queryGenerator/PathParser.d.ts +64 -0
- package/dist/queryGenerator/PathParser.d.ts.map +1 -0
- package/dist/queryGenerator/PathParser.js +164 -0
- package/dist/queryGenerator/PathParser.js.map +1 -0
- package/dist/queryGenerator/SelectClauseBuilder.d.ts +63 -0
- package/dist/queryGenerator/SelectClauseBuilder.d.ts.map +1 -0
- package/dist/queryGenerator/SelectClauseBuilder.js +196 -0
- package/dist/queryGenerator/SelectClauseBuilder.js.map +1 -0
- package/dist/queryGenerator/SelectCombinationExpander.d.ts +42 -0
- package/dist/queryGenerator/SelectCombinationExpander.d.ts.map +1 -0
- package/dist/queryGenerator/SelectCombinationExpander.js +95 -0
- package/dist/queryGenerator/SelectCombinationExpander.js.map +1 -0
- package/dist/queryGenerator/WhereClauseBuilder.d.ts +20 -0
- package/dist/queryGenerator/WhereClauseBuilder.d.ts.map +1 -0
- package/dist/queryGenerator/WhereClauseBuilder.js +63 -0
- package/dist/queryGenerator/WhereClauseBuilder.js.map +1 -0
- package/dist/queryGenerator/index.d.ts +10 -0
- package/dist/queryGenerator/index.d.ts.map +1 -0
- package/dist/queryGenerator/index.js +19 -0
- package/dist/queryGenerator/index.js.map +1 -0
- package/dist/queryGenerator.d.ts +61 -0
- package/dist/queryGenerator.d.ts.map +1 -0
- package/dist/queryGenerator.js +187 -0
- package/dist/queryGenerator.js.map +1 -0
- package/dist/tests/sqlOnFhir.test.d.ts +11 -0
- package/dist/tests/sqlOnFhir.test.d.ts.map +1 -0
- package/dist/tests/sqlOnFhir.test.js +24 -0
- package/dist/tests/sqlOnFhir.test.js.map +1 -0
- package/dist/tests/utils/database.d.ts +38 -0
- package/dist/tests/utils/database.d.ts.map +1 -0
- package/dist/tests/utils/database.js +258 -0
- package/dist/tests/utils/database.js.map +1 -0
- package/dist/tests/utils/generator.d.ts +58 -0
- package/dist/tests/utils/generator.d.ts.map +1 -0
- package/dist/tests/utils/generator.js +195 -0
- package/dist/tests/utils/generator.js.map +1 -0
- package/dist/tests/utils/reporter.d.ts +83 -0
- package/dist/tests/utils/reporter.d.ts.map +1 -0
- package/dist/tests/utils/reporter.js +245 -0
- package/dist/tests/utils/reporter.js.map +1 -0
- package/dist/tests/utils/sqlOnFhir.d.ts +33 -0
- package/dist/tests/utils/sqlOnFhir.d.ts.map +1 -0
- package/dist/tests/utils/sqlOnFhir.js +281 -0
- package/dist/tests/utils/sqlOnFhir.js.map +1 -0
- package/dist/tests/utils/testContext.d.ts +18 -0
- package/dist/tests/utils/testContext.d.ts.map +1 -0
- package/dist/tests/utils/testContext.js +25 -0
- package/dist/tests/utils/testContext.js.map +1 -0
- package/dist/tests/utils/types.d.ts +31 -0
- package/dist/tests/utils/types.d.ts.map +1 -0
- package/dist/tests/utils/types.js +9 -0
- package/dist/tests/utils/types.js.map +1 -0
- package/dist/types.d.ts +288 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds WHERE clauses for SQL queries.
|
|
3
|
+
*/
|
|
4
|
+
import { TranspilerContext } from "../fhirpath/transpiler.js";
|
|
5
|
+
import { ViewDefinitionWhere } from "../types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Handles generation of WHERE clauses.
|
|
8
|
+
*/
|
|
9
|
+
export declare class WhereClauseBuilder {
|
|
10
|
+
/**
|
|
11
|
+
* Build complete WHERE clause combining resource type filter and view-level filters.
|
|
12
|
+
* For test execution, testId is used to filter test data in the test table.
|
|
13
|
+
*/
|
|
14
|
+
buildWhereClause(resourceType: string, resourceAlias: string, testId: string | undefined, whereConditions: ViewDefinitionWhere[] | undefined, context: TranspilerContext): string | null;
|
|
15
|
+
/**
|
|
16
|
+
* Generate the WHERE clause for view-level filters.
|
|
17
|
+
*/
|
|
18
|
+
private generateViewWhereClause;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=WhereClauseBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WhereClauseBuilder.d.ts","sourceRoot":"","sources":["../../src/queryGenerator/WhereClauseBuilder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAc,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD;;GAEG;AACH,qBAAa,kBAAkB;IAC7B;;;OAGG;IACH,gBAAgB,CACd,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,eAAe,EAAE,mBAAmB,EAAE,GAAG,SAAS,EAClD,OAAO,EAAE,iBAAiB,GACzB,MAAM,GAAG,IAAI;IA2BhB;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAoChC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Builds WHERE clauses for SQL queries.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WhereClauseBuilder = void 0;
|
|
7
|
+
const transpiler_js_1 = require("../fhirpath/transpiler.js");
|
|
8
|
+
/**
|
|
9
|
+
* Handles generation of WHERE clauses.
|
|
10
|
+
*/
|
|
11
|
+
class WhereClauseBuilder {
|
|
12
|
+
/**
|
|
13
|
+
* Build complete WHERE clause combining resource type filter and view-level filters.
|
|
14
|
+
* For test execution, testId is used to filter test data in the test table.
|
|
15
|
+
*/
|
|
16
|
+
buildWhereClause(resourceType, resourceAlias, testId, whereConditions, context) {
|
|
17
|
+
const conditions = [];
|
|
18
|
+
// Add resource type filter.
|
|
19
|
+
conditions.push(`[${resourceAlias}].[resource_type] = '${resourceType}'`);
|
|
20
|
+
// Add test_id filter for test isolation (only used in test table which has test_id column).
|
|
21
|
+
if (testId) {
|
|
22
|
+
conditions.push(`[${resourceAlias}].[test_id] = '${testId}'`);
|
|
23
|
+
}
|
|
24
|
+
// Add view-level WHERE conditions.
|
|
25
|
+
const viewWhereClause = this.generateViewWhereClause(whereConditions, context);
|
|
26
|
+
if (viewWhereClause) {
|
|
27
|
+
conditions.push(viewWhereClause);
|
|
28
|
+
}
|
|
29
|
+
if (conditions.length === 0) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return `WHERE ${conditions.join(" AND ")}`;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generate the WHERE clause for view-level filters.
|
|
36
|
+
*/
|
|
37
|
+
generateViewWhereClause(whereConditions, context) {
|
|
38
|
+
if (!whereConditions || whereConditions.length === 0) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const conditions = [];
|
|
42
|
+
const booleanFields = ["active", "deceased", "multipleBirth"];
|
|
43
|
+
for (const where of whereConditions) {
|
|
44
|
+
try {
|
|
45
|
+
const condition = transpiler_js_1.Transpiler.transpile(where.path, context);
|
|
46
|
+
// Check if this looks like a simple boolean field reference that needs to be cast.
|
|
47
|
+
const simpleBooleanFieldPattern = new RegExp(`^JSON_VALUE\\([^,]+,\\s*'\\$\\.(${booleanFields.join("|")})'\\)$`);
|
|
48
|
+
if (simpleBooleanFieldPattern.test(condition.trim())) {
|
|
49
|
+
conditions.push(`(CASE WHEN ${condition} = 'true' THEN 1 ELSE 0 END = 1)`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
conditions.push(condition);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
throw new Error(`Failed to transpile where condition '${where.path}': ${error}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return `(${conditions.join(") AND (")})`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.WhereClauseBuilder = WhereClauseBuilder;
|
|
63
|
+
//# sourceMappingURL=WhereClauseBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WhereClauseBuilder.js","sourceRoot":"","sources":["../../src/queryGenerator/WhereClauseBuilder.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,6DAA0E;AAG1E;;GAEG;AACH,MAAa,kBAAkB;IAC7B;;;OAGG;IACH,gBAAgB,CACd,YAAoB,EACpB,aAAqB,EACrB,MAA0B,EAC1B,eAAkD,EAClD,OAA0B;QAE1B,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,4BAA4B;QAC5B,UAAU,CAAC,IAAI,CAAC,IAAI,aAAa,wBAAwB,YAAY,GAAG,CAAC,CAAC;QAE1E,4FAA4F;QAC5F,IAAI,MAAM,EAAE,CAAC;YACX,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;AA7ED,gDA6EC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query generator components for building T-SQL from ViewDefinitions.
|
|
3
|
+
*/
|
|
4
|
+
export { PathParser } from "./PathParser.js";
|
|
5
|
+
export { SelectCombination, SelectCombinationExpander, } from "./SelectCombinationExpander.js";
|
|
6
|
+
export { ForEachProcessor } from "./ForEachProcessor.js";
|
|
7
|
+
export { SelectClauseBuilder } from "./SelectClauseBuilder.js";
|
|
8
|
+
export { WhereClauseBuilder } from "./WhereClauseBuilder.js";
|
|
9
|
+
export { ColumnExpressionGenerator } from "./ColumnExpressionGenerator.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Query generator components for building T-SQL from ViewDefinitions.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ColumnExpressionGenerator = exports.WhereClauseBuilder = exports.SelectClauseBuilder = exports.ForEachProcessor = exports.SelectCombinationExpander = exports.PathParser = void 0;
|
|
7
|
+
var PathParser_js_1 = require("./PathParser.js");
|
|
8
|
+
Object.defineProperty(exports, "PathParser", { enumerable: true, get: function () { return PathParser_js_1.PathParser; } });
|
|
9
|
+
var SelectCombinationExpander_js_1 = require("./SelectCombinationExpander.js");
|
|
10
|
+
Object.defineProperty(exports, "SelectCombinationExpander", { enumerable: true, get: function () { return SelectCombinationExpander_js_1.SelectCombinationExpander; } });
|
|
11
|
+
var ForEachProcessor_js_1 = require("./ForEachProcessor.js");
|
|
12
|
+
Object.defineProperty(exports, "ForEachProcessor", { enumerable: true, get: function () { return ForEachProcessor_js_1.ForEachProcessor; } });
|
|
13
|
+
var SelectClauseBuilder_js_1 = require("./SelectClauseBuilder.js");
|
|
14
|
+
Object.defineProperty(exports, "SelectClauseBuilder", { enumerable: true, get: function () { return SelectClauseBuilder_js_1.SelectClauseBuilder; } });
|
|
15
|
+
var WhereClauseBuilder_js_1 = require("./WhereClauseBuilder.js");
|
|
16
|
+
Object.defineProperty(exports, "WhereClauseBuilder", { enumerable: true, get: function () { return WhereClauseBuilder_js_1.WhereClauseBuilder; } });
|
|
17
|
+
var ColumnExpressionGenerator_js_1 = require("./ColumnExpressionGenerator.js");
|
|
18
|
+
Object.defineProperty(exports, "ColumnExpressionGenerator", { enumerable: true, get: function () { return ColumnExpressionGenerator_js_1.ColumnExpressionGenerator; } });
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* T-SQL query generator for ViewDefinition structures.
|
|
3
|
+
* Generates SQL queries that can be executed against MS SQL Server.
|
|
4
|
+
*/
|
|
5
|
+
import { TranspilationResult, ViewDefinition } from "./types.js";
|
|
6
|
+
export interface QueryGeneratorOptions {
|
|
7
|
+
tableName?: string;
|
|
8
|
+
schemaName?: string;
|
|
9
|
+
resourceIdColumn?: string;
|
|
10
|
+
resourceJsonColumn?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Main query generator that orchestrates SQL generation from ViewDefinitions.
|
|
14
|
+
*/
|
|
15
|
+
export declare class QueryGenerator {
|
|
16
|
+
private readonly options;
|
|
17
|
+
private readonly pathParser;
|
|
18
|
+
private readonly combinationExpander;
|
|
19
|
+
private readonly forEachProcessor;
|
|
20
|
+
private readonly selectClauseBuilder;
|
|
21
|
+
private readonly whereClauseBuilder;
|
|
22
|
+
private readonly columnGenerator;
|
|
23
|
+
constructor(options?: QueryGeneratorOptions);
|
|
24
|
+
/**
|
|
25
|
+
* Generate a T-SQL query from a ViewDefinition.
|
|
26
|
+
*/
|
|
27
|
+
generateQuery(viewDef: ViewDefinition, testId?: string): TranspilationResult;
|
|
28
|
+
/**
|
|
29
|
+
* Generate all complete SELECT statements, handling unionAll properly.
|
|
30
|
+
*/
|
|
31
|
+
private generateAllSelectStatements;
|
|
32
|
+
/**
|
|
33
|
+
* Generate a complete SQL statement for a specific combination.
|
|
34
|
+
*/
|
|
35
|
+
private generateStatementForCombination;
|
|
36
|
+
/**
|
|
37
|
+
* Generate a simple SELECT statement without forEach.
|
|
38
|
+
*/
|
|
39
|
+
private generateSimpleStatement;
|
|
40
|
+
/**
|
|
41
|
+
* Generate a SELECT statement with forEach using CROSS APPLY.
|
|
42
|
+
*/
|
|
43
|
+
private generateForEachStatement;
|
|
44
|
+
/**
|
|
45
|
+
* Generate the FROM clause.
|
|
46
|
+
*/
|
|
47
|
+
private generateFromClause;
|
|
48
|
+
/**
|
|
49
|
+
* Create the base transpiler context.
|
|
50
|
+
*/
|
|
51
|
+
private createBaseContext;
|
|
52
|
+
/**
|
|
53
|
+
* Extract the value from a ViewDefinitionConstant.
|
|
54
|
+
*/
|
|
55
|
+
private getConstantValue;
|
|
56
|
+
/**
|
|
57
|
+
* Collect all column definitions from select elements.
|
|
58
|
+
*/
|
|
59
|
+
private collectAllColumns;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=queryGenerator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryGenerator.d.ts","sourceRoot":"","sources":["../src/queryGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,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,mBAAmB,CAAsB;IAC1D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4B;gBAEhD,OAAO,GAAE,qBAA0B;IAkB/C;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAuB5E;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAanC;;OAEG;IACH,OAAO,CAAC,+BAA+B;IAYvC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA0B/B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAsChC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA8CxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CA0B1B"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* T-SQL query generator for ViewDefinition structures.
|
|
4
|
+
* Generates SQL queries that can be executed against MS SQL Server.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.QueryGenerator = void 0;
|
|
8
|
+
const transpiler_js_1 = require("./fhirpath/transpiler.js");
|
|
9
|
+
const index_js_1 = require("./queryGenerator/index.js");
|
|
10
|
+
/**
|
|
11
|
+
* Main query generator that orchestrates SQL generation from ViewDefinitions.
|
|
12
|
+
*/
|
|
13
|
+
class QueryGenerator {
|
|
14
|
+
options;
|
|
15
|
+
pathParser;
|
|
16
|
+
combinationExpander;
|
|
17
|
+
forEachProcessor;
|
|
18
|
+
selectClauseBuilder;
|
|
19
|
+
whereClauseBuilder;
|
|
20
|
+
columnGenerator;
|
|
21
|
+
constructor(options = {}) {
|
|
22
|
+
this.options = {
|
|
23
|
+
tableName: "fhir_resources",
|
|
24
|
+
schemaName: "dbo",
|
|
25
|
+
resourceIdColumn: "id",
|
|
26
|
+
resourceJsonColumn: "json",
|
|
27
|
+
...options,
|
|
28
|
+
};
|
|
29
|
+
// Initialise specialised processors.
|
|
30
|
+
this.pathParser = new index_js_1.PathParser();
|
|
31
|
+
this.combinationExpander = new index_js_1.SelectCombinationExpander();
|
|
32
|
+
this.columnGenerator = new index_js_1.ColumnExpressionGenerator();
|
|
33
|
+
this.forEachProcessor = new index_js_1.ForEachProcessor(this.pathParser);
|
|
34
|
+
this.selectClauseBuilder = new index_js_1.SelectClauseBuilder(this.columnGenerator);
|
|
35
|
+
this.whereClauseBuilder = new index_js_1.WhereClauseBuilder();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Generate a T-SQL query from a ViewDefinition.
|
|
39
|
+
*/
|
|
40
|
+
generateQuery(viewDef, testId) {
|
|
41
|
+
try {
|
|
42
|
+
const context = this.createBaseContext(viewDef, testId);
|
|
43
|
+
const columns = this.collectAllColumns(viewDef.select);
|
|
44
|
+
const selectStatements = this.generateAllSelectStatements(viewDef, context);
|
|
45
|
+
const sql = selectStatements.length > 1
|
|
46
|
+
? selectStatements.join("\nUNION ALL\n")
|
|
47
|
+
: selectStatements[0];
|
|
48
|
+
return {
|
|
49
|
+
sql,
|
|
50
|
+
columns,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
throw new Error(`Failed to generate query for ViewDefinition: ${error}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Generate all complete SELECT statements, handling unionAll properly.
|
|
59
|
+
*/
|
|
60
|
+
generateAllSelectStatements(viewDef, context) {
|
|
61
|
+
const unionCombinations = this.combinationExpander.expandCombinations(viewDef.select);
|
|
62
|
+
return unionCombinations.map((combination) => this.generateStatementForCombination(combination, viewDef, context));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Generate a complete SQL statement for a specific combination.
|
|
66
|
+
*/
|
|
67
|
+
generateStatementForCombination(combination, viewDef, context) {
|
|
68
|
+
const hasForEach = this.forEachProcessor.combinationHasForEach(combination);
|
|
69
|
+
return hasForEach
|
|
70
|
+
? this.generateForEachStatement(combination, viewDef, context)
|
|
71
|
+
: this.generateSimpleStatement(combination, viewDef, context);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Generate a simple SELECT statement without forEach.
|
|
75
|
+
*/
|
|
76
|
+
generateSimpleStatement(combination, viewDef, context) {
|
|
77
|
+
const selectClause = this.selectClauseBuilder.generateSimpleSelectClause(combination, context);
|
|
78
|
+
const fromClause = this.generateFromClause(context);
|
|
79
|
+
const whereClause = this.whereClauseBuilder.buildWhereClause(viewDef.resource, context.resourceAlias, context.testId, viewDef.where, context);
|
|
80
|
+
let statement = `${selectClause}\n${fromClause}`;
|
|
81
|
+
if (whereClause) {
|
|
82
|
+
statement += `\n${whereClause}`;
|
|
83
|
+
}
|
|
84
|
+
return statement;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Generate a SELECT statement with forEach using CROSS APPLY.
|
|
88
|
+
*/
|
|
89
|
+
generateForEachStatement(combination, viewDef, context) {
|
|
90
|
+
const fromClause = this.generateFromClause(context);
|
|
91
|
+
const { forEachContextMap, topLevelForEach } = this.forEachProcessor.buildForEachContextMap(combination.selects, context, combination);
|
|
92
|
+
const applyClauses = this.forEachProcessor.buildApplyClauses(forEachContextMap, topLevelForEach, combination);
|
|
93
|
+
const selectClause = this.selectClauseBuilder.generateForEachSelectClause(combination, context, forEachContextMap);
|
|
94
|
+
const whereClause = this.whereClauseBuilder.buildWhereClause(viewDef.resource, context.resourceAlias, context.testId, viewDef.where, context);
|
|
95
|
+
let statement = `${selectClause}\n${fromClause}${applyClauses}`;
|
|
96
|
+
if (whereClause) {
|
|
97
|
+
statement += `\n${whereClause}`;
|
|
98
|
+
}
|
|
99
|
+
return statement;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Generate the FROM clause.
|
|
103
|
+
*/
|
|
104
|
+
generateFromClause(context) {
|
|
105
|
+
const tableName = `[${this.options.schemaName}].[${this.options.tableName}]`;
|
|
106
|
+
return `FROM ${tableName} AS [${context.resourceAlias}]`;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Create the base transpiler context.
|
|
110
|
+
*/
|
|
111
|
+
createBaseContext(viewDef, testId) {
|
|
112
|
+
const constants = {};
|
|
113
|
+
if (viewDef.constant) {
|
|
114
|
+
for (const constant of viewDef.constant) {
|
|
115
|
+
constants[constant.name] = this.getConstantValue(constant);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
resourceAlias: "r",
|
|
120
|
+
constants,
|
|
121
|
+
testId,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Extract the value from a ViewDefinitionConstant.
|
|
126
|
+
*/
|
|
127
|
+
getConstantValue(constant) {
|
|
128
|
+
const primitiveKeys = [
|
|
129
|
+
"valueString",
|
|
130
|
+
"valueInteger",
|
|
131
|
+
"valueDecimal",
|
|
132
|
+
"valueBoolean",
|
|
133
|
+
"valueDate",
|
|
134
|
+
"valueDateTime",
|
|
135
|
+
"valueTime",
|
|
136
|
+
"valueInstant",
|
|
137
|
+
"valueCode",
|
|
138
|
+
"valueId",
|
|
139
|
+
"valueUri",
|
|
140
|
+
"valueUrl",
|
|
141
|
+
"valueCanonical",
|
|
142
|
+
"valueUuid",
|
|
143
|
+
"valueOid",
|
|
144
|
+
"valueMarkdown",
|
|
145
|
+
"valueBase64Binary",
|
|
146
|
+
"valuePositiveInt",
|
|
147
|
+
"valueUnsignedInt",
|
|
148
|
+
"valueInteger64",
|
|
149
|
+
];
|
|
150
|
+
const definedValues = primitiveKeys.filter((key) => constant[key] !== undefined);
|
|
151
|
+
if (definedValues.length === 0) {
|
|
152
|
+
throw new Error(`Constant '${constant.name}' must have exactly one value[x] element defined`);
|
|
153
|
+
}
|
|
154
|
+
if (definedValues.length > 1) {
|
|
155
|
+
throw new Error(`Constant '${constant.name}' must have exactly one value[x] element defined, but has ${definedValues.length}`);
|
|
156
|
+
}
|
|
157
|
+
const key = definedValues[0];
|
|
158
|
+
return constant[key];
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Collect all column definitions from select elements.
|
|
162
|
+
*/
|
|
163
|
+
collectAllColumns(selects) {
|
|
164
|
+
const columns = [];
|
|
165
|
+
for (const select of selects) {
|
|
166
|
+
if (select.column) {
|
|
167
|
+
for (const column of select.column) {
|
|
168
|
+
columns.push({
|
|
169
|
+
name: column.name,
|
|
170
|
+
type: transpiler_js_1.Transpiler.inferSqlType(column.type),
|
|
171
|
+
nullable: true, // FHIR data is generally nullable.
|
|
172
|
+
description: column.description,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (select.select) {
|
|
177
|
+
columns.push(...this.collectAllColumns(select.select));
|
|
178
|
+
}
|
|
179
|
+
if (select.unionAll) {
|
|
180
|
+
columns.push(...this.collectAllColumns(select.unionAll));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return columns;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
exports.QueryGenerator = QueryGenerator;
|
|
187
|
+
//# sourceMappingURL=queryGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryGenerator.js","sourceRoot":"","sources":["../src/queryGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic SQL-on-FHIR tests generated from JSON test definitions.
|
|
3
|
+
*
|
|
4
|
+
* This file serves as the entry point for running SQL-on-FHIR tests using Vitest.
|
|
5
|
+
* It dynamically loads test definitions from JSON files and creates Vitest test suites
|
|
6
|
+
* at runtime, without generating physical test files.
|
|
7
|
+
*
|
|
8
|
+
* The test path is provided via the SQLONFHIR_TEST_PATH environment variable.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=sqlOnFhir.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlOnFhir.test.d.ts","sourceRoot":"","sources":["../../src/tests/sqlOnFhir.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dynamic SQL-on-FHIR tests generated from JSON test definitions.
|
|
4
|
+
*
|
|
5
|
+
* This file serves as the entry point for running SQL-on-FHIR tests using Vitest.
|
|
6
|
+
* It dynamically loads test definitions from JSON files and creates Vitest test suites
|
|
7
|
+
* at runtime, without generating physical test files.
|
|
8
|
+
*
|
|
9
|
+
* The test path is provided via the SQLONFHIR_TEST_PATH environment variable.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const vitest_1 = require("vitest");
|
|
13
|
+
const generator_1 = require("./utils/generator");
|
|
14
|
+
// Get test path from environment variable
|
|
15
|
+
const testPath = process.env.SQLONFHIR_TEST_PATH;
|
|
16
|
+
if (!testPath) {
|
|
17
|
+
throw new Error("SQLONFHIR_TEST_PATH environment variable is required. " +
|
|
18
|
+
"Set it to a SQL on FHIR JSON test file or directory containing test files.");
|
|
19
|
+
}
|
|
20
|
+
// Create dynamic tests within a describe block
|
|
21
|
+
(0, vitest_1.describe)("SQL on FHIR compliance tests", () => {
|
|
22
|
+
(0, generator_1.createDynamicTests)(testPath);
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=sqlOnFhir.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlOnFhir.test.js","sourceRoot":"","sources":["../../src/tests/sqlOnFhir.test.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAEH,mCAAkC;AAClC,iDAAuD;AAEvD,0CAA0C;AAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAEjD,IAAI,CAAC,QAAQ,EAAE,CAAC;IACd,MAAM,IAAI,KAAK,CACb,wDAAwD;QACtD,4EAA4E,CAC/E,CAAC;AACJ,CAAC;AAED,+CAA+C;AAC/C,IAAA,iBAAQ,EAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,IAAA,8BAAkB,EAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database setup and teardown utilities for Vitest tests.
|
|
3
|
+
*
|
|
4
|
+
* Provides functions to manage database connections, table creation,
|
|
5
|
+
* and test data lifecycle during Vitest test execution.
|
|
6
|
+
*/
|
|
7
|
+
import { ConnectionPool } from "mssql";
|
|
8
|
+
/**
|
|
9
|
+
* Setup database connection and create the FHIR resources table.
|
|
10
|
+
* This should be called once before running tests.
|
|
11
|
+
*/
|
|
12
|
+
export declare function setupDatabase(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Cleanup database connection.
|
|
15
|
+
* This should be called once after all tests are complete.
|
|
16
|
+
*/
|
|
17
|
+
export declare function cleanupDatabase(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Setup test data by inserting FHIR resources into the table.
|
|
20
|
+
* This should be called before each test case.
|
|
21
|
+
*
|
|
22
|
+
* @param resources - FHIR resources to insert
|
|
23
|
+
* @param testId - Unique test identifier for isolation (prepended to resource IDs)
|
|
24
|
+
*/
|
|
25
|
+
export declare function setupTestData(resources: any[], testId: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Cleanup test data by removing resources for a specific test.
|
|
28
|
+
* This should be called after each test case.
|
|
29
|
+
*
|
|
30
|
+
* @param testId - Unique test identifier to clean up
|
|
31
|
+
*/
|
|
32
|
+
export declare function cleanupTestData(testId: string): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Get the current database connection pool.
|
|
35
|
+
* Used by test utilities that need direct database access.
|
|
36
|
+
*/
|
|
37
|
+
export declare function getDatabasePool(): ConnectionPool;
|
|
38
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/tests/utils/database.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAkC,MAAM,OAAO,CAAC;AA+CvE;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBnD;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAWrD;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,GAAG,EAAE,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CA8Cf;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCnE;AAwFD;;;GAGG;AACH,wBAAgB,eAAe,IAAI,cAAc,CAKhD"}
|