İçeriğe geç

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:

Kod
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:

Kod
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:

Kod
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.

Kod
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 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.