
# Schemos tikrinimas

Kai skirtingose momentinėse kopijose keičiasi schemos (pridedami, pašalinami arba pervadinami stulpeliai), merql aptinka šiuos skirtumus ir apie juos praneša. Schemos neatitikimai nesustabdo sujungimo, tačiau yra parodomi, kad iškvietėjas galėtų nuspręsti, kaip elgtis toliau.

## Aptikimas

`SchemaValidator::validate()` palygina kiekvienos lentelės stulpelių rinkinius base, ours ir theirs momentinėse kopijose. Pranešama apie:

- Pusėje ours pridėtus stulpelius (yra ours, bet nėra base)
- Pusėje ours pašalintus stulpelius (yra base, bet nėra ours)
- Pusėje theirs pridėtus stulpelius
- Pusėje theirs pašalintus stulpelius

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

## Kas aptinkama

| Pakeitimas | Aptinkama | Pastabos |
|---|---|---|
| Stulpelis pridėtas | Taip | Pateikiama atskirai kiekvienai pusei (ours/theirs) |
| Stulpelis pašalintas | Taip | Pateikiama atskirai kiekvienai pusei |
| Stulpelio tipas pakeistas | Ne | Tipai saugomi, bet nelyginami |
| Stulpelis pervadintas | Ne | Rodomas kaip pridėjimas ir pašalinimas |
| Pirminis raktas pakeistas | Ne | Tapatybė nustatoma fiksuojant momentinę kopiją |

## Veikimas sujungimo metu

Jei stulpelis yra vienoje momentinėje kopijoje, bet jo nėra kitoje, sujungimo metu trūkstama stulpelio reikšmė laikoma `null`. Tai reiškia:

- Jei pusėje theirs pridėtas stulpelis turi ne NULL reikšmę, ji rodoma kaip `null -> value` (pakeitimas iš theirs priimtas)
- Jei pusėje theirs pašalintas stulpelis, laikoma, kad jo reikšmė visose theirs eilutėse yra `null`

Sujungimas tęsiamas ir pateikiamas rezultatas. Schemos neatitikimai yra informacinio pobūdžio. Prieš pritaikydamas sujungtus duomenis, iškvietėjas turėtų patikrinti, ar tikslinės duomenų bazės schema su jais sutampa.

## Neatitikimų peržiūra

Schemos neatitikimus galima pasiekti per `ThreeWayMerge` (naudojant `schemaMismatches()`) ir per `MergeResult` (naudojant `schemaMismatches()` ir `hasSchemaMismatches()`). Jie išsaugomi per `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
}
```
