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,193 @@
1
+ "use strict";
2
+ /**
3
+ * Main orchestration for NDJSON loader.
4
+ * Coordinates file discovery, table management, and loading operations.
5
+ *
6
+ * @author John Grimes
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
20
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.loadNdjsonFiles = loadNdjsonFiles;
24
+ const connection_js_1 = require("./connection.js");
25
+ const discovery_js_1 = require("./discovery.js");
26
+ const tables_js_1 = require("./tables.js");
27
+ const stream_js_1 = require("./stream.js");
28
+ const progress_js_1 = require("./progress.js");
29
+ /**
30
+ * Discover and log files to be loaded.
31
+ *
32
+ * @param options - Loader options.
33
+ * @returns Discovered files.
34
+ */
35
+ function discoverAndLogFiles(options) {
36
+ if (options.verbose) {
37
+ console.log(`Discovering NDJSON files in ${options.directory}...`);
38
+ }
39
+ const files = (0, discovery_js_1.discoverFiles)(options);
40
+ if (files.length === 0) {
41
+ if (!options.quiet) {
42
+ console.log("No NDJSON files found matching the criteria");
43
+ }
44
+ return [];
45
+ }
46
+ if (!options.quiet) {
47
+ const filesByResourceType = (0, discovery_js_1.groupFilesByResourceType)(files);
48
+ console.log(`Found ${files.length} file(s) for ${filesByResourceType.size} resource type(s):\n`);
49
+ for (const [resourceType, resourceFiles] of filesByResourceType) {
50
+ console.log(` ${resourceType}: ${resourceFiles.length} file(s)`);
51
+ }
52
+ console.log();
53
+ }
54
+ return files;
55
+ }
56
+ /**
57
+ * Split files into chunks for parallel processing.
58
+ *
59
+ * @param files - Files to chunk.
60
+ * @param chunkSize - Size of each chunk.
61
+ * @returns Array of file chunks.
62
+ */
63
+ function chunkFiles(files, chunkSize) {
64
+ const chunks = [];
65
+ for (let i = 0; i < files.length; i += chunkSize) {
66
+ chunks.push(files.slice(i, i + chunkSize));
67
+ }
68
+ return chunks;
69
+ }
70
+ /**
71
+ * Prepare database table for loading.
72
+ *
73
+ * @param pool - Database connection pool.
74
+ * @param options - Loader options.
75
+ * @returns Table schema and name.
76
+ */
77
+ async function prepareTable(pool, options) {
78
+ const schemaName = options.schemaName ?? "dbo";
79
+ const tableName = options.tableName ?? "fhir_resources";
80
+ if (options.createTable !== false) {
81
+ if (options.verbose) {
82
+ console.log(`Ensuring table [${schemaName}].[${tableName}] exists${options.truncate ? " (will truncate)" : ""}...`);
83
+ }
84
+ await (0, tables_js_1.ensureTable)(pool, schemaName, tableName, options.truncate ?? false);
85
+ }
86
+ return { schemaName, tableName };
87
+ }
88
+ /**
89
+ * Load files in parallel chunks.
90
+ *
91
+ * @param pool - Database connection pool.
92
+ * @param files - Files to load.
93
+ * @param options - Loader options.
94
+ * @param schemaName - Schema name.
95
+ * @param tableName - Table name.
96
+ * @param progress - Progress tracker.
97
+ */
98
+ async function loadFilesInChunks(pool, files, options, schemaName, tableName, progress) {
99
+ const parallel = options.parallel ?? 4;
100
+ const continueOnError = options.continueOnError ?? false;
101
+ const fileChunks = chunkFiles(files, parallel);
102
+ for (const chunk of fileChunks) {
103
+ const loadPromises = chunk.map(async (file) => {
104
+ (0, progress_js_1.initializeFileProgress)(progress, file);
105
+ const result = await (0, stream_js_1.loadFile)(pool, file, schemaName, tableName, options.batchSize ?? 1000, (rowsLoaded) => {
106
+ (0, progress_js_1.updateFileProgress)(progress, file.path, rowsLoaded);
107
+ if (options.progress && !options.verbose) {
108
+ (0, progress_js_1.printSimpleProgress)(progress);
109
+ }
110
+ });
111
+ (0, progress_js_1.completeFileProgress)(progress, result);
112
+ if (options.verbose) {
113
+ (0, progress_js_1.printVerboseProgress)(progress);
114
+ }
115
+ if (result.error && !continueOnError) {
116
+ throw new Error(`Failed to load ${file.path}: ${result.error}`);
117
+ }
118
+ return result;
119
+ });
120
+ await Promise.all(loadPromises);
121
+ }
122
+ }
123
+ /**
124
+ * Perform the actual loading process.
125
+ *
126
+ * @param pool - Database connection pool.
127
+ * @param files - Files to load.
128
+ * @param options - Loader options.
129
+ * @param startTime - Start timestamp.
130
+ * @returns Loader summary.
131
+ */
132
+ async function performLoad(pool, files, options, startTime) {
133
+ const connected = await (0, connection_js_1.testConnection)(pool);
134
+ if (!connected) {
135
+ throw new Error("Failed to connect to database");
136
+ }
137
+ if (!options.quiet) {
138
+ console.log("Connected successfully\n");
139
+ }
140
+ const progress = (0, progress_js_1.createProgressTracker)(files);
141
+ const { schemaName, tableName } = await prepareTable(pool, options);
142
+ if (!options.quiet) {
143
+ console.log("Loading files...\n");
144
+ }
145
+ await loadFilesInChunks(pool, files, options, schemaName, tableName, progress);
146
+ if (options.progress && !options.verbose && !options.quiet) {
147
+ process.stdout.write("\r" + " ".repeat(80) + "\r");
148
+ }
149
+ const summary = (0, progress_js_1.createSummary)(progress, Date.now() - startTime);
150
+ if (!options.quiet) {
151
+ (0, progress_js_1.printSummary)(summary);
152
+ }
153
+ return summary;
154
+ }
155
+ /**
156
+ * Load NDJSON files from a directory into SQL Server.
157
+ *
158
+ * @param options - Loader options.
159
+ * @returns Promise that resolves to the loader summary.
160
+ */
161
+ async function loadNdjsonFiles(options) {
162
+ const startTime = Date.now();
163
+ const files = discoverAndLogFiles(options);
164
+ if (files.length === 0) {
165
+ return (0, progress_js_1.createSummary)((0, progress_js_1.createProgressTracker)([]), Date.now() - startTime);
166
+ }
167
+ if (options.dryRun) {
168
+ if (!options.quiet) {
169
+ console.log("Dry run - no data will be loaded\n");
170
+ }
171
+ return (0, progress_js_1.createSummary)((0, progress_js_1.createProgressTracker)(files), Date.now() - startTime);
172
+ }
173
+ if (!options.quiet) {
174
+ console.log(`Connecting to SQL Server at ${options.database.host}:${options.database.port ?? 1433}...`);
175
+ }
176
+ const pool = await (0, connection_js_1.createConnectionPool)(options.database);
177
+ try {
178
+ return await performLoad(pool, files, options, startTime);
179
+ }
180
+ finally {
181
+ await (0, connection_js_1.closeConnectionPool)(pool);
182
+ }
183
+ }
184
+ /**
185
+ * Export all loader functionality.
186
+ */
187
+ __exportStar(require("./types.js"), exports);
188
+ __exportStar(require("./connection.js"), exports);
189
+ __exportStar(require("./discovery.js"), exports);
190
+ __exportStar(require("./tables.js"), exports);
191
+ __exportStar(require("./stream.js"), exports);
192
+ __exportStar(require("./progress.js"), exports);
193
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/loader/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Progress tracking for NDJSON loader.
3
+ * Provides real-time progress updates and statistics.
4
+ *
5
+ * @author John Grimes
6
+ */
7
+ import type { DiscoveredFile, FileLoadResult, LoaderProgress, LoaderSummary } from "./types.js";
8
+ /**
9
+ * Create a new progress tracker.
10
+ *
11
+ * @param files - Array of files to track.
12
+ * @returns New progress tracker.
13
+ */
14
+ export declare function createProgressTracker(files: DiscoveredFile[]): LoaderProgress;
15
+ /**
16
+ * Initialize progress for a file.
17
+ *
18
+ * @param progress - Progress tracker.
19
+ * @param file - File to initialize.
20
+ */
21
+ export declare function initializeFileProgress(progress: LoaderProgress, file: DiscoveredFile): void;
22
+ /**
23
+ * Update progress for a file.
24
+ *
25
+ * @param progress - Progress tracker.
26
+ * @param filePath - Path to the file.
27
+ * @param rowsLoaded - Number of rows loaded.
28
+ */
29
+ export declare function updateFileProgress(progress: LoaderProgress, filePath: string, rowsLoaded: number): void;
30
+ /**
31
+ * Mark a file as completed.
32
+ *
33
+ * @param progress - Progress tracker.
34
+ * @param result - File load result.
35
+ */
36
+ export declare function completeFileProgress(progress: LoaderProgress, result: FileLoadResult): void;
37
+ /**
38
+ * Format progress as a status string.
39
+ *
40
+ * @param progress - Progress tracker.
41
+ * @returns Formatted status string.
42
+ */
43
+ export declare function formatProgressStatus(progress: LoaderProgress): string;
44
+ /**
45
+ * Print verbose progress to console.
46
+ *
47
+ * @param progress - Progress tracker.
48
+ */
49
+ export declare function printVerboseProgress(progress: LoaderProgress): void;
50
+ /**
51
+ * Print simple progress line to console (can be overwritten).
52
+ *
53
+ * @param progress - Progress tracker.
54
+ */
55
+ export declare function printSimpleProgress(progress: LoaderProgress): void;
56
+ /**
57
+ * Create a summary of the loading operation.
58
+ *
59
+ * @param progress - Progress tracker.
60
+ * @param durationMs - Duration in milliseconds.
61
+ * @returns Loader summary.
62
+ */
63
+ export declare function createSummary(progress: LoaderProgress, durationMs: number): LoaderSummary;
64
+ /**
65
+ * Print a summary of the loading operation.
66
+ *
67
+ * @param summary - Loader summary.
68
+ */
69
+ export declare function printSummary(summary: LoaderSummary): void;
70
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/loader/progress.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EAEd,cAAc,EACd,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,CAQ7E;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,cAAc,GACnB,IAAI,CAON;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,IAAI,CAKN;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,cAAc,GACrB,IAAI,CAYN;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAMrE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAkBnE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAElE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,cAAc,EACxB,UAAU,EAAE,MAAM,GACjB,aAAa,CAsBf;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAqBzD"}
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ /**
3
+ * Progress tracking for NDJSON loader.
4
+ * Provides real-time progress updates and statistics.
5
+ *
6
+ * @author John Grimes
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createProgressTracker = createProgressTracker;
10
+ exports.initializeFileProgress = initializeFileProgress;
11
+ exports.updateFileProgress = updateFileProgress;
12
+ exports.completeFileProgress = completeFileProgress;
13
+ exports.formatProgressStatus = formatProgressStatus;
14
+ exports.printVerboseProgress = printVerboseProgress;
15
+ exports.printSimpleProgress = printSimpleProgress;
16
+ exports.createSummary = createSummary;
17
+ exports.printSummary = printSummary;
18
+ /**
19
+ * Create a new progress tracker.
20
+ *
21
+ * @param files - Array of files to track.
22
+ * @returns New progress tracker.
23
+ */
24
+ function createProgressTracker(files) {
25
+ return {
26
+ totalFiles: files.length,
27
+ filesCompleted: 0,
28
+ totalRowsLoaded: 0,
29
+ totalRowsFailed: 0,
30
+ fileProgress: new Map(),
31
+ };
32
+ }
33
+ /**
34
+ * Initialize progress for a file.
35
+ *
36
+ * @param progress - Progress tracker.
37
+ * @param file - File to initialize.
38
+ */
39
+ function initializeFileProgress(progress, file) {
40
+ progress.fileProgress.set(file.path, {
41
+ file,
42
+ rowsLoaded: 0,
43
+ rowsFailed: 0,
44
+ completed: false,
45
+ });
46
+ }
47
+ /**
48
+ * Update progress for a file.
49
+ *
50
+ * @param progress - Progress tracker.
51
+ * @param filePath - Path to the file.
52
+ * @param rowsLoaded - Number of rows loaded.
53
+ */
54
+ function updateFileProgress(progress, filePath, rowsLoaded) {
55
+ const fileProgress = progress.fileProgress.get(filePath);
56
+ if (fileProgress) {
57
+ fileProgress.rowsLoaded = rowsLoaded;
58
+ }
59
+ }
60
+ /**
61
+ * Mark a file as completed.
62
+ *
63
+ * @param progress - Progress tracker.
64
+ * @param result - File load result.
65
+ */
66
+ function completeFileProgress(progress, result) {
67
+ const fileProgress = progress.fileProgress.get(result.file.path);
68
+ if (fileProgress) {
69
+ fileProgress.rowsLoaded = result.rowsLoaded;
70
+ fileProgress.rowsFailed = result.rowsFailed;
71
+ fileProgress.completed = true;
72
+ fileProgress.error = result.error;
73
+ progress.filesCompleted++;
74
+ progress.totalRowsLoaded += result.rowsLoaded;
75
+ progress.totalRowsFailed += result.rowsFailed;
76
+ }
77
+ }
78
+ /**
79
+ * Format progress as a status string.
80
+ *
81
+ * @param progress - Progress tracker.
82
+ * @returns Formatted status string.
83
+ */
84
+ function formatProgressStatus(progress) {
85
+ const percentage = ((progress.filesCompleted / progress.totalFiles) *
86
+ 100).toFixed(0);
87
+ return `[${progress.filesCompleted}/${progress.totalFiles} files (${percentage}%)] ${progress.totalRowsLoaded} rows loaded`;
88
+ }
89
+ /**
90
+ * Print verbose progress to console.
91
+ *
92
+ * @param progress - Progress tracker.
93
+ */
94
+ function printVerboseProgress(progress) {
95
+ console.log(formatProgressStatus(progress));
96
+ for (const [, fileProgress] of progress.fileProgress) {
97
+ if (fileProgress.completed) {
98
+ const status = fileProgress.error ? "✗ FAILED" : "✓ COMPLETE";
99
+ const rows = `${fileProgress.rowsLoaded} rows`;
100
+ const failed = fileProgress.rowsFailed > 0
101
+ ? ` (${fileProgress.rowsFailed} failed)`
102
+ : "";
103
+ console.log(` ${status} ${fileProgress.file.resourceType}: ${rows}${failed}`);
104
+ if (fileProgress.error) {
105
+ console.log(` Error: ${fileProgress.error}`);
106
+ }
107
+ }
108
+ }
109
+ }
110
+ /**
111
+ * Print simple progress line to console (can be overwritten).
112
+ *
113
+ * @param progress - Progress tracker.
114
+ */
115
+ function printSimpleProgress(progress) {
116
+ process.stdout.write(`\r${formatProgressStatus(progress)}`);
117
+ }
118
+ /**
119
+ * Create a summary of the loading operation.
120
+ *
121
+ * @param progress - Progress tracker.
122
+ * @param durationMs - Duration in milliseconds.
123
+ * @returns Loader summary.
124
+ */
125
+ function createSummary(progress, durationMs) {
126
+ const errors = [];
127
+ let filesLoaded = 0;
128
+ let filesFailed = 0;
129
+ for (const [, fileProgress] of progress.fileProgress) {
130
+ if (fileProgress.error) {
131
+ filesFailed++;
132
+ errors.push({ file: fileProgress.file.path, error: fileProgress.error });
133
+ }
134
+ else if (fileProgress.completed) {
135
+ filesLoaded++;
136
+ }
137
+ }
138
+ return {
139
+ filesLoaded,
140
+ filesFailed,
141
+ rowsLoaded: progress.totalRowsLoaded,
142
+ rowsFailed: progress.totalRowsFailed,
143
+ durationMs,
144
+ errors,
145
+ };
146
+ }
147
+ /**
148
+ * Print a summary of the loading operation.
149
+ *
150
+ * @param summary - Loader summary.
151
+ */
152
+ function printSummary(summary) {
153
+ console.log("\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
154
+ console.log("NDJSON Loader Summary");
155
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
156
+ console.log(`Files loaded: ${summary.filesLoaded}`);
157
+ console.log(`Files failed: ${summary.filesFailed}`);
158
+ console.log(`Rows loaded: ${summary.rowsLoaded}`);
159
+ console.log(`Rows failed: ${summary.rowsFailed}`);
160
+ console.log(`Duration: ${formatDuration(summary.durationMs)}`);
161
+ console.log(`Throughput: ${formatThroughput(summary.rowsLoaded, summary.durationMs)} rows/sec`);
162
+ if (summary.errors.length > 0) {
163
+ console.log("\nErrors:");
164
+ for (const error of summary.errors) {
165
+ console.log(` ${error.file}: ${error.error}`);
166
+ }
167
+ }
168
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
169
+ }
170
+ /**
171
+ * Format duration in human-readable format.
172
+ *
173
+ * @param ms - Duration in milliseconds.
174
+ * @returns Formatted duration string.
175
+ */
176
+ function formatDuration(ms) {
177
+ const seconds = Math.floor(ms / 1000);
178
+ const minutes = Math.floor(seconds / 60);
179
+ const hours = Math.floor(minutes / 60);
180
+ if (hours > 0) {
181
+ return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
182
+ }
183
+ else if (minutes > 0) {
184
+ return `${minutes}m ${seconds % 60}s`;
185
+ }
186
+ else if (seconds > 0) {
187
+ return `${seconds}s`;
188
+ }
189
+ else {
190
+ return `${ms}ms`;
191
+ }
192
+ }
193
+ /**
194
+ * Format throughput in rows per second.
195
+ *
196
+ * @param rows - Number of rows.
197
+ * @param ms - Duration in milliseconds.
198
+ * @returns Formatted throughput string.
199
+ */
200
+ function formatThroughput(rows, ms) {
201
+ if (ms === 0)
202
+ return "0";
203
+ const rowsPerSec = (rows / ms) * 1000;
204
+ return rowsPerSec.toLocaleString(undefined, { maximumFractionDigits: 0 });
205
+ }
206
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/loader/progress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Streaming NDJSON loader.
3
+ * Loads NDJSON files line-by-line with batched bulk inserts.
4
+ *
5
+ * @author John Grimes
6
+ */
7
+ import { type ConnectionPool } from "mssql";
8
+ import type { DiscoveredFile, FileLoadResult } from "./types.js";
9
+ /**
10
+ * Load a single NDJSON file into the database.
11
+ *
12
+ * @param pool - Database connection pool.
13
+ * @param file - File to load.
14
+ * @param schemaName - Schema name.
15
+ * @param tableName - Name of the table to load into.
16
+ * @param batchSize - Number of rows per batch.
17
+ * @param onProgress - Optional callback for progress updates.
18
+ * @returns Promise that resolves to the load result.
19
+ */
20
+ export declare function loadFile(pool: ConnectionPool, file: DiscoveredFile, schemaName: string, tableName: string, batchSize?: number, onProgress?: (rowsLoaded: number) => void): Promise<FileLoadResult>;
21
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/loader/stream.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAY,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjE;;;;;;;;;;GAUG;AAEH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,cAAc,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAAa,EACxB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,GACxC,OAAO,CAAC,cAAc,CAAC,CAoEzB"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ /**
3
+ * Streaming NDJSON loader.
4
+ * Loads NDJSON files line-by-line with batched bulk inserts.
5
+ *
6
+ * @author John Grimes
7
+ */
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.loadFile = loadFile;
13
+ const fs_1 = require("fs");
14
+ const readline_1 = require("readline");
15
+ const mssql_1 = __importDefault(require("mssql"));
16
+ /**
17
+ * Load a single NDJSON file into the database.
18
+ *
19
+ * @param pool - Database connection pool.
20
+ * @param file - File to load.
21
+ * @param schemaName - Schema name.
22
+ * @param tableName - Name of the table to load into.
23
+ * @param batchSize - Number of rows per batch.
24
+ * @param onProgress - Optional callback for progress updates.
25
+ * @returns Promise that resolves to the load result.
26
+ */
27
+ // eslint-disable-next-line max-lines-per-function -- File loading requires streaming and batching logic
28
+ async function loadFile(pool, file, schemaName, tableName, batchSize = 1000, onProgress) {
29
+ const startTime = Date.now();
30
+ let rowsLoaded = 0;
31
+ const rowsFailed = 0;
32
+ let batch = [];
33
+ try {
34
+ // Create a readline interface to read the file line by line.
35
+ const fileStream = (0, fs_1.createReadStream)(file.path, { encoding: "utf-8" });
36
+ const rl = (0, readline_1.createInterface)({
37
+ input: fileStream,
38
+ crlfDelay: Infinity, // Treat \r\n as a single line break.
39
+ });
40
+ // Process each line as a raw string.
41
+ for await (const line of rl) {
42
+ // Skip empty lines.
43
+ if (!line.trim()) {
44
+ continue;
45
+ }
46
+ // Add to batch.
47
+ batch.push(line);
48
+ // If batch is full, insert it.
49
+ if (batch.length >= batchSize) {
50
+ await insertBatch(pool, schemaName, tableName, file.resourceType, batch);
51
+ rowsLoaded += batch.length;
52
+ batch = [];
53
+ // Report progress.
54
+ if (onProgress) {
55
+ onProgress(rowsLoaded);
56
+ }
57
+ }
58
+ }
59
+ // Insert any remaining rows in the final batch.
60
+ if (batch.length > 0) {
61
+ await insertBatch(pool, schemaName, tableName, file.resourceType, batch);
62
+ rowsLoaded += batch.length;
63
+ if (onProgress) {
64
+ onProgress(rowsLoaded);
65
+ }
66
+ }
67
+ return {
68
+ file,
69
+ rowsLoaded,
70
+ rowsFailed,
71
+ durationMs: Date.now() - startTime,
72
+ };
73
+ }
74
+ catch (error) {
75
+ return {
76
+ file,
77
+ rowsLoaded,
78
+ rowsFailed,
79
+ durationMs: Date.now() - startTime,
80
+ error: error instanceof Error ? error.message : String(error),
81
+ };
82
+ }
83
+ }
84
+ /**
85
+ * Insert a batch of rows using bulk insert.
86
+ *
87
+ * @param pool - Database connection pool.
88
+ * @param schemaName - Schema name.
89
+ * @param tableName - Name of the table to insert into.
90
+ * @param resourceType - FHIR resource type.
91
+ * @param lines - Array of JSON lines to insert.
92
+ */
93
+ async function insertBatch(pool, schemaName, tableName, resourceType, lines) {
94
+ const table = new mssql_1.default.Table(`[${schemaName}].[${tableName}]`);
95
+ table.columns.add("resource_type", mssql_1.default.NVarChar(64), { nullable: false });
96
+ table.columns.add("json", mssql_1.default.NVarChar(mssql_1.default.MAX), { nullable: false });
97
+ for (const line of lines) {
98
+ table.rows.add(resourceType, line);
99
+ }
100
+ const request = pool.request();
101
+ await request.bulk(table);
102
+ }
103
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/loader/stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Table management for NDJSON loader.
3
+ * Creates and manages the single fhir_resources table.
4
+ *
5
+ * @author John Grimes
6
+ */
7
+ import { type ConnectionPool } from "mssql";
8
+ /**
9
+ * Check if a table exists in the database.
10
+ *
11
+ * @param pool - Database connection pool.
12
+ * @param schemaName - Schema name.
13
+ * @param tableName - Name of the table to check.
14
+ * @returns Promise that resolves to true if the table exists.
15
+ */
16
+ export declare function tableExists(pool: ConnectionPool, schemaName: string, tableName: string): Promise<boolean>;
17
+ /**
18
+ * Create the fhir_resources table with an index on resource_type.
19
+ * Table schema: id (INT IDENTITY PRIMARY KEY), resource_type (NVARCHAR(64)), json (NVARCHAR(MAX))
20
+ *
21
+ * @param pool - Database connection pool.
22
+ * @param schemaName - Schema name.
23
+ * @param tableName - Name of the table to create.
24
+ */
25
+ export declare function createTable(pool: ConnectionPool, schemaName: string, tableName: string): Promise<void>;
26
+ /**
27
+ * Truncate a table (remove all rows).
28
+ *
29
+ * @param pool - Database connection pool.
30
+ * @param schemaName - Schema name.
31
+ * @param tableName - Name of the table to truncate.
32
+ */
33
+ export declare function truncateTable(pool: ConnectionPool, schemaName: string, tableName: string): Promise<void>;
34
+ /**
35
+ * Ensure the fhir_resources table exists, creating it if necessary.
36
+ *
37
+ * @param pool - Database connection pool.
38
+ * @param schemaName - Schema name.
39
+ * @param tableName - Name of the table.
40
+ * @param truncate - Whether to truncate the table if it exists.
41
+ */
42
+ export declare function ensureTable(pool: ConnectionPool, schemaName: string, tableName: string, truncate?: boolean): Promise<void>;
43
+ //# sourceMappingURL=tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../src/loader/tables.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAY,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAEjD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,cAAc,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAWlB;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,cAAc,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAef;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,cAAc,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,cAAc,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,OAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CAUf"}