Forespørgsler
RecordQuery er streamingfilteret, der bruges sammen med stream(). Det dækker
adgangsmønstre, der føjer data til: fortsæt efter en markør, læs et tidsinterval,
filtrer efter feltlighed og stop ved en grænse. Brug
forespørgselsbyggeren til mere avancerede betingelser,
sortering og indeksbaserede opslag; til alt, en almindelig foreach over en
stream kan gøre, er RecordQuery det billigere værktøj.
RecordQuery er uforanderlig. Hver ændringsmetode returnerer en klonet forespørgsel:
$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() og time_range_ms() bruger UUID-sortering, så de kræver ikke et tidsstempelfelt
i postdataene. På SegmentedLog springer de også arbejde over: segmenter,
hvis id-interval ligger uden for vinduet, åbnes aldrig, og sparsomme
indeks pr. segment søger tæt på den første matchende post i stedet for at
gennemsøge fra begyndelsen.
where_equal() sammenligner et datafelt på øverste niveau med === og accepterer skalære
værdier eller null. Et null-filter matcher poster, hvor feltet findes
og er null; poster uden feltet matcher ikke.
Markørbaseret sideinddeling
Id'er sorteres efter oprettelsestid, så den sidste id på en side er markøren for den næste:
$page = iterator_to_array($store->stream(
Storh\RecordQuery::all()->after($lastSeenId)->limit(100)
), false);
$lastSeenId = [] === $page ? $lastSeenId : end($page)->id();
Håndtering af korrupte poster
En scanning giver som standard en fejl ved den første post, der ikke kan læses. Brug
continue_on_error(), når scanningen skal springe den over og rapportere fejlen
i stedet:
$query = Storh\RecordQuery::all()->continue_on_error(
static function (string $location, Throwable $error): void {
error_log($location . ': ' . $error->getMessage());
},
);
Placeringen er postens id for DocStore og segment-file:byte-offset
for SegmentedLog. repair() er værktøjet til faktisk at rydde op i korrupte
poster; se CLI.