Gap-fill: re-sequence the session by ts on save (filled points landed at the front on merged/split tracks with NULL seq)

This commit is contained in:
4aiman 2026-09-22 20:58:06 +03:00
commit 5f58eabcc5
2 changed files with 45 additions and 0 deletions

View file

@ -0,0 +1,27 @@
# Сессия 2026-09-22 (2) - достройка пропусков уходила «в начало»
По утверждённому плану `~/.claude/plans/merry-discovering-dream.md`.
## Симптом
Достройка GPS-пропусков (🧩) показывала превью нормально, но сохранённый трек тянул прямую
линию от старта к месту пропуска («возврат в начало»). На любом (недавнем) треке.
## Корень
`saveGapFill` (db.js) ставит достроенным точкам `seq = lastSeq` (seq последней РЕАЛЬНОЙ точки
перед пропуском). У склеенных/разрезанных треков реальные точки имеют `seq = NULL` (склейка/
разрез специально обнуляют seq -> порядок по ts). Тогда `lastSeq` остаётся 0, все достроенные
точки получают seq=0, а `getGpsPoints` (`ORDER BY COALESCE(seq,999999), ts`) ставит их ПЕРЕД
реальными (NULL→999999) -> прямая к началу. Подтверждено: единственный NULL-seq трек в БД -
склеенный 16.09; недавние треки пользователя склеены.
## Фикс
`saveGapFill`: после вставки достроенных точек - пере-нумерация seq ВСЕЙ сессии по ts (читаю
id `ORDER BY ts,id`, seq=порядковый номер, пакетный `CASE id WHEN..` чанками по 300, паттерн
из `saveSmoothedTrack`). Теперь getGpsPoints всегда в порядке ts независимо от исходного seq
(плотный/NULL/смешанный). Для плотных треков - no-op, для склеенных - чинит.
## Проверка
- SQL: у склеенного 16.09 реальные точки seq=NULL (seq=0 достроенной встала бы перед ними) -
корень подтверждён.
- Десктоп (Xvfb): подсадка склеенного трека -> 🧩 -> Сохранить -> переоткрыть: без прямой к
началу. Затем сборка + телефон, вытянуть сегодняшний трек.