Frågor
RecordQuery är strömningsfiltret som används med stream(). Det täcker
åtkomstmönster för tillägg: återuppta efter en markör, läsa ett tidsfönster,
filtrera på fältlikhet och stanna vid en gräns. För mer avancerade predikat,
sortering och indexbaserade sökningar använder du
frågebyggaren; för allt som en vanlig foreach över en
ström kan göra är RecordQuery det billigare verktyget.
RecordQuery är oföränderlig. Varje modifierare returnerar en klonad fråga:
$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() och time_range_ms() använder UUID-ordning, så de behöver inget tidsstämpelfält
bland postens data. På SegmentedLog hoppar de också över arbete: segment
vars id-intervall ligger utanför fönstret öppnas aldrig, och glesa
index per segment söker sig nära den första matchande posten i stället för
att skanna från början.
where_equal() jämför ett toppnivåfält i data med === och accepterar skalära
värden eller null. Ett null-filter matchar poster där fältet finns
och är null; poster utan fältet matchar inte.
Markörsidnumrering
Id:n sorteras efter skapandetid, så det sista id:t på en sida blir markören för nästa:
$page = iterator_to_array($store->stream(
Storh\RecordQuery::all()->after($lastSeenId)->limit(100)
), false);
$lastSeenId = [] === $page ? $lastSeenId : end($page)->id();
Hantera korrupta poster
En skanning avbryts vid den första oläsbara posten som standard. Använd
continue_on_error() när skanningen ska hoppa över den och rapportera felet
i stället:
$query = Storh\RecordQuery::all()->continue_on_error(
static function (string $location, Throwable $error): void {
error_log($location . ': ' . $error->getMessage());
},
);
Platsen är postens id för DocStore och segment-file:byte-offset
för SegmentedLog. repair() är verktyget för att faktiskt rensa bort korrupta
poster; se CLI.