Preskočiť na obsah

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:

PHP
$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:

PHP
$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():

PHP
$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.