
# Sémaellenőrzés

Ha a pillanatfelvételek között változik a séma (oszlopok hozzáadása, eltávolítása vagy átnevezése), a merql észleli és jelenti ezeket az eltéréseket. A sémák közötti eltérések nem akadályozzák a merge-et, de láthatóvá válnak, így a hívó fél eldöntheti, hogyan járjon el.

## Észlelés

A `SchemaValidator::validate()` összehasonlítja az egyes táblák oszlopkészletét a base, ours és theirs pillanatfelvételek között. A következőket jelenti:

- Az ours állapotban hozzáadott oszlopok (jelen vannak az ours-ban, de a base-ben nem)
- Az ours állapotból eltávolított oszlopok (jelen vannak a base-ben, de az ours-ban nem)
- A theirs állapotban hozzáadott oszlopok
- A theirs állapotból eltávolított oszlopok

```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 észlel

| Változás | Észleli | Megjegyzések |
|---|---|---|
| Oszlop hozzáadása | Igen | Oldalanként jelenti (ours/theirs) |
| Oszlop eltávolítása | Igen | Oldalanként jelenti |
| Oszloptípus megváltozása | Nem | A típusokat tárolja, de nem hasonlítja össze |
| Oszlop átnevezése | Nem | Hozzáadásként és eltávolításként jelenik meg |
| Elsődleges kulcs megváltozása | Nem | Az azonosító a pillanatfelvétel készítésekor rögzül |

## Működés merge közben

Ha egy oszlop szerepel az egyik pillanatfelvételben, a másikban azonban nem, a merge a hiányzó oszlop értékét `null` értékként kezeli. Ez azt jelenti, hogy:

- A theirs állapotban hozzáadott, nem null értékű oszlop `null -> value` értékként jelenik meg (a theirs módosításaként elfogadva)
- A theirs állapotból eltávolított oszlop minden sorban `null` értékkel jelenik meg a theirs állapotban

A merge lefut, és eredményt állít elő. A sémák közötti eltérések tájékoztató jellegűek. Alkalmazás előtt a hívó félnek ellenőriznie kell, hogy a céladatbázis sémája megfelel-e az egyesített adatoknak.

## Az eltérések elérése

A sémaeltérések a `ThreeWayMerge` felületen (a `schemaMismatches()` segítségével) és a `MergeResult` felületen (a `schemaMismatches()` és a `hasSchemaMismatches()` segítségével) is elérhetők. A `ConflictResolver::resolve()` során is megmaradnak.

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