Skip to content

v1.9.3

Choose a tag to compare

@github-actions github-actions released this 25 Apr 16:19
· 20 commits to master since this release

Добавлено

  • Pointwise incremental refresh для метаданных в git fast path — при изменении одного объекта в Catalogs, Documents, InformationRegisters, AccumulationRegisters, AccountingRegisters, ChartsOfAccounts, EventSubscriptions, ScheduledJobs, XDTOPackages индекс обновляется точечно (DELETE+INSERT по конкретному object_name) вместо category-wide rescan. На больших конфигурациях (Тест ERP, 1000+ объектов в категории) это основной источник времени инкрементального обновления. Категории вне whitelist (Reports, Constants, FunctionalOptions, Subsystems, Roles, ChartsOfCharacteristicTypes и др.) по-прежнему идут через bulk fallback — поведение строго эквивалентно полному rescan категории. Покрывает таблицы object_attributes, predefined_items, object_synonyms, metadata_references, event_subscriptions, scheduled_jobs, xdto_packages.
  • Trigger set split для .command файлов — изменение .command (per-object Commands и CommonCommands) теперь корректно попадает в metadata_trigger_set (ранее игнорировалось), но НЕ в obj_meta_changed для synonym-ветки — чистая .command-дельта не вызывает category-wide synonym rescan (perf-фикс).
  • Telemetry git fast path — одна INFO-строка после каждого incremental update: pointwise refresh used for N categories (M objects), fallback used for K categories (reasons: {...}), bsl modules incremental: L.
  • Soft fallback thresholds_POINTWISE_MAX_OBJECTS=50 (абсолютный) и _POINTWISE_MAX_RATIO=0.5 (доля от total в категории): при массовом изменении одного раздела точечный путь автоматически уступает bulk-collect (избегаем 50× per-object парсингов).
  • 35+ новых регрессионных тестовtests/test_pointwise_refresh.py (32 теста) покрывает resolver, dispatcher, eligibility, equivalence with full build, регрессию synonym rescan на .command-дельте, Group B deletion с CF Ext layout. tests/test_object_synonyms.py дополнен 3 тестами на CF sibling-only layouts (top-level + nested Subsystems + dedup).

Изменено

  • _find_metadata_xml и _CMD_HOST_CATS вынесены из closure внутри _collect_metadata_tables на module level — переиспользуются pointwise-путём. Поведение существующего bulk collector не меняется.

Исправлено

  • _collect_object_synonyms пропускал CF sibling-only layout — категории, в которых объекты лежат прямо файлами без объектных подкаталогов (Category/<Name>.xml без Category/<Name>/), не индексировались в object_synonyms. Типичный кейс: EventSubscriptions в CF Документооборот КОРП — 229 строк в event_subscriptions, но 0 в object_synonyms, business-name search не находил их до первого incremental update. Фикс: второй проход по plain .xml в каталоге категории с дедупликацией через множество уже обработанных object_name. На Тест ЕРП (CF) после fresh build object_synonyms вырос с 13 661 до 18 078 (+4417), на Тест ЕРП (EDT) row-count не изменился (фикс не затрагивает EDT). Аналогичный sibling-only баг исправлен в _collect_subsystems_recursive для вложенных Subsystems. Тесты в tests/test_object_synonyms.py.
  • Pointwise resolver не разрешал Group B категории и Subsystems_resolve_object_from_path использовал только parse_bsl_path, который знает категории из format_detector.METADATA_CATEGORIES (категории-хосты BSL-модулей). Чисто-метаданные категории — EventSubscriptions, ScheduledJobs, FunctionalOptions, DefinedTypes — там отсутствуют, поэтому resolver возвращал (None, None) для всех путей в этих категориях, и pointwise-dispatcher падал в bulk fallback с reason no_objects. Фикс: resolver делает fallback на первый сегмент пути с проверкой по _CATEGORY_RU (полный список indexable категорий), плюс корректно разбирает EDT layout Category/<Name>/<Name>.mdo через parts[1]. Тесты test_event_subscriptions_cf_sibling/_edt, test_scheduled_jobs_cf_sibling, test_defined_types_cf_sibling в tests/test_pointwise_refresh.py.
  • Pointwise Group B оставлял stale object_synonyms — EventSubscriptions/ScheduledJobs/XDTOPackages входят в _SYNONYM_CATEGORIES через _CATEGORY_RU, bulk collector их синонимы собирал, но _refresh_global_object/_refresh_xdto_package обновляли только глобальные таблицы и metadata_references, без object_synonyms. После pointwise synonym-ветка вычитала pointwise_categories из своего фильтра, поэтому category-wide synonym refresh тоже пропускался — синоним подписки/job/XDTO оставался устаревшим. Фикс: вызов _insert_synonym_for_object через parse_metadata_xml (для паритета с bulk collector) внутри Group B refresh + DELETE по (category, object_name) в начале.
  • Pointwise CoA эмитил metadata_references, которых full build не пишет_refresh_object вызывал _insert_references_for_object для всех whitelisted категорий, но full collector эмитит parsed.references только в loop по _ATTR_CATEGORIES (где CoA отсутствует — она только в _PREDEFINED_CATEGORIES). Это давало расхождение pointwise vs fresh full build по таблице metadata_references для CoA. Фикс: gating if category in _ATTR_CATEGORIES: перед _insert_references_for_object. Тест test_coa_pointwise_matches_full_build в tests/test_pointwise_refresh.py.
  • Group B deletion path не чистил CF Ext layout и stale rows с parsed.name != object_name — для Group B при deletion файла исходный код делал только DELETE WHERE name=? по object_name. Но bulk collector через rglob индексирует все три CF layouts (Category/<obj>/<obj>.mdo, Category/<obj>.xml, Category/<obj>/Ext/*.xml); если внутренний <Name> отличался от folder name (а row хранится с name=parsed.name), DELETE мискачивал. Фикс: deletion path расширен до DELETE WHERE name=? OR file IN (candidate_files) OR file LIKE 'Category/<obj>/%' ESCAPE '\\' — ловит любой layout. Аналогично для metadata_references.path. _ и % в названиях экранируются через helper _escape_for_sql_like. Тест test_event_subscription_cf_ext_deletion в tests/test_pointwise_refresh.py.

Обратная совместимость

  • Pointwise работает только в git fast path; полное построение и не-git update не затронуты.
  • Pointwise молча пропускает DELETE/INSERT в metadata_references/object_synonyms на legacy-индексах без этих таблиц (v1.9.0 и старше) — поведение строго эквивалентно bulk path.
  • При SAVEPOINT-rollback (любое исключение в pointwise) категория автоматически уходит на bulk fallback — корректность не страдает, лишь логируется в reasons.

Полный список изменений: CHANGELOG.md