
# Vaicājumi

`RecordQuery` ir straumēšanas filtrs, ko izmanto kopā ar `stream()`. Tas aptver piekļuves scenārijus, kuros dati tiek papildināti: turpināt pēc kursora, nolasīt laika periodu, filtrēt pēc lauka vienādības un apstāties pie ierobežojuma. Sarežģītākiem nosacījumiem, kārtošanai un indeksu meklējumiem izmantojiet [vaicājumu veidotāju](https://storh.inline0.dev/lv/docs/query-builder); darbībām, ko straumei var veikt vienkāršs `foreach`, `RecordQuery` ir lētāks rīks.

`RecordQuery` ir nemaināms. Katrs pārveidotājs atgriež klonētu vaicājumu:

```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.
}
```

`after()` un `time_range_ms()` izmanto UUID secību, tāpēc ierakstu datos nav vajadzīgs laika zīmoga lauks. Izmantojot `SegmentedLog`, tiek arī izlaista lieka apstrāde: segmenti, kuru ID diapazons ir ārpus norādītā perioda, netiek atvērti, bet retie indeksi katrā segmentā meklē pirmo atbilstošo ierakstu, nevis skenē no sākuma.

`where_equal()` salīdzina augšējā līmeņa datu lauku ar `===` un pieņem skalāras vērtības vai `null`. Filtrs `null` atbilst ierakstiem, kuros lauks pastāv un ir null; ieraksti bez šī lauka neatbilst.

## Lapošana ar kursoru

ID tiek kārtoti pēc izveides laika, tāpēc pēdējās lapas pēdējais ID ir nākamās lapas kursors:

```php
$page = iterator_to_array($store->stream(
    Storh\RecordQuery::all()->after($lastSeenId)->limit(100)
), false);

$lastSeenId = [] === $page ? $lastSeenId : end($page)->id();
```

## Bojātu ierakstu pārvarēšana

Pēc noklusējuma skenēšana pārtrūkst, sastopot pirmo nenolasāmo ierakstu. Izmantojiet `continue_on_error()`, ja skenēšanas laikā tas jāizlaiž un tā vietā jāziņo par kļūmi:

```php
$query = Storh\RecordQuery::all()->continue_on_error(
    static function (string $location, Throwable $error): void {
        error_log($location . ': ' . $error->getMessage());
    },
);
```

Atrašanās vieta ir ieraksta ID, ja runa ir par `DocStore` un `segment-file:byte-offset`, un `SegmentedLog` gadījumā. `repair()` ir rīks bojātu ierakstu tīrīšanai; skatiet [CLI](https://storh.inline0.dev/lv/docs/cli).
