
# Užklausos

`RecordQuery` yra srautinio filtravimo įrankis, naudojamas su `stream()`. Jis skirtas prieigos šablonams, kuriuose duomenys pridedami: tęsti nuo žymeklio, skaityti laiko intervalą, filtruoti pagal laukų lygybę ir sustoti pasiekus limitą. Sudėtingesniems predikatams, rikiavimui ir paieškai pagal indeksą naudokite [užklausų kūrimo priemonę](https://storh.inline0.dev/lt/docs/query-builder); viskam, ką gali atlikti paprastas `foreach` sraute, `RecordQuery` yra našesnis įrankis.

`RecordQuery` yra nekintamas. Kiekvienas modifikatorius grąžina klonuotą užklausą:

```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()` ir `time_range_ms()` naudoja UUID tvarką, todėl įrašo duomenyse nereikia laiko žymos lauko. Naudojant `SegmentedLog`, jie taip pat praleidžia nereikalingą darbą: segmentai, kurių ID intervalas nepatenka į nurodytą langą, neatveriami, o reti kiekvieno segmento indeksai leidžia greitai pasiekti pirmą tinkamą įrašą, neskaitant nuo pradžios.

`where_equal()` palygina aukščiausio lygio duomenų lauką su `===` ir priima skaliarines reikšmes arba `null`. `null` filtras atitinka įrašus, kuriuose laukas yra ir jo reikšmė yra null; įrašai be šio lauko neatitinka filtro.

## Žymekliais valdoma puslapiuotė

ID rikiuojami pagal sukūrimo laiką, todėl paskutinio vieno puslapio ID tampa kito puslapio žymekliu:

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

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

## Sugadintų įrašų apdorojimas

Pagal numatytuosius nustatymus skenavimas sustoja aptikęs pirmą neperskaitomą įrašą. Jei norite jį praleisti ir pranešti apie klaidą, naudokite `continue_on_error()`:

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

Vieta yra įrašo ID, kai naudojamas `DocStore`, o `segment-file:byte-offset` – kai naudojamas `SegmentedLog`. Sugadintus įrašus išvalo įrankis `repair()`; žr. [CLI](https://storh.inline0.dev/lt/docs/cli).
