OGDI DataLab évolue !

La plateforme de publication de données ouvertes OGDI DataLab (disponible sur la forge GitHub comme solution communautaire sous licence libre Microsoft Public License (Ms-PL)) évolue comme l’indique le titre de ce billet.

Ainsi, vis-à-vis de la version 5 disponible jusqu'à présent, un ensemble de nouvelles fonctionnalités ont été introduites au niveau de la branche V6 sur la forge et sont désormais utilisables par tous dès aujourd’hui.

Au-delà d’un nouveau palier technique dans les versions des technologies utilisées, avec notamment :

L’objectif de ce billet, vous l’aurez compris, consiste à vous proposer une vue d’ensemble rapide de ces nouvelles fonctionnalités qui concernent plus particulièrement :

  • Le service de données (projet nommé DataService),
  • L’explorateur de données (projet nommé DataBrowser),
  • L’outil de chargement de données (projet nommé DataLoader).

Voyons à présent ce qu’il en est de ces nouvelles fonctionnalités. Toute la documentation sur la solution a elle aussi été mise à jour en conséquence pour les refléter. Vous pouvez donc vous reporter à cette dernière pour plus de détails sur ces évolutions.

Le service de données

Les principales nouveautés de cette évolution d’OGDI DataLab se concentrent au niveau du service de données (projet nommé DataService). Il s’agit pour mémoire d’un service de données RESTful conforme au protocole ouvert de donnée OData (Open Data Protocol) qui permet de consommer les différents catalogues de jeux de données publiés.

Ce service de données est complément réécrit dans cette version avec, à la clé, une nouvelle architecture (encore) plus performante. Il convient également de noter dans ce contexte la prise en charge de nouvelles fonctions dans l’URL de requête.

image

Nous tenons à ce propos à remercier très sincèrement les équipes en charge du portail opendata.bordeaux.fr de la Ville de Bordeaux pour :

  • Les améliorations apportées au service de données en termes de prise en charge de mots-clés additionnels au niveau des opérations de requête d’un jeu de données pour offrir une couverture fonctionnelle améliorée de la spécification d’OData.
  • La volonté de partager ces améliorations avec le plus grand nombre et de contribuer ainsi à la solution communautaire OGDI DataLab dans un esprit de mutualisation des investissements que nous souhaitons ici saluer. C’est clairement le cercle vertueux que nous souhaitons encourager et soutenir pour la solution.

Cette contribution est désormais intégrée dans la branche v6.

Une nouvelle architecture

Le travail de refonte a porté essentiellement sur une factorisation du code pour éviter au maximum la redondance de code. Le diagramme ci-dessous présente l’organisation des classes de traitement des requêtes HTTP.

image

La classe abstraite AbstractHttpHandler regroupe le code commun à l’ensemble des requêtes, à savoir l’analyse de la chaîne de requête ainsi que la récupération des données dans les tables Azure.

Les classes qui héritent de la classe abstraite AbstractHttpHandler s’occupent de mettre en forme des réponses selon les types de requêtes. A ce titre, la classe MainHttpHandler est la classe qui gère les requêtes classiques sur les données ; toutes les autres classes gèrent les cas spécifiques tels que les métadonnées ou la liste des catalogues de jeux de données.

Les nouvelles fonctionnalités

Comme évoqué précédemment, le service de données RESTful gère à présent de nouveaux mots-clés OData qui peuvent être insérés dans l’URL de requête. Ces mots clés permettent de personnaliser les résultats retournés par le service de données. Ces nouvelles fonctionnalités ont été ajoutées dans le but à la fois d’offrir une meilleure flexibilité et de se rapprocher au maximum de la spécification OData en termes de couverture fonctionnelle.

Mot clé $top

Il est maintenant possible de spécifier la valeur « all » pour le paramètre $top ; ce qui a pour effet de retourner l’ensemble des résultats d’un jeu de données (dataset) sans limiter du nombre de résultat. Pour rappel, le service de données retourne par défaut les 1000 premiers résultats d’un jeu de données et le flux ainsi retourné contient à la fin des résultats de cette première requête http un élément de type link contenant l’URL pour obtenir les enregistrements suivants, et ainsi de suite jusqu’à ce que l’on ait parcouru tous les résultats. Pour ce faire, l’URL contient un jeton de continuation $skiptoken.

Le tableau ci-dessous présente quelques exemples d’utilisation du paramètre $top :

 

Requête Description
Pas de $top https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset  Retourne un maximum de 1000 lignes
$top=2         https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset? $top= 2 Retourne un maximum de 2 lignes
$top=2390         https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset? $top= 2390 Retourne un maximum de 2390 lignes
$top=all         https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset? $top= all Retourne toutes les lignes

Le service de données se conforme à la spécification OData pour le paramètre $top et ce comme décrit ici.

Mot clé $skip

Le paramètre $skip permet d’omettre les X premières lignes du résultat d’une requête (X étant la valeur du paramètre $skip).

Le tableau ci-dessous présente quelques exemples d’utilisation du paramètre $skip :

 

Requête Description
$skip=2 https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset? $skip= 2 Les 2 premiers résultats seront omis
$skip=5&$top=10 https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset? $skip= 5& $top= 10 Retourne 10 résultats à partir du 5ème

