
# Preverjanje sheme

Ko se sheme med posnetki spreminjajo (stolpci so dodani, odstranjeni ali preimenovani), merql zazna te razlike in o njih poroča. Neskladja shem ne preprečijo združevanja, vendar so prikazana, da se klicatelj lahko odloči, kako nadaljevati.

## Zaznavanje

`SchemaValidator::validate()` primerja nabore stolpcev vsake tabele v posnetkih osnovnega stanja, naše kopije in njihove kopije. Poroča o:

- Stolpci, dodani v naši kopiji (prisotni v naši kopiji, ne pa v osnovnem stanju)
- Stolpci, odstranjeni iz naše kopije (prisotni v osnovnem stanju, ne pa v naši kopiji)
- Stolpci, dodani v njihovi kopiji
- Stolpci, odstranjeni iz njihove kopije

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

## Kaj se zazna

| Sprememba | Zaznano | Opombe |
|---|---|---|
| Dodan stolpec | Da | Poročilo za vsako stran (našo/njihovo) |
| Odstranjen stolpec | Da | Poročilo za vsako stran |
| Spremenjen tip stolpca | Ne | Tipi so shranjeni, vendar se ne primerjajo |
| Preimenovan stolpec | Ne | Prikaže se kot dodajanje in odstranitev |
| Spremenjen primarni ključ | Ne | Identiteta je določena ob ustvarjanju posnetka |

## Obnašanje med združevanjem

Ko stolpec obstaja v enem posnetku, v drugem pa ne, združevanje obravnava manjkajočo vrednost stolpca kot `null`. To pomeni:

- Stolpec, dodan v njihovi kopiji z vrednostjo, ki ni null, se prikaže kot `null -> value` (sprejeta je sprememba njihove kopije)
- Stolpec, odstranjen iz njihove kopije, se v vseh vrsticah njihove kopije obravnava, kot da ima vrednost `null`

Združevanje se nadaljuje in ustvari rezultat. Neskladja shem so informativna. Klicatelj mora pred uveljavitvijo preveriti, ali se shema ciljne zbirke podatkov ujema z združenimi podatki.

## Dostop do neskladij

Neskladja shem so na voljo v `ThreeWayMerge` (prek `schemaMismatches()`) in v `MergeResult` (prek `schemaMismatches()` in `hasSchemaMismatches()`). Ohranjena so skozi `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
}
```
