В настоящее время я не вижу существующей поддержки разбивки на страницы в библиотеке graphql-java . У него есть некоторая базовая поддержка ретрансляции, в которой мы можем создать connection
, рекомендованный Facebook способ реализации разбивки на страницы.
Это метод, который помогает добиться этого. Однако без документации мне трудно понять, как работает эта функция. Может ли кто-нибудь разбить шаги, которые они предприняли бы для добавления поддержки разбивки на страницы, если у них уже есть существующая модель, которая позволяет выполнять базовые запросы, такие как Add
, delete
, fetch
и т. Д., С использованием библиотеки graphql-java?
GraphQL: как реализовать разбиение на страницы с помощью graphQL-java?
Ответы:
Вам даже не нужны ретрансляционные соединения для поддержки разбивки на страницы. Ваш запрос может просто принять номер страницы и размер (или предел / смещение) в качестве аргументов и вернуть список - готово. Но, если вы хотите, чтобы релейное соединение, например, Book
введите что-то вроде следующего:
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());
В результате у вас будет тип BookConnection
, соответствующий спецификации подключения реле а>.
Что касается примера с базовым GraphQL, у вас есть простое веб-приложение, которое здесь.
Спецификация подключения, естественно, соответствует хранилищу данных, которое поддерживает разбиение на страницы с помощью курсора, но требует некоторого творчества при использовании с разными стилями разбиения на страницы.
1) Если вы хотите использовать простую разбивку по страницам на основе смещения, вы можете решить рассматривать after
как смещение (что означает, что будет передано число), а first
как ограничение:
SELECT * FROM ORDER BY timestamp OFFSET $after LIMIT $first
То же для before
и last
, только в другом направлении.
2) Другой способ - рассматривать _9 _ / _ 10_ как последнее увиденное значение столбца сортировки (поэтому будет передано фактическое (скрытое) значение):
SELECT * FROM ORDER BY timestamp WHERE timestamp > $after LIMIT $first
Я также рекомендую вам взглянуть на мой проект graphql-spqr с пример приложения, которое упрощает разработку API GraphQL.
Например, вы должны создать такой результат с разбивкой на страницы:
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;
}
}
Есть много других способов создать экземпляр Page
, это самый простой.
Затем вы сгенерируете схему из своего класса Java:
GraphQLSchema schema = new GraphQLSchemaGenerator()
.withOperationsFromSingleton(new BookService())
.generate();
GraphQL graphQL = GraphQLRuntime.newGraphQL(schema).build();
И выполните запрос:
ExecutionResult result = graphQL.execute("{books(first:10, after:\"20\") {" +
" pageInfo {" +
" hasNextPage" +
" }," +
" edges {" +
" cursor, node {" +
" title" +
"}}}}");
Но, опять же, если вы не используете Relay, нет необходимости усложнять вещи. Если ваше хранилище естественно поддерживает разбиение на страницы на основе курсора, сделайте это. Если это не так, просто используйте простые аргументы ограничения / смещения и верните список и забудьте о спецификации подключения. Он был создан, чтобы позволить Relay автоматически управлять разбивкой по страницам в различных сценариях, поэтому это почти всегда полный перебор, если вы не используете Relay и / или БД с разбивкой на страницы на основе курсора.
Page<Book>
). 11.01.2019