
# Επικύρωση σχήματος

Όταν τα σχήματα εξελίσσονται μεταξύ στιγμιότυπων (με προσθήκη, αφαίρεση ή μετονομασία στηλών), το merql εντοπίζει και αναφέρει αυτές τις διαφορές. Οι ασυμφωνίες σχήματος δεν εμποδίζουν τη συγχώνευση, αλλά επισημαίνονται ώστε ο καλών να αποφασίσει πώς θα προχωρήσει.

## Εντοπισμός

Το `SchemaValidator::validate()` συγκρίνει τα σύνολα στηλών κάθε πίνακα στα στιγμιότυπα base, ours και theirs. Αναφέρει:

- Στήλες που προστέθηκαν στο ours (υπάρχουν στο ours αλλά όχι στο base)
- Στήλες που αφαιρέθηκαν από το ours (υπάρχουν στο base αλλά όχι στο ours)
- Στήλες που προστέθηκαν στο theirs
- Στήλες που αφαιρέθηκαν από το 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"
    }
}
```

## Τι εντοπίζεται

| Αλλαγή | Εντοπίζεται | Σημειώσεις |
|---|---|---|
| Προσθήκη στήλης | Ναι | Αναφέρεται ανά πλευρά (ours/theirs) |
| Αφαίρεση στήλης | Ναι | Αναφέρεται ανά πλευρά |
| Αλλαγή τύπου στήλης | Όχι | Οι τύποι αποθηκεύονται, αλλά δεν συγκρίνονται |
| Μετονομασία στήλης | Όχι | Εμφανίζεται ως προσθήκη και αφαίρεση |
| Αλλαγή πρωτεύοντος κλειδιού | Όχι | Η ταυτοποίηση ορίζεται κατά τη δημιουργία του στιγμιότυπου |

## Συμπεριφορά κατά τη συγχώνευση

Όταν μια στήλη υπάρχει σε ένα στιγμιότυπο αλλά όχι σε άλλο, η συγχώνευση θεωρεί ότι η τιμή της στήλης που λείπει είναι `null`. Αυτό σημαίνει:

- Μια στήλη που προστέθηκε στο theirs με μη κενή τιμή εμφανίζεται ως `null -> value` (γίνεται αποδεκτή ως αλλαγή του theirs)
- Μια στήλη που αφαιρέθηκε από το theirs εμφανίζεται σαν να έχει `null` για όλες τις γραμμές στο theirs

Η συγχώνευση συνεχίζεται και παράγει αποτέλεσμα. Οι ασυμφωνίες σχήματος είναι ενημερωτικές. Ο καλών πρέπει να επαληθεύσει ότι το σχήμα της βάσης δεδομένων-στόχου αντιστοιχεί στα συγχωνευμένα δεδομένα πριν από την εφαρμογή τους.

## Πρόσβαση στις ασυμφωνίες

Οι ασυμφωνίες σχήματος είναι διαθέσιμες τόσο στο `ThreeWayMerge` (μέσω του `schemaMismatches()`) όσο και στο `MergeResult` (μέσω των `schemaMismatches()` και `hasSchemaMismatches()`). Διατηρούνται μέσω του `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
}
```
