ключ точки — интервал одной формы, класс «эпизодных метрик» убран
Перепись по 22 метрикам с интервалами опровергла признак из первой редакции: start всегда равен date, интервалы несёт не только сон, обе формы точки не смешиваются внутри метрики одной доставки, а разные интервалы под одной меткой всегда несут разное содержимое. Значит ключ единый — метрика + слой + начало + конец, у измерения вырожденный, без ветвления по классу.
This commit is contained in:
+15
-14
@@ -24,8 +24,8 @@ healthlog принимает выгрузки Apple Health из приложен
|
||||
- **Сохранили — значит приняли.** Код ответа отражает доставку, а не разбор
|
||||
(см. «Приём»).
|
||||
- **Ничего не теряем молча.** Идентичность — устойчивые координаты
|
||||
(`метрика + слой + метка времени`), а у точки-интервала — `метрика + слой +
|
||||
начало + конец`; `source` в ключ не входит, он
|
||||
(`метрика + слой + начало + конец`; у точки-измерения конец равен началу);
|
||||
`source` в ключ не входит, он
|
||||
нестабилен. Хеш канонизированного содержимого остаётся детектором изменений,
|
||||
чтобы не писать зря. При столкновении выигрывает более полная точка, а не
|
||||
последняя пришедшая: бедная доставка не должна стирать поля у богатой.
|
||||
@@ -461,22 +461,23 @@ hour метки выровнены на час heart_rate 00:00:00
|
||||
**Идентичность точки — координаты, а не содержимое.**
|
||||
|
||||
```
|
||||
ключ: метрика + слой + метка времени
|
||||
ключ: метрика + слой + начало + конец конец = начало, если end нет
|
||||
значения: qty / Min / Avg / Max / source / … ← перезаписываются
|
||||
```
|
||||
|
||||
**У точки-интервала ключ — интервал.** Метка на эпизоде не уникальна: под одним
|
||||
`date` лежит до трёх записей сна, и это не дефект, а способ Apple выразить
|
||||
вложенность «в кровати» и фазы внутри неё. Ключ
|
||||
`метрика + слой + начало + конец` измерен на всём корпусе (находка 47): 174
|
||||
координаты против 170 по метке, ноль столкновений против 33 **внутри одной
|
||||
доставки**, где тай-брейк по времени приёма неприменим в принципе. `value` в
|
||||
ключе ничего не добавляет.
|
||||
**Ключ — интервал, а не метка.** Метка на записи сна не уникальна: под одним
|
||||
`date` лежит до трёх записей, и это не дефект, а способ Apple выразить
|
||||
вложенность «в кровати» и фазы внутри неё. Измерено на всём корпусе (находка
|
||||
47): 174 координаты против 170 по метке, ноль столкновений против 33 **внутри
|
||||
одной доставки**, где тай-брейк по времени приёма неприменим в принципе.
|
||||
`value` в ключе ничего не добавляет.
|
||||
|
||||
Эпизодность выводится из формы точки — есть `start` и `end`, отличные от `date`,
|
||||
— а не из списка имён метрик: список был бы вторым способом описывать то, что
|
||||
уже сказано данными. Час объекта берётся по началу эпизода, иначе
|
||||
принадлежность объекту зависела бы от длительности.
|
||||
Форма ключа **одна для всех точек**. Интервалы несут 22 метрики, а не только
|
||||
сон; `start`, когда он есть, всегда равен `date`; обе формы точки не
|
||||
смешиваются внутри метрики одной доставки. Поэтому отдельного класса «эпизодных
|
||||
метрик» нет — нечего выводить и нечего поддерживать в каталоге и Read API. Час
|
||||
объекта берётся по началу, иначе принадлежность объекту зависела бы от
|
||||
длительности.
|
||||
|
||||
`HKObject.uuid` дал бы идентичность даром, но в выгрузку Apple он не попадает —
|
||||
там у записи только `type`, `sourceName`, `sourceVersion`, `creationDate`,
|
||||
|
||||
@@ -1495,6 +1495,35 @@ type sourceName sourceVersion creationDate startDate endDate value
|
||||
идентичности обязана выражаться через `start`/`end`: иначе `import(экспорт)` не
|
||||
сойдётся с `replay(HAE)` и журнал перестанет быть журналом.
|
||||
|
||||
### Уточнение: ключ один, и это интервал
|
||||
|
||||
Перепись по всем 22 метрикам, несущим `start`/`end`, поправила формулировку:
|
||||
|
||||
- **`start` всегда равен `date`** — ноль исключений на всём корпусе. Признак
|
||||
«`start` и `end`, отличные от `date`» неработоспособен: отличается только
|
||||
`end`.
|
||||
- **Интервалы несёт не один сон, а 22 метрики** (`heart_rate`,
|
||||
`physical_effort`, `walking_speed`, `apple_stand_hour`, …).
|
||||
- **Обе формы точки никогда не смешиваются** внутри одной метрики в одной
|
||||
доставке: интервальность — свойство режима выгрузки, а не отдельной точки.
|
||||
Значит ключ с интервалом не разорвёт надвое точку, которая приехала то с
|
||||
`end`, то без.
|
||||
- **Разные интервалы под одной меткой** встречаются только у `sleep_analysis`
|
||||
(3 метки) и `resting_heart_rate` (2 метки), и во **всех** случаях содержимое
|
||||
точек различается. То есть это разные данные, а не поправленный задним числом
|
||||
интервал: ключ с интервалом ничего не задваивает.
|
||||
|
||||
Отсюда ключ не двух форм, а одной:
|
||||
|
||||
```
|
||||
координата = метрика + слой + начало + конец
|
||||
у точки-измерения конец = начало
|
||||
```
|
||||
|
||||
Понятия «эпизодная схема» не требуется вовсе — выводить нечего, ветвления в
|
||||
коде нет, и правило разрешения столкновений по полноте продолжает работать
|
||||
ровно там, где работало.
|
||||
|
||||
### Как это решают другие
|
||||
|
||||
- **Health CSV Importer** дедуплицирует по `Start Date + End Date + Data Type +
|
||||
|
||||
Reference in New Issue
Block a user