Lekérdezések
A RecordQuery a stream()-hez használható adatfolyamos szűrő. A hozzáfűzésközpontú hozzáférési mintákat fedi le: folytatás kurzorról, időablak olvasása, mezőegyezés szerinti szűrés és leállás egy korlátnál. Összetettebb feltételekhez, rendezéshez és indexalapú kereséshez használja a lekérdezésépítőt; adatfolyam egyszerű foreach műveleteihez a RecordQuery hatékonyabb eszköz.
A RecordQuery nem módosítható. Minden módosító egy klónozott lekérdezést ad vissza:
$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.
}
A after() és a time_range_ms() a UUID rendezését használja, ezért nincs szükség időbélyegmezőre a rekordadatokban. A SegmentedLog esetén ráadásul kevesebb munkát végeznek: azokat a szegmenseket, amelyek azonosítótartománya kívül esik az időablakon, meg sem nyitják, a szegmensenkénti ritka indexek pedig a kezdettől való bejárás helyett az első egyező rekord közelébe ugranak.
A where_equal() a legfelső szintű adatmezőt a === értékével veti össze, és skalárértékeket vagy null értéket fogad el. A null szűrő azokat a rekordokat találja meg, amelyekben a mező jelen van és null értékű; a mező nélküli rekordok nem egyeznek.
Kurzoros lapozás
Az azonosítók létrehozási idő szerint rendeződnek, ezért az egyik oldal utolsó azonosítója a következő oldal kurzora:
$page = iterator_to_array($store->stream(
Storh\RecordQuery::all()->after($lastSeenId)->limit(100)
), false);
$lastSeenId = [] === $page ? $lastSeenId : end($page)->id();
Sérült rekordok kezelése
Alapértelmezés szerint a bejárás az első olvashatatlan rekordnál hibát jelez. Használja a continue_on_error() beállítást, ha a bejárásnak át kell ugrania a rekordot, és helyette jelentenie kell a hibát:
$query = Storh\RecordQuery::all()->continue_on_error(
static function (string $location, Throwable $error): void {
error_log($location . ': ' . $error->getMessage());
},
);
A helyet a DocStore esetében a rekordazonosító, a SegmentedLog esetében a segment-file:byte-offset adja meg. A sérült rekordok tényleges eltávolítására a repair() szolgál; lásd: CLI.