
# Sütun Düzeyinde Birleştirme

Sütun düzeyinde birleştirme, merql'in saf satır düzeyinde karşılaştırmaya göre başlıca avantajıdır. Her iki taraf da aynı satırı değiştirdiğinde merql tüm satırı çakışma olarak işaretlemek yerine her sütunu ayrı ayrı karşılaştırır.

## Satır düzeyinde birleştirmenin sorunu

İki kişinin aynı satırı düzenlediği bir `posts` tablosunu düşünün:

```
Base:    post #42  { title: "Hello",     content: "Body",    status: "draft"   }
Ours:    post #42  { title: "Hello",     content: "Body v2", status: "draft"   }
Theirs:  post #42  { title: "New Title", content: "Body",    status: "publish" }
```

Satır düzeyinde birleştirme, her iki tarafın da satırı değiştirdiğini görür ve çakışma bildirir. Ancak değişiklikler hiç çakışmaz. Ours `content` öğesini, theirs ise `title` ve `status` öğelerini düzenledi.

## Sütun düzeyinde birleştirme bunu nasıl çözer

merql, üç yönlü birleştirme kurallarını her sütuna ayrı ayrı uygular:

```
title:   base="Hello", ours="Hello",  theirs="New Title"  -> accept theirs
content: base="Body",  ours="Body v2", theirs="Body"      -> accept ours
status:  base="draft", ours="draft",  theirs="publish"    -> accept theirs
```

Sonuç: `{ title: "New Title", content: "Body v2", status: "publish" }`. Sorunsuz birleştirme, çakışma yok.

## Nasıl çalışır

`ThreeWayMerge` her iki tarafın da aynı satırı güncellediğini algıladığında, işlemi `ColumnMerge::merge()` öğesine devreder:

```php
use Merql\Merge\ColumnMerge;

$result = ColumnMerge::merge(
    table: 'posts',
    rowKey: '42',
    base: ['title' => 'Hello', 'content' => 'Body', 'status' => 'draft'],
    ours: ['title' => 'Hello', 'content' => 'Body v2', 'status' => 'draft'],
    theirs: ['title' => 'New Title', 'content' => 'Body', 'status' => 'publish'],
);

// $result['values']    -> merged column values
// $result['conflicts'] -> list of Conflict objects (empty if clean)
```

Her sütun için aynı kurallar geçerlidir:

| Temel | Ours | Theirs | Sonuç |
|---|---|---|---|
| A | A | A | Temel tutulur (değişiklik yok) |
| A | A | B | Theirs kabul edilir |
| A | B | A | Ours kabul edilir |
| A | B | B | Kabul edilir (iki taraf da aynı fikirde) |
| A | B | C | **Çakışma** (farklı değerler) |

## Çakışmaların sürdüğü durumlar

Her iki taraf da aynı sütunu farklı değerlere değiştirdiğinde sütun düzeyinde çakışma oluşur:

```
Base:    post #42  { title: "Hello" }
Ours:    post #42  { title: "Welcome" }
Theirs:  post #42  { title: "Greetings" }
```

Her ikisi de `title` öğesini farklı değerlere değiştirdi. Bu, çözüm gerektiren gerçek bir çakışmadır.

```php
$result = ColumnMerge::merge(
    'posts', '42',
    ['title' => 'Hello'],
    ['title' => 'Welcome'],
    ['title' => 'Greetings'],
);

// $result['conflicts'] contains one Conflict:
//   table: "posts", column: "title"
//   oursValue: "Welcome", theirsValue: "Greetings", baseValue: "Hello"
```

## Kısmi çakışmalar

Tek bir satırda hem sorunsuz birleştirmeler hem de çakışmalar olabilir. Bir sütun sorunsuzca birleşirken diğeri çakışırsa, satıra ait `MergeOperation` temiz sütunlar için birleştirilmiş değerleri, çakışan sütunlar içinse (varsayılan olarak) ours değerini içerir. Çakışma ayrıca bildirilir.

```
Base:    { title: "Hello", content: "Body",    status: "draft" }
Ours:    { title: "Welcome", content: "Body v2", status: "draft" }
Theirs:  { title: "Greetings", content: "Body",    status: "publish" }
```

Burada `title` çakışır (her iki taraf da farklı değiştirdi), `content` sorunsuz birleşir (yalnızca ours değiştirdi) ve `status` sorunsuz birleşir (yalnızca theirs değiştirdi). İşlem şunları taşır:

```php
// values: { title: "Welcome", content: "Body v2", status: "publish" }
// One conflict on the "title" column.
```

## Değer karşılaştırması

Sütun değerleri dönüştürüldükten sonra dizeler olarak karşılaştırılır. `NULL` ayrı bir değerdir:

- `NULL` ile `NULL` = değişiklik yok.
- `NULL` ile `"hello"` = güncelleme.
- `"hello"` ile `NULL` = güncelleme.
- `"1"` ile `1` = değişiklik yok (ikisi de `"1"` dizesine dönüştürülür).

Bu, MerQL bağlantı adaptörünün alma davranışıyla uyumludur: tüm veritabanı değerleri dize (veya NULL) olarak döner.

## Hücre düzeyinde birleştirme

Sütun düzeyinde birleştirme yine de çakışmayla sonuçlandığında (her iki taraf da aynı sütunu farklı değerlere değiştirdiğinde), merql [hücre düzeyinde birleştirme](https://merql.inline0.dev/tr/docs/merge/cell-level) ile bir seviye daha derine inebilir. Bu, TEXT sütunlarına (satır satır fark) ve JSON sütunlarına (anahtar anahtar fark) uygulanarak, her iki tarafın da aynı sütun değerinin farklı bölümlerini düzenlediği durumları çözer.
