Заявки
RecordQuery е филтърът за поточно извличане, използван с stream(). Той обхваща моделите за достъп с добавяне на записи: продължаване след курсор, четене на времеви интервал, филтриране по равенство на поле и спиране при достигане на лимит. За по-сложни предикати, сортиране и търсене с индекси използвайте конструктора на заявки; за всичко, което обикновен foreach върху поток може да прави, RecordQuery е по-икономичният инструмент.
RecordQuery е неизменяем. Всеки модификатор връща клонирана заявка:
$query = Storh\RecordQuery::all()
->after($lastSeenId)
->time_range_ms($fromMs, $untilMs)
->where_equal('kind', 'page')
->limit(100);
foreach ($store->stream($query) as $record) {
// Records are yielded lazily.
}
after() и time_range_ms() използват подреждането на UUID, затова не се нуждаят от поле за времеви отпечатък в данните на записа. При SegmentedLog те също спестяват работа: сегментите, чийто диапазон от идентификатори е извън интервала, изобщо не се отварят, а разредените индекси за всеки сегмент търсят близо до първия съвпадащ запис, вместо да сканират от началото.
where_equal() сравнява поле от най-горно ниво в данните с === и приема скаларни стойности или null. Филтър null съвпада със записи, при които полето присъства и е null; записите без това поле не съвпадат.
Странично прелистване с курсор
Идентификаторите се сортират по време на създаване, затова последният идентификатор на една страница служи като курсор за следващата:
$page = iterator_to_array($store->stream(
Storh\RecordQuery::all()->after($lastSeenId)->limit(100)
), false);
$lastSeenId = [] === $page ? $lastSeenId : end($page)->id();
Справяне с повредени записи
По подразбиране сканирането прекъсва при първия нечетим запис. Използвайте continue_on_error(), когато сканирането трябва да го пропусне и вместо това да отчете грешката:
$query = Storh\RecordQuery::all()->continue_on_error(
static function (string $location, Throwable $error): void {
error_log($location . ': ' . $error->getMessage());
},
);
Местоположението е идентификаторът на записа за DocStore и segment-file:byte-offset за SegmentedLog. repair() е инструментът за действително почистване на повредени записи; вижте CLI.