
# Schemavalidatie

Wanneer schema's tussen snapshots veranderen (kolommen worden toegevoegd, verwijderd of hernoemd), detecteert en rapporteert merql deze verschillen. Schema-afwijkingen blokkeren de merge niet, maar worden zichtbaar gemaakt zodat de aanroeper kan beslissen hoe verder te gaan.

## Detectie

`SchemaValidator::validate()` vergelijkt de kolomverzamelingen van elke tabel in de snapshots base, ours en theirs. Het rapporteert:

- Kolommen toegevoegd in ours (aanwezig in ours maar niet in base)
- Kolommen verwijderd in ours (aanwezig in base maar niet in ours)
- Kolommen toegevoegd in theirs
- Kolommen verwijderd in theirs

```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"
    }
}
```

## Wat wordt gedetecteerd

| Wijziging | Gedetecteerd | Opmerkingen |
|---|---|---|
| Kolom toegevoegd | Ja | Per zijde gerapporteerd (ours/theirs) |
| Kolom verwijderd | Ja | Per zijde gerapporteerd |
| Kolomtype gewijzigd | Nee | Typen worden opgeslagen, maar niet vergeleken |
| Kolom hernoemd | Nee | Verschijnt als toevoeging en verwijdering |
| Primaire sleutel gewijzigd | Nee | Identiteit ligt vast op het moment van de snapshot |

## Gedrag tijdens de merge

Als een kolom wel in de ene snapshot bestaat maar niet in de andere, behandelt de merge de ontbrekende kolomwaarde als `null`. Dit betekent:

- Een kolom die in theirs is toegevoegd met een niet-nullwaarde verschijnt als `null -> value` (geaccepteerd als wijziging van theirs)
- Een kolom die in theirs is verwijderd, wordt voor alle rijen in theirs behandeld alsof deze `null` had

De merge wordt uitgevoerd en levert een resultaat op. De schema-afwijkingen zijn informatief. De aanroeper moet controleren of het schema van de doeldatabase overeenkomt met de samengevoegde gegevens voordat deze worden toegepast.

## Afwijkingen bekijken

Schema-afwijkingen zijn beschikbaar op zowel `ThreeWayMerge` (via `schemaMismatches()`) als op `MergeResult` (via `schemaMismatches()` en `hasSchemaMismatches()`). Ze blijven behouden via `ConflictResolver::resolve()`.

```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
}
```
