Expand description
Шаг 8 (A1, план 3): стор связей перевёрнутой библиотеки.
Связь = (token, context_token) — не рекурсивна (в отличие от тела прямой полки: связь не ссылается на другие связи), поэтому дедупликация напрямую по паре, без content-хеширования — пара сама себе ключ.
Тело (какие связи существуют) отделено от счётчика (сколько раз связь
встретилась) — та же дисциплина, что у Store (INVARIANTS.md:
“разделение тела и счётчика”). Счётчик здесь не строится — это работа
шага 9 (cooc.rs, COO/CSR). intern_all намеренно отбрасывает вес из
потока экстрактора: тело фиксирует факт существования связи, не её
частоту.
Связь односторонняя (план 3, шаг 8): перевёрнутая библиотека ссылается
на TokenId прямой полки, прямая полка о перевёрнутой не знает —
InvertedStore не хранит и не требует &Store для своей идентичности,
только TokenId-значения.
Персист — тот же redb-паттерн, что у шага 6 (persist.rs): append-only
лог рождений связей, load воспроизводит intern_link() по порядку и
проверяет позиционность (тот же класс проверки, что LoadError:: CorruptLog у прямой полки).
Structs§
Enums§
Functions§
- load
- Восстановить стор связей проходом по логу, воспроизводя
intern_linkв порядке рождения. Позиционность проверяется так же, как у прямой полки: i-я запись обязана воспроизвестись в LinkIdi. - save
- Дописать в лог связи, рождённые после последнего save (или все, если
лог пуст) — тот же инкрементальный паттерн, что
persist::save.