
# Interogări

`RecordQuery` este filtrul de streaming folosit împreună cu `stream()`. Acoperă tiparele de acces orientate spre adăugare: reluarea după un cursor, citirea unei ferestre de timp, filtrarea după egalitatea unui câmp și oprirea la o limită. Pentru predicate mai complexe, ordonare și căutări bazate pe indexuri, folosiți generatorul de interogări [query builder](https://storh.inline0.dev/ro/docs/query-builder); pentru tot ce poate face o interogare simplă `foreach` asupra unui flux, `RecordQuery` este instrumentul mai eficient.

`RecordQuery` este imuabil. Fiecare modificator returnează o interogare clonată:

```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()` și `time_range_ms()` folosesc ordonarea UUID, deci nu au nevoie de un câmp cu marcaj temporal în datele înregistrării. În `SegmentedLog`, evită și operații inutile: segmentele ale căror intervale de id-uri sunt în afara ferestrei nu sunt deschise, iar indexurile rare per segment caută aproape de prima înregistrare potrivită, în loc să parcurgă datele de la început.

`where_equal()` compară un câmp de nivel superior din date cu `===` și acceptă valori scalare sau `null`. Un filtru `null` potrivește înregistrările în care câmpul există și are valoarea null; înregistrările fără câmp nu se potrivesc.

## Paginare cu cursoare

Id-urile sunt sortate după momentul creării, astfel că ultimul id de pe o pagină devine cursorul pentru pagina următoare:

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

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

## Gestionarea înregistrărilor corupte

În mod implicit, o scanare se oprește cu eroare la prima înregistrare care nu poate fi citită. Folosiți `continue_on_error()` pentru ca scanarea să o omită și să raporteze eroarea:

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

Locația este id-ul înregistrării pentru `DocStore` și `segment-file:byte-offset` pentru `SegmentedLog`. `repair()` este instrumentul pentru curățarea efectivă a înregistrărilor corupte; consultați [CLI](https://storh.inline0.dev/ro/docs/cli).
