
# Skeeman kelpoisuuden tarkistus

Kun skeemat muuttuvat tilannevedosten välillä (sarakkeita lisätään, poistetaan tai nimetään uudelleen), merql havaitsee ja raportoi erot. Skeemavirheet eivät estä yhdistämistä, mutta ne tuodaan esiin, jotta kutsuja voi päättää, miten toimia.

## Havaitseminen

`SchemaValidator::validate()` vertaa kunkin taulun sarakejoukkoja base-, ours- ja theirs-tilannevedoksissa. Se raportoi:

- Ours-tilanteeseen lisätyt sarakkeet (ovat ours-tilanteessa mutta eivät basessa)
- Ours-tilanteesta poistetut sarakkeet (ovat basessa mutta eivät ours-tilanteessa)
- Theirs-tilanteeseen lisätyt sarakkeet
- Theirs-tilanteesta poistetut sarakkeet

```php
use Merql\Merge\ThreeWayMerge;

$merge = new ThreeWayMerge();
$result = $merge->merge($base, $ours, $theirs);

if ($result->hasSchemaMismatches()) {
    foreach ($result->schemaMismatches() as $mismatch) {
        echo $mismatch->getMessage() . "\n";
        // "Schema mismatch on table 'posts': columns added in theirs: subtitle"
    }
}
```

## Mitä havaitaan

| Muutos | Havaitaan | Huomautukset |
|---|---|---|
| Sarake lisätty | Kyllä | Raportoidaan puolen mukaan (ours/theirs) |
| Sarake poistettu | Kyllä | Raportoidaan puolen mukaan |
| Sarakkeen tyyppi muuttunut | Ei | Tyypit tallennetaan, mutta niitä ei verrata |
| Sarake nimetty uudelleen | Ei | Näkyy lisäyksenä ja poistona |
| Pääavain muuttunut | Ei | Identiteetti määräytyy tilannevedoksen tallennushetkellä |

## Toiminta yhdistämisen aikana

Jos sarake on yhdessä tilannevedoksessa mutta puuttuu toisesta, yhdistäminen käsittelee puuttuvan sarakearvon arvona `null`. Tämä tarkoittaa seuraavaa:

- Theirs-tilanteeseen lisätty sarake, jonka arvo ei ole null, näkyy arvona `null -> value` (hyväksytty theirs-muutos)
- Theirs-tilanteesta poistettu sarake näkyy siten, että sen arvo on `null` kaikilla theirs-tilanteen riveillä

Yhdistäminen jatkuu ja tuottaa tuloksen. Skeemaerot ovat tiedoksi. Kutsujan tulee varmistaa, että kohdetietokannan skeema vastaa yhdistettyjä tietoja ennen niiden käyttöönottoa.

## Erojen tarkastelu

Skeemaerot ovat saatavilla sekä kohteessa `ThreeWayMerge` (metodin `schemaMismatches()` kautta) että kohteessa `MergeResult` (metodien `schemaMismatches()` ja `hasSchemaMismatches()` kautta). Ne säilyvät kohteen `ConflictResolver::resolve()` läpi.

```php
// On the merge result directly
$result->hasSchemaMismatches(); // bool
$result->schemaMismatches();    // list<SchemaException>

// Each mismatch is a SchemaException with a descriptive message
foreach ($result->schemaMismatches() as $e) {
    // $e->getMessage() includes table name and column details
}
```
