Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дублирование пограничных данных, при постраничном выводе 
:(
    Опции темы
Aliance
Дата 13.12.2012, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Входные данные: есть ньюсфид постов (пусть будет как вконтакте). Допустим, за раз выводится по 5 записей (0-5). При скроллинге к концу подгружается следующая страница (5-10). Так же (с помощью вебсокетов) каждый новый пост автоматически prepend`ится в начало ньюсфида.

Проблема: находясь на первой странице и видя 5 первых постов (0-5), дожидаемся появления нового и его prepend`а в начало (1 + [0-5]), после чего скроллим страничку, подгружается вторая с 5 постами (5-10), но начиная с начала списка, т.е. учитывая появление нового. Таким образом, последний пост первой страницы дублируется первым постом на второй странице.

Выглядит примерно так:
1) имеем
пост №1 (страница №1)
пост №2 (страница №1)
пост №3 (страница №1)
пост №4 (страница №1)
пост №5 (страница №1)

2) подгружается автоматически новый пост и помещается в начало списка:
новый подгруженный и prepend`енный пост
пост №1 (страница №1)
пост №2 (страница №1)
пост №3 (страница №1)
пост №4 (страница №1)
пост №5 (страница №1)

3) скроллим сниз и подгружаем посты второй страницы
новый подгруженный и prepend`енный пост
пост №1 (страница №1)
пост №2 (страница №1)
пост №3 (страница №1)
пост №4 (страница №1)
пост №5 (страница №1)

пост №5 (страница №2)
пост №6 (страница №2)
пост №7 (страница №2)
пост №8 (страница №2)
пост №9 (страница №2)


Я вижу сразу несколько решений, хотелось бы посовещаться, какое бы выбрали вы и почему.

Тему отзеркалил в разделы и по php, и по js, т.к. тут используются обе технологии.
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 13.12.2012, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Веди пагинацию по идам сообщений.
тогда дублирования не будет


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Aliance
Дата 13.12.2012, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Цитата(Fortop @  13.12.2012,  16:31 Найти цитируемый пост)
идам

фидам / видам / IDам?
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 13.12.2012, 15:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Если для идентификации поста - начала страницы использовать его timestamp добавления, то никаких проблем нет.
Для подгрузки старых(не отображенных) постов используем время последнего отображенного поста.

что-то навроде
Код

select * from posts where timestamp<TMESTAMP limit 5;




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
bars80080
Дата 13.12.2012, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(Aliance @  13.12.2012,  15:32 Найти цитируемый пост)
фидам / видам / IDам? 

IDам

загружается список с какими-то id, и далее при запросе отправляется номер последнего. where `id`>

Добавлено через 21 секунду
TIMESTAMP всё-таки не обеспечит идеальную точность
PM MAIL WWW   Вверх
Fortop
Дата 13.12.2012, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(Aliance @  13.12.2012,  15:32 Найти цитируемый пост)
фидам / видам / IDам? 

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

С одним только таймштампом могут быть определенные сложности при агрегации очень активных источников (когда на единицу времени будет приходится большая куча сообщений)

Это сообщение отредактировал(а) Fortop - 13.12.2012, 15:49


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Aliance
Дата 13.12.2012, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Наверное мое упущение, что я не упомянул ограничения.
Проблема в том, что данные получаются не из БД напрямую, а из Сишного демона, так что править его не вариант. Нужно решить проблему малой кровью. Мне в голову пришло следующее:

На js заводим переменную
Код

var loadedPosts = 0;


далее при каждой подгрузке нового поста инкрементим ее, вызовом примерно такой функции:
Код

var nextLoadedOnscrollPage = 2;
var loadedPosts = 0;
var postLimit = <?=POST_LIMIT?>; // 5

function onloadNewPostCallback() {
   loadedPosts++;
   if (loadedPosts == postLimit) {
      loadedPosts = 0;
      nextLoadedOnscrollPage++;
   }
}


