Commit 10d349b7 authored by Blaise de Carné 's avatar Blaise de Carné

Merge branch 'release/1.1.0'

parents 1f0ee9de 266c31a5
Pipeline #55520 passed with stage
in 22 seconds
......@@ -6,4 +6,6 @@
/vendor/
/.idea/
/var/
/bin/
\ No newline at end of file
/bin/
tests/dataset.hdt.index
node_modules
\ No newline at end of file
......@@ -4,6 +4,20 @@ Tous les changements notables apportés à ce projet seront documentés dans ce
Le format est basé sur [Keep a Changelog](http://keepachangelog.com/fr/1.0.0/)
et ce projet adhère à [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
## En cours
## [1.1.0] - 2018-06-04
### Ajouts
- Gestion des propriétés multilingues
- Ajout d'un argument lang
### Modifications
- Ajout d'un tri par défaut sur la requête SPARQL (uri ASC)
- Ajout d'un pré-traitement d'ordonnancement dans le QueryHydrator
- Ajout d'une option pour choisir le graph par défaut dans le VirtuosoResolver
- Modification du filtre uri : utilisation de VALUES à la place de BIND
## [1.0.0] - 2018-04-24
### Ajouts
......
......@@ -3,7 +3,7 @@
"license": "MIT",
"keywords": ["graphql","datatourisme","api","sparql","opendata"],
"type": "library",
"version": "1.0.0",
"version": "1.1.0",
"homepage": "https://www.datatourisme.gouv.fr",
"authors": [
{
......@@ -43,14 +43,19 @@
},
"scripts": {
"clean": "vendor/bin/php-cs-fixer fix -v --using-cache=no",
"generate_doc": [
"graphql-markdown http://localhost:8080 > docs/api/reference.md",
"sed -i -e \"s/# Schema Types/# Référence/g\" docs/api/reference.md",
"sed -i -e \"s/href=\\\"#/href=\\\"#\\/api/reference?id=/g\" docs/api/reference.md",
"sed -i -e \"s/id=pointofinterest_sort/id=pointofinterest/g\" docs/api/reference.md",
"sed -i -e \"s/id=pointofinterest_filter/id=pointofinterest/g\" docs/api/reference.md",
"sed -i -e \"s/<th align=\\\"right\\\">Argument<\\\/th>//g\" docs/api/reference.md",
"sed -i -e \"s/<th align=\\\"left\\\">Field<\\\/th>/<th align=\\\"left\\\" colspan=\\\"2\\\">Field<\\\/th>/g\" docs/api/reference.md"
"doc-serve": "docsify serve docs",
"graphql-endpoint": "php -S 127.0.0.1:8080 -t tests/",
"doc-generate": [
"node_modules/.bin/graphql-markdown http://127.0.0.1:8080/endpoint.php > docs/api/reference.md",
"sed -i -e \"s/# Schema Types/# Référence/g\" docs/api/reference.md",
"sed -i -e \"s/href=\\\"#/href=\\\"#\\/api\\/reference?id=/g\" docs/api/reference.md",
"sed -i -e \"s/id=pointofinterest_sort/id=pointofinterest/g\" docs/api/reference.md",
"sed -i -e \"s/id=pointofinterest_filter/id=pointofinterest/g\" docs/api/reference.md",
"sed -i -e \"s/<th align=\\\"right\\\">Argument<\\\/th>//g\" docs/api/reference.md",
"sed -i -e \"s/<th align=\\\"left\\\">Field<\\\/th>/<th align=\\\"left\\\" colspan=\\\"2\\\">Field<\\\/th>/g\" docs/api/reference.md",
"sed -i -e \"s/<details>//g\" docs/api/reference.md",
"sed -i -e \"s/<\\/details>//g\" docs/api/reference.md",
"sed -i -e \"s/<summary><strong>Table of Contents<\\/strong><\\/summary>//g\" docs/api/reference.md"
]
}
}
......@@ -8,8 +8,9 @@ services:
volumes:
- ./tests/RWStore.properties:/docker-entrypoint-initdb.d/kb/RWStore.properties
- ./tests/dataset.ttl:/docker-entrypoint-initdb.d/kb/data/dataset.ttl
virtuoso:
image: tenforce/virtuoso:1.3.1-virtuoso7.2.2
image: tenforce/virtuoso:1.3.1-virtuoso7.2.4
ports:
- 8890:8890
volumes:
......
......@@ -25,7 +25,8 @@ Voici la liste des arguments disponibles :
],
sort: [
# ... <- Liste des règles de tri des résultats
]
],
lang: "fr"
) {
# ...
}
......@@ -264,4 +265,10 @@ Cette requête extrait tous les identifiants des **POI** par ordre décroissant
}
}
}
```
\ No newline at end of file
```
## lang
**lang** permet de limiter les propriétés traduisibles renvoyées dans la réponse aux
seules valeurs de la langue sélectionnée. La liste des codes acceptés est définie par
la norme **ISO 639-1** : [https://fr.wikipedia.org/wiki/Liste_des_codes_ISO_639-1].
# Champs
## Généralités
Le principe essentiel de GraphQL est d'adapter la réponse aux champs demandés par l'utilisateur dans le corps de la
requête :
......@@ -36,7 +38,6 @@ pour connaître la liste des champs d'un POI : [PointOfInterest](api/reference.m
la spécification GraphQL n'autorisant pas cette notation, l'API DATAtourisme remplace le double point par un `_`.
Exemple: `rdfs:label` devient `rdfs_label`.
** Exemple **
```graphql
......@@ -45,9 +46,12 @@ Exemple: `rdfs:label` devient `rdfs_label`.
total
results {
_uri # <- Identifiant du POI
rdfs_label # <- Nom du POI
hasDescription {
shortDescription # <- Description du POI
dc_identifier # <- Référence du POI
isLocatedAt {
schema_geo {
schema_latitude # <- Latitude du POI
schema_longitude # <- Longitude du POI
}
}
}
}
......@@ -64,29 +68,44 @@ Exemple: `rdfs:label` devient `rdfs_label`.
"results": [
{
"_uri": "https://data.datatourisme.gouv.fr/21/5430055a-2d35-3ce7-adc9-ebecb9f5cbfd",
"rdfs_label": ["Jouer aux échecs"],
"hasDescription": [{
"shortDescription": [
"Rendez-vous le 1er et le 3ème vendredi du mois à la maison des Associations, cours apprentissage, perfectionnement, rencontres amicales, tournois."
"dc_identifier": ["FMACHA0100957599"],
"isLocatedAt": [{
"schema_geo": [{
"schema_latitude": [
49.376388888889
],
"schema_longitude": [
6.1580555555556
]
}]
}]
},
{
"_uri": "https://data.datatourisme.gouv.fr/21/ce824246-dd4f-3f08-ab90-974a409f67d6",
"rdfs_label": ["Le sens de la fête"],
"hasDescription": [{
"shortDescription": [
"Comédie de Eric Toledano et Olivier Nakache. Avec Jean-Pierre Bacri, Gilles Lellouche, Eye Haidara."
"dc_identifier": ["FMACHA0100957578"],
"isLocatedAt": [{
"schema_geo": [{
"schema_latitude": [
48.693055555556
],
"schema_longitude": [
6.1794444444445
]
}
]},
}]
}]
},
{
"_uri": "https://data.datatourisme.gouv.fr/31/00024f0a-74b7-34fd-80f0-eec5cbf61189",
"rdfs_label": ["Randonnée"],
"hasDescription": [{
"shortDescription": [
"Randonnée par les Randonneurs du Montet"
"dc_identifier": ["FMACHA0100705801"],
"isLocatedAt": [{
"schema_geo": [{
"schema_latitude": [
49.360329728326
],
"schema_longitude": [
6.1624977836914
]
}]
}]
}
]
......@@ -95,3 +114,54 @@ Exemple: `rdfs:label` devient `rdfs_label`.
}
```
## Propriétés multilingues
Certaines propriétés (rdf:label, :shortDescription) sont multilingues : chaque valeur peut se retrouver traduite
en plusieurs langues.
Dans ce cas précis, leur structure est décomposée afin de connaître la langue associée à chacune des valeurs :
** Exemple **
```graphql
{
poi {
total
results {
_uri
rdfs_label {
value
lang
}
}
}
}
```
** Résultat **
```json
{
"data": {
"poi": {
"total": 1308,
"results": [
{
"_uri": "https://data.datatourisme.gouv.fr/21/5430055a-2d35-3ce7-adc9-ebecb9f5cbfd",
"rdfs_label": [
{ "value": "Jouer aux échecs", lang: "fr" },
{ "value": "Play chess", lang: "en" }
]
},
{
"_uri": "https://data.datatourisme.gouv.fr/21/ce824246-dd4f-3f08-ab90-974a409f67d6",
"rdfs_label": [
{ "value": "Randonnée", lang: "fr" },
{ "value": "Hiking", lang: "en" }
]
}
]
}
}
}
```
# Référence
<details>
<summary><strong>Table of Contents</strong></summary>
* [Query](#query)
* [Objects](#objects)
......@@ -15,6 +15,7 @@
* [Description](#description)
* [FeatureSpecification](#featurespecification)
* [FoodProduct](#foodproduct)
* [LangString](#langstring)
* [LocationInterest](#locationinterest)
* [LocationInterest_Place](#locationinterest_place)
* [Offer](#offer)
......@@ -55,9 +56,9 @@
* [Int](#int)
* [String](#string)
</details>
## Query (schemaQuery)
## Query (datatourismeQuery)
<table>
<thead>
<tr>
......@@ -98,6 +99,11 @@
<td valign="top">[<a href="#/api/reference?id=pointofinterest">PointOfInterest_Filter</a>]</td>
<td></td>
</tr>
<tr>
<td colspan="2" align="right" valign="top">lang</td>
<td valign="top"><a href="#/api/reference?id=string">String</a></td>
<td></td>
</tr>
</tbody>
</table>
......@@ -294,7 +300,7 @@ Un équipement, un aménagement, une infrastructure, proposé par un POI. Ex: u
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -337,7 +343,7 @@ Les langues proposées par l&#039;équipement d&#039;information. Il est recomma
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -373,7 +379,7 @@ Audience à laquelle s&#039;adresse l&#039;item. En général, il s&#039;agit d&
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -497,7 +503,7 @@ Code INSEE de la division administrative
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -533,7 +539,7 @@ Le type de cuisine qu&#039;un établissement de restauration peut proposer. Ex:
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -588,7 +594,7 @@ Code INSEE de la division administrative
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -816,7 +822,7 @@ Vrai si le produit propose un accès à internet.
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -826,6 +832,39 @@ Etiquette courte décrivant la ressource.
</tbody>
</table>
### LangString
<table>
<thead>
<tr>
<th align="left" colspan="2">Field</th>
<th align="left">Type</th>
<th align="left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="2" valign="top"><strong>value</strong></td>
<td valign="top"><a href="#/api/reference?id=string">String</a></td>
<td>
Literal value
</td>
</tr>
<tr>
<td colspan="2" valign="top"><strong>lang</strong></td>
<td valign="top"><a href="#/api/reference?id=string">String</a></td>
<td>
Literal language
</td>
</tr>
</tbody>
</table>
### LocationInterest
Un point d&#039;intérêt auquel peut être associé un lieu ou un environnement. ex : à la campagne, au bord de la mer, une autoroute, ....
......@@ -852,7 +891,7 @@ Un point d&#039;intérêt auquel peut être associé un lieu ou un environnement
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -886,7 +925,7 @@ Etiquette courte décrivant la ressource.
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -1148,7 +1187,7 @@ L&#039;age minimum requis.
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -1624,7 +1663,7 @@ Les langues proposées par l&#039;équipement d&#039;information. Il est recomma
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -1792,7 +1831,7 @@ Le mode de tarification. ex : Abonnement, à la journée, par personne, ...
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -1828,7 +1867,7 @@ Une politique de tarification détermine les conditions de consommation que cou
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -1873,7 +1912,7 @@ Le système de classement qui propose cette valeur.
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -1928,7 +1967,7 @@ Code INSEE de la division administrative
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -2054,7 +2093,7 @@ La durée de validité d&#039;un classement, depuis sa reviewDeliveryDate. Expr
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -2108,7 +2147,7 @@ La disposition de la salle. Ex: en banquet, en U, en cocktail, ...
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -2224,7 +2263,7 @@ Un thème est un sujet auquel un POI peut se rapporter. Ex: la peinture, l&#039
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -2350,7 +2389,7 @@ Le dénivelé du parcours (différence entre l&#039;altitude minimale et l&#039
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -2540,7 +2579,7 @@ A pour media représentatif.
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -2707,7 +2746,7 @@ l&#039;index de l&#039;élément de la liste.
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -2741,7 +2780,7 @@ Etiquette courte décrivant la ressource.
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -2775,7 +2814,7 @@ Etiquette courte décrivant la ressource.
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......@@ -2967,7 +3006,7 @@ L&#039;heure d&#039;ouverture du lieu ou du service le (s) jour (s) donné (s)
</tr>
<tr>
<td colspan="2" valign="top"><strong>rdfs_label</strong></td>
<td valign="top">[<a href="#/api/reference?id=string">String</a>]</td>
<td valign="top">[<a href="#/api/reference?id=langstring">LangString</a>]</td>
<td>
Etiquette courte décrivant la ressource.
......
{
"name": "datatourisme-api",
"version": "1.1.0",
"repository": "https://framagit.org/datatourisme/api",
"author": "Conjecto <contact@conjecto.com>",
"license": "MIT",
"dependencies": {
"graphql-markdown": "^3.2.0"
}
}
......@@ -11909,7 +11909,7 @@ fields:
description: null
ebucore:abstract:
name: "a pour abstraction"
type: "xsd:string"
type: "rdf:langString"
description: "fournit un description courte."
schema:openingHoursSpecification:
name: "a pour horaires d'ouverture"
......@@ -12065,7 +12065,7 @@ fields:
description: "L'age minimum requis."
dc:description:
name: "Description longue"
type: "xsd:string"
type: "rdf:langString"
description: "Description longue de la ressource."
:appliesOnDay:
name: "s'applique sur le jour de la semaine"
......@@ -12272,7 +12272,7 @@ fields:
\ objets point séparés par un caractère espace."
rdfs:label:
name: "Nom"
type: "xsd:string"
type: "rdf:langString"
description: "Etiquette courte décrivant la ressource."
:agreementLicense:
name: "Numéro d'immatriculation au registre des opérateurs de voyages"
......@@ -12411,7 +12411,7 @@ fields:
\ composant de celui-ci). Ex: un court de golf dans un camping."
ebucore:title:
name: "a pour titre"
type: "xsd:string"
type: "rdf:langString"
description: "Titre de la ressource."
:hasPricingMode:
name: "a pour mode de tarification"
......@@ -12499,7 +12499,7 @@ fields:
\ spécifier une distance. Sinon, préférer la relation directe isCloseTo."
:shortDescription:
name: "Description courte"
type: "xsd:string"
type: "rdf:langString"
description: "Utiliser cette propriété pour attacher une description courte qui\
\ pourra être utilisée sur des supports de publication l'espace est un critè\
re important."
......@@ -12546,7 +12546,7 @@ fields:
description: "L'age maximum suggéré."
ebucore:comments:
name: "description"
type: "xsd:string"
type: "rdf:langString"
description: "La description de la ressource."
:hasHikeAudience:
name: "est un parcours dédié à l'audience"
......
<?php
/**
* Created by PhpStorm.
* User: blaise
* Date: 25/05/18
* Time: 18:32
*/
namespace Datatourisme\Api\Processor;
use Datatourisme\Api\Schema\Type\Object\LangStringType;
use Youshido\GraphQL\Field\FieldInterface;
use Youshido\GraphQL\Parser\Ast\Interfaces\FieldInterface as AstFieldInterface;
/**
* Class Processor
* @package Datatourisme\Api\Processor
*/
class Processor extends \Youshido\GraphQL\Execution\Processor
{
protected function resolveObject(FieldInterface $field, AstFieldInterface $ast, $parentValue = null, $fromObject = false)
{
// hack to handle legacy langstring behavior
// will be deprecated in 2.0
if($field->getType() instanceof LangStringType && !count($ast->getFields())) {
return $parentValue;
}
return parent::resolveObject($field, $ast, $parentValue, $fromObject); // TODO: Change the autogenerated stub
}
}
\ No newline at end of file
......@@ -13,7 +13,6 @@ use Datatourisme\Api\Exception\RuntimeException;
use Datatourisme\Api\Resolver\ResolverInterface;
use Datatourisme\Api\Schema\Compiler\SchemaCompiler;
use Datatourisme\Api\Schema\SchemaLoader;
use Youshido\GraphQL\Execution\Processor;
class ProcessorBuilder
{
......@@ -50,7 +49,7 @@ class ProcessorBuilder
/**
* @var array
*/
protected $scalarTypes = array();
protected $typesMap = array();