2017-06-15 5 views
2

Derzeit sehe ich keine vorhandene Unterstützung für die Seitennummerierung in der Bibliothek graphql-java. Es hat einige grundlegende Relay-Unterstützung, wo-in, können wir eine connection, Facebooks empfohlene Art der Umsetzung Seitennummerierung erstellen.
This ist die Methode, die hilft, das zu erreichen. Aber ohne Dokumentation fällt es mir schwer zu verstehen, wie diese Funktion funktioniert. Kann jemand die Schritte aufschlüsseln, die er ausführen würde, um Paginierungsunterstützung hinzuzufügen, wenn er bereits ein vorhandenes Modell hat, das grundlegende Abfragen wie Add, delete, fetch usw. unter Verwendung der graphql-java-Bibliothek zulässt?GraphQL: Wie Paginierung mit GraphQL-Java implementieren?

Antwort

3

Sie brauchen nicht einmal Relay-Verbindungen, um die Paginierung zu unterstützen. Ihre Abfrage könnte einfach eine Seitenzahl und Größe (oder Limit/Offset) als Argumente akzeptieren und eine Liste zurückgeben - fertig. Aber wenn Sie Relaisverbindung für z.B. Book Typ, Sie so etwas wie die folgend tun würden:

Relay relay = new Relay(); 
GraphQLOutputType book = ...; //build your normal Book object type 
GraphQLObjectType bookEdge = relay.edgeType(book.getName(), book, null, Collections.emptyList()); 
GraphQLObjectType bookConnection = relay.connectionType(book.getName(), bookEdge, Collections.emptyList()); 

Als Ergebnis würden Sie eine BookConnection Art haben, die die Relay connection spec entspricht.

Wie für das Beispiel mit grundlegenden GraphQL haben Sie eine einfache Web-App here.

Ich würde Ihnen auch empfehlen, einen Blick auf mein Projekt, graphql-spqr, mit an example app, die Entwicklung von GraphQL APIs tot einfach zu machen.

Zum Beispiel werden Sie ein paginierte Ergebnis wie folgt zu erstellen:

public class BookService { 
    @GraphQLQuery(name = "books") 
    //make sure the argument names and types match the Relay spec 
    public Page<Book> getBooks(@GraphQLArgument(name = "first") int first, @GraphQLArgument(name = "after") String after) { 
     //if you decide to fetch from a SQL DB, you need the limit and offset instead of a cursor 
     //so, you can treat "first" as count as "after" as offset 
     int offset = Integer.valueOf(after); 
     List<Book> books = getBooksFromDB(first, offset); 
     Page<Book> bookPage = PageFactory.createOffsetBasedPage(books, totalBookCount, offset); 
     return bookPage; 
    } 
} 

Es gibt viele andere Möglichkeiten, um eine Page Instanz zu erstellen, ist dies nur die straight-forward ein.

Sie würden dann ein Schema aus Ihrer Java-Klasse generieren:

GraphQLSchema schema = new GraphQLSchemaGenerator() 
     .withOperationsFromSingleton(new BookService()) 
     .generate(); 
GraphQL graphQL = GraphQLRuntime.newGraphQL(schema).build(); 

Und eine Abfrage ausführen:

ExecutionResult result = graphQL.execute("{books(first:10, after:\"20\") {" + 
       " pageInfo {" + 
       "  hasNextPage" + 
       " }," + 
       " edges {" + 
       "  cursor, node {" + 
       "   title" + 
       "}}}}"); 

Aber noch einmal, wenn Sie nicht Relay verwenden keine Notwendigkeit gibt es wirklich Dinge zu komplizieren. Wenn Ihr Speicher die cursorbasierte Paginierung natürlich unterstützt, gehen Sie dazu. Wenn dies nicht der Fall ist, verwenden Sie einfach die einfachen Argumente "limit/offset", geben Sie eine Liste zurück und vergessen Sie die Verbindungsspezifikation. Es wurde erstellt, damit Relay Paging in verschiedenen Szenarien automatisch verwalten kann. Es ist also fast immer ein Overkill, wenn Sie Relay nicht verwenden.

+0

Wunderbare Antwort! – Scrotch

+0

@ user3728233 Froh, zu helfen :) – kaqqao

Verwandte Themen