Регистрация  |  Вход

Алгоритм принятия решения при выборе метода пагинации списка на ВФ странице

Всем привет,

как известно пагинациия списка записей важная и большая тема. Важная потом что это именно тот момент когда нам приходится думать сразу о нескольких лимитах, и большая т.к. существует несколько методов пагинации, и у каждого есть свои недостатки и достоинства. Для начала коротко перечислю их, вы добавляйте:

1. Фронт -энд пагинация:
1.1 Косметическая (фейк-пагинация) - через JS плагин, по факту весь список вываливается на страницу со всеми вытекающими.
1.2 Истинная - через РЕСТ апи, веб-сервисы или ремоут-экшинс.

2. Бек-энд пагинация:
1.1 на OFFSET-е.
1.2 на стандартном лист контроллере (по факту это тоже фейк-пагинация т.к. все записи одним махом забираются в переменную типа СтандКонтролера которая идет прямиком в СтатВью со всеми вытекающими).
1.3 полностью кастомная пагинация на переменной-счетчике.

и при выборе нужно идти от простого варианта к сложному учитывать такие факторы как РидОнли возможность и сколько максимально можно получить в список записей, в некоторых случаях все просто, так как выбираемых записей по их природе не может больше небольшого количества.

ну и вопрос в студию:

есть ли у вас какой то алгоритм принятия решения при выборе метода пагинации, логическая схема с ключевыми вопросами/моментами, которые нужно принять во внимание при выборе, чтобы прийти к полностью подходящему и при этом самому простому решению пагинации?

Всем привет,

как известно пагинациия списка записей важная и большая тема. Важная потом что это именно тот момент когда нам приходится думать сразу о нескольких лимитах, и большая т.к. существует несколько методов пагинации, и у каждого есть свои недостатки и достоинства. Для начала коротко перечислю их, вы добавляйте:

1. Фронт -энд пагинация:
1.1 Косметическая (фейк-пагинация) - через JS плагин, по факту весь список вываливается на страницу со всеми вытекающими.
1.2 Истинная - через РЕСТ апи, веб-сервисы или ремоут-экшинс.

2. Бек-энд пагинация:
1.1 на OFFSET-е.
1.2 на стандартном лист контроллере (по факту это тоже фейк-пагинация т.к. все записи одним махом забираются в переменную типа СтандКонтролера которая идет прямиком в СтатВью со всеми вытекающими).
1.3 полностью кастомная пагинация на переменной-счетчике.

и при выборе нужно идти от простого варианта к сложному учитывать такие факторы как РидОнли возможность и сколько максимально можно получить в список записей, в некоторых случаях все просто, так как выбираемых записей по их природе не может больше небольшого количества.

ну и вопрос в студию:

есть ли у вас какой то алгоритм принятия решения при выборе метода пагинации, логическая схема с ключевыми вопросами/моментами, которые нужно принять во внимание при выборе, чтобы прийти к полностью подходящему и при этом самому простому решению пагинации?


Den Brown
2. Бек-энд пагинация:
1.1 на OFFSET-е.

Ни в коем случае! Нельзя сделать OFFSET после 2000 записей, что делает его абсолютно безполезной ерундой
https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_offset.htm


Для пагинации в SF всегда используется StandardSetController (тут тоже есть по OFFSET, но лучше это проигнорить)
https://developer.salesforce.com/page/Paginating_Data_for_Force.com_Applications

[quote="Den Brown"]
2. Бек-энд пагинация:
1.1 на OFFSET-е.
[/quote]

Ни в коем случае! Нельзя сделать OFFSET после 2000 записей, что делает его абсолютно безполезной ерундой
https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_offset.htm


Для пагинации в SF всегда используется StandardSetController (тут тоже есть по OFFSET, но лучше это проигнорить)
https://developer.salesforce.com/page/Paginating_Data_for_Force.com_Applications






Всегда фронтэнд. И не важно как вы получаете записи все сразу или пачками. И соответственно сортировка по полям выборки.

Всегда фронтэнд. И не важно как вы получаете записи все сразу или пачками. И соответственно сортировка по полям выборки.

Когда я разбирался с пангинацией пришел к выводу что лучше чем StandardSetController нету,хотя там есть не плохая альтернатива.
StandardSetController для него отрабатывает DataBaseQueryLocator который может вернуть до 50 милионов, я так понимаю что он еще не кушает heap size, но 10 000 записей это ограничение для работы с одним сетом,Я еще видел статью где реализовывали интерфейс iterator для пангинации но смысла большого в этом не увидел.

Когда я разбирался с пангинацией пришел к выводу что лучше чем StandardSetController нету,хотя там есть не плохая альтернатива.
StandardSetController для него отрабатывает DataBaseQueryLocator который может вернуть до 50 милионов, я так понимаю что он еще не кушает heap size, но 10 000 записей это ограничение для работы с одним сетом,Я еще видел статью где реализовывали интерфейс iterator для пангинации но смысла большого в этом не увидел.

wilder
Всегда фронтэнд. И не важно как вы получаете записи все сразу или пачками. И соответственно сортировка по полям выборки.

а view state не свалится ? или туда поподают только переменные апекса?

