
# Frågor

`RecordQuery` är strömningsfiltret som används med `stream()`. Det täcker
åtkomstmönster för tillägg: återuppta efter en markör, läsa ett tidsfönster,
filtrera på fältlikhet och stanna vid en gräns. För mer avancerade predikat,
sortering och indexbaserade sökningar använder du
[frågebyggaren](https://storh.inline0.dev/sv/docs/query-builder); för allt som en vanlig `foreach` över en
ström kan göra är `RecordQuery` det billigare verktyget.

`RecordQuery` är oföränderlig. Varje modifierare returnerar en klonad fråga:

```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()` och `time_range_ms()` använder UUID-ordning, så de behöver inget tidsstämpelfält
bland postens data. På `SegmentedLog` hoppar de också över arbete: segment
vars id-intervall ligger utanför fönstret öppnas aldrig, och glesa
index per segment söker sig nära den första matchande posten i stället för
att skanna från början.

`where_equal()` jämför ett toppnivåfält i data med `===` och accepterar skalära
värden eller `null`. Ett `null`-filter matchar poster där fältet finns
och är null; poster utan fältet matchar inte.

## Markörsidnumrering

Id:n sorteras efter skapandetid, så det sista id:t på en sida blir markören för
nästa:

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

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

## Hantera korrupta poster

En skanning avbryts vid den första oläsbara posten som standard. Använd
`continue_on_error()` när skanningen ska hoppa över den och rapportera felet
i stället:

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

Platsen är postens id för `DocStore` och `segment-file:byte-offset`
för `SegmentedLog`. `repair()` är verktyget för att faktiskt rensa bort korrupta
poster; se [CLI](https://storh.inline0.dev/sv/docs/cli).
