İçeriğe geç

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 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 aracını kullanın.