
# Skeemi valideerimine

Kui skeemid hetktõmmiste vahel muutuvad (veerge lisatakse, eemaldatakse või nimetatakse ümber), tuvastab merql need erinevused ja annab neist teada. Skeemierinevused ei takista ühendamist, kuid need tuuakse esile, et kutsuja saaks otsustada, kuidas edasi minna.

## Tuvastamine

`SchemaValidator::validate()` võrdleb iga tabeli veergude kogumeid aluse, meie oma ja nende hetktõmmistes. See annab teada:

- Meie omasse lisatud veerud (olemas meie omas, puuduvad aluses)
- Meie omast eemaldatud veerud (olemas aluses, puuduvad meie omas)
- Nende omasse lisatud veerud
- Nende omast eemaldatud veerud

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

## Mida tuvastatakse

| Muutus | Tuvastatakse | Märkused |
|---|---|---|
| Veerg lisatud | Jah | Teatatakse kummagi poole kohta (meie/nende) |
| Veerg eemaldatud | Jah | Teatatakse kummagi poole kohta |
| Veeru tüüp muudetud | Ei | Tüübid salvestatakse, kuid neid ei võrrelda |
| Veerg ümber nimetatud | Ei | Käsitletakse lisamise ja eemaldamisena |
| Primaarvõti muudetud | Ei | Identiteet fikseeritakse hetktõmmise tegemisel |

## Käitumine ühendamisel

Kui veerg on ühes hetktõmmises olemas, kuid teises mitte, käsitleb ühendamine puuduva veeru väärtusena `null`. See tähendab järgmist:

- Nende omasse lisatud veeru nullist erinev väärtus kuvatakse väärtusena `null -> value` (nende muudatus võetakse vastu)
- Nende omast eemaldatud veeru väärtuseks loetakse kõigis nende ridades `null`

Ühendamine jätkub ja annab tulemuse. Skeemierinevused on üksnes teavitavad. Kutsuja peaks enne rakendamist kontrollima, kas sihtandmebaasi skeem vastab ühendatud andmetele.

## Erinevuste vaatamine

Skeemierinevused on saadaval nii objektis `ThreeWayMerge` (meetodi `schemaMismatches()` kaudu) kui ka objektis `MergeResult` (meetodite `schemaMismatches()` ja `hasSchemaMismatches()` kaudu). Need säilivad ka pärast `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
}
```
