fhir-persistence 0.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/CHANGELOG.md +77 -0
- package/LICENSE +21 -0
- package/README.md +225 -0
- package/dist/cjs/index.cjs +8869 -0
- package/dist/cjs/index.cjs.map +7 -0
- package/dist/cjs/index.d.ts +3114 -0
- package/dist/cjs/package.json +5 -0
- package/dist/esm/index.d.ts +3114 -0
- package/dist/esm/index.mjs +8745 -0
- package/dist/esm/index.mjs.map +7 -0
- package/dist/esm/package.json +5 -0
- package/dist/index.d.ts +3114 -0
- package/dist/lib/cache/resource-cache.d.ts +137 -0
- package/dist/lib/cache/resource-cache.d.ts.map +1 -0
- package/dist/lib/cli/reindex.d.ts +55 -0
- package/dist/lib/cli/reindex.d.ts.map +1 -0
- package/dist/lib/db/adapter.d.ts +79 -0
- package/dist/lib/db/adapter.d.ts.map +1 -0
- package/dist/lib/db/better-sqlite3-adapter.d.ts +65 -0
- package/dist/lib/db/better-sqlite3-adapter.d.ts.map +1 -0
- package/dist/lib/db/dialect.d.ts +87 -0
- package/dist/lib/db/dialect.d.ts.map +1 -0
- package/dist/lib/db/index.d.ts +18 -0
- package/dist/lib/db/index.d.ts.map +1 -0
- package/dist/lib/db/postgres-adapter.d.ts +84 -0
- package/dist/lib/db/postgres-adapter.d.ts.map +1 -0
- package/dist/lib/db/postgres-dialect.d.ts +36 -0
- package/dist/lib/db/postgres-dialect.d.ts.map +1 -0
- package/dist/lib/db/sqlite-adapter.d.ts +41 -0
- package/dist/lib/db/sqlite-adapter.d.ts.map +1 -0
- package/dist/lib/db/sqlite-dialect.d.ts +34 -0
- package/dist/lib/db/sqlite-dialect.d.ts.map +1 -0
- package/dist/lib/index.d.ts +65 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/migration/ig-persistence-manager.d.ts +56 -0
- package/dist/lib/migration/ig-persistence-manager.d.ts.map +1 -0
- package/dist/lib/migration/migration-generator.d.ts +38 -0
- package/dist/lib/migration/migration-generator.d.ts.map +1 -0
- package/dist/lib/migration/reindex-scheduler.d.ts +82 -0
- package/dist/lib/migration/reindex-scheduler.d.ts.map +1 -0
- package/dist/lib/migration/schema-diff.d.ts +44 -0
- package/dist/lib/migration/schema-diff.d.ts.map +1 -0
- package/dist/lib/migrations/index.d.ts +8 -0
- package/dist/lib/migrations/index.d.ts.map +1 -0
- package/dist/lib/migrations/migration-runner.d.ts +102 -0
- package/dist/lib/migrations/migration-runner.d.ts.map +1 -0
- package/dist/lib/observability/search-logger.d.ts +74 -0
- package/dist/lib/observability/search-logger.d.ts.map +1 -0
- package/dist/lib/platform/platform-ig-definitions.d.ts +51 -0
- package/dist/lib/platform/platform-ig-definitions.d.ts.map +1 -0
- package/dist/lib/platform/platform-ig-loader.d.ts +30 -0
- package/dist/lib/platform/platform-ig-loader.d.ts.map +1 -0
- package/dist/lib/providers/definition-provider.d.ts +124 -0
- package/dist/lib/providers/definition-provider.d.ts.map +1 -0
- package/dist/lib/providers/fhir-definition-provider.d.ts +58 -0
- package/dist/lib/providers/fhir-definition-provider.d.ts.map +1 -0
- package/dist/lib/providers/fhir-runtime-provider.d.ts +75 -0
- package/dist/lib/providers/fhir-runtime-provider.d.ts.map +1 -0
- package/dist/lib/providers/in-memory-definition-provider.d.ts +72 -0
- package/dist/lib/providers/in-memory-definition-provider.d.ts.map +1 -0
- package/dist/lib/providers/index.d.ts +13 -0
- package/dist/lib/providers/index.d.ts.map +1 -0
- package/dist/lib/providers/property-path-runtime-provider.d.ts +34 -0
- package/dist/lib/providers/property-path-runtime-provider.d.ts.map +1 -0
- package/dist/lib/providers/runtime-provider.d.ts +84 -0
- package/dist/lib/providers/runtime-provider.d.ts.map +1 -0
- package/dist/lib/registry/element-cardinality.d.ts +15 -0
- package/dist/lib/registry/element-cardinality.d.ts.map +1 -0
- package/dist/lib/registry/index.d.ts +10 -0
- package/dist/lib/registry/index.d.ts.map +1 -0
- package/dist/lib/registry/package-registry-repo.d.ts +106 -0
- package/dist/lib/registry/package-registry-repo.d.ts.map +1 -0
- package/dist/lib/registry/search-parameter-registry.d.ts +175 -0
- package/dist/lib/registry/search-parameter-registry.d.ts.map +1 -0
- package/dist/lib/registry/structure-definition-registry.d.ts +93 -0
- package/dist/lib/registry/structure-definition-registry.d.ts.map +1 -0
- package/dist/lib/repo/errors.d.ts +61 -0
- package/dist/lib/repo/errors.d.ts.map +1 -0
- package/dist/lib/repo/history-bundle.d.ts +78 -0
- package/dist/lib/repo/history-bundle.d.ts.map +1 -0
- package/dist/lib/repo/index.d.ts +17 -0
- package/dist/lib/repo/index.d.ts.map +1 -0
- package/dist/lib/repo/indexing-pipeline.d.ts +108 -0
- package/dist/lib/repo/indexing-pipeline.d.ts.map +1 -0
- package/dist/lib/repo/lookup-table-writer.d.ts +46 -0
- package/dist/lib/repo/lookup-table-writer.d.ts.map +1 -0
- package/dist/lib/repo/reference-indexer.d.ts +56 -0
- package/dist/lib/repo/reference-indexer.d.ts.map +1 -0
- package/dist/lib/repo/row-builder.d.ts +78 -0
- package/dist/lib/repo/row-builder.d.ts.map +1 -0
- package/dist/lib/repo/row-indexer.d.ts +111 -0
- package/dist/lib/repo/row-indexer.d.ts.map +1 -0
- package/dist/lib/repo/sql-builder.d.ts +166 -0
- package/dist/lib/repo/sql-builder.d.ts.map +1 -0
- package/dist/lib/repo/types.d.ts +321 -0
- package/dist/lib/repo/types.d.ts.map +1 -0
- package/dist/lib/schema/ddl-generator.d.ts +81 -0
- package/dist/lib/schema/ddl-generator.d.ts.map +1 -0
- package/dist/lib/schema/index.d.ts +8 -0
- package/dist/lib/schema/index.d.ts.map +1 -0
- package/dist/lib/schema/table-schema-builder.d.ts +66 -0
- package/dist/lib/schema/table-schema-builder.d.ts.map +1 -0
- package/dist/lib/schema/table-schema.d.ts +236 -0
- package/dist/lib/schema/table-schema.d.ts.map +1 -0
- package/dist/lib/search/index.d.ts +22 -0
- package/dist/lib/search/index.d.ts.map +1 -0
- package/dist/lib/search/pagination.d.ts +53 -0
- package/dist/lib/search/pagination.d.ts.map +1 -0
- package/dist/lib/search/param-parser.d.ts +85 -0
- package/dist/lib/search/param-parser.d.ts.map +1 -0
- package/dist/lib/search/search-bundle.d.ts +61 -0
- package/dist/lib/search/search-bundle.d.ts.map +1 -0
- package/dist/lib/search/search-executor.d.ts +58 -0
- package/dist/lib/search/search-executor.d.ts.map +1 -0
- package/dist/lib/search/search-planner.d.ts +57 -0
- package/dist/lib/search/search-planner.d.ts.map +1 -0
- package/dist/lib/search/search-sql-builder.d.ts +86 -0
- package/dist/lib/search/search-sql-builder.d.ts.map +1 -0
- package/dist/lib/search/types.d.ts +219 -0
- package/dist/lib/search/types.d.ts.map +1 -0
- package/dist/lib/search/where-builder.d.ts +64 -0
- package/dist/lib/search/where-builder.d.ts.map +1 -0
- package/dist/lib/startup/fhir-system.d.ts +82 -0
- package/dist/lib/startup/fhir-system.d.ts.map +1 -0
- package/dist/lib/store/conditional-service.d.ts +76 -0
- package/dist/lib/store/conditional-service.d.ts.map +1 -0
- package/dist/lib/store/fhir-persistence.d.ts +81 -0
- package/dist/lib/store/fhir-persistence.d.ts.map +1 -0
- package/dist/lib/store/fhir-store.d.ts +44 -0
- package/dist/lib/store/fhir-store.d.ts.map +1 -0
- package/dist/lib/terminology/terminology-code-repo.d.ts +61 -0
- package/dist/lib/terminology/terminology-code-repo.d.ts.map +1 -0
- package/dist/lib/terminology/valueset-repo.d.ts +76 -0
- package/dist/lib/terminology/valueset-repo.d.ts.map +1 -0
- package/dist/lib/transaction/bundle-processor.d.ts +84 -0
- package/dist/lib/transaction/bundle-processor.d.ts.map +1 -0
- package/dist/lib/transaction/urn-resolver.d.ts +62 -0
- package/dist/lib/transaction/urn-resolver.d.ts.map +1 -0
- package/dist/tsdoc-metadata.json +11 -0
- package/package.json +87 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-indexer.d.ts","sourceRoot":"","sources":["../../../src/repo/reference-indexer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/C;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAMD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,mBAAmB,EAAE,GAC3B,YAAY,EAAE,CAuBhB;AAkGD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,mBAAmB,EAAE,GAC3B,cAAc,EAAE,CAgClB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Row Builder
|
|
3
|
+
*
|
|
4
|
+
* Converts a FHIR resource into a database row for the main table
|
|
5
|
+
* and history table. Handles fixed columns and (future) search columns.
|
|
6
|
+
*
|
|
7
|
+
* Phase 9 MVP: populates fixed columns + content JSON only.
|
|
8
|
+
* Search column population will be added incrementally.
|
|
9
|
+
*
|
|
10
|
+
* @module fhir-persistence/repo
|
|
11
|
+
*/
|
|
12
|
+
import type { PersistedResource, ResourceRow, HistoryRow, OperationContext } from "./types.js";
|
|
13
|
+
import type { SearchParameterImpl } from "../registry/search-parameter-registry.js";
|
|
14
|
+
/**
|
|
15
|
+
* Build a main table row from a persisted FHIR resource.
|
|
16
|
+
*
|
|
17
|
+
* Populates:
|
|
18
|
+
* - Fixed columns: `id`, `content`, `lastUpdated`, `deleted`, `__version`
|
|
19
|
+
* - Meta columns: `_source`, `_profile`
|
|
20
|
+
* - (Future) Search columns via SearchParameterRegistry + FHIRPath
|
|
21
|
+
*
|
|
22
|
+
* @param resource - The persisted resource (must have `id` and `meta`).
|
|
23
|
+
* @returns A `ResourceRow` ready for SQL insertion.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildResourceRow(resource: PersistedResource, context?: OperationContext): ResourceRow;
|
|
26
|
+
/**
|
|
27
|
+
* Build a main table row with search column values populated.
|
|
28
|
+
*
|
|
29
|
+
* Extends `buildResourceRow()` by extracting search parameter values
|
|
30
|
+
* from the resource JSON and merging them into the row.
|
|
31
|
+
*
|
|
32
|
+
* @param resource - The persisted resource.
|
|
33
|
+
* @param searchImpls - SearchParameterImpl list for this resource type.
|
|
34
|
+
* @returns A `ResourceRow` with both fixed and search columns.
|
|
35
|
+
*/
|
|
36
|
+
export declare function buildResourceRowWithSearch(resource: PersistedResource, searchImpls: SearchParameterImpl[], context?: OperationContext): ResourceRow;
|
|
37
|
+
/**
|
|
38
|
+
* Build compartments array for a resource.
|
|
39
|
+
*
|
|
40
|
+
* Phase 18: Full compartment extraction.
|
|
41
|
+
* - Patient resources: compartment = [own ID]
|
|
42
|
+
* - Other resources: scan all reference-type search params for Patient references,
|
|
43
|
+
* extract the Patient IDs as compartment members.
|
|
44
|
+
*
|
|
45
|
+
* @param resource - The persisted resource.
|
|
46
|
+
* @param searchImpls - Optional SearchParameterImpl list for reference extraction.
|
|
47
|
+
* @returns Array of compartment UUIDs (Patient IDs).
|
|
48
|
+
*/
|
|
49
|
+
export declare function buildCompartments(resource: PersistedResource, searchImpls?: SearchParameterImpl[]): string[];
|
|
50
|
+
/**
|
|
51
|
+
* Build a main table row for a soft-deleted resource.
|
|
52
|
+
*
|
|
53
|
+
* Sets `deleted=true`, `content=''`, `__version=-1`.
|
|
54
|
+
* All search columns will be null (not populated).
|
|
55
|
+
*
|
|
56
|
+
* @param resourceType - The resource type.
|
|
57
|
+
* @param id - The resource ID.
|
|
58
|
+
* @param lastUpdated - The deletion timestamp.
|
|
59
|
+
* @returns A `ResourceRow` representing the deleted state.
|
|
60
|
+
*/
|
|
61
|
+
export declare function buildDeleteRow(resourceType: string, id: string, lastUpdated: string, context?: OperationContext): ResourceRow;
|
|
62
|
+
/**
|
|
63
|
+
* Build a history table row from a persisted FHIR resource.
|
|
64
|
+
*
|
|
65
|
+
* @param resource - The persisted resource.
|
|
66
|
+
* @returns A `HistoryRow` for the history table.
|
|
67
|
+
*/
|
|
68
|
+
export declare function buildHistoryRow(resource: PersistedResource): HistoryRow;
|
|
69
|
+
/**
|
|
70
|
+
* Build a history table row for a delete event.
|
|
71
|
+
*
|
|
72
|
+
* @param id - The resource ID.
|
|
73
|
+
* @param versionId - The versionId for this delete event.
|
|
74
|
+
* @param lastUpdated - The deletion timestamp.
|
|
75
|
+
* @returns A `HistoryRow` with empty content.
|
|
76
|
+
*/
|
|
77
|
+
export declare function buildDeleteHistoryRow(id: string, versionId: string, lastUpdated: string): HistoryRow;
|
|
78
|
+
//# sourceMappingURL=row-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-builder.d.ts","sourceRoot":"","sources":["../../../src/repo/row-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE/F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAapF;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,WAAW,CAwBrG;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,iBAAiB,EAC3B,WAAW,EAAE,mBAAmB,EAAE,EAClC,OAAO,CAAC,EAAE,gBAAgB,GACzB,WAAW,CAmBb;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,iBAAiB,EAC3B,WAAW,CAAC,EAAE,mBAAmB,EAAE,GAClC,MAAM,EAAE,CA+BV;AA+DD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,EACpB,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACzB,WAAW,CAUb;AAMD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,iBAAiB,GAAG,UAAU,CAOvE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,UAAU,CAOZ"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Row Indexer
|
|
3
|
+
*
|
|
4
|
+
* Extracts search parameter values from FHIR resource JSON and produces
|
|
5
|
+
* column name → value pairs for the main table's search columns.
|
|
6
|
+
*
|
|
7
|
+
* Phase 14: Uses simplified property path extraction (not full FHIRPath).
|
|
8
|
+
* Full FHIRPath evaluation can be added in a future phase.
|
|
9
|
+
*
|
|
10
|
+
* @module fhir-persistence/repo
|
|
11
|
+
*/
|
|
12
|
+
import type { SearchParameterImpl } from "../registry/search-parameter-registry.js";
|
|
13
|
+
import type { LookupTableType } from "../schema/table-schema.js";
|
|
14
|
+
import type { FhirResource } from "./types.js";
|
|
15
|
+
/**
|
|
16
|
+
* Search column values to merge into the main table row.
|
|
17
|
+
*/
|
|
18
|
+
export interface SearchColumnValues {
|
|
19
|
+
[columnName: string]: unknown;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Generate a deterministic UUID-like hash for a token value.
|
|
23
|
+
*
|
|
24
|
+
* Produces a v4-format UUID string from the SHA-256 hash of `system|code`.
|
|
25
|
+
* This matches Medplum's approach of using a deterministic hash for token
|
|
26
|
+
* search columns (UUID[] type).
|
|
27
|
+
*/
|
|
28
|
+
export declare function hashToken(system: string, code: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Extract the property path for a given resource type from a FHIRPath expression.
|
|
31
|
+
*
|
|
32
|
+
* Handles:
|
|
33
|
+
* - Simple: `"Patient.birthDate"` → `["birthDate"]`
|
|
34
|
+
* - Union: `"Patient.name | Practitioner.name"` → `["name"]` (for Patient)
|
|
35
|
+
* - .where(): `"Account.subject.where(resolve() is Patient)"` → `["subject"]`
|
|
36
|
+
* - Nested: `"Observation.value.as(Quantity)"` → `["valueQuantity"]` (special)
|
|
37
|
+
* - Deep: `"Patient.contact.name"` → `["contact", "name"]`
|
|
38
|
+
*
|
|
39
|
+
* @returns Array of path segments, or null if no matching path found.
|
|
40
|
+
*/
|
|
41
|
+
export declare function extractPropertyPath(expression: string, resourceType: string): string[] | null;
|
|
42
|
+
/**
|
|
43
|
+
* Navigate a resource object using a property path and return the value(s).
|
|
44
|
+
*
|
|
45
|
+
* Handles arrays at any level — if a path segment hits an array,
|
|
46
|
+
* the remaining path is applied to each element.
|
|
47
|
+
*
|
|
48
|
+
* @returns Array of extracted values (may be empty).
|
|
49
|
+
*/
|
|
50
|
+
export declare function getNestedValues(obj: unknown, pathSegments: string[]): unknown[];
|
|
51
|
+
/**
|
|
52
|
+
* Build search column values for a FHIR resource.
|
|
53
|
+
*
|
|
54
|
+
* Given a resource and its applicable SearchParameterImpl list,
|
|
55
|
+
* extracts values from the resource JSON and returns a map of
|
|
56
|
+
* column name → value pairs ready for SQL insertion.
|
|
57
|
+
*
|
|
58
|
+
* @param resource - The FHIR resource to index.
|
|
59
|
+
* @param impls - SearchParameterImpl list for this resource type.
|
|
60
|
+
* @returns Column name → value map for search columns.
|
|
61
|
+
*/
|
|
62
|
+
export declare function buildSearchColumns(resource: FhirResource, impls: SearchParameterImpl[]): SearchColumnValues;
|
|
63
|
+
/**
|
|
64
|
+
* Build shared token columns by aggregating token values from
|
|
65
|
+
* `identifier`, `_tag`, and `_security` into unified arrays.
|
|
66
|
+
*
|
|
67
|
+
* Called after buildSearchColumns() and buildMetadataColumns()
|
|
68
|
+
* to merge their token values.
|
|
69
|
+
*/
|
|
70
|
+
export declare function buildSharedTokenColumns(searchCols: SearchColumnValues, metadataCols: SearchColumnValues): SearchColumnValues;
|
|
71
|
+
/**
|
|
72
|
+
* Build metadata search column values from a FHIR resource's `meta` element.
|
|
73
|
+
*
|
|
74
|
+
* Extracts `meta.tag` and `meta.security` into the fixed metadata columns:
|
|
75
|
+
* - `___tag` TEXT[] of "system|code" strings, `___tagSort` TEXT (triple underscore — matches Medplum)
|
|
76
|
+
* - `___security` TEXT[] of "system|code" strings, `___securitySort` TEXT
|
|
77
|
+
*
|
|
78
|
+
* v2 DDL: 2 columns per metadata token (not 3). No UUID hash, no Text column.
|
|
79
|
+
*
|
|
80
|
+
* @param resource - The FHIR resource to extract metadata from.
|
|
81
|
+
* @returns Column name → value map for metadata search columns.
|
|
82
|
+
*/
|
|
83
|
+
export declare function buildMetadataColumns(resource: FhirResource): SearchColumnValues;
|
|
84
|
+
/**
|
|
85
|
+
* A row to be inserted into one of the 4 global lookup tables.
|
|
86
|
+
*/
|
|
87
|
+
export interface LookupTableRow {
|
|
88
|
+
/** Which global table: HumanName, Address, ContactPoint, or Identifier. */
|
|
89
|
+
table: LookupTableType;
|
|
90
|
+
/** Column name → value map for the lookup table row. */
|
|
91
|
+
values: Record<string, unknown>;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Extract rows for global lookup tables from a FHIR resource.
|
|
95
|
+
*
|
|
96
|
+
* Scans the resource for HumanName, Address, ContactPoint, and Identifier
|
|
97
|
+
* values and decomposes them into individual rows matching Medplum's schema:
|
|
98
|
+
*
|
|
99
|
+
* - `HumanName` → { resourceId, name, given, family }
|
|
100
|
+
* - `Address` → { resourceId, address, city, country, postalCode, state, use }
|
|
101
|
+
* - `ContactPoint` → { resourceId, system, value, use }
|
|
102
|
+
* - `Identifier` → { resourceId, system, value }
|
|
103
|
+
*
|
|
104
|
+
* @param resource - The FHIR resource (must have `id`).
|
|
105
|
+
* @param impls - SearchParameterImpl list for this resource type.
|
|
106
|
+
* @returns Array of LookupTableRow to insert into global tables.
|
|
107
|
+
*/
|
|
108
|
+
export declare function buildLookupTableRows(resource: FhirResource & {
|
|
109
|
+
id: string;
|
|
110
|
+
}, impls: SearchParameterImpl[]): LookupTableRow[];
|
|
111
|
+
//# sourceMappingURL=row-indexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-indexer.d.ts","sourceRoot":"","sources":["../../../src/repo/row-indexer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AAMD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAW9D;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,MAAM,EAAE,GAAG,IAAI,CAmCjB;AAMD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,EAAE,CAwBX;AAwID;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,mBAAmB,EAAE,GAC3B,kBAAkB,CAsBpB;AAkHD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,kBAAkB,EAC9B,YAAY,EAAE,kBAAkB,GAC/B,kBAAkB,CAwBpB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,YAAY,GACrB,kBAAkB,CA8CpB;AAMD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,KAAK,EAAE,eAAe,CAAC;IAEvB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,YAAY,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EACvC,KAAK,EAAE,mBAAmB,EAAE,GAC3B,cAAc,EAAE,CAsBlB"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQL Builder
|
|
3
|
+
*
|
|
4
|
+
* Generates parameterized SQL statements for FHIR resource persistence.
|
|
5
|
+
* All queries use `$1, $2, ...` placeholders — no string interpolation
|
|
6
|
+
* of user data (SQL injection safe).
|
|
7
|
+
*
|
|
8
|
+
* Table and column names are double-quoted for safety but are NOT
|
|
9
|
+
* parameterized (they come from the schema, not user input).
|
|
10
|
+
*
|
|
11
|
+
* @module fhir-persistence/repo
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Build an UPSERT statement for the main resource table.
|
|
15
|
+
*
|
|
16
|
+
* Generates:
|
|
17
|
+
* ```sql
|
|
18
|
+
* INSERT INTO "Patient" ("id", "content", ...)
|
|
19
|
+
* VALUES ($1, $2, ...)
|
|
20
|
+
* ON CONFLICT ("id") DO UPDATE SET
|
|
21
|
+
* "content" = EXCLUDED."content", ...
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @param tableName - The table name (e.g., `'Patient'`).
|
|
25
|
+
* @param columns - Column name → value map. Order is preserved.
|
|
26
|
+
* @returns `{ sql, values }` ready for `client.query()`.
|
|
27
|
+
*/
|
|
28
|
+
export declare function buildUpsertSQL(tableName: string, columns: Record<string, unknown>): {
|
|
29
|
+
sql: string;
|
|
30
|
+
values: unknown[];
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Build a plain INSERT statement (no conflict handling).
|
|
34
|
+
*
|
|
35
|
+
* Used for history table writes where each row is unique
|
|
36
|
+
* (keyed by `versionId`).
|
|
37
|
+
*
|
|
38
|
+
* @param tableName - The table name (e.g., `'Patient_History'`).
|
|
39
|
+
* @param columns - Column name → value map.
|
|
40
|
+
* @returns `{ sql, values }` ready for `client.query()`.
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildInsertSQL(tableName: string, columns: Record<string, unknown>): {
|
|
43
|
+
sql: string;
|
|
44
|
+
values: unknown[];
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Build a SELECT statement to read a resource by ID.
|
|
48
|
+
*
|
|
49
|
+
* Returns `content` and `deleted` columns.
|
|
50
|
+
*
|
|
51
|
+
* @param tableName - The table name (e.g., `'Patient'`).
|
|
52
|
+
* @returns `{ sql }` — use with `values: [id]`.
|
|
53
|
+
*/
|
|
54
|
+
export declare function buildSelectByIdSQL(tableName: string): string;
|
|
55
|
+
/**
|
|
56
|
+
* Build a SELECT statement to read history entries for a resource.
|
|
57
|
+
*
|
|
58
|
+
* Returns all history rows ordered by `lastUpdated` descending (newest first).
|
|
59
|
+
*
|
|
60
|
+
* @param tableName - The history table name (e.g., `'Patient_History'`).
|
|
61
|
+
* @returns `{ sql }` — use with `values: [id]`.
|
|
62
|
+
*/
|
|
63
|
+
export declare function buildSelectHistorySQL(tableName: string): string;
|
|
64
|
+
/**
|
|
65
|
+
* Options for building history SQL with filtering and pagination.
|
|
66
|
+
*/
|
|
67
|
+
export interface HistorySQLOptions {
|
|
68
|
+
since?: string;
|
|
69
|
+
count?: number;
|
|
70
|
+
cursor?: string;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Build a SELECT for instance history with optional _since, _count, cursor.
|
|
74
|
+
*
|
|
75
|
+
* Returns `id`, `versionId`, `lastUpdated`, `content` columns.
|
|
76
|
+
*
|
|
77
|
+
* @param tableName - The history table name.
|
|
78
|
+
* @returns `{ sql, values }`.
|
|
79
|
+
*/
|
|
80
|
+
export declare function buildInstanceHistorySQL(tableName: string, resourceId: string, options?: HistorySQLOptions): {
|
|
81
|
+
sql: string;
|
|
82
|
+
values: unknown[];
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Build a SELECT for type-level history (all resources of a type).
|
|
86
|
+
*
|
|
87
|
+
* @param tableName - The history table name.
|
|
88
|
+
* @returns `{ sql, values }`.
|
|
89
|
+
*/
|
|
90
|
+
export declare function buildTypeHistorySQL(tableName: string, options?: HistorySQLOptions): {
|
|
91
|
+
sql: string;
|
|
92
|
+
values: unknown[];
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Build a SELECT statement to read a specific version from the history table.
|
|
96
|
+
*
|
|
97
|
+
* @param tableName - The history table name (e.g., `'Patient_History'`).
|
|
98
|
+
* @returns `{ sql }` — use with `values: [id, versionId]`.
|
|
99
|
+
*/
|
|
100
|
+
export declare function buildSelectVersionSQL(tableName: string): string;
|
|
101
|
+
/**
|
|
102
|
+
* v2: Build an INSERT statement for the main resource table.
|
|
103
|
+
* Uses `?` placeholders (SQLite-compatible).
|
|
104
|
+
*/
|
|
105
|
+
export declare function buildInsertMainSQLv2(tableName: string, columns: Record<string, unknown>): {
|
|
106
|
+
sql: string;
|
|
107
|
+
values: unknown[];
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* v2: Build an UPDATE statement for the main resource table.
|
|
111
|
+
* Uses `?` placeholders. Updates all columns except `id`.
|
|
112
|
+
*/
|
|
113
|
+
export declare function buildUpdateMainSQLv2(tableName: string, columns: Record<string, unknown>): {
|
|
114
|
+
sql: string;
|
|
115
|
+
values: unknown[];
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* v2: Build an INSERT statement for the history table.
|
|
119
|
+
* Uses `?` placeholders. Does NOT include versionSeq (AUTOINCREMENT).
|
|
120
|
+
*/
|
|
121
|
+
export declare function buildInsertHistorySQLv2(tableName: string, columns: Record<string, unknown>): {
|
|
122
|
+
sql: string;
|
|
123
|
+
values: unknown[];
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* v2: SELECT by ID — no projectId, returns versionId + deleted.
|
|
127
|
+
*/
|
|
128
|
+
export declare function buildSelectByIdSQLv2(tableName: string): string;
|
|
129
|
+
/**
|
|
130
|
+
* v2: SELECT a specific version from the history table.
|
|
131
|
+
*/
|
|
132
|
+
export declare function buildSelectVersionSQLv2(tableName: string): string;
|
|
133
|
+
/**
|
|
134
|
+
* v2: DELETE all reference rows for a resource (before re-inserting on update).
|
|
135
|
+
*/
|
|
136
|
+
export declare function buildDeleteReferencesSQLv2(tableName: string): string;
|
|
137
|
+
/**
|
|
138
|
+
* v2: Build a multi-row INSERT for the references table.
|
|
139
|
+
* Each row has 5 columns: resourceId, targetType, targetId, code, referenceRaw.
|
|
140
|
+
*/
|
|
141
|
+
export declare function buildInsertReferencesSQLv2(tableName: string, rowCount: number): string;
|
|
142
|
+
/**
|
|
143
|
+
* v2: Instance history SELECT with optional _since, _count, cursor.
|
|
144
|
+
* Uses `?` placeholders and ORDER BY versionSeq DESC.
|
|
145
|
+
*/
|
|
146
|
+
export declare function buildInstanceHistorySQLv2(tableName: string, resourceId: string, options?: {
|
|
147
|
+
since?: string;
|
|
148
|
+
count?: number;
|
|
149
|
+
cursor?: string;
|
|
150
|
+
}): {
|
|
151
|
+
sql: string;
|
|
152
|
+
values: unknown[];
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* v2: Type-level history SELECT.
|
|
156
|
+
* Uses `?` placeholders and ORDER BY versionSeq DESC.
|
|
157
|
+
*/
|
|
158
|
+
export declare function buildTypeHistorySQLv2(tableName: string, options?: {
|
|
159
|
+
since?: string;
|
|
160
|
+
count?: number;
|
|
161
|
+
cursor?: string;
|
|
162
|
+
}): {
|
|
163
|
+
sql: string;
|
|
164
|
+
values: unknown[];
|
|
165
|
+
};
|
|
166
|
+
//# sourceMappingURL=sql-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-builder.d.ts","sourceRoot":"","sources":["../../../src/repo/sql-builder.ts"],"names":[],"mappings":"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"}
|