
# Sorgular

`RecordQuery`, `stream()` ile kullanılan akışlı filtredir. İmleçten sonra devam etme, zaman aralığını okuma, alan eşitliğine göre filtreleme ve bir sınırda durma gibi ekleme ağırlıklı erişim biçimlerini kapsar. Daha gelişmiş koşullar, sıralama ve dizin destekli aramalar için [sorgu oluşturucuyu](https://storh.inline0.dev/tr/docs/query-builder) kullanın; düz bir akış üzerinde `foreach` ile yapılabilen her şey için `RecordQuery` daha hafif bir araçtır.

`RecordQuery` değiştirilemez. Her değiştirici klonlanmış bir sorgu döndürür:

```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()` ve `time_range_ms()` sıralama için UUID kullanır; bu nedenle kayıt verilerinde zaman damgası alanına ihtiyaç duymaz. `SegmentedLog` üzerinde ayrıca gereksiz işi atlar: kimlik aralığı pencerenin dışında kalan segmentler hiç açılmaz ve seyrek, segment başına dizinler en baştan taramak yerine ilk eşleşen kayda yakın bir konuma gider.

`where_equal()`, üst düzey bir veri alanını `===` ile karşılaştırır ve skaler değerleri ya da `null` kabul eder. `null` filtresi, alanın bulunduğu ve null olduğu kayıtlarla eşleşir; alanı bulunmayan kayıtlar eşleşmez.

## İmleçle sayfalama

Kimlikler oluşturulma zamanına göre sıralanır; bu nedenle bir sayfanın son kimliği sonraki sayfanın imlecidir:

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

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

## Bozuk kayıtlara rağmen devam etme

Varsayılan olarak tarama, okunamayan ilk kayıtta hata verir. Taramanın bu kaydı atlayıp hatayı bildirmesi gerekiyorsa `continue_on_error()` kullanın:

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

Konum, `DocStore` ve `segment-file:byte-offset` için kayıt kimliğidir; `SegmentedLog` içinse `repair()`'tür. Bozuk kayıtları gerçekten temizlemek için [CLI](https://storh.inline0.dev/tr/docs/cli) aracını kullanın.
