Repli de requête FHIR
Le repli Power Query est le mécanisme utilisé par un connecteur Power Query pour transformer les transformations de données en requêtes envoyées à la source de données. Ce mécanisme de pliage permet à Power Query de décharger la plus grande partie possible de la sélection des données sur la source de données plutôt que de récupérer de grandes quantités de données inutiles uniquement pour les ignorer dans le client. Le connecteur Power Query pour FHIR inclut des fonctionnalités de repli de requête mais, en raison de la nature de la recherche FHIR, une attention particulière doit être accordée aux expressions Power Query pour garantir que le repli de requête est effectué dès que possible. Cet article explique les principes de base du repli FHIR Power Query et fournit des instructions et des exemples.
FHIR et repli de requête
Supposons que vous construisez une requête pour récupérer des ressources « Patient » à partir d'un serveur FHIR et que vous êtes intéressé par les patients nés avant l'année 1980. Une telle requête peut ressembler à ceci :
let
Source = Fhir.Contents("https://myfhirserver.azurehealthcareapis.com", null),
Patient1 = Source{[Name="Patient"]}[Data],
#"Filtered Rows" = Table.SelectRows(Patient1, each [birthDate] < #date(1980, 1, 1))
in
#"Filtered Rows"
Au lieu de récupérer toutes les ressources Patient à partir du serveur FHIR et de les filtrer dans le client (Power BI), il est plus efficace d’envoyer une requête avec un paramètre de recherche au serveur FHIR :
GET https://myfhirserver.azurehealthcareapis.com/Patient?birthdate=lt1980-01-01
Avec une telle requête, le client ne reçoit que les patients qui l'intéressent et n'a pas besoin d'ignorer des données dans le client.
Dans l'exemple d'une date de naissance, le pliage de requête est simple. Néanmoins, est généralement difficile dans FHIR, car les noms des paramètres de recherche ne correspondent pas toujours aux noms des champs de données et plusieurs champs de données contribuent fréquemment à un paramètre de recherche unique.
Prenons l’exemple de la ressource Observation
et du champ category
. Le champ Observation.category
est un CodeableConcept
dans FHIR, qui a un champ coding
, qui comprend des champs system
et code
(entre autres champs). Supposons que vous êtes intéressé par les signes vitaux uniquement. Vous serez intéressé par Observations où Observation.category.coding.code = "vital-signs"
, mais la recherche FHIR se présenterait comme https://myfhirserver.azurehealthcareapis.com/Observation?category=vital-signs
.
Pour pouvoir effectuer un repli de requête dans les cas les plus compliqués, le connecteur Power Query pour FHIR associe des expressions Power Query à une liste de modèles d’expression et les traduit en paramètres de recherche appropriés. Les modèles d’expression sont générés à partir de la spécification FHIR.
Cette correspondance avec les modèles d’expression fonctionne mieux quand toutes les expressions de sélection (filtrage) sont effectuées le plus tôt possible dans les étapes de transformation de données avant toute autre mise en forme des données.
Remarque
Pour optimiser les chances du moteur Power Query d’exécuter le repli de requête, vous devez effectuer toutes les expressions de sélection de données avant toute mise en forme des données.
Exemple de repli de requête
Pour illustrer un pliage de requête efficace, nous allons examiner l'exemple d'obtention de tous les signes vitaux de la ressource Observation. La façon intuitive de procéder consiste à développer d’abord le champ Observation.category
, à développer le champ Observation.category.coding
, puis à filtrer. La requête se présenterait comme ceci :
// Inefficient Power Query
let
Source = Fhir.Contents("https://myfhirserver.azurehealthcareapis.com", null),
Observation = Source{[Name="Observation"]}[Data],
ExpandCategory = Table.ExpandTableColumn(Observation, "category", {"coding"}, {"category.coding"}),
ExpandCoding = Table.ExpandTableColumn(ExpandCategory, "category.coding", {"system", "code"}, {"category.coding.system", "category.coding.code"}),
FilteredRows = Table.SelectRows(ExpandCoding, each ([category.coding.code] = "vital-signs"))
in
FilteredRows
Malheureusement, le moteur Power Query ne la reconnaît plus en tant que modèle de sélection mappé au paramètre de recherche category
, mais si vous restructurez la requête comme :
// Efficient Power Query allowing folding
let
Source = Fhir.Contents("https://myfhirserver.azurehealthcareapis.com", null),
Observation = Source{[Name="Observation"]}[Data],
FilteredObservations = Table.SelectRows(Observation, each Table.MatchesAnyRows([category], each Table.MatchesAnyRows([coding], each [code] = "vital-signs"))),
ExpandCategory = Table.ExpandTableColumn(FilteredObservations, "category", {"coding"}, {"category.coding"}),
ExpandCoding = Table.ExpandTableColumn(ExpandCategory, "category.coding", {"system", "code"}, {"category.coding.system", "category.coding.code"})
in
ExpandCoding
La requête de recherche /Observation?category=vital-signs
est envoyée au serveur FHIR, ce qui réduit la quantité de données que le client reçoit du serveur.
Bien que la première et la deuxième expressions Power Query aboutissent au même jeu de données, la dernière entraîne, en général, de meilleures performances de requête. Il est important de noter que la deuxième version, plus efficace, de la requête ne peut pas être obtenue uniquement par le biais de la mise en forme des données avec l’interface graphique utilisateur (GUI). Il est nécessaire d'écrire la requête dans l'éditeur avancé de Power Query.
L'exploration initiale des données peut être effectuée à l'aide de l'éditeur de requêtes de l'interface graphique, mais nous vous recommandons de remanier la requête en gardant à l'esprit le pliage des requêtes. Plus précisément, les requêtes sélectives (filtrage) doivent être effectuées le plus tôt possible.
Recherche de modèles de repli
Le connecteur Power Query pour FHIR ne pourra effectuer le repli de requête que si les expressions Power Query mappent aux paramètres de recherche connus tels que définis par la spécification FHIR. Si vous vous demandez si le repli de requête est possible, nous vous recommandons de consulter la spécification FHIR. Chaque ressource répertorie un ensemble de paramètres de recherche vers le bas de la page de spécification. Vous pouvez également consulter la page des modèles de repli de requête pour obtenir des exemples d’écriture d’expressions Power Query pliables pour FHIR.
Débogage du repli de requête
Si vous essayez de déterminer si une expression Power Query donnée est repliée et quelle est l’expression de recherche FHIR résultante, vous pouvez démarrer Fiddler lors de la mise en forme de requêtes dans Power BI Desktop.
Résumé
Le repli de requête fournit des expressions Power Query plus efficaces. Une Power Query correctement conçue permet le pliage de requête, et par conséquent, le déchargement d'une grande partie de la charge de filtrage des données sur la source de données.
Étapes suivantes
Dans cet article, vous avez appris à utiliser le pliage de requête dans le connecteur Power Query pour FHIR. Ensuite, explorez la liste des modèles de repli FHIR Power Query.