Ερωτήματα
Το RecordQuery είναι το φίλτρο ροής που χρησιμοποιείται με το stream(). Καλύπτει μοτίβα πρόσβασης με προσθήκες: συνέχιση μετά από δρομέα, ανάγνωση χρονικού διαστήματος, φιλτράρισμα βάσει ισότητας πεδίου και διακοπή σε ένα όριο. Για πιο σύνθετες συνθήκες, ταξινόμηση και αναζητήσεις μέσω ευρετηρίων, χρησιμοποιήστε τον δημιουργό ερωτημάτων· για όσα μπορεί να κάνει ένα απλό foreach σε μια ροή, το RecordQuery είναι το ελαφρύτερο εργαλείο.
Το RecordQuery είναι αμετάβλητο. Κάθε τροποποιητής επιστρέφει ένα κλωνοποιημένο ερώτημα:
$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· οι εγγραφές χωρίς το πεδίο δεν ταιριάζουν.
Σελιδοποίηση με δρομέα
Τα αναγνωριστικά ταξινομούνται βάσει του χρόνου δημιουργίας, επομένως το τελευταίο αναγνωριστικό μιας σελίδας γίνεται ο δρομέας για την επόμενη:
$page = iterator_to_array($store->stream(
Storh\RecordQuery::all()->after($lastSeenId)->limit(100)
), false);
$lastSeenId = [] === $page ? $lastSeenId : end($page)->id();
Διατήρηση κατεστραμμένων εγγραφών
Από προεπιλογή, η σάρωση προκαλεί σφάλμα στην πρώτη εγγραφή που δεν μπορεί να διαβαστεί. Χρησιμοποιήστε το continue_on_error() όταν η σάρωση πρέπει να την παραλείπει και να αναφέρει αντί γι’ αυτήν την αποτυχία:
$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.