Dotazy
RecordQuery je streamovací filter používaný s stream(). Pokrýva vzory prístupu zamerané na pridávanie: pokračovanie od kurzora, čítanie časového okna,
filtrovanie podľa rovnosti polí a zastavenie po dosiahnutí limitu. Pre zložitejšie predikáty,
zoradenie a vyhľadávanie pomocou indexov použite
zostavovač dotazov; na všetko, čo dokáže obyčajný foreach
pri spracovaní streamu, je RecordQuery úspornejším nástrojom.
RecordQuery je nemenný. Každý modifikátor vráti klonovaný dotaz:
$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() a time_range_ms() používajú poradie UUID, takže v údajoch záznamu nepotrebujú pole s časovou pečiatkou. Na SegmentedLog navyše šetria prácu: segmenty,
ktorých rozsah ID leží mimo okna, sa vôbec neotvoria a riedke
indexy jednotlivých segmentov vyhľadajú záznam blízko prvého záznamu, ktorý vyhovuje podmienkam, namiesto skenovania od začiatku.
where_equal() porovná pole údajov najvyššej úrovne s === a prijíma skalárne
hodnoty alebo null. Filter null zodpovedá záznamom, v ktorých pole existuje
a má hodnotu null; záznamy bez tohto poľa nevyhovujú.
Stránkovanie kurzorom
ID sa radia podľa času vytvorenia, takže posledné ID na jednej stránke je kurzorom pre ďalšiu:
$page = iterator_to_array($store->stream(
Storh\RecordQuery::all()->after($lastSeenId)->limit(100)
), false);
$lastSeenId = [] === $page ? $lastSeenId : end($page)->id();
Zachovanie poškodených záznamov
Skenovanie štandardne zlyhá pri prvom nečitateľnom zázname. Ak ho má skenovanie preskočiť a namiesto toho nahlásiť zlyhanie,
použite continue_on_error():
$query = Storh\RecordQuery::all()->continue_on_error(
static function (string $location, Throwable $error): void {
error_log($location . ': ' . $error->getMessage());
},
);
Umiestnenie je ID záznamu pre DocStore a segment-file:byte-offset
pre SegmentedLog. Nástrojom na skutočné vyčistenie poškodených
záznamov je repair(); pozrite si CLI.