@metriport/fhir-sdk 1.2.7 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +207 -0
- package/dist/__tests__/date-range-performance.test.d.ts +2 -0
- package/dist/__tests__/date-range-performance.test.d.ts.map +1 -0
- package/dist/__tests__/date-range-performance.test.js +218 -0
- package/dist/__tests__/date-range-performance.test.js.map +1 -0
- package/dist/__tests__/date-range-search.test.d.ts +2 -0
- package/dist/__tests__/date-range-search.test.d.ts.map +1 -0
- package/dist/__tests__/date-range-search.test.js +215 -0
- package/dist/__tests__/date-range-search.test.js.map +1 -0
- package/dist/__tests__/fhir-bundle-sdk.test.js +467 -0
- package/dist/__tests__/fhir-bundle-sdk.test.js.map +1 -1
- package/dist/__tests__/reverse-references.test.d.ts +2 -0
- package/dist/__tests__/reverse-references.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-references.test.js +241 -0
- package/dist/__tests__/reverse-references.test.js.map +1 -0
- package/dist/demo-reverse-references.d.ts +7 -0
- package/dist/demo-reverse-references.d.ts.map +1 -0
- package/dist/demo-reverse-references.js +207 -0
- package/dist/demo-reverse-references.js.map +1 -0
- package/dist/fhir-bundle-sdk.d.ts +222 -0
- package/dist/fhir-bundle-sdk.d.ts.map +1 -0
- package/dist/fhir-bundle-sdk.js +527 -0
- package/dist/fhir-bundle-sdk.js.map +1 -0
- package/dist/index.d.ts +2 -242
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -677
- package/dist/index.js.map +1 -1
- package/dist/internal/bundle-operations.d.ts +14 -0
- package/dist/internal/bundle-operations.d.ts.map +1 -0
- package/dist/internal/bundle-operations.js +55 -0
- package/dist/internal/bundle-operations.js.map +1 -0
- package/dist/internal/date-extraction.d.ts +12 -0
- package/dist/internal/date-extraction.d.ts.map +1 -0
- package/dist/internal/date-extraction.js +206 -0
- package/dist/internal/date-extraction.js.map +1 -0
- package/dist/internal/graph-traversal.d.ts +13 -0
- package/dist/internal/graph-traversal.d.ts.map +1 -0
- package/dist/internal/graph-traversal.js +89 -0
- package/dist/internal/graph-traversal.js.map +1 -0
- package/dist/internal/indexing.d.ts +17 -0
- package/dist/internal/indexing.d.ts.map +1 -0
- package/dist/internal/indexing.js +118 -0
- package/dist/internal/indexing.js.map +1 -0
- package/dist/internal/llm-context.d.ts +39 -0
- package/dist/internal/llm-context.d.ts.map +1 -0
- package/dist/internal/llm-context.js +188 -0
- package/dist/internal/llm-context.js.map +1 -0
- package/dist/internal/reference-resolution.d.ts +25 -0
- package/dist/internal/reference-resolution.d.ts.map +1 -0
- package/dist/internal/reference-resolution.js +133 -0
- package/dist/internal/reference-resolution.js.map +1 -0
- package/dist/internal/reference-utils.d.ts +26 -0
- package/dist/internal/reference-utils.d.ts.map +1 -0
- package/dist/internal/reference-utils.js +89 -0
- package/dist/internal/reference-utils.js.map +1 -0
- package/dist/internal/validation.d.ts +16 -0
- package/dist/internal/validation.d.ts.map +1 -0
- package/dist/internal/validation.js +45 -0
- package/dist/internal/validation.js.map +1 -0
- package/dist/types/sdk-types.d.ts +107 -0
- package/dist/types/sdk-types.d.ts.map +1 -0
- package/dist/types/sdk-types.js +17 -0
- package/dist/types/sdk-types.js.map +1 -0
- package/dist/types/smart-resources.d.ts +97 -4
- package/dist/types/smart-resources.d.ts.map +1 -1
- package/dist/types/smart-resources.js +82 -5
- package/dist/types/smart-resources.js.map +1 -1
- package/dist/utils/interval-tree/index.d.ts +87 -0
- package/dist/utils/interval-tree/index.d.ts.map +1 -0
- package/dist/utils/interval-tree/index.js +774 -0
- package/dist/utils/interval-tree/index.js.map +1 -0
- package/dist/utils/interval-tree/shallowequal/arrays.d.ts +3 -0
- package/dist/utils/interval-tree/shallowequal/arrays.d.ts.map +1 -0
- package/dist/utils/interval-tree/shallowequal/arrays.js +25 -0
- package/dist/utils/interval-tree/shallowequal/arrays.js.map +1 -0
- package/dist/utils/interval-tree/shallowequal/index.d.ts +6 -0
- package/dist/utils/interval-tree/shallowequal/index.d.ts.map +1 -0
- package/dist/utils/interval-tree/shallowequal/index.js +28 -0
- package/dist/utils/interval-tree/shallowequal/index.js.map +1 -0
- package/dist/utils/interval-tree/shallowequal/objects.d.ts +3 -0
- package/dist/utils/interval-tree/shallowequal/objects.d.ts.map +1 -0
- package/dist/utils/interval-tree/shallowequal/objects.js +28 -0
- package/dist/utils/interval-tree/shallowequal/objects.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
4
|
+
const index_1 = require("../index");
|
|
5
|
+
const fhir_bundles_1 = require("./fixtures/fhir-bundles");
|
|
6
|
+
describe("Reverse References", () => {
|
|
7
|
+
describe("getResourcesReferencingId - basic functionality", () => {
|
|
8
|
+
it("should return all resources that reference a given resource ID", async () => {
|
|
9
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
10
|
+
// patient-123 is referenced by:
|
|
11
|
+
// - encounter-789 (subject)
|
|
12
|
+
// - observation-001 (subject)
|
|
13
|
+
// - diagnostic-report-002 (subject)
|
|
14
|
+
const referencingResources = sdk.getResourcesReferencingId("patient-123");
|
|
15
|
+
expect(referencingResources).toHaveLength(3);
|
|
16
|
+
const resourceTypes = referencingResources.map(r => r.resourceType).sort();
|
|
17
|
+
expect(resourceTypes).toEqual(["DiagnosticReport", "Encounter", "Observation"]);
|
|
18
|
+
});
|
|
19
|
+
it("should return empty array when no resources reference the given ID", async () => {
|
|
20
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
21
|
+
const referencingResources = sdk.getResourcesReferencingId("nonexistent-id");
|
|
22
|
+
expect(referencingResources).toEqual([]);
|
|
23
|
+
});
|
|
24
|
+
it("should handle resources referenced by multiple other resources", async () => {
|
|
25
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
26
|
+
// encounter-789 is referenced by:
|
|
27
|
+
// - observation-001 (encounter)
|
|
28
|
+
// - diagnostic-report-002 (encounter)
|
|
29
|
+
const referencingResources = sdk.getResourcesReferencingId("encounter-789");
|
|
30
|
+
expect(referencingResources).toHaveLength(2);
|
|
31
|
+
expect(referencingResources.every(r => r.resourceType === "Observation" || r.resourceType === "DiagnosticReport")).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
it("should handle resources referenced by array fields", async () => {
|
|
34
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
35
|
+
// practitioner-456 is referenced by:
|
|
36
|
+
// - encounter-789 (participant array)
|
|
37
|
+
// - observation-001 (performer array)
|
|
38
|
+
// - diagnostic-report-002 (performer array)
|
|
39
|
+
const referencingResources = sdk.getResourcesReferencingId("practitioner-456");
|
|
40
|
+
expect(referencingResources).toHaveLength(3);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe("getResourcesReferencingId - filtering by resource type", () => {
|
|
44
|
+
it("should filter by source resource type", async () => {
|
|
45
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
46
|
+
// Get only Observations that reference patient-123
|
|
47
|
+
const observations = sdk.getResourcesReferencingId("patient-123", {
|
|
48
|
+
resourceType: "Observation",
|
|
49
|
+
});
|
|
50
|
+
expect(observations).toHaveLength(1);
|
|
51
|
+
expect(observations[0]?.resourceType).toBe("Observation");
|
|
52
|
+
expect(observations[0]?.id).toBe("observation-001");
|
|
53
|
+
});
|
|
54
|
+
it("should return empty array when filtering by type with no matches", async () => {
|
|
55
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
56
|
+
// No Practitioners reference patient-123
|
|
57
|
+
const practitioners = sdk.getResourcesReferencingId("patient-123", {
|
|
58
|
+
resourceType: "Practitioner",
|
|
59
|
+
});
|
|
60
|
+
expect(practitioners).toEqual([]);
|
|
61
|
+
});
|
|
62
|
+
it("should handle multiple resources of same type referencing target", async () => {
|
|
63
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.mixedResourceTypesBundle);
|
|
64
|
+
// patient-mix-1 is referenced by observation-mix-1 and observation-mix-2
|
|
65
|
+
const observations = sdk.getResourcesReferencingId("patient-mix-1", {
|
|
66
|
+
resourceType: "Observation",
|
|
67
|
+
});
|
|
68
|
+
expect(observations).toHaveLength(2);
|
|
69
|
+
expect(observations.every(o => o.resourceType === "Observation")).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe("getResourcesReferencingId - filtering by reference field", () => {
|
|
73
|
+
it("should filter by specific reference field", async () => {
|
|
74
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
75
|
+
// Get only resources that reference patient-123 via "subject" field
|
|
76
|
+
const subjectReferences = sdk.getResourcesReferencingId("patient-123", {
|
|
77
|
+
referenceField: "subject",
|
|
78
|
+
});
|
|
79
|
+
expect(subjectReferences).toHaveLength(3);
|
|
80
|
+
expect(subjectReferences.every(r => {
|
|
81
|
+
const resource = r;
|
|
82
|
+
return resource.subject?.reference?.includes("patient-123");
|
|
83
|
+
})).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
it("should filter by nested reference field", async () => {
|
|
86
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
87
|
+
// Get only resources that reference practitioner-456 via "performer" field
|
|
88
|
+
const performerReferences = sdk.getResourcesReferencingId("practitioner-456", {
|
|
89
|
+
referenceField: "performer",
|
|
90
|
+
});
|
|
91
|
+
expect(performerReferences.length).toBeGreaterThan(0);
|
|
92
|
+
});
|
|
93
|
+
it("should return empty array when field does not match", async () => {
|
|
94
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
95
|
+
// No resources reference patient-123 via "performer" field
|
|
96
|
+
const performerReferences = sdk.getResourcesReferencingId("patient-123", {
|
|
97
|
+
referenceField: "performer",
|
|
98
|
+
});
|
|
99
|
+
expect(performerReferences).toEqual([]);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe("getResourcesReferencingId - combined filters", () => {
|
|
103
|
+
it("should apply both resourceType and referenceField filters", async () => {
|
|
104
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
105
|
+
// Get only Observations that reference patient-123 via "subject"
|
|
106
|
+
const observations = sdk.getResourcesReferencingId("patient-123", {
|
|
107
|
+
resourceType: "Observation",
|
|
108
|
+
referenceField: "subject",
|
|
109
|
+
});
|
|
110
|
+
expect(observations).toHaveLength(1);
|
|
111
|
+
expect(observations[0]?.resourceType).toBe("Observation");
|
|
112
|
+
expect(observations[0]?.id).toBe("observation-001");
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe("Smart resource getReferencingResources method", () => {
|
|
116
|
+
it("should expose getReferencingResources on smart resources", async () => {
|
|
117
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
118
|
+
const patient = sdk.getPatientById("patient-123");
|
|
119
|
+
expect(patient).toBeDefined();
|
|
120
|
+
expect(typeof patient.getReferencingResources).toBe("function");
|
|
121
|
+
});
|
|
122
|
+
it("should return all resources referencing the smart resource", async () => {
|
|
123
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
124
|
+
const patient = sdk.getPatientById("patient-123");
|
|
125
|
+
const referencingResources = patient.getReferencingResources();
|
|
126
|
+
expect(referencingResources).toHaveLength(3);
|
|
127
|
+
const resourceTypes = referencingResources.map((r) => r.resourceType).sort();
|
|
128
|
+
expect(resourceTypes).toEqual(["DiagnosticReport", "Encounter", "Observation"]);
|
|
129
|
+
});
|
|
130
|
+
it("should support filtering options on smart resource method", async () => {
|
|
131
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
132
|
+
const patient = sdk.getPatientById("patient-123");
|
|
133
|
+
const observations = patient.getReferencingResources({
|
|
134
|
+
resourceType: "Observation",
|
|
135
|
+
});
|
|
136
|
+
expect(observations).toHaveLength(1);
|
|
137
|
+
expect(observations[0].resourceType).toBe("Observation");
|
|
138
|
+
});
|
|
139
|
+
it("should support referenceField filtering on smart resource method", async () => {
|
|
140
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
141
|
+
const patient = sdk.getPatientById("patient-123");
|
|
142
|
+
const subjectReferences = patient.getReferencingResources({
|
|
143
|
+
referenceField: "subject",
|
|
144
|
+
});
|
|
145
|
+
expect(subjectReferences).toHaveLength(3);
|
|
146
|
+
});
|
|
147
|
+
it("should return empty array when smart resource is not referenced", async () => {
|
|
148
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
149
|
+
const practitioner = sdk.getPractitionerById("practitioner-456");
|
|
150
|
+
// Check if the method exists and returns an array
|
|
151
|
+
const pracReferences = practitioner.getReferencingResources();
|
|
152
|
+
expect(Array.isArray(pracReferences)).toBe(true);
|
|
153
|
+
});
|
|
154
|
+
it("should work with resources that have no ID", async () => {
|
|
155
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
156
|
+
const observation = sdk.getObservationById("observation-001");
|
|
157
|
+
const referencingResources = observation.getReferencingResources();
|
|
158
|
+
// observation-001 is referenced by diagnostic-report-002 in the "result" field
|
|
159
|
+
expect(referencingResources).toHaveLength(1);
|
|
160
|
+
expect(referencingResources[0].resourceType).toBe("DiagnosticReport");
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
describe("Edge cases", () => {
|
|
164
|
+
it("should handle bundle with no references", async () => {
|
|
165
|
+
const bundle = {
|
|
166
|
+
resourceType: "Bundle",
|
|
167
|
+
type: "collection",
|
|
168
|
+
entry: [
|
|
169
|
+
{
|
|
170
|
+
resource: {
|
|
171
|
+
resourceType: "Patient",
|
|
172
|
+
id: "patient-solo",
|
|
173
|
+
name: [{ family: "Solo" }],
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
],
|
|
177
|
+
};
|
|
178
|
+
const sdk = await index_1.FhirBundleSdk.create(bundle);
|
|
179
|
+
const referencingResources = sdk.getResourcesReferencingId("patient-solo");
|
|
180
|
+
expect(referencingResources).toEqual([]);
|
|
181
|
+
});
|
|
182
|
+
it("should handle resources with fullUrl references", async () => {
|
|
183
|
+
const bundle = {
|
|
184
|
+
resourceType: "Bundle",
|
|
185
|
+
type: "collection",
|
|
186
|
+
entry: [
|
|
187
|
+
{
|
|
188
|
+
fullUrl: "urn:uuid:patient-fullurl-test",
|
|
189
|
+
resource: {
|
|
190
|
+
resourceType: "Patient",
|
|
191
|
+
id: "patient-fullurl-test",
|
|
192
|
+
name: [{ family: "FullUrl" }],
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
resource: {
|
|
197
|
+
resourceType: "Observation",
|
|
198
|
+
id: "observation-fullurl-test",
|
|
199
|
+
status: "final",
|
|
200
|
+
code: { text: "Test" },
|
|
201
|
+
subject: {
|
|
202
|
+
reference: "urn:uuid:patient-fullurl-test",
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
],
|
|
207
|
+
};
|
|
208
|
+
const sdk = await index_1.FhirBundleSdk.create(bundle);
|
|
209
|
+
// Should work with resource ID
|
|
210
|
+
const referencingById = sdk.getResourcesReferencingId("patient-fullurl-test");
|
|
211
|
+
expect(referencingById).toHaveLength(1);
|
|
212
|
+
// Should also work with fullUrl
|
|
213
|
+
const referencingByFullUrl = sdk.getResourcesReferencingId("urn:uuid:patient-fullurl-test");
|
|
214
|
+
expect(referencingByFullUrl).toHaveLength(1);
|
|
215
|
+
});
|
|
216
|
+
it("should return smart resources from reverse lookup", async () => {
|
|
217
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
218
|
+
const referencingResources = sdk.getResourcesReferencingId("patient-123");
|
|
219
|
+
// Check that returned resources are smart resources
|
|
220
|
+
expect(referencingResources.length).toBeGreaterThan(0);
|
|
221
|
+
expect(referencingResources[0].__isSmartResource).toBe(true);
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
describe("Performance", () => {
|
|
225
|
+
it("should perform reverse lookup in constant time", async () => {
|
|
226
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
227
|
+
const iterations = 100;
|
|
228
|
+
const times = [];
|
|
229
|
+
for (let i = 0; i < iterations; i++) {
|
|
230
|
+
const start = performance.now();
|
|
231
|
+
sdk.getResourcesReferencingId("patient-123");
|
|
232
|
+
const end = performance.now();
|
|
233
|
+
times.push(end - start);
|
|
234
|
+
}
|
|
235
|
+
const avgTime = times.reduce((a, b) => a + b) / times.length;
|
|
236
|
+
// Should be extremely fast (under 1ms on average)
|
|
237
|
+
expect(avgTime).toBeLessThan(1);
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
//# sourceMappingURL=reverse-references.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reverse-references.test.js","sourceRoot":"","sources":["../../src/__tests__/reverse-references.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo-reverse-references.d.ts","sourceRoot":"","sources":["../src/demo-reverse-references.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Demo script showcasing reverse reference functionality in FHIR SDK
|
|
4
|
+
*
|
|
5
|
+
* Run with: npx ts-node src/demo-reverse-references.ts
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
const index_1 = require("./index");
|
|
9
|
+
const fhir_bundles_1 = require("./__tests__/fixtures/fhir-bundles");
|
|
10
|
+
async function demonstrateReverseReferences() {
|
|
11
|
+
console.log("=".repeat(80));
|
|
12
|
+
console.log("FHIR SDK - Reverse Reference Lookup Demo");
|
|
13
|
+
console.log("=".repeat(80));
|
|
14
|
+
console.log();
|
|
15
|
+
// Create SDK instance with sample bundle
|
|
16
|
+
const sdk = await index_1.FhirBundleSdk.create(fhir_bundles_1.validCompleteBundle);
|
|
17
|
+
console.log(`📦 Loaded bundle with ${sdk.total} resources`);
|
|
18
|
+
console.log();
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// DEMO 1: Find all resources that reference a patient
|
|
21
|
+
// ============================================================================
|
|
22
|
+
console.log("─".repeat(80));
|
|
23
|
+
console.log("DEMO 1: Find all resources that reference a specific patient");
|
|
24
|
+
console.log("─".repeat(80));
|
|
25
|
+
const patientId = "patient-123";
|
|
26
|
+
console.log(`\n🔍 Finding all resources that reference Patient/${patientId}...\n`);
|
|
27
|
+
const referencingPatient = sdk.getResourcesReferencingId(patientId);
|
|
28
|
+
console.log(`Found ${referencingPatient.length} resources:\n`);
|
|
29
|
+
for (const resource of referencingPatient) {
|
|
30
|
+
console.log(` ✓ ${resource.resourceType}/${resource.id}`);
|
|
31
|
+
}
|
|
32
|
+
console.log();
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// DEMO 2: Filter by resource type
|
|
35
|
+
// ============================================================================
|
|
36
|
+
console.log("─".repeat(80));
|
|
37
|
+
console.log("DEMO 2: Filter reverse references by resource type");
|
|
38
|
+
console.log("─".repeat(80));
|
|
39
|
+
console.log(`\n🔍 Finding only Observations that reference Patient/${patientId}...\n`);
|
|
40
|
+
const observations = sdk.getResourcesReferencingId(patientId, {
|
|
41
|
+
resourceType: "Observation",
|
|
42
|
+
});
|
|
43
|
+
console.log(`Found ${observations.length} Observation(s):\n`);
|
|
44
|
+
for (const obs of observations) {
|
|
45
|
+
const obsData = obs;
|
|
46
|
+
console.log(` ✓ Observation/${obs.id}`);
|
|
47
|
+
console.log(` Code: ${obsData.code?.text || "N/A"}`);
|
|
48
|
+
console.log(
|
|
49
|
+
` Value: ${obsData.valueQuantity?.value || "N/A"} ${obsData.valueQuantity?.unit || ""}`
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
console.log();
|
|
53
|
+
// ============================================================================
|
|
54
|
+
// DEMO 3: Filter by reference field
|
|
55
|
+
// ============================================================================
|
|
56
|
+
console.log("─".repeat(80));
|
|
57
|
+
console.log("DEMO 3: Filter reverse references by field name");
|
|
58
|
+
console.log("─".repeat(80));
|
|
59
|
+
console.log(
|
|
60
|
+
`\n🔍 Finding resources that reference Patient/${patientId} via 'subject' field...\n`
|
|
61
|
+
);
|
|
62
|
+
const subjectReferences = sdk.getResourcesReferencingId(patientId, {
|
|
63
|
+
referenceField: "subject",
|
|
64
|
+
});
|
|
65
|
+
console.log(`Found ${subjectReferences.length} resource(s) with 'subject' reference:\n`);
|
|
66
|
+
for (const resource of subjectReferences) {
|
|
67
|
+
console.log(` ✓ ${resource.resourceType}/${resource.id}`);
|
|
68
|
+
}
|
|
69
|
+
console.log();
|
|
70
|
+
// ============================================================================
|
|
71
|
+
// DEMO 4: Combined filters
|
|
72
|
+
// ============================================================================
|
|
73
|
+
console.log("─".repeat(80));
|
|
74
|
+
console.log("DEMO 4: Combine resource type and field filters");
|
|
75
|
+
console.log("─".repeat(80));
|
|
76
|
+
const practitionerId = "practitioner-456";
|
|
77
|
+
console.log(
|
|
78
|
+
`\n🔍 Finding Observations that reference Practitioner/${practitionerId} via 'performer'...\n`
|
|
79
|
+
);
|
|
80
|
+
const performerObs = sdk.getResourcesReferencingId(practitionerId, {
|
|
81
|
+
resourceType: "Observation",
|
|
82
|
+
referenceField: "performer",
|
|
83
|
+
});
|
|
84
|
+
console.log(`Found ${performerObs.length} Observation(s):\n`);
|
|
85
|
+
for (const obs of performerObs) {
|
|
86
|
+
console.log(` ✓ Observation/${obs.id}`);
|
|
87
|
+
console.log(` Performed by: Practitioner/${practitionerId}`);
|
|
88
|
+
}
|
|
89
|
+
console.log();
|
|
90
|
+
// ============================================================================
|
|
91
|
+
// DEMO 5: Smart resource method
|
|
92
|
+
// ============================================================================
|
|
93
|
+
console.log("─".repeat(80));
|
|
94
|
+
console.log("DEMO 5: Using smart resource getReferencingResources() method");
|
|
95
|
+
console.log("─".repeat(80));
|
|
96
|
+
const patient = sdk.getPatientById(patientId);
|
|
97
|
+
if (patient) {
|
|
98
|
+
console.log(`\n👤 Patient: ${patient.name?.[0]?.family}, ${patient.name?.[0]?.given?.[0]}`);
|
|
99
|
+
console.log(` Gender: ${patient.gender}`);
|
|
100
|
+
console.log(` Birth Date: ${patient.birthDate}\n`);
|
|
101
|
+
// Use the smart resource method
|
|
102
|
+
const referencingResources = patient.getReferencingResources();
|
|
103
|
+
console.log(`📊 This patient is referenced by ${referencingResources.length} resources:\n`);
|
|
104
|
+
// Group by resource type
|
|
105
|
+
const byType = referencingResources.reduce((acc, r) => {
|
|
106
|
+
acc[r.resourceType] = (acc[r.resourceType] || 0) + 1;
|
|
107
|
+
return acc;
|
|
108
|
+
}, {});
|
|
109
|
+
for (const [type, count] of Object.entries(byType)) {
|
|
110
|
+
console.log(` • ${type}: ${count}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
console.log();
|
|
114
|
+
// ============================================================================
|
|
115
|
+
// DEMO 6: Discover related encounters
|
|
116
|
+
// ============================================================================
|
|
117
|
+
console.log("─".repeat(80));
|
|
118
|
+
console.log("DEMO 6: Discover what happened during an encounter");
|
|
119
|
+
console.log("─".repeat(80));
|
|
120
|
+
const encounterId = "encounter-789";
|
|
121
|
+
console.log(`\n🏥 Finding all clinical activities during Encounter/${encounterId}...\n`);
|
|
122
|
+
const encounterReferences = sdk.getResourcesReferencingId(encounterId, {
|
|
123
|
+
referenceField: "encounter",
|
|
124
|
+
});
|
|
125
|
+
console.log(`Found ${encounterReferences.length} clinical record(s) from this encounter:\n`);
|
|
126
|
+
for (const resource of encounterReferences) {
|
|
127
|
+
const data = resource;
|
|
128
|
+
console.log(` 📋 ${resource.resourceType}/${resource.id}`);
|
|
129
|
+
if (resource.resourceType === "Observation") {
|
|
130
|
+
console.log(` Type: ${data.code?.text || "N/A"}`);
|
|
131
|
+
console.log(` Status: ${data.status}`);
|
|
132
|
+
} else if (resource.resourceType === "DiagnosticReport") {
|
|
133
|
+
console.log(` Type: ${data.code?.text || "N/A"}`);
|
|
134
|
+
console.log(` Status: ${data.status}`);
|
|
135
|
+
console.log(` Results: ${data.result?.length || 0} observation(s)`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
console.log();
|
|
139
|
+
// ============================================================================
|
|
140
|
+
// DEMO 7: Performance comparison
|
|
141
|
+
// ============================================================================
|
|
142
|
+
console.log("─".repeat(80));
|
|
143
|
+
console.log("DEMO 7: Performance - O(1) reverse lookup");
|
|
144
|
+
console.log("─".repeat(80));
|
|
145
|
+
console.log("\n⚡ Running 1000 reverse reference lookups...\n");
|
|
146
|
+
const iterations = 1000;
|
|
147
|
+
const startTime = performance.now();
|
|
148
|
+
for (let i = 0; i < iterations; i++) {
|
|
149
|
+
sdk.getResourcesReferencingId(patientId);
|
|
150
|
+
}
|
|
151
|
+
const endTime = performance.now();
|
|
152
|
+
const avgTime = (endTime - startTime) / iterations;
|
|
153
|
+
console.log(` Total time: ${(endTime - startTime).toFixed(2)}ms`);
|
|
154
|
+
console.log(` Average per lookup: ${avgTime.toFixed(4)}ms`);
|
|
155
|
+
console.log(
|
|
156
|
+
` Performance: ${
|
|
157
|
+
avgTime < 0.1
|
|
158
|
+
? "✅ Excellent (< 0.1ms)"
|
|
159
|
+
: avgTime < 1
|
|
160
|
+
? "✅ Good (< 1ms)"
|
|
161
|
+
: "⚠️ Could be better"
|
|
162
|
+
}`
|
|
163
|
+
);
|
|
164
|
+
console.log();
|
|
165
|
+
// ============================================================================
|
|
166
|
+
// DEMO 8: Bi-directional reference navigation
|
|
167
|
+
// ============================================================================
|
|
168
|
+
console.log("─".repeat(80));
|
|
169
|
+
console.log("DEMO 8: Bi-directional reference navigation");
|
|
170
|
+
console.log("─".repeat(80));
|
|
171
|
+
console.log("\n🔄 Demonstrating forward and reverse reference navigation...\n");
|
|
172
|
+
const observation = sdk.getObservationById("observation-001");
|
|
173
|
+
if (observation) {
|
|
174
|
+
console.log(`Starting from: Observation/${observation.id}`);
|
|
175
|
+
console.log();
|
|
176
|
+
// Forward reference: Get the patient
|
|
177
|
+
console.log("➡️ Forward: observation.getSubject()");
|
|
178
|
+
const subject = observation.getSubject();
|
|
179
|
+
if (subject) {
|
|
180
|
+
console.log(` Found: ${subject.resourceType}/${subject.id}`);
|
|
181
|
+
console.log();
|
|
182
|
+
// Reverse reference: Get all resources referencing this patient
|
|
183
|
+
console.log("⬅️ Reverse: patient.getReferencingResources()");
|
|
184
|
+
const backReferences = subject.getReferencingResources();
|
|
185
|
+
console.log(` Found ${backReferences.length} resources referencing this patient:`);
|
|
186
|
+
for (const ref of backReferences) {
|
|
187
|
+
console.log(` • ${ref.resourceType}/${ref.id}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
console.log();
|
|
192
|
+
// ============================================================================
|
|
193
|
+
console.log("=".repeat(80));
|
|
194
|
+
console.log("✨ Demo complete! All reverse reference features showcased.");
|
|
195
|
+
console.log("=".repeat(80));
|
|
196
|
+
}
|
|
197
|
+
// Run the demo
|
|
198
|
+
demonstrateReverseReferences()
|
|
199
|
+
.then(() => {
|
|
200
|
+
console.log("\n✅ Demo completed successfully\n");
|
|
201
|
+
process.exit(0);
|
|
202
|
+
})
|
|
203
|
+
.catch(error => {
|
|
204
|
+
console.error("\n❌ Demo failed:", error);
|
|
205
|
+
process.exit(1);
|
|
206
|
+
});
|
|
207
|
+
//# sourceMappingURL=demo-reverse-references.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo-reverse-references.js","sourceRoot":"","sources":["../src/demo-reverse-references.ts"],"names":[],"mappings":"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"}
|