Size: a a a

GraphQL — русскоговорящее сообщество

2020 March 11

t

toriningen in GraphQL — русскоговорящее сообщество
курсор просто задает точку отсчета, вместо "10 записей, начиная от записи №2761" будет "10 записей, начиная от записи с pk=foo@bar.com"
источник

t

toriningen in GraphQL — русскоговорящее сообщество
буду рад прояснить какие-то моменты, если в моем путанном объяснении остались пробелы
источник

A1

Art 141 in GraphQL — русскоговорящее сообщество
Не обязательно свои. Если видели просто примеры, то тоже подойдёт.

У меня почти всегда все решения бьются на пункте "главное, чтобы сортировка была стабильной".
Из предложений, вроде гитхаба и подобных api, видел сортировки по id и timestamp создания записи. То есть довольно уникальным вещам.
По моей практике бизнесу это почти никогда не достаточно. И им надо, например, по не уникальным названиям или создателю записи отсортировать.

Про курсоры на первые/последний 5 страниц не совсем понял. То есть всё равно получаем из базы записей с этих страниц и генерируем страницы? Относительно большой минус по сравнению с тривиальным расчетом страниц при limit/offset подходе.
источник

t

toriningen in GraphQL — русскоговорящее сообщество
Art 141
Не обязательно свои. Если видели просто примеры, то тоже подойдёт.

У меня почти всегда все решения бьются на пункте "главное, чтобы сортировка была стабильной".
Из предложений, вроде гитхаба и подобных api, видел сортировки по id и timestamp создания записи. То есть довольно уникальным вещам.
По моей практике бизнесу это почти никогда не достаточно. И им надо, например, по не уникальным названиям или создателю записи отсортировать.

Про курсоры на первые/последний 5 страниц не совсем понял. То есть всё равно получаем из базы записей с этих страниц и генерируем страницы? Относительно большой минус по сравнению с тривиальным расчетом страниц при limit/offset подходе.
ну, сортировка может быть стабильной в любом случае. Если есть timestamp, хорошо. Если нет timestamp, то стабильность можно обеспечить путем вторичной сортировки по тому же первичному ключу (или по его хэшу, если возможность вычислить относительный порядок ключей нежелательна), который, я подразумеваю, есть всегда. Т.е. после любой пользовательской сортировки, которая возможно имеет повторяющиеся ключи, потом сортировать по тайстампу (если есть), потом по хешу первичного ключа - и стабильность достигнута.
источник

t

toriningen in GraphQL — русскоговорящее сообщество
теперь что касается 5 первых-последних 5 страниц. Чистого limit offset вам в любом случае недостаточно, чтобы узнать последние записи, т.к. насколько мне известно, такой вещи как "offset с конца" нет. Если вы считаете количество записей одним запросом, затем делаете offset уже от этого числа, то вы с тем же успехом можете получить и первичный ключ последней записи одним запросом.
источник

t

toriningen in GraphQL — русскоговорящее сообщество
В простом случае, если точная навигация не принципиальна, вы, конечно, можете использовать оффсеты, и потом уже идти оттуда по курсорам - гибридный подход. Если нужна точная навигация, то вы можете получить опорные записи под каждую страницу - вам не нужно получать все записи, только те, которые будут в начале (или конце) каждой страницы.
источник

t

toriningen in GraphQL — русскоговорящее сообщество
если у вас есть индекс по вашему ключу сортировки (надеюсь, он у вас есть), это быстрая операция.
источник

t

toriningen in GraphQL — русскоговорящее сообщество
если ваши режимы сортировки поддерживают обратимость, то все еще проще.
источник

t

toriningen in GraphQL — русскоговорящее сообщество
заранее извиняюсь, если какие-то утверждения кажутся безосновательными, я сужу по своему домену, и не знаю вашей специфики
источник

A1

Art 141 in GraphQL — русскоговорящее сообщество
Если вы считаете количество записей одним запросом, затем делаете offset уже от этого числа, то вы с тем же успехом можете получить и первичный ключ последней записи одним запросом.

Количество записей зачастую и так надо на фронте показать.
А вот прорабатывать логику "сгенерировать курсор для 10 объекта с конца, для 20 объекта с конца и тд..." как-то неудобно. Плюс надо понимать в какой момент эти страницы могли уже пересечься. Плюс как рассчитать номера самих страниц, чтобы их вывести пользователю... В общем куча вопросов и без примеров сложновато.
С нашей командой фронтов и мобильных разрабов так и не нашли удобства в курсорах.

В принципе в этой статье https://use-the-index-luke.com/no-offset есть примеры использования подобных курсоров в фреймворках. Надо будет покурить примеры из них. Быстро пробежавшись не увидел решения для вывода курсоров к наборам страниц, а не бесконечных курсоров.
источник

t

toriningen in GraphQL — русскоговорящее сообщество
Art 141
Если вы считаете количество записей одним запросом, затем делаете offset уже от этого числа, то вы с тем же успехом можете получить и первичный ключ последней записи одним запросом.

Количество записей зачастую и так надо на фронте показать.
А вот прорабатывать логику "сгенерировать курсор для 10 объекта с конца, для 20 объекта с конца и тд..." как-то неудобно. Плюс надо понимать в какой момент эти страницы могли уже пересечься. Плюс как рассчитать номера самих страниц, чтобы их вывести пользователю... В общем куча вопросов и без примеров сложновато.
С нашей командой фронтов и мобильных разрабов так и не нашли удобства в курсорах.

В принципе в этой статье https://use-the-index-luke.com/no-offset есть примеры использования подобных курсоров в фреймворках. Надо будет покурить примеры из них. Быстро пробежавшись не увидел решения для вывода курсоров к наборам страниц, а не бесконечных курсоров.
вам не нужно рассчитывать номера страниц - вы просто встраиваете их в курсор
источник

t

toriningen in GraphQL — русскоговорящее сообщество
т.е. добавьте к курсору еще и номер страницы. это ведь вопрос исключительно представления
источник

A1

Art 141 in GraphQL — русскоговорящее сообщество
Как?
источник

A1

Art 141 in GraphQL — русскоговорящее сообщество
cursor: filters+sort+page+per_page ?
источник

t

toriningen in GraphQL — русскоговорящее сообщество
я сейчас скину, что у нас в курсор включено
источник

t

toriningen in GraphQL — русскоговорящее сообщество
так, судя по коду, мы в выхлоп запроса graphql отдаем следующее:

- элементы на странице
- общее количество записей
- номер страницы
- курсор следующей страницы (первичный ключ, фильтры, сортировка + направление сортировки, направление курсора)
- курсор предыдущей страницы (--"--)
- курсор первой страницы (--"--)
- курсор последней страницы (--"--)
источник

t

toriningen in GraphQL — русскоговорящее сообщество
сам курсор - простой jwt
источник

t

toriningen in GraphQL — русскоговорящее сообщество
с подписью, но без срока действия
источник

t

toriningen in GraphQL — русскоговорящее сообщество
номер страницы не вычисляется, кроме как +1 и -1 от текущего номера страницы
источник

t

toriningen in GraphQL — русскоговорящее сообщество
в принципе, т.к. оно только для презентации используется, то отдавать номера страниц можно произвольные
источник