Repository navigation
Conversation
- МодельДанных хранит объекты модели в СинхронизированнаяКарта и обходит ее
через ДляКаждого: регистрация класса параллельно операциям больше не роняет
обход модели ("Collection was modified"). Повторная регистрация типа не
подменяет объект модели, с которым уже работают хранилища.
- ОбъектМодели.Колонки() снова отдает копию: правка результата не меняет общую
модель. Библиотека и встроенные коннекторы читают таблицу без копии через
служебный Служебный_Колонки().
- Имя таблицы объекта модели подчиненной таблицы передается третьим параметром
конструктора ОбъектМодели; мутатор Служебный_ИмяТаблицы удален.
- ТипыКолонок.Типы() и ТипыПодчиненныхТаблиц.Типы() отдают ФиксированныйМассив.
Изменения поведения: Колонки() - копия, как до nixel2007#151; Типы() нельзя менять.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (20)
Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review. WalkthroughИзменены контракты объекта модели и хранилища моделей. Внутренние операции и коннекторы используют исходные колонки модели. Перечни типов колонок и подчинённых таблиц теперь представлены фиксированными массивами. ChangesМодель данных и её потребители
Фиксированные массивы типов
Priority: ➖ Normal Estimated code review effort: 3 (Moderate) | ~25 minutes Change: Bug fix Suggested reviewers: Merge Risk: ⚪ Minimal · up to The changes are mergeable after normal checks. No actionable failure was identified; the concurrency tests exercise registration alongside model enumeration. Architecture SummaryArchitecture risk: 🔵 Low · up to The change affects 3 systems. Changed systems: Architecture concerns Review detailsSystems and components
Before / after behavior
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches 💡 1🧪 Generate unit tests (beta)
🛠️ Fix failing CI checks 💡
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Пишет кролик: модель обновлена, Comment |
| ОбъектМоделиЭлементКоллекции.Служебный_ИмяТаблицы(ПодчиненнаяТаблица.ИмяТаблицы); | ||
| // Колонки модели только для чтения, но этот объект модели только что создан и еще никому не отдан. | ||
| КолонкиОбъектаМодели = ОбъектМоделиЭлементКоллекции.Колонки(); | ||
| КолонкиОбъектаМодели = ОбъектМоделиЭлементКоллекции.Служебный_Колонки(); |
There was a problem hiding this comment.
у тебя протух апстрим. Служебный_Колонки() больше не нужен. Колонки() теперь возвращает оригинальную таблицу, но контрактом ее запрещено менять, чтобы не создавать гонку.
There was a problem hiding this comment.
Убрал в a682855. Колонки() снова отдаёт саму таблицу с контрактом «только для чтения», как после #151. Служебный_Колонки() и копии больше нет: модули и коннекторы такие же, как в master, тесты #151 (КолонкиОтдаютТаблицуМодели, индексы, донастройка через Колонки()) вернул. ОбработкаКоллекций правит Колонки() только у свежего, ещё никому не отданного объекта модели элемента.
Свежий master тоже влил, но с тех пор там пришли только обновления зависимостей.
| @@ -1,25 +1,60 @@ | |||
| #Использовать collectionos | |||
|
|
|||
| // СинхронизированнаяКарта - Тип сущности: ее объект модели. Модель общая у всех потоков, работающих | |||
There was a problem hiding this comment.
предлагаю CoW, раз она не меняется после инициализации.
There was a problem hiding this comment.
Сделал в a682855. Модель хранится в КартаКопированиеПриЗаписи из collectionos 0.9.0 (поднял в packagedef):
Получитьи обход идут по неизменяемому снимку без блокировки,ПолучитьОбъектыМодели—Значения().ВМассив();- регистрация —
ВставитьЕслиОтсутствует: повторная регистрация возвращает уже существующий объект модели и не подменяет его.
Тесты МодельДанных (регистрация 50 классов параллельно обходу модели, повторная регистрация) — по три прогона на 2.2.0 и 2.3.0-next, все зелёные. Полный прогон без PostgreSQL — 304 из 304 на обоих движках.
| Перем Ссылка Экспорт; | ||
| Перем ДвоичныеДанные Экспорт; | ||
|
|
||
| // ФиксированныйМассив - Все типы колонок. |
There was a problem hiding this comment.
Поправил в a682855: ФиксированныйМассив из Строка у Типы и ПримитивныеТипы в ТипыКолонок и у Типы в ТипыПодчиненныхТаблиц.
| // Параметры: | ||
| // ПТипСущности - Тип - Тип класса сущности. | ||
| // ПМодельДанных - МодельДанных - Модель, к которой относится объект. | ||
| // ПИмяТаблицы - Строка - Имя таблицы вместо имени из аннотации класса. Так создаются объекты |
There was a problem hiding this comment.
ну-ка подробнее, как оно работает на релизной версии с примерами разных типов подчиненных таблиц, и как оно работает после этой правки.
There was a problem hiding this comment.
Поведение не меняется. Ниже — как это работает на релизе v5.4.0.2 и что поменяла правка; проверено одним сценарием на релизе и на ветке.
Как сейчас (v5.4.0.2)
-
Родительский
ОбъектМоделивЗаполнитьПодчиненныеТаблицыописывает каждое поле с&ПодчиненнаяТаблица:- имя таблицы —
ИмяТаблицыиз аннотации, а без негоСтрока(ТипСущности) + "_" + ИмяПоля; Тип—МассивилиСтруктура, плюсТипЭлементаиКаскадноеЧтение.
- имя таблицы —
-
Для записи, чтения и
ИнициализироватьОбработкаКоллекций.ПолучитьОбъектМоделиДляПодчиненнойТаблицыкаждый раз строит новыйОбъектМоделислужебного классаСлужебнаяСущность_ЭлементКоллекцииКлючЗначение(колонкиid,ref,key,value). Конструктор берёт имя таблицы из&Сущностьслужебного класса —СлужебнаяСущность_ЭлементКоллекцииКлючЗначение. -
Затем
Служебный_ИмяТаблицы(ПодчиненнаяТаблица.ИмяТаблицы)подменяет имя таблицы, иКолонки()этого свежего объекта донастраиваются:key—Целоедля массива иСтрокадля структуры;- у
refТипСсылки— тип родителя; value— примитивный тип элемента либоСсылкана класс элемента.
Объект никому не передан, поэтому эти правки контракт не нарушают.
Что изменилось. Имя таблицы передаётся третьим параметром конструктора и присваивается в его конце, то есть там же, где раньше его ставил Служебный_ИмяТаблицы сразу после конструктора. После ЗаполнитьКолонки конструктор ИмяТаблицы не читает: имя подчинённых таблиц по умолчанию собирается из ТипСущности. Поэтому результат тот же. Ушёл только экспортный мутатор, через который имя таблицы можно было поменять у уже опубликованного объекта модели.
Примеры. Это СущностьСоВсемиТипамиКолонок из фикстур и класс Заказ с таблицей Заказы и тремя подчинёнными таблицами без ИмяТаблицы (массив Целое, структура Дата, массив ссылок). SQLite, сохранение и чтение. Вывод на v5.4.0.2 и на ветке совпадает строка в строку, на 2.2.0 и на 2.3.0-next:
СущностьСоВсемиТипамиКолонок (таблица СущностьСоВсемиТипамиКолонок)
Массив: Массив из Строка -> таблица ВсеТипыКолонок_Массив; key Целое; ref Ссылка -> СущностьСоВсемиТипамиКолонок (таблица СущностьСоВсемиТипамиКолонок); value Строка
Структура: Структура из Строка -> таблица ВсеТипыКолонок_Структура; key Строка; ref Ссылка -> СущностьСоВсемиТипамиКолонок (таблица СущностьСоВсемиТипамиКолонок); value Строка
МассивСсылок: Массив из СущностьСоВсемиТипамиКолонок -> таблица ВсеТипыКолонок_МассивСсылок; key Целое; ref Ссылка -> СущностьСоВсемиТипамиКолонок (таблица СущностьСоВсемиТипамиКолонок); value Ссылка -> СущностьСоВсемиТипамиКолонок (таблица СущностьСоВсемиТипамиКолонок)
МассивСсылокКаскад: Массив из СущностьСоВсемиТипамиКолонок, каскадно -> таблица ВсеТипыКолонок_МассивСсылокКаскад; key Целое; ref Ссылка -> СущностьСоВсемиТипамиКолонок (таблица СущностьСоВсемиТипамиКолонок); value Ссылка -> СущностьСоВсемиТипамиКолонок (таблица СущностьСоВсемиТипамиКолонок)
Заказ (таблица Заказы)
Числа: Массив из Целое -> таблица Заказ_Числа; key Целое; ref Ссылка -> Заказ (таблица Заказы); value Целое
Сроки: Структура из Дата -> таблица Заказ_Сроки; key Строка; ref Ссылка -> Заказ (таблица Заказы); value Дата
Позиции: Массив из СущностьСоВсемиТипамиКолонок -> таблица Заказ_Позиции; key Целое; ref Ссылка -> Заказ (таблица Заказы); value Ссылка -> СущностьСоВсемиТипамиКолонок (таблица СущностьСоВсемиТипамиКолонок)
Таблицы в БД: sqlite_sequence, ВсеТипыКолонок_Массив, ВсеТипыКолонок_МассивСсылок, ВсеТипыКолонок_МассивСсылокКаскад, ВсеТипыКолонок_Структура, Заказ_Позиции, Заказ_Сроки, Заказ_Числа, Заказы, СущностьСоВсемиТипамиКолонок
Заказ_Числа: (1, 0, 30) (1, 1, 10) (1, 2, 20)
Заказ_Сроки: (1, Начало, 01.10.2026 0:00:00) (1, Конец, 07.10.2026 0:00:00)
Заказ_Позиции: (1, 0, 7)
Прочитано: Числа = 30, 10, 20; Сроки = 01.10.2026 .. 07.10.2026; Позиции[0] = 7 (Число)
Попутно заметил расхождение, которое было и до этого PR. Описание аннотации ПодчиненнаяТаблица обещает имя по умолчанию ИмяТаблицыСущности_ИмяСвойства, а код берёт имя класса: у Заказ с таблицей Заказы получается Заказ_Числа, а не Заказы_Числа. Здесь я это не трогал. Что поправить — описание или поведение?
…ированиеПриЗаписи По ревью: - Колонки() по-прежнему отдает саму таблицу модели, менять ее контрактом запрещено; Служебный_Колонки() и копия убраны, тесты nixel2007#151 возвращены. - Модель данных меняется только при регистрации класса, поэтому хранится в КартаКопированиеПриЗаписи (collectionos 0.9.0): чтение и обход идут по неизменяемому снимку, ПолучитьОбъектыМодели - Значения().ВМассив(). - В комментариях перечней указан тип элементов ФиксированныйМассив. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Что чинит
Общие описания модели, которые читают все потоки, работающие с менеджером. Для каждого пункта сначала написан тест, красный на
master, потом исправление.masterМодельДанныххранила объекты модели в обычномСоответствиебез блокировки, а классы можно регистрировать и после передачи менеджера другим потокамИнициализировать), падало с «Collection was modified», пока другой поток регистрировал классыКартаКопированиеПриЗаписи(collectionos 0.9.0): модель меняется только при регистрации класса, а чтение и обход идут по неизменяемому снимку без блокировкиВставитьЕслиОтсутствует: для известного типа возвращается существующий объектСлужебный_ИмяТаблицыОбъектМодели, мутатор удалён. Имена и колонки подчинённых таблиц не меняются — сравнение с v5.4.0.2 в обсужденииТипыКолонок.Типы()иТипыПодчиненныхТаблиц.Типы()отдавали общий изменяемыйМассивФиксированныйМассивОбъектМодели.Колонки()остаётся как вmaster: отдаёт саму таблицу модели, менять её контрактом запрещено.Что меняется снаружи
Типы()—ФиксированныйМассив: код, который менял результат, получит ошибку.Служебный_ИмяТаблицы(помечен@internal) удалён. У конструктораОбъектМоделиновый необязательный параметрПИмяТаблицы.collectionosподнята до 0.9.0.Тесты
Новые:
МодельДанных— повторная регистрация не подменяет объект модели; задание обходит модель, пока тест регистрирует 50 сгенерированных классов. Наmasterвторой тест падал в задании три раза из трёх.ОбъектМодели.ИмяТаблицыЗадаетсяПриСоздании.ТипыКолонок— обаТипы()отдаютФиксированныйМассив.Полный прогон после правок по ревью, без PostgreSQL: OneScript 2.2.0 — 304 из 304, 2.3.0-next+a02323a1 — 304 из 304. До ревью с PostgreSQL: 322 из 322 на обоих движках и 305 из 305 только PostgreSQL.
🤖 Generated with Claude Code