v1.9.3
Добавлено
- 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 buildobject_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 с reasonno_objects. Фикс: resolver делает fallback на первый сегмент пути с проверкой по_CATEGORY_RU(полный список indexable категорий), плюс корректно разбирает EDT layoutCategory/<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. Фикс: gatingif 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