При подгрузки новой страницы мы передаем не только требуемую к загрузке страницу (nextLoadedOnscrollPage), но и кол-во уже подгруженных постов (loadedPosts).
Получается, если loadedPosts == 0, то грузим все как обычно (если загружено постов на новую страницу, просто увеличиваем требуемую страницу), иначе же к оффсету добавляем это число. По идеи будет работать как нужно и малой кровью, не трогая выборку.
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 13.12.2012, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(Aliance @  13.12.2012,  16:20 Найти цитируемый пост)
При подгрузки новой страницы мы передаем не только требуемую к загрузке страницу (nextLoadedOnscrollPage), но и кол-во уже подгруженных постов (loadedPosts).

Что это даст?

Цитата(Aliance @  13.12.2012,  16:20 Найти цитируемый пост)
Проблема в том, что данные получаются не из БД напрямую, а из Сишного демона

Какое это имеет значение?
Или записи идут потоком и никак не идентифицируются? 



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Arantir
Дата 13.12.2012, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



Aliance, а когда новых постов будет 5 и получится что на второй странице должны погрузиться посты 11-10? =)

Я вот не понимаю, каким образом приложение получает эти пачки постов. Ну из демона. А там есть возможность указать диапазон постов? Или только по номеру страницы? Или как-то еще?

Это сообщение отредактировал(а) Arantir - 13.12.2012, 20:13


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Aliance
Дата 14.12.2012, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Цитата(Fortop @  13.12.2012,  20:47 Найти цитируемый пост)
Что это даст?

То, что мы можем сдвигать offset на это переданное значение.

Цитата(Fortop @  13.12.2012,  20:47 Найти цитируемый пост)
Какое это имеет значение?
Или записи идут потоком и никак не идентифицируются? 

Значение в том, что задачу нужно решить не изменением демона.

Цитата(Arantir @  13.12.2012,  21:12 Найти цитируемый пост)
Aliance, а когда новых постов будет 5 и получится что на второй странице должны погрузиться посты 11-10? =)

Я же написал псевдокод, где указал, что если подгруженных постов > лимит, то ставим подгруженных постов = 0, а следующую загружаемую страницу увеличиваем на единицу (то есть как бы пропускаем одну страницу, т.к. она уже загружена)

Цитата(Arantir @  13.12.2012,  21:12 Найти цитируемый пост)
Я вот не понимаю, каким образом приложение получает эти пачки постов. Ну из демона. А там есть возможность указать диапазон постов? Или только по номеру страницы? Или как-то еще?

PHP скрипту на вход передается только page, который нужно загрузить. На его основе определяется offset и limit. 
Демону на вход передается только offset и limit.
Я предлагаю передавать php скрипту еще и кол-во уже подгруженных постов, чтобы добавлять их к определенному ранее offset`у.
PM MAIL WWW ICQ Skype   Вверх
Aliance
Дата 18.12.2012, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Я немного перепутал - проблема возникала ровно наоборот, когда новая запись в хранилище появилась, а в ленте у клиента еще нет - тогда возникала такая ситуация. от такого не спастись предложенным мною методом, т.к. loadedPosts еще будет равно нулю. Пришлось пока решить проблему костылём - после загрузки фидов, пробегаюсь по всем js`ом и удаляю дубликаты с одинаковым ID.
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 19.12.2012, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Aliance, ну неужели твой демон не возвращает никакого уникального ключа с записью? ну елки палки smile


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Aliance
Дата 19.12.2012, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



ID записи, безусловно возвращает. Не пойму, что с того?
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 19.12.2012, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(Aliance @  19.12.2012,  14:27 Найти цитируемый пост)
ID записи, безусловно возвращает. Не пойму, что с того? 

Ну и ориентируйся по нему для своей пагинации.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ksnk
Дата 19.12.2012, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Aliance @  19.12.2012,  14:27 Найти цитируемый пост)
ID записи, безусловно возвращает. Не пойму, что с того? 

вообще говоря, несложно сформировать список отображенных постов. Тем более что, обычно, новые посты имеют больший ID, чем более старые. Если ID странным и непредсказуемым образом перемешаны, можно дополнить их timestamp'ом добавления поста. Для уникальности и определенности.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0622 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.