
# Forespørgsler

`RecordQuery` er streamingfilteret, der bruges sammen med `stream()`. Det dækker
adgangsmønstre, der føjer data til: fortsæt efter en markør, læs et tidsinterval,
filtrer efter feltlighed og stop ved en grænse. Brug
[forespørgselsbyggeren](https://storh.inline0.dev/da/docs/query-builder) til mere avancerede betingelser,
sortering og indeksbaserede opslag; til alt, en almindelig `foreach` over en
stream kan gøre, er `RecordQuery` det billigere værktøj.

`RecordQuery` er uforanderlig. Hver ændringsmetode returnerer en klonet forespørgsel:

```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()` og `time_range_ms()` bruger UUID-sortering, så de kræver ikke et tidsstempelfelt
i postdataene. På `SegmentedLog` springer de også arbejde over: segmenter,
hvis id-interval ligger uden for vinduet, åbnes aldrig, og sparsomme
indeks pr. segment søger tæt på den første matchende post i stedet for at
gennemsøge fra begyndelsen.

`where_equal()` sammenligner et datafelt på øverste niveau med `===` og accepterer skalære
værdier eller `null`. Et `null`-filter matcher poster, hvor feltet findes
og er null; poster uden feltet matcher ikke.

## Markørbaseret sideinddeling

Id'er sorteres efter oprettelsestid, så den sidste id på en side er markøren for den
næste:

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

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

## Håndtering af korrupte poster

En scanning giver som standard en fejl ved den første post, der ikke kan læses. Brug
`continue_on_error()`, når scanningen skal springe den over og rapportere fejlen
i stedet:

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

Placeringen er postens id for `DocStore` og `segment-file:byte-offset`
for `SegmentedLog`. `repair()` er værktøjet til faktisk at rydde op i korrupte
poster; se [CLI](https://storh.inline0.dev/da/docs/cli).
