Skip to main content

Module inverted

Module inverted 

Source
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§

InvertedStore

Enums§

InvertedLoadError

Functions§

load
Восстановить стор связей проходом по логу, воспроизводя intern_link в порядке рождения. Позиционность проверяется так же, как у прямой полки: i-я запись обязана воспроизвестись в LinkId i.
save
Дописать в лог связи, рождённые после последнего save (или все, если лог пуст) — тот же инкрементальный паттерн, что persist::save.

Type Aliases§

LinkId