- Правило покрытия получило второй разряд (условный, как у точек), запрет вырождения формы и счёт содержательных элементов ряда: скелет из скаляров и ряд из null больше не затирают маршрут. Победитель внутри доставки стал функцией множества версий — общим помощником с точками, — а провенанс поднимается и при совпавшем хеше, иначе отложенная доставка возвращала витрину к прежнему содержимому. - Одно поле не того типа больше не уносит сущность, а пропуски видны в учётной записи доставки (миграция 00008, NULL = «не измерялось»); каноническая форма считается один раз и вне транзакции; откат бинаря поверх новой схемы отказывает на старте; текст ошибки разбора не несёт значений из тела. - Ревью кода профилем deep (девять проходов) нашло две регрессии и обе закрыты: безусловный второй разряд запирал законный досчёт навсегда, а выбор победителя был квадратичен по числу присланных версий одного ключа.
46 lines
2.9 KiB
Markdown
46 lines
2.9 KiB
Markdown
# Data-миграции не отбирают строки по обрезаемым спискам
|
|
|
|
**Приоритет:** низкий
|
|
|
|
Остаток задачи «Дозакрыть находки ревью по слиянию сущностей» (архивный change
|
|
`dozakryt-nahodki-sushchnostej`).
|
|
|
|
## Оракул: механизм доказан, дефект пока пустой
|
|
|
|
Миграция `00007` переводит в `pending` доставки, у которых имя ставшей покрытой
|
|
секции стоит в `uncovered_sections`:
|
|
|
|
```sql
|
|
WHERE EXISTS (SELECT 1 FROM json_each(delivery.uncovered_sections)
|
|
WHERE json_each.value IN ('workouts', 'stateOfMind'))
|
|
```
|
|
|
|
Список `uncovered_sections` обрезается на 32 имени **в порядке встречи**
|
|
(`hae.maxUncovered`, счётчик `UncoveredDropped`). Секция, стоящая в теле после
|
|
тридцати двух незнакомых ключей, в список не попадает — и отбор миграции её не
|
|
найдёт. Оракул жил в `tmp/adv/uncovered_test.go`: тело с 32 ключами `junk` и
|
|
секцией `ecg` за ними даёт список без `ecg`.
|
|
|
|
Для `00007` дефект **пустой**: HAE шлёт одну секцию за доставку
|
|
(`docs/local-research.md`, находка 50), секций восемь, тела с 32 незнакомыми
|
|
ключами в архиве не существует. Но следующая покрытая секция унаследует ту же
|
|
слепую зону, а к тому времени причину никто не вспомнит.
|
|
|
|
## Что делать
|
|
|
|
Записать принцип и выбрать форму отбора:
|
|
|
|
- **Принцип:** data-миграция не отбирает строки по списку, который где-то
|
|
обрезается. Отбирать надо по признаку, который обрезке не подлежит, —
|
|
например «эту доставку смотрел разбор старше версии N».
|
|
- Практическое следствие для существующего кода: `UncoveredDropped > 0` обязан
|
|
означать безусловное пересворачивание — доставка, у которой список обрезан,
|
|
про своё покрытие ничего достоверного не говорит.
|
|
- Кандидат в `docs/conventions.md` (раздел про миграции), если форма отбора
|
|
окажется общей.
|
|
|
|
## Связано
|
|
|
|
- [Проверка секций, которых поток ещё не приносил](proverka-novyh-sekcij.md) —
|
|
именно она следующей сделает секцию покрытой и напишет такую миграцию.
|