Suodattimet
Suodattimet määrittävät, mitä tietoja tilannekuvaan sisällytetään. Sulje välimuistitaulut pois, ohita usein muuttuvat aikaleimasarakkeet tai jätä tilapäiset rivit pois. Suodattimia käytetään tilannekuvan tallennuksen aikana, ja ne vaikuttavat kaikkiin myöhempiin toimintoihin (vertailu, yhdistäminen, käyttöönotto).
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
Määrittää, mitkä taulut sisällytetään tilannekuvaan. Tukee glob-malleja PHPn fnmatch()n avulla.
Sulje tauluja pois
use Merql\Filter\TableFilter;
$filter = TableFilter::exclude(['sessions', 'cache_*', 'wp_*_log']);
Kaikki poissulkumallia vastaavat taulut jätetään tilannekuvan ulkopuolelle. Jokerimerkki * vastaa mitä tahansa merkkijonoa.
Sisällytä tauluja
$filter = TableFilter::include(['posts', 'comments', 'users']);
Vain sisällytysmallia vastaavat taulut tallennetaan. Kaikki muut jätetään pois.
Näin se toimii
Suodattimen apply()-metodi ottaa vastaan taulunimien luettelon ja palauttaa suodatetun osajoukon:
$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']
Kun sekä sisällytys- että poissulkumallit ovat käytössä (erillisissä suodatininstansseissa), poissulku arvioidaan ensin. Taulu säilytetään vain, jos se ei vastaa yhtäkään poissulkumallia ja vastaa vähintään yhtä sisällytysmallia.
ColumnFilter
Poistaa tietyt sarakkeet rivitiedoista tallennuksen aikana. Hyödyllinen usein muuttuville sarakkeille, joiden arvot muuttuvat jokaisella kirjoituskerralla ja aiheuttaisivat vääriä eroja.
use Merql\Filter\ColumnFilter;
$filter = ColumnFilter::ignore(['updated_at', 'modified_date', 'last_login']);
Yleisiä käyttötapauksia
updated_at/modified_at, jotka muuttuvat jokaisella tallennuskerralla.revision, joiden arvo kasvaa automaattisesti.session_tokentai muut tilapäiset kentät.
Näin se toimii
Suodatin poistaa nimetyt sarakkeet kustakin rivistä rivitunnisteen laskemisen jälkeen:
$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']
Rivitunniste (identiteetti) lasketaan suodattamattomasta rivistä. Sarakesuodatin ei siis vaikuta identiteettisarakkeisiin. Vain sormenjäljen ja erojen laskennassa käytettävät tiedot suodatetaan.
RowFilter
Suodattaa yksittäisiä rivejä predikaattilausekkeella. Lauseke saa parametreikseen taulun nimen ja rivin kaikki tiedot ja palauttaa arvon true rivin sisällyttämiseksi tai false sen poissulkemiseksi.
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;
});
Näin se toimii
shouldInclude()-metodia kutsutaan tallennuksen aikana jokaiselle riville:
$include = $filter->shouldInclude('posts', ['id' => 1, 'status' => 'draft']);
// false
Poissuljettuja rivejä ei sormenjälkitetä eikä tallenneta tilannevedokseen, eivätkä ne näy eroissa tai yhdistämisissä.
Suodattimien yhdistäminen
Välitä useita suodattimia metodille capture(). Kutakin suodatintyyppiä käytetään enintään yhtä:
$snapshot = $snapshotter->capture('baseline', filters: [
TableFilter::exclude(['cache_*']),
ColumnFilter::ignore(['updated_at']),
RowFilter::create(fn($table, $row) => ($row['active'] ?? '1') === '1'),
]);
Käsittelyjärjestys:
- TableFilter suoritetaan ensin, ja se määrittää tallennettavat taulut.
- Kunkin taulun rivit luetaan tietokannasta.
- RowFilter suoritetaan jokaiselle riville ja hylkää ehdon vastaiset rivit.
- Rivitunniste lasketaan suodattamattomasta rivistä (identiteettisarakkeet säilyvät).
- ColumnFilter poistaa ohitettavat sarakkeet rivitiedoista.
- Sormenjälki lasketaan suodatetuista rivitiedoista.
Tässä järjestyksessä identiteettisarakkeet ovat aina käytettävissä tunnisteen laskentaa varten, vaikka sarakesuodatin poistaisi ne myöhemmin.
Suodattimet ja yhdenmukaisuus
Yhdistämisen kaikissa kolmessa tilannevedoksessa (base, ours, theirs) tulisi käyttää samoja suodattimia. Jos suodattimet eroavat, rivejä tai sarakkeita voi näyttää lisätyn tai poistuneen, vaikka ne on vain suodatettu eri tavoin.
// 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);