Advanced .net api (ewout)
-
Upload
devdays -
Category
Healthcare
-
view
175 -
download
1
Transcript of Advanced .net api (ewout)
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
Advanced.NET API
Ewout KramerFHIR Developer DaysNovember 17, 2016
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
2
Who am I?
Name: Ewout Kramer Company: Furore Background:
Computer Science (operating systems) In Health IT since 1999 FHIR Core team Lead dev on the .NET API
[email protected], @ewoutkramer http://thefhirplace.com
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
BEYOND THE POCO
3
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
4
Why?
No need to parse whole POCO’s in memory Generic clients/servers not needing pre-
compiled model classes Tools that can parse (partly) invalid FHIR
data Accessing DSTU2 and STU3 data
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
5
“Logical” structure of FHIR data
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
6
IElementNavigator
Represents a position in a tree of FHIR data Has all the aspects of a node (from last slide) Path: Patient.name[1].family[0]
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
7
INavigator<T>
GetChildrenByName(this IElementNavigator navigator, string name)
IEnumerable<object> Values(this IElementNavigator navigator)
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
8
Caveat
We are showing you work in progress Interfaces may change Will be implemented for DSTU2 and STU3 Currently prackaged as part of the
FluentPath .NET Core library (HL7.FluentPath)
Use the latest 0.4.x (alpha) releases Only available implementation is the PocoNavigator
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
GETTING TO METADATA
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
Conformance Resources
Provide “metadata” about Model Definitions (StructureDefinition) Operations (OperationDefinition) Search parameters (SearchParameter) List of codes (ValueSet)
Identified by a “canonical url” that SHOULD resolve, e.g. “http://hl7.org/fhir/StructureDefinition/Patient”
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
11
Resolution
Directly using a FHIR REST call to the url More likely:
As part of a “snapshot”/zip of files delivered with your app
Compiled into your app In a database
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
12
IResourceResolver
Concrete implementations in API: DirectorySource, ZipSource WebSource CachedResolver (wraps another resolver) MultiResolver (tries a list of resolvers)
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
13
Combine at will
MyDbResolver ZipSource WebResolver
MultiResolver
CachedResolverMultiResolver
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
14
Practicalities
Packaged in Hl7.Fhir.Specification assembly Namespace Hl7.Fhir.Specification.Source Includes useful extension methods like:
FindStructureDefinition(this IResourceResolver resolver, string uri, bool requireSnapshot = false)
FindStructureDefinitionForCoreType(this IResourceResolver resolver, FHIRDefinedType type)
FindExtensionDefinition(this IResourceResolver resolver, string uri, bool requireSnapshot = false)
Data for base spec is in “specification.zip”, easy to get to using ZipSource.CreateValidationSource()
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
TERMINOLOGY
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
FHIR Resources
CodingSystem resource (STU3) A dictionary of concepts (possibly huge!)
ValueSet (DSTU2, STU3) A (use-case specific) selection of concepts from
1..* CodingSystems May be directly enumerated (‘extensional’) May be composed using filters (‘intensional’)
“all the LOINC codes in LOINC Part Concept Cholesterol | Bld-Ser-Plas (LP43571-6), except for 5932-9 Cholesterol [Presence] in Blood by Test strip”
May be composed from other ValueSets
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
17
Main functionality
Expand an intensional ValueSet Determine whether some code is member of
a ValueSet Do a code-lookup
Find details like alternative designation
Could be done “in-memory” (i.e. using an expanded ValueSet)
By calling the FHIR terminology operations
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
18
In-memory
Expand using the ValueSetExpander class in Hl7.Fhir.Specification.Terminology
Set limits on expansion size Uses IResourceResolver to locate
ValueSets Current limitations:
No filters No imports of whole CodeSystems
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
19
Working with the expansion Useful extension methods on ValueSet
HasExpansion() ExpansionSize() FindInExpansion(String code, string system) bool CodeInExpansion(String code, string system)
Note: no automatic expansion, use ValueSetExpander
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
20
Terminology operations
https://www.hl7.org/FHIR/valueset-operations.html
$expand, $lookup, $validate-code
class FhirClient ExpandValueSet() ConceptLookup() ValidateCode()
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
21
ITerminologyService
Currently available: LocalTerminologyServer Does an in-memory expand & lookup
Planned: try cache - then the LocalTerminologyServer - then the operations on a “real” terminology server.
Note: returns OperationOutcome
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
FHIRPATH SUPPORT
22
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
FhirPath in .NET
First, the name FhirPath -> FluentPath -> FhirPath
Available as a .NET Core library Hl7.FluentPath on NuGet (0.4.x)
Is built on top of IElementNavigator – so it could work on *any* object model
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
24
Compiling FhirPath
Advantage: Compile once, run many (fast) class FluentPathCompiler public CompiledExpression Compile(string expression)
CompiledExpression is a native Lambda that will run the statement against an IElementNavigator
You can also compile to an Expression tree (for debug/display purposes)
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
25
Using CompiledExpression First, compile the statement
var ce = compiler.Compile(“Patient.name”);
Then: var result = ce(…) result is a set of IElementNavigators
Or: object s = ce.Scalar(…); bool p = ce.Predicate(…); bool b = ce.IsBoolean(true, …);
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
26
Convenience methods
Comparable methods exist on IElementNavigator so you can directly query a source of data
Example: IElementNavigator nav = new PocoNavigator(myPatient); object cnt = nav.Scalar(“Patient.name.count()”); Compiles & caches last 500 expressions for
you
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
27
On POCO’s directly…
The Hl7.Fhir.Core assembly has extension methods in Hl7.Fhir.FluentPath for working directly on FHIR POCO’s
Patient p = …;object cnt = p.Scalar(“Patient.name.count()”);
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
VALIDATION
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
The Big PictureFHIR Data
<Patient></Patient>
IElementNavigator FHIR Definitions
StructureDefinitionOperationDefinitionValueSet
IResource Resolver
FindStructure Definition()
ValueSetExpander
LocalTerminology Server
ITerminologyService
Validator
FluentPathCompiler
FHIR Poco
OperationOutcome(with IssueComponents)
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
30
Practicalities
class Validator in Hl7.Fhir.Validation namespace (Hl7.Fhir.Specification assembly)
Configure: new Validator(settings) Resolver, terminology service to use
Validate: call one of the overloads: Validate(IElementNavigator) Validate(Base) Validate(XmlReader)
Result is an OperationOutcome
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
31
Caveats
Validator is still being developed as we speak
Support most features already, except for slicing – only discriminator-less slicing is supported
Other improvements: e.g. loop-detection
Almost daily updates with more functionality
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
32
OperationOutcome- on steroids Lots of helper methods Properties:
Success (!information,!warning) Fatals, Errors, Warnings properties
Extension methods (in Hl7.Fhir.Support) ErrorsAt(string path) Where(severity, type, …) Set/GetHierachyLevel() Include(outcome), Add(outcome)
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
QUESTIONS?
33
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
HANDS-ON TRACKSuggestions for a pleasurable afternoon
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
IResourceResolver
Try to use the ZipSource with the specification.zip to get some core resource definitions
Write your own IResourceResolver that resolves from a .NET compiled-in resource (not a FHIR resource ;-)
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
36
ITerminologyService
Use your new IResourceResolver to resolve a ValueSet & expand it.
Use ValueSet’s FindInExpansion to verify whether you succeeded
Look at the C# implementation of LocalTerminologyService. Could you make one that calls the FhirClient.ValidateCode() instead?
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
37
Play with the validator Check out https://
github.com/ewoutkramer/Furore.Fhir.ValidationDemo & compile
Try to incorporate your resolver and terminology service (if any)
Try running the examples at https://github.com/ewoutkramer/fhir-net-api/tree/develop/src/Hl7.Fhir.Specification.Tests/TestData/validation
Alter the examples so they trigger your code (change a binding…)
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
HIDDEN GEMS
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
ResourceIdentity
class ResoureIdentity : Uri Builds FHIR RESTful Uri’s Factory methods Build():
.Build(“Patient”, “4E75”, vid: “4”) “/Patient/4E75/_history/4”
StructureDefinition URLs for core types .Core(FHIRDefinedType.HumanName)
“http://hl7.org/fhir/StructureDefinition/HumanName”
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
40
ResourceIdentity (2)
Even more useful: parsing RESTful Urls var ep = “http://server.org/fhir/Patient/4”
var u = new ResourceIdentity(ep);
u.ResourceType “Patient”
u.Id “4”
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
41
Extension Manipulations
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
42
TransactionBuilder
© 2014 HL7 ® International. Licensed under Creative Commons. HL7 & Health Level Seven are registered trademarks of Health Level Seven International. Reg. U.S. TM Office.
43
SnapshotGenerator