7 Commits

Author SHA1 Message Date
Andrey Epifancev
5db0bd4cee fix(svod2): серверный поиск совпадает с экраном — пустое поле contract_detail не затирает contract_summary (R-30, решение пользователя 08.11)
В v3.svod2_lines counterparty/reference/deadline/comment берутся как COALESCE(detail, summary).
Оракулы (Python, JS, векторы) отбрасывают null при слиянии, legacy_full() снова читает
ответ без параметров. Тесты: пустое поле detail, отсутствие строки detail, перекрытие непустым detail.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 11:45:37 +04:00
Andrey Epifancev
79c841dcaf Merge origin/feat/220 в feat/236 (сервер): свод 2 постранично поверх test (AURORA-1843)
Конфликты summary.py, summary_repository.py, summary_service.py,
test_summary2_related_records_sql.py: сохранены новые методы страниц и фасетов,
режим без параметров идёт по быстрому JSON-пути test (AURORA-1848).
Миграция переименована в 0057 (down_revision 0056); в svod2_lines добавлена
поправка 0050 (СПОД аренды, только ГО). Эталон svod2_legacy_golden перезаписан
под ответ без null-полей; legacy_full оракулов строится прямым вызовом функции.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 11:02:30 +04:00
Andrey Epifancev
c8e957b13d perf(svod2): ускорен серверный поиск свода 2 без изменения результата
Поиск в v3.svod2_lines строил jsonb header || contract_summary || contract_detail на каждую
строку, разворачивал его в jsonb_each и прогонял каждое значение через svod2_casefold, а числа
через svod2_js_number_text. Теперь:
- разбор поисковой строки (числа возможны, нет U+0001, нужные пары таблицы регистра) делается
  один раз в CTE q; раньше при подстановке SQL-функции выражение нормализации p_search
  вычислялось на каждое значение каждой строки;
- значения берутся напрямую из колонок, без jsonb; склеиваются и проверяются одним strpos через
  разделитель U+0001 (со строкой поиска, где есть U+0001, значения проверяются по одному);
- регистр данных приводится только по парам таблицы, чей результат есть в строке поиска;
- числа в текст JS переводятся, только если все символы строки возможны в записи числа, и
  только если по остальным значениям совпадения нет; нули без обращения к plpgsql;
- v_svod2_go и v_svod2_rf с SET jit = off (JIT плана добавлял сотни миллисекунд).

Тесты: поиск svod2_lines равен прежнему поиску по jsonb (эталонный SQL в тесте) на обоих листах
для 55 строк, включая числа, экспоненту, NaN и Infinity, стык значений, U+0001, ненормализованные
строки; состав колонок contract_* закреплён тестом.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 14:07:01 +04:00
Andrey Epifancev
f5bccc5ba2 test(api): свод 2 — поиск из пробелов в сверке с оракулом
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 21:50:27 +04:00
Andrey Epifancev
e81df1d71e fix(api): свод 2 — варианты фильтров без коррелированного подзапроса поиска, откат засева в teardown
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 21:50:04 +04:00
Andrey Epifancev
719f568863 perf(api): свод 2 — общий отбор svod2_lines, страницы с total_count, варианты фильтров в SQL
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 21:40:41 +04:00
Andrey Epifancev
a62add9779 perf(api): свод 2 — миграция 0053: нормализаторы поиска как в JS и компактная проекция
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 21:24:34 +04:00