Je suis très intéressé par GraphQL pour une solution analytique (pensez à une webapp affichant des graphiques). Mais je ne trouve aucun exemple de GraphQL utilisant la fonction d'agrégation. C'est un aspect principal de la plupart des requêtes effectuées par mon frontend.
Pour ma solution, nous avons 3 appels backend typiques.
Disons que ce type est spécifié dans GraphQL
type Person {
name: String
age: Int
create_time: Date
}
Cela semble être bien géré par GraphQL. Pas de question ici.
ex. Rechercher l'âge de la personne nommée Bob {Personne (nom: "Bob") {age}}
C'est le cas typique où je veux afficher les informations dans un graphique à secteurs. Disons que je veux compter le nombre de personnes par âge.
Voici la requête PostgreSQL:
SELECT age, count(*) from Ticket group by age;
Quel serait l'équivalent dans GraphQL?
ex. Disons que je veux compter le nombre d'utilisateurs créés par heure.
Voici la requête PostgreSQL:
SELECT date_trunc('hour', create_time) as create_time_bin, count(*) from Person group by create_time_bin order by create_time_bin ASC;
Quelle serait la requête équivalente GraphQL?
GraphQL, à la fin de la journée, répond avec vos types définis. Vous avez juste besoin de mettre ces données dans un type. Que ce soit un type spécifique pour ces différentes requêtes, ou des champs pour ces données sur les types existants, c'est à vous de décider, mais c'est tout. GraphQL nécessite plus d'efforts à l'avance en termes de définition de vos types et de ce que toutes les requêtes retourneront, ce qui le rend plus rigide, mais l'idée est que de l'autre côté de cela se trouvent des fonctionnalités intéressantes, comme l'introspection et la vérification de type. S'il ne semble pas logique de mettre ce type de structures de données "ad hoc" dans un type GraphQL, il n'est pas illégal d'avoir des points de terminaison non GraphQL si vous avez besoin d'autres sources de données.
@Damien, ces problèmes ne sont pas les problèmes de GraphQL.
Chaque fois que vous voulez faire quelque chose dans GraphQL, vous devez définir un Type de données de retour , Spécification de la fonction que vous implémentez , et parfois un Type de données d'entrée à alimenter dans votre fonction. Enfin, vous écrivez du code pour faire le travail.
En fait, il semble que vous (ré) écrivez votre code en langage GraphQL.
Prenez l'exemple où vous souhaitez afficher les informations dans un graphique à secteurs:
SELECT age, count(*) from Ticket group by age;
Définissez vos données de retour voici une liste d'âge et de nombre:
type TickGroupByAge {
age: Int
count: Int
}
Définissez votre fonction ou requête en langage GraphQL:
getTicketGroupByAge : [TickGroupByAge]`
Enfin, écrivez une fonction pour implémenter la requête ci-dessus:
async function(){
const res = await client.query("SELECT age, count(*) from Ticket group by age");
return res.rows;
}
@Ryan Je suis totalement d'accord avec vous que GraphQL vous oblige à écrire beaucoup de définitions de types pour résoudre une tâche simple. Pour cette raison, j'ai fini par construire mon propre NextQL - moteur GraphQL qui est similaire à GraphQL mais plus simple.
Mon projet prend en charge des définitions de types imbriquées complexes, qui vous libèrent de la définition de nombreuses définitions inutiles.
Découvrez https://github.com/niclasko/Cypher.js (note: je suis l'auteur)
En rapport avec la question. Il peut être utilisé pour interroger et agréger des données à partir de points de terminaison JSON:
load json from "http://url/person" as l return l.age, count(1)
Il y a même une fonction de graphique à barres:
load json from "http://url/person" as l return barchart(toint(l.age)) as age_distribution
Voici un exemple d'interrogation d'un document JSON complexe et d'exécution d'une analyse agrégée sur celui-ci: