UMIhelp

Разработка сайта на UMI.CMS => Настройка системы и модулей => Тема начата: Alexey от 31 Января 2013, 20:59:30

Название: Погрешности в методах фильтрации less, more [selector]
Отправлено: Alexey от 31 Января 2013, 20:59:30
При реализации разного рода задач приходится нередко использовать API, а конкретнее - класс selector.

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

1. Методы фильтрации less, more и т.п., применяемые к полю, имеющему тип "Дата", работают некорректно.

Логичнее всего, как я подумал сначала, подавать дату в timestamp, ведь именно в таком виде она и хранится в БД, однако в таком случае возвращается вообще 0 объектов (хотя по timestamp та же сортировка выполняется корректно).

Вставки кода приведу только с проблемными местами, чтобы не было ничего лишнего:

$element_ldate="1359333515";
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('1c_exchange_date')->more($element_ldate);

При указывании даты в формете "Y-m-d H:i:s" (такой, как мы видим ее в админке, по сути, согласно заданному формату default-date-format в config.ini, секция system) отбор работает, но только с точностью до минут. Для решения задачи учитывать секунды обязательно.

$element_ldate="2013-01-28 00:38:35"";
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('1c_exchange_date')->more($element_ldate);

С less, а также с дополнительной приставкой равенства eq ситуация такая же.

А between, насколько я помню, наоборот, корректно работает с timestamp, а вот такой формат, увы, не переваривает. Естественно, ничего из этого не документировано.

2. Попробовал применить методы less и more для системного поля id.

Тут просто выводим объекты каталога и сортируем их по id по убыванию.

$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->order('id')->desc();

На выходе если выведем id, получим следующее:
3136, 3135, 3134, ..., 258, 257, 256.
Итого: 2659 объектов.

Далее, предположим, мне нужно дополнительно отсечь еще и все объекты, id у которых меньше 3136. Дописываем заветную строчку:

$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('id')->less(3136);
$pages->order('id')->desc();

На выходе получаем:
2806, 2805, 2804, ..., 258, 257, 256.
Итого: 2462 объекта

В итоге погрешность составляет 2659-2462=197~200 объектов при попытке отсеять всего лишь 1 объект.

Для more ситуация ничуть не лучше.

$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$pages->where('id')->more(1000);
$pages->order('id')->desc();

3136, 3135, 3134, ..., 674, 673, 672.

Если вместо 1000 будет, к примеру, 500, то массив вообще остается без изменений, т.е. конечный объект по-прежнему имеет id 256.

C дополнительной приставкой равенства eq ситуация такая же.

Подскажите, что я делаю не так, или действительно такая ошибка имеет место? Может быть она появляется только для поля id?

P.S. Тестирую в standalone файле, результаты вывожу в foreach.




Название: Re:Погрешности в методах фильтрации less, more [selector]
Отправлено: Alexey от 13 Февраля 2013, 20:18:23
Разобрался в обеих проблемах в тот же день, чуть позже могу написать, в чем именно они заключались. Так что вопросы уже не актуальны.
Название: Re:Погрешности в методах фильтрации less, more [selector]
Отправлено: admin от 13 Февраля 2013, 21:18:56
Может вопросы и не актуальны, но буду очень вам признателен, если найдете время описать, в чем же была причина такого поведения системы.