2016-01-27 8 views
12

Sono molto interessato a GraphQL per una soluzione analitica (si pensi a una webapp che visualizza grafici). Ma non riesco a trovare alcun esempio di GraphQL utilizzando la funzione di aggregazione. Questo è un aspetto principale della maggior parte delle domande fatte dal mio frontend.Supporto della funzione di aggregazione in GraphQL

Per la mia soluzione, abbiamo 3 tipiche chiamate di backend.

  1. Ricerca
  2. Aggregate
  3. Time Series

diciamo che abbiamo questo tipo specificato nel GraphQL

type Person { 
    name: String 
    age: Int 
    create_time: Date 
} 
  1. Ricerca

Questo sembra essere ben gestito da GraphQL. Nessuna domanda qui.

ex. Cerca età della persona di nome Bob { Persona (nome: "Bob") { età } }

  1. Aggregate

Questo è il tipico caso in cui Voglio visualizzare le informazioni in un grafico a torta. Quindi diciamo che voglio contare il numero di persone per età.

qui sarebbe la query PostgreSQL:

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

Quale sarebbe l'equivalente in GraphQL?

  1. Time Series Questo è il caso tipico in cui voglio visualizzare le informazioni in un BarChart con l'asse X come ora.

ex. Diciamo che voglio contare il numero di utenti creati all'ora.

qui sarebbe la query 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; 

Quale sarebbe la query equivalente GraphQL?

+1

Per non parlare, come si fanno i confronti di gamma per gli scalari, come SELECT * WHERE timestamp> ... AND timestamp <...? O ordinare i risultati con uno scalare? Non vedo nessuno di questi nella specifica. Cosa mi manca? –

+0

Aggiungete parametri ai vostri campi che consentono quel tipo di filtro. – Ryan

risposta

8

GraphQL, alla fine della giornata, risponde con i tipi definiti. Hai solo bisogno di mettere quei dati in un tipo. Che si tratti di un tipo specifico per queste diverse query o di campi per quei dati sui tipi esistenti, dipende da te, ma questo è tutto ciò che si riduce a. GraphQL richiede più impegno in termini di definizione dei tipi e di restituzione di tutte le query, il che lo rende più rigido, ma l'idea è che dall'altra parte ci sono alcune funzioni interessanti, come l'introspezione e il controllo dei tipi. Se non sembra logico collocare quel tipo di strutture dati "ad hoc" in un tipo GraphQL, non è illegale disporre di endpoint non GraphQL se sono necessarie altre origini dati.

+0

Penso di ottenere quello che stai dicendo, ma capisco come sarebbe l'implementazione di questo. – Damien

+4

@Damien, ogni query GraphQL è gestita da una funzione resolve(). I parametri di query forniti alla query sono gli argomenti di questa funzione. La funzione resolve() scompare e fa tutto ciò che vuoi, ad esempio recupera i risultati di una query SQL da un'altra posizione, quindi puoi aggregarli a tuo piacimento e infine restituire il risultato di tutto ciò come risposta alla query GraphQL . Il punto è: si dovrebbe fare l'aggregazione come se resolve() fosse solo un'altra funzione JS che restituisce numeri. Ma il client di query non ha bisogno di sapere o preoccuparsi. – batjko

1

@Danni, questi problemi non sono problemi di GraphQL.

Ogni volta che si vuole fare qualcosa in GraphQL è necessario definire una tipo di dati di ritorno, Spec della funzione di implementare, e talvolta una tipo di dati in ingresso per alimentare la vostra funzione. Finalmente scrivi il codice per fare il lavoro.

Infatti, sembra che tu abbia (ri) scritto il tuo codice in linguaggio GraphQL.

Prendiamo l'esempio in cui si desidera visualizzare le informazioni in un grafico a torta:

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

definire i dati di ritorno: ecco un elenco di età e contare:

type TickGroupByAge { 
     age: Int 
     count: Int 
    } 

Definire la funzione o il Query in linguaggio GraphQL:

getTicketGroupByAge : [TickGroupByAge]` 

Infine scrivere una funzione per implementare la query sopra:

async function(){ 
    const res = await client.query("SELECT age, count(*) from Ticket group by age"); 
    return res.rows; 
} 

@Ryan Sono assolutamente d'accordo con te sul fatto che GraphQL ti costringa a scrivere molte definizioni di tipi per risolvere un compito semplice. Per questo motivo, ho finito per costruire il mio NextQL - GraphQL-liked engine che è simile a GraphQL ma più semplice.

Il mio progetto supporta definizioni di tipi annidati complessi, che ti consentono di definire molti elementi inutili.