[quote="wilder"]Всегда фронтэнд. И не важно как вы получаете записи все сразу или пачками. И соответственно сортировка по полям выборки.[/quote]
а view state не свалится ? или туда поподают только переменные апекса?

Sergey Prichepo
а view state не свалится ? или туда поподают только переменные апекса?

=)

[quote="Sergey Prichepo"]а view state не свалится ? или туда поподают только переменные апекса?[/quote]
=)

Gres

=)
=)

[quote="Gres"][/quote]
=)
=)

В viewstate это засоленное сериализованное состояние контроллера.
Если ты делаешь веб сервис, то состояние естественно нигде не хранится.

В viewstate это засоленное сериализованное состояние контроллера.
Если ты делаешь веб сервис, то состояние естественно нигде не хранится.

Gres
В viewstate это засоленное сериализованное состояние контроллера.

это я понимаю можно написать transient для листа и не боятся рендера, я про то что если одновременно придет больше количество данных не станели плохо ? Зная wilder он может сказать что это надо засунуть var js переменную и спокойно по ней ходить.

[quote="Gres"]В viewstate это засоленное сериализованное состояние контроллера.[/quote]
это я понимаю  можно написать transient для листа и не боятся рендера, я про то что если одновременно придет больше количество данных не станели плохо ? Зная wilder он может сказать что это надо засунуть var js переменную и спокойно по ней ходить.

Gres
Если ты делаешь веб сервис, то состояние естественно нигде не хранится.

Web service если не ошибаюсь api кушают если поднимать из Js queryMOre,в задаче про это ничего не было.

[quote="Gres"]Если ты делаешь веб сервис, то состояние естественно нигде не хранится.[/quote]
Web service если не ошибаюсь api кушают если поднимать из Js queryMOre,в задаче про это ничего не было.

Кстати про web-service возвращаясь к твоей статья я правильно понимаю что твоё решение работает,прямо прямо пропорционально тому количеству страниц которое может сгенерить salesforce server в 24 часа? то есть примерно около миллион cтарниц в сутки или там еще от лицензий зависит ?

Кстати про web-service возвращаясь к твоей статья я правильно понимаю что твоё решение работает,прямо прямо пропорционально тому количеству страниц которое может сгенерить salesforce server в 24 часа? то есть примерно около миллион cтарниц в сутки или там еще от лицензий зависит ?

Sergey Prichepo
Web service если не ошибаюсь api кушают

Ну это все зависит, как ты его реализуешь?

[quote="Sergey Prichepo"]Web service если не ошибаюсь api кушают[/quote]
Ну это все зависит, как ты его реализуешь?

Sergey Prichepo
если одновременно придет больше количество данных не станели плохо

Ну если у клиента слабый комп, то, возможно, и станет.

[quote="Sergey Prichepo"]если одновременно придет больше количество данных не станели плохо[/quote]
Ну если у клиента слабый комп, то, возможно, и станет.

Sergey Prichepo
Web service если не ошибаюсь api кушают если поднимать из Js

Если это Rest то вроде не кушает. Тем более они щас исправили косяк с субдоменами.

И кстати всегда можно замутить rest вебсервис по технологии Gres'a точно ничего не кушает :)

[quote="Sergey Prichepo"]Web service если не ошибаюсь api кушают если поднимать из Js [/quote]

Если это Rest то вроде не кушает. Тем более они щас исправили косяк с субдоменами.

И кстати всегда можно замутить rest вебсервис по технологии Gres'a точно ничего не кушает :)

Gres
Ну это все зависит, как ты его реализуешь?

Понятно что не через SOAP, хотя мне кто-то рассказывал что есть js бибилиотека вроде TKRemoteJs которая апи salesforce не кушает. Насчет рест не знал что не кушает апи.

[quote="Gres"]
Ну это все зависит, как ты его реализуешь?[/quote]
Понятно что не через SOAP, хотя мне кто-то рассказывал что есть js бибилиотека вроде TKRemoteJs которая апи salesforce не кушает. Насчет рест не знал что не кушает апи. 

wilder
И кстати всегда можно замутить rest вебсервис по технологии Gres'a точно ничего не кушает :)

Клиенту я наверное бы постремался такое предлагать,вот вопрос вебсервис по технологии Gres'a Работает пропорционально количеству страниц которое отдает salesforce server в 24 часа ?

[quote="wilder"]

И кстати всегда можно замутить rest вебсервис по технологии Gres'a точно ничего не кушает :)[/quote]

Клиенту я наверное бы постремался такое предлагать,вот вопрос  вебсервис по технологии Gres'a Работает пропорционально количеству страниц которое отдает salesforce server в 24 часа ?

На счет пагинации. Я за фронтенд вариант от wilder - получать все данные на js стороне и уже по ним бегать.
Но с небольшим дополнением. В случае ОЧЕНЬ больших выборок я делаю ограничение и поиск на бэкенд стороне apex.
Я уже про это писал много раз на форуме. Пользователю нафиг не нужно пагинация по 10 000 или даже 1 000 000 записей - заи(устанет) пагинировать. Я достаю 1000 записей на страницу - делаю фронтенд пагинацию и честно предупреждаю пользователя что выборка ограничена 1000 записями и надо уточнить критерии поиска. PROFIT

