Interogări
RecordQuery este filtrul de streaming folosit împreună cu stream(). Acoperă tiparele de acces orientate spre adăugare: reluarea după un cursor, citirea unei ferestre de timp, filtrarea după egalitatea unui câmp și oprirea la o limită. Pentru predicate mai complexe, ordonare și căutări bazate pe indexuri, folosiți generatorul de interogări query builder; pentru tot ce poate face o interogare simplă foreach asupra unui flux, RecordQuery este instrumentul mai eficient.
RecordQuery este imuabil. Fiecare modificator returnează o interogare clonată:
$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() și time_range_ms() folosesc ordonarea UUID, deci nu au nevoie de un câmp cu marcaj temporal în datele înregistrării. În SegmentedLog, evită și operații inutile: segmentele ale căror intervale de id-uri sunt în afara ferestrei nu sunt deschise, iar indexurile rare per segment caută aproape de prima înregistrare potrivită, în loc să parcurgă datele de la început.
where_equal() compară un câmp de nivel superior din date cu === și acceptă valori scalare sau null. Un filtru null potrivește înregistrările în care câmpul există și are valoarea null; înregistrările fără câmp nu se potrivesc.
Paginare cu cursoare
Id-urile sunt sortate după momentul creării, astfel că ultimul id de pe o pagină devine cursorul pentru pagina următoare:
$page = iterator_to_array($store->stream(
Storh\RecordQuery::all()->after($lastSeenId)->limit(100)
), false);
$lastSeenId = [] === $page ? $lastSeenId : end($page)->id();
Gestionarea înregistrărilor corupte
În mod implicit, o scanare se oprește cu eroare la prima înregistrare care nu poate fi citită. Folosiți continue_on_error() pentru ca scanarea să o omită și să raporteze eroarea:
$query = Storh\RecordQuery::all()->continue_on_error(
static function (string $location, Throwable $error): void {
error_log($location . ': ' . $error->getMessage());
},
);
Locația este id-ul înregistrării pentru DocStore și segment-file:byte-offset pentru SegmentedLog. repair() este instrumentul pentru curățarea efectivă a înregistrărilor corupte; consultați CLI.