Filtri
Filtri nosaka, kuri dati tiek iekļauti momentuzņēmumā. Izslēdziet kešatmiņas tabulas, ignorējiet mainīgas laikspiedolu kolonnas vai izlaidiet īslaicīgas rindas. Filtri tiek lietoti momentuzņēmuma tveršanas laikā un ietekmē visas turpmākās darbības (diff, merge, apply).
use Merql\Filter\TableFilter;
use Merql\Filter\ColumnFilter;
use Merql\Snapshot\Snapshotter;
$snapshotter = new Snapshotter($connection);
$snapshot = $snapshotter->capture('baseline', filters: [
TableFilter::exclude(['sessions', 'cache_*']),
ColumnFilter::ignore(['updated_at', 'modified_date']),
]);
TableFilter
Nosaka, kuras tabulas tiek iekļautas momentuzņēmumā. Atbalsta glob modeļus, izmantojot PHP fnmatch().
Tabulu izslēgšana
use Merql\Filter\TableFilter;
$filter = TableFilter::exclude(['sessions', 'cache_*', 'wp_*_log']);
Jebkura tabula, kas atbilst izslēgšanas modelim, tiek izlaista no momentuzņēmuma. Aizstājējzīme * atbilst jebkurai rakstzīmju virknei.
Tabulu iekļaušana
$filter = TableFilter::include(['posts', 'comments', 'users']);
Tiek tvertas tikai tabulas, kas atbilst iekļaušanas modelim. Pārējās tiek izslēgtas.
Kā tas darbojas
Filtra metode apply() saņem tabulu nosaukumu sarakstu un atgriež filtrēto apakškopu:
$allTables = ['posts', 'comments', 'sessions', 'cache_pages', 'users'];
$filter = TableFilter::exclude(['sessions', 'cache_*']);
$filtered = $filter->apply($allTables);
// ['posts', 'comments', 'users']
$filter = TableFilter::include(['posts', 'users']);
$filtered = $filter->apply($allTables);
// ['posts', 'users']
Ja iekļaušanas un izslēgšanas modeļi ir norādīti abi (atsevišķās filtru instancēs), vispirms tiek izvērtēta izslēgšana. Lai tabulu paturētu, tā nedrīkst atbilst nevienam izslēgšanas modelim un tai jāatbilst vismaz vienam iekļaušanas modelim.
ColumnFilter
Tveršanas laikā izņem konkrētas kolonnas no rindu datiem. Noder mainīgām kolonnām, kas mainās katrā ierakstīšanas reizē un radītu kļūdainas atšķirības.
use Merql\Filter\ColumnFilter;
$filter = ColumnFilter::ignore(['updated_at', 'modified_date', 'last_login']);
Biežākie lietojumi
updated_at/modified_atlaikspiedoli, kas mainās katrā saglabāšanas reizē.revisionskaitītāji, kas automātiski palielinās.session_tokenvai citi īslaicīgi lauki.
Kā tas darbojas
Filtrs izņem nosauktās kolonnas no katras rindas pēc tam, kad aprēķināta rindas atslēga:
$filter = ColumnFilter::ignore(['updated_at']);
$row = ['id' => 1, 'title' => 'Hello', 'updated_at' => '2026-01-15 10:30:00'];
$filtered = $filter->applyToRow($row);
// ['id' => 1, 'title' => 'Hello']
Rindas atslēga (identitāte) tiek aprēķināta no nefiltrētas rindas. Tāpēc identitātes kolonnas nekad neietekmē kolonnu filtrs. Tiek filtrēti tikai dati, ko izmanto pirkstu nospieduma aprēķināšanai un atšķirību noteikšanai.
RowFilter
Filtrē atsevišķas rindas, izmantojot predikāta noslēgumu. Noslēgums saņem tabulas nosaukumu un pilnus rindas datus un atgriež true, lai iekļautu rindu, vai false, lai to izslēgtu.
use Merql\Filter\RowFilter;
// Exclude draft posts.
$filter = RowFilter::create(function (string $table, array $row): bool {
if ($table === 'posts' && ($row['status'] ?? '') === 'draft') {
return false;
}
return true;
});
// Exclude rows with NULL email.
$filter = RowFilter::create(function (string $table, array $row): bool {
if ($table === 'users') {
return $row['email'] !== null;
}
return true;
});
Kā tas darbojas
Katras rindas tveršanas laikā tiek izsaukta metode shouldInclude():
$include = $filter->shouldInclude('posts', ['id' => 1, 'status' => 'draft']);
// false
Izslēgtajām rindām netiek aprēķināts pirkstu nospiedums, tās netiek saglabātas momentuzņēmumā un neparādās atšķirībās vai apvienošanas rezultātos.
Filtru apvienošana
Padodiet vairākus filtrus funkcijai capture(). Tiek izmantots ne vairāk kā viens katra filtra tipa eksemplārs:
$snapshot = $snapshotter->capture('baseline', filters: [
TableFilter::exclude(['cache_*']),
ColumnFilter::ignore(['updated_at']),
RowFilter::create(fn($table, $row) => ($row['active'] ?? '1') === '1'),
]);
Apstrādes secība:
- Vispirms darbojas TableFilter, kas nosaka tveramās tabulas.
- Katrai tabulai no datubāzes tiek nolasītas rindas.
- RowFilter tiek lietots katrai rindai un izslēdz neatbilstošās.
- No nefiltrētās rindas tiek aprēķināta rindas atslēga (identitātes kolonnas paliek neskartas).
- ColumnFilter izņem ignorētās kolonnas no rindas datiem.
- No filtrētajiem rindas datiem tiek aprēķināts pirkstu nospiedums.
Šāda secība nodrošina, ka identitātes kolonnas vienmēr ir pieejamas atslēgas aprēķināšanai, pat ja kolonnu filtrs tās vēlāk izņem.
Filtri un konsekvence
Apvienošanas pamatmomentuzņēmumam, mūsu momentuzņēmumam un viņu momentuzņēmumam jāizmanto vieni un tie paši filtri. Ja filtri atšķiras, var šķist, ka rindas vai kolonnas ir pievienotas vai noņemtas, lai gan patiesībā tās ir tikai atšķirīgi filtrētas.
// Use the same filter set for all snapshots.
$filters = [
TableFilter::exclude(['sessions']),
ColumnFilter::ignore(['updated_at']),
];
$base = $snapshotter->capture('base', filters: $filters);
$ours = $snapshotter->capture('ours', filters: $filters);
$theirs = $snapshotter->capture('theirs', filters: $filters);