
# Заявки

`RecordQuery` е филтърът за поточно извличане, използван с `stream()`. Той обхваща моделите за достъп с добавяне на записи: продължаване след курсор, четене на времеви интервал, филтриране по равенство на поле и спиране при достигане на лимит. За по-сложни предикати, сортиране и търсене с индекси използвайте [конструктора на заявки](https://storh.inline0.dev/bg/docs/query-builder); за всичко, което обикновен `foreach` върху поток може да прави, `RecordQuery` е по-икономичният инструмент.

`RecordQuery` е неизменяем. Всеки модификатор връща клонирана заявка:

```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()` и `time_range_ms()` използват подреждането на UUID, затова не се нуждаят от поле за времеви отпечатък в данните на записа. При `SegmentedLog` те също спестяват работа: сегментите, чийто диапазон от идентификатори е извън интервала, изобщо не се отварят, а разредените индекси за всеки сегмент търсят близо до първия съвпадащ запис, вместо да сканират от началото.

`where_equal()` сравнява поле от най-горно ниво в данните с `===` и приема скаларни стойности или `null`. Филтър `null` съвпада със записи, при които полето присъства и е null; записите без това поле не съвпадат.

## Странично прелистване с курсор

Идентификаторите се сортират по време на създаване, затова последният идентификатор на една страница служи като курсор за следващата:

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

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

## Справяне с повредени записи

По подразбиране сканирането прекъсва при първия нечетим запис. Използвайте `continue_on_error()`, когато сканирането трябва да го пропусне и вместо това да отчете грешката:

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

Местоположението е идентификаторът на записа за `DocStore` и `segment-file:byte-offset` за `SegmentedLog`. `repair()` е инструментът за действително почистване на повредени записи; вижте [CLI](https://storh.inline0.dev/bg/docs/cli).