На счет пагинации. Я за фронтенд вариант от wilder - получать все данные на js стороне и уже по ним бегать. 
Но с небольшим дополнением. В случае ОЧЕНЬ больших выборок я делаю ограничение и поиск на бэкенд стороне apex.
Я уже про это писал много раз на форуме. Пользователю нафиг не нужно пагинация по 10 000 или даже 1 000 000 записей - заи(устанет) пагинировать. Я достаю 1000 записей на страницу - делаю фронтенд пагинацию и честно предупреждаю пользователя что выборка ограничена 1000 записями и надо уточнить критерии поиска. PROFIT

ну если у фронт-эрд пагинации столько серьезных сторонников, то попробую более подробно разложить эти методы по группам:

Синхронная:
(1) выгружай все записи на страницу, а там пагинируй косметическим пагинатором (лимиты 1000 и СтайтВью - но если ограниченная по возможному количеству природа записей позволяет, то сойдет для сельской местности);

Асинхронная:
(вариант с Аджакс перерисовкой секции не разбирается, так как это просто вариант бек-энд пагинации)

(1) на ремоут экшенс, удобно, весь вопрос действуют ли здесь лимиты 1000 и СтайтВью, но думаю, что нет:
(1-1) подавай все записи на страницу а там пагинируй косметическим пагинатором;
(1-2) истинная пагинация с помощью кверения записей пачками, и здесь снова к вопросу, а как обеспечивается квериние пачками на сервере.

(2) на РЕСТ-апи (есть свои лимиты), веб-сервисах (вероятно есть свои лимиты), РЕСТ страницах Греса:
(2-1) подавай все записи на страницу а там пагинируй косметическим пагинатором, можно легко выложить тысячи записей, но идет приличная загрузка браузера, но кого это волнует...
(2-2) истинная пагинация с помощью кверения записей пачками, и здесь снова к вопросу, а как обеспечивается квериние пачками на сервере.

вспомогательный костыль: рубить список ЛИМИТ топором: просто, надежно, но мне почему то не нравится.

вариант решения проблемы длинного списка: создать в квери обязательные условия, ограничивающие кол-во выводимых записей, например только по месяцам и никак не за год.

кстати, заметил, что вы не рассматриваете варианты, и у вас нет алгоритма выбора, а просто всегда пользуетесь всегда одним и тем же методом.

ну если у фронт-эрд пагинации столько серьезных сторонников, то попробую более подробно разложить эти методы по группам:

Синхронная:
(1) выгружай все записи на страницу, а там пагинируй косметическим пагинатором (лимиты  1000 и СтайтВью - но если ограниченная по возможному количеству природа записей позволяет, то сойдет для сельской местности);

Асинхронная:
(вариант с Аджакс перерисовкой секции не разбирается, так как это просто вариант бек-энд пагинации)

(1) на ремоут экшенс, удобно, весь вопрос действуют ли здесь лимиты 1000 и СтайтВью, но думаю, что нет:
(1-1) подавай все записи на страницу а там пагинируй косметическим пагинатором;
(1-2) истинная пагинация с помощью кверения записей пачками, и здесь снова к вопросу, а как обеспечивается квериние пачками на сервере.

(2) на РЕСТ-апи (есть свои лимиты), веб-сервисах (вероятно есть свои лимиты), РЕСТ страницах Греса:
(2-1) подавай все записи на страницу а там пагинируй косметическим пагинатором, можно легко выложить тысячи записей, но идет приличная загрузка браузера, но кого это волнует...
(2-2) истинная пагинация с помощью кверения записей пачками, и здесь снова к вопросу, а как обеспечивается квериние пачками на сервере.

вспомогательный костыль: рубить список ЛИМИТ топором: просто, надежно, но мне почему то не нравится.

вариант решения проблемы длинного списка: создать в квери обязательные условия, ограничивающие кол-во выводимых записей, например только по месяцам и никак не за год.

кстати, заметил, что вы не рассматриваете варианты, и у вас нет алгоритма выбора, а просто  всегда пользуетесь всегда одним и тем же методом.



Den Brown
кстати, заметил, что вы не рассматриваете варианты, и у вас нет алгоритма выбора, а просто всегда пользуетесь всегда одним и тем же методом

Используем то что работает и проверено не один раз :)

[quote="Den Brown"]кстати, заметил, что вы не рассматриваете варианты, и у вас нет алгоритма выбора, а просто всегда пользуетесь всегда одним и тем же методом[/quote]

Используем то что работает и проверено не один раз :)

Den Brown
кстати, заметил, что вы не рассматриваете варианты, и у вас нет алгоритма выбора, а просто всегда пользуетесь всегда одним и тем же методом.

Зачем какой-то алгоритм использовать? Делай то что работает.

[quote="Den Brown"]кстати, заметил, что вы не рассматриваете варианты, и у вас нет алгоритма выбора, а просто всегда пользуетесь всегда одним и тем же методом.[/quote]
Зачем какой-то алгоритм использовать? Делай то что работает.