С TypeORM getManyWithCount, как генерировать PageInfo для разбивки на страницы - PullRequest
1 голос
/ 22 марта 2019

Я реализую разбиение на страницы в стиле Relay для сервера GraphQL и использую отличную библиотеку TypeORM.

Я хочу найти лучший способ создания объекта PageInfo после запроса:

type PageInfo {
  endCursor: String
  hasNextPage: Boolean!
  hasPreviousPage: Boolean!
  startCursor: String
}
if (before) {
  qb = qb.andWhere('note.notedAt <=(:before)', { before });
}

if (after) {
  qb = qb.andWhere('note.notedAt >(:after)', { after });
}

qb = qb.take(args.take)
const [entities, totalEntitesCount] = qb.getManyWithCount()

Итак, с этой информацией, как мы вычисляем hasNextPage и hasPreviousPage

Мое нынешнее мышление:

function createPageInfo(
  noteEdges: Array<{ node: Note; cursor: Date }>,
  totalCount: number,
  findOptions: NoteFindOptions
) {

  let hasNextPage: boolean;
  let hasPreviousPage: boolean;

  if(findOptions.after) {
    hasPreviousPage = true;
    hasNextPage = (noteEdges.length < totalCount)
  } else if (findOptions.before) {
    hasNextPage = true;
    hasPreviousPage = (noteEdges.length < totalCount)
  } else {
    hasPreviousPage = false;
    hasNextPage = (noteEdges.length < totalCount)
  }

  return {
    startCursor: noteEdges[0].cursor,
    endCursor: noteEdges[noteEdges.length - 1].cursor,
    hasNextPage,
    hasPreviousPage
  };
}

1 Ответ

1 голос
/ 26 апреля 2019

Это будет в значительной степени работать, но имейте в виду, что totalEntitiesCount - это не количество всех записей в таблице, а только тех, которые соответствуют условию вашего курсора (note.notedAt > :after или note.notedAt <= :before). gb.getManyAndCount() внутренне удаляет любые orderBy, limit, skip и т. Д., Но сохраняет условия, в которых находится (см. этот файл ).

Кроме того, IDK при ретрансляции на курсор before / after для определения hasNext / hasPrev соответственно в порядке. Если вы передадите первый идентификатор или дату в таблице курсору after, вы все равно получите hasPreviousPage = true, но на самом деле их не будет.

Вы можете увидеть мой взгляд на это в этой сути . Идея состоит в том, чтобы сначала запросить результаты, а затем создать запрос подсчета для totalCount и элементов до и после результатов. Запрос количества клонируется перед применением условий. Это позволяет сохранить любые предыдущие условия, но избежать состояния курсора. В качестве бонуса вы получите количество следующих / предыдущих предметов.

Это все еще WIP, я еще не проверял.

...