Modelo FHIRPath
La struct FHIRPathModelData proporciona metadatos en tiempo de ejecucion que un motor FHIRPath necesita para evaluar correctamente expresiones contra recursos FHIR. Cada paquete de version (r4, r4b, r5) expone su propia instancia singleton a traves de la funcion FHIRPathModel().
El Singleton
Accede a los metadatos del modelo a traves de la funcion a nivel de paquete:
import "github.com/gofhir/models/r4/v2"
model := r4.FHIRPathModel()El *FHIRPathModelData devuelto se inicializa una vez al momento de cargar el paquete y es seguro para uso concurrente. Contiene todos los metadatos de tipos extraidos de las StructureDefinitions de FHIR para esa version.
Mapas de Datos Internos
La struct FHIRPathModelData contiene seis mapas internos, cada uno con un proposito especifico durante la evaluacion de FHIRPath:
| Mapa | Tipo | Proposito |
|---|---|---|
choiceTypePaths | map[string][]string | Mapea las rutas base de elementos polimorficos a sus codigos de tipo permitidos |
path2Type | map[string]string | Mapea cada ruta de elemento a su codigo de tipo FHIR |
path2RefType | map[string][]string | Mapea las rutas de elementos Reference a los tipos de recurso objetivo permitidos |
type2Parent | map[string]string | Mapea los nombres de tipo a su padre en la jerarquia de tipos FHIR |
pathsDefinedElsewhere | map[string]string | Resuelve las rutas de elementos que estan definidas en un tipo diferente |
resources | map[string]bool | Conjunto de todos los nombres de tipos de recurso |
Estos mapas no se exportan directamente. En su lugar, siete metodos de acceso proporcionan una API limpia para consultar los metadatos.
Metodos de Acceso
ChoiceTypes
Devuelve los codigos de tipo permitidos para un elemento polimorfico (choice). La ruta debe usar el nombre base sin el sufijo de tipo.
model := r4.FHIRPathModel()
// Observation.value es un choice type (value[x])
types := model.ChoiceTypes("Observation.value")
// Devuelve: ["Quantity", "CodeableConcept", "string", "boolean", "integer",
// "Range", "Ratio", "SampledData", "time", "dateTime", "Period"]TypeOf
Devuelve el codigo de tipo FHIR para una ruta de elemento dada. Los tipos primitivos usan minusculas ("string", "boolean"), los tipos complejos usan PascalCase ("HumanName", "CodeableConcept").
model := r4.FHIRPathModel()
t := model.TypeOf("Patient.name")
// Devuelve: "HumanName"
t = model.TypeOf("Patient.active")
// Devuelve: "boolean"ReferenceTargets
Devuelve los tipos de recurso objetivo permitidos para una ruta de elemento Reference.
model := r4.FHIRPathModel()
targets := model.ReferenceTargets("Observation.subject")
// Devuelve: ["Device", "Group", "Location", "Patient"]ParentType
Devuelve el nombre del tipo padre inmediato en la jerarquia de tipos FHIR.
model := r4.FHIRPathModel()
parent := model.ParentType("Patient")
// Devuelve: "DomainResource"
parent = model.ParentType("Age")
// Devuelve: "Quantity"IsSubtype
Indica si child es igual o un subtipo de parent recorriendo la jerarquia de tipos.
model := r4.FHIRPathModel()
model.IsSubtype("Patient", "Resource") // true
model.IsSubtype("Patient", "DomainResource") // true
model.IsSubtype("Age", "Quantity") // true
model.IsSubtype("Quantity", "Age") // falseResolvePath
Resuelve rutas de elementos que estan definidas en otro lugar (por ejemplo, backbone elements compartidos entre tipos). Si la ruta no esta definida en otro lugar, devuelve la entrada sin cambios.
model := r4.FHIRPathModel()
resolved := model.ResolvePath("Bundle.entry.resource")
// Puede devolver la ruta canonica si este elemento esta definido en otro tipoIsResource
Indica si un nombre de tipo dado es un tipo de recurso FHIR.
model := r4.FHIRPathModel()
model.IsResource("Patient") // true
model.IsResource("HumanName") // false
model.IsResource("Bundle") // trueIntegracion con gofhir/fhirpath
El caso de uso principal de FHIRPathModelData es proporcionar informacion de tipos a un motor de evaluacion FHIRPath. La biblioteca complementaria gofhir/fhirpath acepta el modelo a traves de la opcion WithModel:
import (
"fmt"
"github.com/gofhir/fhirpath"
"github.com/gofhir/models/r4/v2"
)
// Construir un recurso
patient := r4.NewPatientBuilder().
SetId("example-1").
SetBirthDate("1990-01-15").
Build()
// Evaluar una expresion FHIRPath contra el recurso
result, err := fhirpath.Evaluate(patient, "Patient.birthDate",
fhirpath.WithModel(r4.FHIRPathModel()))
if err != nil {
panic(err)
}
fmt.Println(result) // ["1990-01-15"]El modelo permite al motor FHIRPath:
- Resolver choice types: Cuando una expresion hace referencia a
Observation.value, el motor usaChoiceTypespara saber que campos concretos (valueQuantity,valueString, etc.) verificar. - Validar rutas:
TypeOfconfirma que una ruta comoPatient.nameexiste y devuelveHumanName. - Navegar la jerarquia de tipos:
IsSubtypeyParentTypesoportan los operadoresisyasde FHIRPath. - Verificar objetivos de referencia:
ReferenceTargetsvalida las llamadas.resolve()contra los tipos de objetivo permitidos.