
# Overenie schémy

Keď sa schémy medzi snímkami vyvíjajú (pridávajú sa, odstraňujú alebo premenúvajú stĺpce), merql tieto rozdiely zisťuje a hlási. Nesúlad schém neblokuje zlúčenie, no zobrazí sa, aby sa volajúca aplikácia mohla rozhodnúť, ako pokračovať.

## Zisťovanie

`SchemaValidator::validate()` porovnáva množiny stĺpcov každej tabuľky v snímkach base, ours a theirs. Hlási:

- Stĺpce pridané v ours (sú v ours, ale nie v base)
- Stĺpce odstránené v ours (sú v base, ale nie v ours)
- Stĺpce pridané v theirs
- Stĺpce odstránené v 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"
    }
}
```

## Čo sa zisťuje

| Zmena | Zistená | Poznámky |
|---|---|---|
| Pridaný stĺpec | Áno | Hlási sa osobitne pre každú stranu (ours/theirs) |
| Odstránený stĺpec | Áno | Hlási sa osobitne pre každú stranu |
| Zmenený typ stĺpca | Nie | Typy sa ukladajú, ale neporovnávajú |
| Premenovaný stĺpec | Nie | Zobrazí sa ako pridanie a odstránenie |
| Zmenený primárny kľúč | Nie | Identita sa určí pri vytvorení snímky |

## Správanie počas zlúčenia

Keď stĺpec existuje v jednej snímke, ale v inej nie, pri zlúčení sa chýbajúca hodnota stĺpca považuje za `null`. To znamená:

- Stĺpec pridaný v theirs s hodnotou, ktorá nie je null, sa zobrazí ako `null -> value` (prijme sa ako zmena v theirs)
- Odstránený stĺpec v theirs sa bude považovať za taký, ktorý má vo všetkých riadkoch v theirs hodnotu `null`

Zlúčenie pokračuje a vytvorí výsledok. Nesúlady schém majú informatívny charakter. Volajúca aplikácia by mala pred použitím overiť, či schéma cieľovej databázy zodpovedá zlúčeným údajom.

## Prístup k nesúladom

Nesúlady schém sú dostupné v `ThreeWayMerge` (cez `schemaMismatches()`) aj v `MergeResult` (cez `schemaMismatches()` a `hasSchemaMismatches()`). Zachovávajú sa v `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
}
```
