
# Poizvedbe

`RecordQuery` je pretočni filter za uporabo z `stream()`. Pokriva vzorce dostopa, usmerjene v dodajanje: nadaljevanje za kazalcem, branje časovnega okna, filtriranje po enakosti polja in ustavitev pri omejitvi. Za zahtevnejše pogoje, razvrščanje in iskanje na podlagi indeksov uporabite gradnik poizvedb [query builder](https://storh.inline0.dev/sl/docs/query-builder); za vse, kar lahko naredi navaden `foreach` nad tokom, je `RecordQuery` cenejše orodje.

`RecordQuery` je nespremenljiv. Vsak modifikator vrne klon poizvedbe:

```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()` in `time_range_ms()` uporabljata razvrščanje UUID, zato v podatkih zapisa ne potrebujeta časovnega polja. Pri `SegmentedLog` tudi preskočita nepotrebno delo: segmenti, katerih obseg ID-jev je zunaj časovnega okna, se sploh ne odprejo, redki indeksi na posameznih segmentih pa se pomaknejo blizu prvega ujemajočega se zapisa, namesto da bi pregledovali od začetka.

`where_equal()` primerja vrhnje podatkovno polje z `===` in sprejme skalarne vrednosti ali `null`. Filter `null` se ujema z zapisi, v katerih polje obstaja in ima vrednost null; zapisi brez tega polja se ne ujemajo.

## Ostranjevanje s kazalcem

ID-ji so razvrščeni po času nastanka, zato je zadnji ID ene strani kazalec za naslednjo:

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

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

## Ohranitev poškodovanih zapisov

Pregled privzeto sproži napako pri prvem neberljivem zapisu. Uporabite `continue_on_error()`, če naj pregled zapis preskoči in namesto tega sporoči napako:

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

Lokacija je ID zapisa za `DocStore` in `segment-file:byte-offset` za `SegmentedLog`. `repair()` je orodje za dejansko čiščenje poškodovanih zapisov; glejte [CLI](https://storh.inline0.dev/sl/docs/cli).
