fhirviews 0.3.0
Esta versión amplía el motor DuckDB a todo el perfil shareable y la mayor parte de FHIRPath N1, con la misma semántica que fhirpath.js; agrega las operaciones de terminología ($expand, $lookup, $validate-code) y un catálogo de vistas listas para salud pública, y corrige el envío de las operaciones ($) a servidores reales. No hay cambios incompatibles.
Motor DuckDB
- El motor DuckDB (
vista_ejecutar_duckdb(),vista_sql()) traduce muchas más funciones de FHIRPath:union(),combine(),intersect(),exclude(),isDistinct(),subsetOf(),supersetOf(),allTrue(),anyTrue(),allFalse(),anyFalse(),indexOf(),replaceMatches(),split(),toChars(),toBoolean(),convertsToInteger(),convertsToDecimal(),convertsToBoolean(),convertsToString(),abs(),ceiling(),floor(),round(),truncate(),sqrt(),power()(exacta),trace(),is()/as()como funciones ylowBoundary()/highBoundary()de fechas y horas. Pasa 7 de las 11 pruebas experimentales del banco oficial, como el motor V8 (antes 3). - Las funciones que ya traducía siguen ahora la semántica de fhirpath.js en los casos límite que antes daban otro resultado sin aviso: comparaciones de fechas con distinta precisión y zona horaria, igualdad entre valores de distinto tipo (
birthDate = '1970-06-15'es falso), números comparados con 8 decimales (0.1 + 0.2 = 0.3),toInteger()/toDecimal()de textos,substring()fuera de rango,replace()con patrón vacío,trim()con espacios de Unicode,iif()con condiciones no lógicas, el orden de|ytoString()de números. - Sigue el tipo FHIR de cada expresión con el modelo R4 (el mismo de fhirpath.js), lo que permite elegir solo las variantes de cada elemento de elección y comparar fechas, textos y horas según su tipo.
- Lo que no se puede traducir con certeza da un error:
fhirviews_error_sqlal traducir (por ejemplo, expresiones regulares con construcciones que JavaScript y RE2 interpretan distinto, olowBoundary()de decimales) yfhirviews_error_vistaal ejecutar cuando depende de los datos (una fecha sin hora frente a una fecha y hora, textos con caracteres que DuckDB pasa a mayúsculas de otra forma,skip()con un número negativo…). - Nuevo argumento
diferidodevista_ejecutar_duckdb(): condiferido = TRUEdevuelve una tabla de dplyr (dbplyr) sobre la consulta, para filtrar y resumir en DuckDB y traer a R solo el resultado. dplyr y dbplyr se agregan a Suggests. - Una columna sin tipo cuyos valores son todos números enteros llega a R como entero, como en
vista_ejecutar().
Terminologías
- Nuevas funciones para trabajar con un servidor de terminología FHIR (por ejemplo, tx.fhir.org o un Snowstorm), con la misma conexión de
fhir_conectar(), su token o su autenticación SMART on FHIR:-
tx_expandir(): operaciónValueSet/$expandcon paginación (offsetycount) para expansiones grandes; acepta la URL canónica delValueSeto unValueSetpropio (lista, JSON o archivo) y devuelve undata.frameconsystem,code,displayyversion. -
tx_buscar_codigo(): operaciónCodeSystem/$lookup, con el nombre, las designaciones y las propiedades del código. -
tx_validar_codigo(): operaciónValueSet/$validate-codepara un vector de códigos.
-
-
vista_con_valueset()agrega a unViewDefinitionlos códigos de una expansión (como constantes y unwhere, o como columna lógica), de modo que un indicador definido con unValueSetse calcula convista_ejecutar()ovista_ejecutar_duckdb()sin red. La forma de la condición mantiene la expresión corta con miles de códigos. - Nueva sección sobre terminologías en la viñeta Servidores reales y grandes volúmenes.
Catálogo de vistas para salud pública
- Nuevas
vista_catalogo()yvista_plantilla(): una biblioteca deViewDefinitionlistos para usar (JSON estándar de SQL on FHIR eninst/vistas) con las tablas más comunes en vigilancia y salud pública:pacientes(sexo, nacimiento, fallecimiento, cantón y provincia de residencia),signos_vitales(una fila por medición, con la presión sistólica y diastólica separadas),diagnosticos(CIE-10 y SNOMED CT),notificacion_obligatoria(dengue, malaria y tuberculosis por defecto, con la lista de categorías CIE-10 como constante),inmunizaciones,encuentrosymedicamentos. Todas usangetResourceKey()ygetReferenceKey()para unir las tablas, y dan los mismos resultados convista_ejecutar()yvista_ejecutar_duckdb(). -
vista_plantilla()permite cambiar las constantes de una vista con el argumentoconstantes.
Correcciones
- Las operaciones (
$expand,$lookup,$everything,$export…) con parámetros de búsqueda se envían con el$sin codificar. Antes la URL se reconstruía conhttr2::req_url_query()y, según la versión de libcurl, el$viajaba como%24, que servidores como tx.fhir.org rechazan con 404 (Unknown operation).
fhirviews 0.2.0
Esta versión prepara fhirviews para servidores y volúmenes reales: autenticación SMART on FHIR, exportación masiva con $export y un segundo motor de vistas sobre DuckDB, entre 16 y 37 veces más rápido que el motor V8 (un millón de pacientes en unos 5,5 segundos). No hay cambios incompatibles.
Autenticación SMART on FHIR
-
fhir_conectar()tiene un nuevo argumentoautenticacionpara servidores protegidos con SMART on FHIR / OAuth2 (tokensigue funcionando igual):-
fhir_auth_cliente(): client credentials con secreto (HTTP Basic o en el cuerpo, según lo que admita el servidor). -
fhir_auth_backend(): SMART Backend Services, con un JWT firmado (RS384 o ES384) a partir de una clave privada y sukid. Requiere los paquetes jose y openssl. -
fhir_auth_interactiva(): authorization code con PKCE y lanzamiento standalone (aud), con inicio de sesión en el navegador.
-
-
fhir_smart_configuracion()descubre el token endpoint y el authorization endpoint en.well-known/smart-configurationo, como respaldo, en las extensionesoauth-urisdelCapabilityStatement. - El token se pide en la primera petición, se renueva solo al expirar (y una vez más si el servidor lo rechaza con 401), solo se envía al servidor de la conexión y nunca se imprime, igual que el secreto y la clave.
Exportación masiva (FHIR Bulk Data)
-
fhir_exportar()implementa el cliente de FHIR Bulk Data Access: inicia$exporta nivel de sistema, de pacientes o de unGroup(con_type,_sincey_typeFilter), consulta el estado respetandoRetry-Aftery mostrandoX-Progress, y descarga los archivos NDJSON del manifiesto (con el token solo sirequiresAccessTokenlo pide y solo al mismo servidor). Devuelve las rutas por tipo de recurso, listas paravista_ejecutar(). LosOperationOutcomedel manifiesto se descargan y se avisan. -
fhir_exportar_estado()yfhir_exportar_cancelar()para el modo asíncrono (esperar = FALSE).
Motor DuckDB (experimental)
- Segundo motor de vistas:
vista_sql()traduce unViewDefinitiona una consulta SQL de DuckDB yvista_ejecutar_duckdb()la ejecuta directamente sobre archivos NDJSON (también comprimidos o con comodines) o Parquet, sin cargar los recursos en R; contabla, guarda el resultado en una base DuckDB en lugar de traerlo a R. Requiere duckdb 1.3.0 o posterior. - Admite un subconjunto de FHIRPath: navegación, elementos de elección (
value,effective,onset…),where(),exists(),empty(),first(),join(),ofType(),extension(),getResourceKey(),getReferenceKey(), comparaciones, lógica y constantes. Lo que no puede traducir con certeza da un error de clasefhirviews_error_sql, nunca un resultado aproximado. - Pasa las 133 pruebas shareable del banco oficial (
vista_conformidad(motor = "duckdb")) y una prueba diferencial exige que dé las mismas tablas (valores y tipos) quevista_ejecutar()con las vistas de todas las viñetas. - Rendimiento de punta a punta desde NDJSON: 250 000 pacientes en 1,7 s (62 s con el motor V8) y un millón en 5,5 s.
Documentación
- Nueva viñeta Servidores reales y grandes volúmenes: autenticación SMART paso a paso,
$export(con una exportación real contra el servidor de referencia de SMART Health IT) y el motor DuckDB. - README con los nuevos casos de uso, la comparación de rendimiento entre motores y la comparación con pathling y fhircrackr; artículo Cómo funciona por dentro ampliado con las tres piezas nuevas.
Pruebas
- La autenticación se verificó con un servidor SMART local que comprueba la firma de cada JWT con una implementación independiente (Python y PyJWT), incluidos la renovación del token, el reintento tras un 401 y el rechazo de credenciales o claves incorrectas.
- La exportación se verificó contra https://bulk-data.smarthealthit.org.
- El servidor simulado de las pruebas decodifica las URL, que según la versión de R y de curl llegan con
$codificado como%24.
fhirviews 0.1.0
- Primera versión.
Correcciones de la auditoría técnica
-
fhir_buscar()yfhir_everything()dejan de paginar (con un aviso) si el servidor repite un enlacenext, en lugar de entrar en un bucle infinito. -
fhir_crear()envía los Bundletransactionybatcha la base del servidor (POST [base]), que los procesa, en vez de guardarlos como un recurso Bundle. -
vista_validar()rechazacolumn,selectyunionAllvacíos (antesunionAll: []daba un error poco claro) y las constantes con nombres reservados (resource,rowIndex…), que quedaban ocultas. - Las vistas sobre recursos de varios tipos leídos de JSON o NDJSON ya no vuelven a convertirlos a JSON: unas 9 veces más rápidas.
-
typeya no trunca ni convierte enNAen silencio: si un valor no es compatible, se avisa y se conserva. Las columnas sintypey sin valores toman el tipo del modelo de FHIR R4, de modo que la misma vista da siempre los mismos tipos. -
fhir_conectar()avisa si un token viajaría sin cifrar por http. -
fhir_recursos()informa claramente si un archivo no existe y acepta un vector con varias rutas de archivo.
Cliente FHIR
-
fhir_conectar(),fhir_buscar()(paginación automática por los enlacesnext),fhir_leer(),fhir_crear(),fhir_actualizar(),fhir_borrar(),fhir_everything(),fhir_validar(),fhir_capacidades(),fhir_peticion(),fhir_ejecutar_texto()yfhir_disponible(), con httr2. -
application/fhir+json, token bearer (solo se envía al servidor de la conexión), reintentos ante 429/503 y errores legibles a partir delOperationOutcome, con una clase por código HTTP. -
fhir_peticion()devuelve un objetofhir_respuestaque se imprime con el estado y el JSON con sangría, como Postman.
Vistas SQL on FHIR
-
vista_ejecutar()aplica unViewDefinitiona recursos (listas, Bundles, JSON, NDJSON o archivos.ndjson.gz) y devuelve undata.frame. Admiteselectanidados,column(type,collection),forEach,forEachOrNull,repeat,unionAll,where,constanty%rowIndex. Evalúa por lotes, con una llamada a FHIRPath por expresión y nivel. -
vista_validar(),vista_leer(),vista_crear(),vista_json(),vista_fhirpath(),fhir_recursos(),fhir_tabla()yfhir_vista()(descargar del servidor y aplicar la vista en un paso). - FHIRPath con fhirpath.js 5.2.1 (HL7/fhirpath.js) en V8, con
getResourceKey()ygetReferenceKey(). La capa de FHIRPath está separada (fhirviews_motor()) para poder sustituirla por un motor en R. -
vista_conformidad()ejecuta el banco oficial de pruebas de SQL on FHIR (incluido; o el más reciente condescargar = TRUE) y genera el informe en el formato oficial. Pasan las 133 pruebas shareable y 7 de las 11 experimentales. -
vista_duckdb()guarda vistas como tablas de DuckDB (o de otra conexión DBI) para consultarlas con SQL.
