
# Dotazy

`RecordQuery` je streamovací filter používaný s `stream()`. Pokrýva vzory prístupu zamerané na pridávanie: pokračovanie od kurzora, čítanie časového okna,
filtrovanie podľa rovnosti polí a zastavenie po dosiahnutí limitu. Pre zložitejšie predikáty,
zoradenie a vyhľadávanie pomocou indexov použite
[zostavovač dotazov](https://storh.inline0.dev/sk/docs/query-builder); na všetko, čo dokáže obyčajný `foreach`
pri spracovaní streamu, je `RecordQuery` úspornejším nástrojom.

`RecordQuery` je nemenný. Každý modifikátor vráti klonovaný dotaz:

```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()` a `time_range_ms()` používajú poradie UUID, takže v údajoch záznamu nepotrebujú pole s časovou pečiatkou. Na `SegmentedLog` navyše šetria prácu: segmenty,
ktorých rozsah ID leží mimo okna, sa vôbec neotvoria a riedke
indexy jednotlivých segmentov vyhľadajú záznam blízko prvého záznamu, ktorý vyhovuje podmienkam, namiesto skenovania od začiatku.

`where_equal()` porovná pole údajov najvyššej úrovne s `===` a prijíma skalárne
hodnoty alebo `null`. Filter `null` zodpovedá záznamom, v ktorých pole existuje
a má hodnotu null; záznamy bez tohto poľa nevyhovujú.

## Stránkovanie kurzorom

ID sa radia podľa času vytvorenia, takže posledné ID na jednej stránke je kurzorom pre
ďalšiu:

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

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

## Zachovanie poškodených záznamov

Skenovanie štandardne zlyhá pri prvom nečitateľnom zázname. Ak ho má skenovanie preskočiť a namiesto toho nahlásiť zlyhanie,
použite `continue_on_error()`:

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

Umiestnenie je ID záznamu pre `DocStore` a `segment-file:byte-offset`
pre `SegmentedLog`. Nástrojom na skutočné vyčistenie poškodených
záznamov je `repair()`; pozrite si [CLI](https://storh.inline0.dev/sk/docs/cli).
