2016-01-27 10 views
12

Ich bin sehr interessiert von GraphQL für eine analytische Lösung (denken Sie an eine Webapp Grafik anzeigen). Aber ich kann keine Beispiele für GraphQL finden, die die Aggregatfunktion verwenden. Dies ist ein Hauptaspekt der meisten Abfragen meines Frontends.Unterstützung der Aggregatfunktion in GraphQL

Für meine Lösung haben wir 3 typische Back-End-Anrufe.

  1. Suche
  2. Aggregate
  3. Time Series

Lassen Sie sagen, wir diese Art in GraphQL

type Person { 
    name: String 
    age: Int 
    create_time: Date 
} 
  1. Suche
angegeben haben

Dies scheint von GraphQL gut gehandhabt zu werden. Keine Frage hier.

ex. Suche Alter von Person namens Bob { Person (Name: "Bob") { Alter } }

  1. Aggregate

Dies ist der typische Fall, in dem Ich möchte die Informationen in einem Kreisdiagramm anzeigen. Sagen wir also, ich möchte die Anzahl der Personen nach Alter zählen.

Hier wäre die PostgreSQL-Abfrage:

SELECT age, count(*) from Ticket group by age; 

Was wäre das Äquivalent in GraphQL sein?

  1. Zeitreihe Dies ist der typische Fall, in dem ich die Informationen in einem BarChart mit der X-Achse als Zeit anzeigen möchte.

ex. Sagen wir, ich möchte die Anzahl der erstellten Benutzer pro Stunde zählen.

Hier wäre die PostgreSQL-Abfrage sein:

SELECT date_trunc('hour', create_time) as create_time_bin, count(*) from Person group by create_time_bin order by create_time_bin ASC; 

Was wäre die GraphQL äquivalente Abfrage sein?

+1

Ganz zu schweigen, wie machen Sie Entfernungsvergleiche für Skalare, wie SELECT * WHERE timestamp> ... UND timestamp <...? Oder Sortieren von Ergebnissen mit einem Skalar? Ich sehe keine davon in der Spezifikation. Was vermisse ich? –

+0

Sie fügen Parameter zu Ihren Feldern hinzu, die diesen Filtertyp zulassen. – Ryan

Antwort

8

GraphQL, am Ende des Tages, antwortet mit Ihren definierten Typen. Sie müssen diese Daten nur in einen Typ eingeben. Ob dies ein bestimmter Typ für diese verschiedenen Abfragen ist oder Felder für diese Daten vorhandener Typen, es liegt an Ihnen, aber das ist alles, worum es geht. GraphQL erfordert mehr Aufwand bei der Definition Ihrer Typen und was alle Abfragen zurückgeben werden, was es starrer macht, aber die Idee dahinter ist, dass auf der anderen Seite einige coole Funktionen wie Introspektion und Typprüfung stehen. Wenn es logisch erscheint, solche "Ad-hoc" -Datenstrukturen nicht in einen GraphQL-Typ zu übertragen, ist es nicht illegal, Nicht-GraphQL-Endpunkte zu haben, wenn Sie andere Datenquellen benötigen.

+0

Ich glaube, ich verstehe, was du sagst, aber ich verstehe, wie die Umsetzung aussehen würde. – Damien

+4

@Damien, jede GraphQL-Abfrage wird durch eine resolve() -Funktion beantwortet. Die Abfrageparameter, die Sie der Abfrage geben, sind die Argumente für diese Funktion. Die Funktion resolve() geht dann weg und tut alles, was Sie wollen, sagen Sie, die Ergebnisse einer SQL-Abfrage von woanders abrufen, dann können Sie diese Daten aggregieren, wie Sie möchten, und schließlich das Ergebnis von all dem als Ihre Antwort auf die GraphQL-Abfrage zurückgeben . Punkt ist: Du sollst die Aggregation so machen, als ob resolve() nur eine andere JS-Funktion wäre, die Zahlen zurückgibt. Aber der abfragende Client muss nicht wissen oder kümmern. – batjko

1

@Damien, diese Probleme sind nicht GraphQLs Probleme.

Wenn Sie etwas tun wollen in GraphQL Sie, eine Typ Rückgabedaten definieren müssen Spec der Funktion implementieren Sie, und manchmal ein Art der Eingangsdaten in Ihrer Funktion zu füttern. Schließlich schreiben Sie Code, um den Job zu erledigen.

Tatsächlich sieht es so aus, als ob Sie Ihren Code in der Sprache von GraphQL (re) schreiben.

das Beispiel, wo Sie die Informationen in einem Kreisdiagramm angezeigt werden soll:

SELECT age, count(*) from Ticket group by age; 

Ihre Rückkehr Daten hier definieren Sie eine Liste von Alter und zählen:

type TickGroupByAge { 
     age: Int 
     count: Int 
    } 

Definieren Sie Ihre Funktion oder Abfrage in GraphQL Sprache:

getTicketGroupByAge : [TickGroupByAge]` 

Schließlich schreiben Sie eine Funktion, um obige Abfrage zu implementieren:

@Ryan Ich stimme völlig mit Ihnen überein, dass GraphQL zwingt Sie, eine Menge von Typdefinitionen zu schreiben, um eine einfache Aufgabe zu lösen. Aus diesem Grund habe ich meine eigene NextQL - GraphQL-liked engine erstellt, die ähnlich zu GraphQL aber einfacher ist.

Mein Projekt unterstützt komplexe geschachtelte Typdefinitionen, die es Ihnen ermöglichen, viele unbrauchbare Definitionen zu definieren.