
# 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](https://storh.inline0.dev/hu/docs/query-builder); 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:

```php
$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:

```php
$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:

```php
$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](https://storh.inline0.dev/hu/docs/cli).
