Vaicājumi
RecordQuery ir straumēšanas filtrs, ko izmanto kopā ar stream(). Tas aptver piekļuves scenārijus, kuros dati tiek papildināti: turpināt pēc kursora, nolasīt laika periodu, filtrēt pēc lauka vienādības un apstāties pie ierobežojuma. Sarežģītākiem nosacījumiem, kārtošanai un indeksu meklējumiem izmantojiet vaicājumu veidotāju; darbībām, ko straumei var veikt vienkāršs foreach, RecordQuery ir lētāks rīks.
RecordQuery ir nemaināms. Katrs pārveidotājs atgriež klonētu vaicājumu:
$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() un time_range_ms() izmanto UUID secību, tāpēc ierakstu datos nav vajadzīgs laika zīmoga lauks. Izmantojot SegmentedLog, tiek arī izlaista lieka apstrāde: segmenti, kuru ID diapazons ir ārpus norādītā perioda, netiek atvērti, bet retie indeksi katrā segmentā meklē pirmo atbilstošo ierakstu, nevis skenē no sākuma.
where_equal() salīdzina augšējā līmeņa datu lauku ar === un pieņem skalāras vērtības vai null. Filtrs null atbilst ierakstiem, kuros lauks pastāv un ir null; ieraksti bez šī lauka neatbilst.
Lapošana ar kursoru
ID tiek kārtoti pēc izveides laika, tāpēc pēdējās lapas pēdējais ID ir nākamās lapas kursors:
$page = iterator_to_array($store->stream(
Storh\RecordQuery::all()->after($lastSeenId)->limit(100)
), false);
$lastSeenId = [] === $page ? $lastSeenId : end($page)->id();
Bojātu ierakstu pārvarēšana
Pēc noklusējuma skenēšana pārtrūkst, sastopot pirmo nenolasāmo ierakstu. Izmantojiet continue_on_error(), ja skenēšanas laikā tas jāizlaiž un tā vietā jāziņo par kļūmi:
$query = Storh\RecordQuery::all()->continue_on_error(
static function (string $location, Throwable $error): void {
error_log($location . ': ' . $error->getMessage());
},
);
Atrašanās vieta ir ieraksta ID, ja runa ir par DocStore un segment-file:byte-offset, un SegmentedLog gadījumā. repair() ir rīks bojātu ierakstu tīrīšanai; skatiet CLI.