PostgreSQL для динамического списка

Metadata.js хранит документы и справочники в Couchdb. NoSQL хорошо справляется с задачами разделения, репликации и отказоустойчивого доступа к данным. В Couchdb есть весьма мощные map-reduce и mango индексы, но фильтрация длинных списков по произвольным условиям и вычисление агрегатов, в SQL работает эффективнее. Мы, с самого начала проекта metadata.js, придерживались принципа: берём лучшее из всех современных технологий, не ограничиваясь инструментарием какой-то одной платформы:

Как это работает

Новый индексер встроен в рендер-сервер отчетов. Позже, когда устаканется API, перенесём абстрактные классы и методы в adapter-postgres. API для динамического списка решили сделать совместимым с mango запросами Couchdb. Это позволяет клиентской части не задумываться о синтаксисе сервера. В автономном режиме, приложение построит динсписок по данным IDB браузера. С короткими списками (до 50 тыс. записей), неплохо справится mango Couchdb, длинные отфильтрует Postgres.

Первым, pg-indexer подключили к документу Расчет сервиса Заказ дилера. Включается новый режим в индивидуальных настройках для каждого пользователя: Как включить

Оcновные элементы управления: Список

При нажатии кнопки настроек, видим редактор компоновки динсписка: Список

В типовые настройки включен отбор пр статусам заказа, подразделению и автору документа. Отбор - множественный, то есть, можно включить в список документы нескольких менеджеров или подразделений. Стартовые отборы для полноправных и обычных пользователей - отличаются.

Текущая строка и другие настройки отбора

Существенным недостатком предудущих редакций наших динсписков, была потеря текущей строки и значений отбора при возврате в список из формы документа. Новый динсписок не теряет контекста при переключении между формами. Если пользователь указал некий диапазон дат и список подразделений и переключился из списка заказов в оплаты или отчеты, то вернувшись в форму списка заказов, он получит те же значения фильтра, которые были заданы ранее.

Полнотекстовый поиск

Для поиска документов по строке, задействован индекс fts gist (PostgreSQL v11). В индекс включены основной и дополнительный номера документа, все поля описания клиента дилера, номер телефона и комментарий к заказу. Поиск несколько отличается от привычного фильтра по вхождению строки и больше похож на web-поиск. Поддержаны кавычки и минус-слова, но список по нескольким буквам - не сформируется. Например, заказ с номером 00-777-0019 будет найден по строкам 00-777, 0019, полной строке 00-777-0019, но не будет найден, если указать 019. Рустем и Рустам - синонимы, Изделие и Изделия - синонимы, но подстрока "изд", вернёт пустой список. Поддержаны падежи. Марину, Марине, Мариной - вернут заказы, в тексте которых есть "Марина". Заметных задержек при фильтрации списков в единицы миллионов документов - не выявлено. Надеюсь, синтаксис полнотекстового поиска понравится пользователям.