Poizvedbe
RecordQuery je pretočni filter za uporabo z stream(). Pokriva vzorce dostopa, usmerjene v dodajanje: nadaljevanje za kazalcem, branje časovnega okna, filtriranje po enakosti polja in ustavitev pri omejitvi. Za zahtevnejše pogoje, razvrščanje in iskanje na podlagi indeksov uporabite gradnik poizvedb query builder; za vse, kar lahko naredi navaden foreach nad tokom, je RecordQuery cenejše orodje.
RecordQuery je nespremenljiv. Vsak modifikator vrne klon poizvedbe:
$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() in time_range_ms() uporabljata razvrščanje UUID, zato v podatkih zapisa ne potrebujeta časovnega polja. Pri SegmentedLog tudi preskočita nepotrebno delo: segmenti, katerih obseg ID-jev je zunaj časovnega okna, se sploh ne odprejo, redki indeksi na posameznih segmentih pa se pomaknejo blizu prvega ujemajočega se zapisa, namesto da bi pregledovali od začetka.
where_equal() primerja vrhnje podatkovno polje z === in sprejme skalarne vrednosti ali null. Filter null se ujema z zapisi, v katerih polje obstaja in ima vrednost null; zapisi brez tega polja se ne ujemajo.
Ostranjevanje s kazalcem
ID-ji so razvrščeni po času nastanka, zato je zadnji ID ene strani kazalec za naslednjo:
$page = iterator_to_array($store->stream(
Storh\RecordQuery::all()->after($lastSeenId)->limit(100)
), false);
$lastSeenId = [] === $page ? $lastSeenId : end($page)->id();
Ohranitev poškodovanih zapisov
Pregled privzeto sproži napako pri prvem neberljivem zapisu. Uporabite continue_on_error(), če naj pregled zapis preskoči in namesto tega sporoči napako:
$query = Storh\RecordQuery::all()->continue_on_error(
static function (string $location, Throwable $error): void {
error_log($location . ': ' . $error->getMessage());
},
);
Lokacija je ID zapisa za DocStore in segment-file:byte-offset za SegmentedLog. repair() je orodje za dejansko čiščenje poškodovanih zapisov; glejte CLI.