Il convient de noter qu’il ne faut pas utiliser le mot clé $skip comme un moyen de pagination. Un lien prévu à cet effet est spécifié en bas de la réponse comme décrit précédemment.

Le service de données se conforme à la spécification OData pour le paramètre $skip et ce comme décrit ici.

Mot clé $orderby

Le paramètre $orderby permet de demander au service de données de trier les résultats avant de les retourner. Il est aussi possible de spécifier l’ordre de tri, à savoir asc pour l’ordre croissant et desc pour l’ordre décroissant. Si aucun ordre n’est spécifié, c’est l’ordre croissant qui est utilisé par défaut.

Le tableau ci-dessous présente quelques exemples d’utilisation du paramètre $orderby :

 

Requête Description
$orderby=mairie https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset? $orderby= mairie Trier par champs mairie croissant
$orderby=insee desc https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset? $orderby= insee desc Trier par champs code insee décroissant

Le service de données se conforme à la spécification OData pour le paramètre $orderby et ce comme décrit ici.

Mot clé $filter

Le paramètre $filter était déjà disponible dans la version précédente d’OGDI DataLab. La nouveauté apportée réside dans la possibilité désormais offerte d’utiliser des fonctions de chaîne de caractères, des fonctions de date et des fonctions de nombre dans l’URL de la requête.

Le tableau ci-dessous détaille l’ensemble des nouvelles fonctions :

Fonctions de chaînes de caractères
Bool substringof(string base, string find) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=substringof( mairie, "EAU" ) eq true
Bool endswith(string base, string end) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=endswith( mairie, "ELLE" ) eq true
Bool startswith(string base, string start) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=startswith( mairie, "BEAU" ) eq true
Int length(string base) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=length( mairie ) eq 5
Int indexof(string base, string find) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=indexof( mairie, 'Z' ) eq 4
String replace(string base, string find, string replace) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=replace( mairie, "ZELLE", "" ) eq "BEAU"
String substring(string base, int pos) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=substring( mairie, 4 ) eq "ZELLE"
String substring(string base, int pos, int length) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=substring( mairie, 1, 3 ) eq "EAU"
String tolower(string base) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=tolower( mairie ) eq "beauzelle"
String toupper(string base) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=toupper( mairie ) eq "BEAUZELLE"
String trim(string base) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=trim( mairie ) eq "BEAUZELLE"
String concat(string str1, string str2) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=concat( mairie, " CITY" ) eq "BEAUZELLE CITY"

 

Fonctions de date
Int day(DateTime date) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=day( date_ajout ) eq 28
Int hour(DateTime date) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=hour( date_ajout ) eq 00
Int minute(DateTime date) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=minute( date_ajout ) eq 01
Int month(DateTime date) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=month( date_ajout ) eq 02
Int second(DateTime date) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=second( date_ajout ) eq 09
Int year(DateTime date) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=year( date_ajout ) eq 2012

 

Fonctions sur les nombres
Double round(double nb) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=round( nombre_test ) eq 42
Double floor(double nb) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=floor( nombre_test ) eq 42
Double ceiling(double nb) https://ogdifrance.cloudapp.net:8080/v1/catalog/dataset?$filter=ceiling( nombre_test ) eq 43

Le service de données se conforme à la spécification OData pour le paramètre $filter et ce comme décrit ici.

L’explorateur de données

Suite à la disponibilité de Windows Azure Caching, un précédent billet sur ce blog décrivait la mise en œuvre en pas à pas d’un cache partagé au sein de la plateforme OGDI DataLab pour le service de données et l’explorateur de données et ce, sur la base de la version v5 d’OGDI DataLab.

Cette gestion de cache a été optimisée et est désormais nativement intégrée dans la solution pour ces deux composantes. Dans la pratique, il est possible d’activer ou de désactiver l’utilisation du cache via le paramètre UseCache du projet Cloud DataBrowser.Cloud de l’explorateur de données.

image

image

Le chargeur de données

L’interface graphique de l’outil de chargement de données a enfin également été revue. Elle est maintenant plus claire et plus simple d’utilisation ; Enfin nous l’espérons ;) Le fonctionnement général n’a pas été modifié.

image

Une gestion intelligente du proxy a été ajoutée, c’est-à-dire que l’outil retrouve automatiquement les paramètres de proxy selon la configuration sauvegardée au niveau du système Windows, paramètres que l’on retrouve dans les options Internet d’Internet Explorer. Il est aussi possible de spécifier une adresse de proxy spécifique.

Enfin, la case Bind To Map de l’onglet Dataset Columns est désormais décochée par défaut ; celle-ci entrainait des erreurs lorsque l’utilisateur oubliait de configurer (correctement) les informations de localisation.

En guise de conclusion

Cette nouvelle version d’OGDI DataLab est actuellement en ligne sur l’instance de test OGDI DataLab mise à disposition par Microsoft France. Vous pouvez directement tester les nouvelles fonctionnalités du service de données via l’adresse https://ogdifrance.cloudapp.net:8080/v1/.

image

Pour rappel, l’ensemble du code disponible sous licence libre Microsoft Public License (Ms-PL) est disponible sur la forge GitHub au niveau de la branche V6 du projet openlab/DataLab. Bons tests :)