
# Pratinjau Dry Run

`DryRun::generate()` menghasilkan pernyataan SQL yang dapat dibaca manusia dengan nilai disisipkan langsung. Gunakan untuk meninjau tindakan penggabungan sebelum menerapkannya ke database.

```php
use Merql\Apply\DryRun;

$statements = DryRun::generate($result);

foreach ($statements as $sql) {
    echo "{$sql};\n";
}
```

Pratinjau berisi satu pernyataan untuk setiap operasi dalam hasil, dikelompokkan seperti cara `Applier` mengelompokkannya: penyisipan, lalu pembaruan, lalu penghapusan. Untuk seluruh hasil penggabungan, itu mencakup setiap perubahan dari kedua sisi terhadap base, yang akan dijalankan `Merql::apply()` pada database yang masih berisi base. Pratinjau [hasil terpilih](https://merql.inline0.dev/id/docs/merge/plans) untuk melihat hanya pernyataan bagi operasi yang akan Anda terapkan.

## Contoh keluaran

```sql
INSERT INTO `posts` (`id`, `title`, `content`, `status`) VALUES ('42', 'New Post', 'Body text', 'draft');
UPDATE `posts` SET `title` = 'Updated Title', `status` = 'publish' WHERE `id` = '42';
DELETE FROM `posts` WHERE `id` = '99';
```

Pembaruan menetapkan setiap kolom non-identitas yang dibawa operasi, bukan hanya kolom yang berubah, dan pembaruan yang tidak akan menetapkan kolom apa pun akan diabaikan.

## Pemformatan nilai

Semua nilai dibungkus dengan tanda kutip tunggal. Karakter khusus di-escape agar aman ditampilkan:

| Karakter | Di-escape sebagai |
|---|---|
| `\` (garis miring terbalik) | `\\` |
| `'` (tanda kutip tunggal) | `''` |
| `\0` (byte null) | `\0` |
| `\n` (baris baru) | `\n` |
| `\r` (carriage return) | `\r` |

Nilai NULL ditampilkan sebagai literal `NULL` tanpa tanda kutip:

```sql
UPDATE `posts` SET `subtitle` = NULL WHERE `id` = '42';
```

## Parameter

`DryRun::generate()` menerima parameter yang sama dengan `SqlGenerator::generate()`:

```php
$statements = DryRun::generate(
    $result,
    base: $baseSnapshot,
    fkDependencies: ['comments' => ['posts']],
    driver: new SqliteDriver(),
);
```

| Parameter | Jenis | Deskripsi |
|---|---|---|
| `$result` | `MergeResult` | Hasil penggabungan yang akan dipratinjau. |
| `$base` | `?Snapshot` | Snapshot base untuk kolom identitas. Default-nya `$result->baseSnapshot()`. |
| `$fkDependencies` | `array` | Peta dependensi kunci asing untuk pengurutan. |
| `$driver` | `?Driver` | Driver database untuk mengutip identifier. |

## Dry run vs SqlGenerator

`DryRun` membungkus `SqlGenerator`. Perbedaannya:

- `SqlGenerator::generate()` mengembalikan array `['sql' => '...', 'params' => [...]]` untuk eksekusi pernyataan yang disiapkan oleh adaptor.
- `DryRun::generate()` mengembalikan string datar dengan nilai disisipkan langsung, agar mudah dibaca.

Jangan jalankan keluaran dry run sebagai SQL. Formatnya untuk ditampilkan, bukan untuk eksekusi yang aman. Untuk menjalankan penggabungan, gunakan `Applier` atau `SqlGenerator` secara langsung dengan pernyataan yang disiapkan.

## Menggunakan facade

Melalui facade, ambil hasil penggabungan lalu pratinjau:

```php
use Merql\Merql;
use Merql\Apply\DryRun;

$result = Merql::merge('base', 'ours', 'theirs');

$statements = DryRun::generate($result);

foreach ($statements as $sql) {
    echo "{$sql};\n";
}
```

Atau dari CLI dengan flag `--dry-run`:

```bash
vendor/bin/merql merge base ours theirs --dry-run
```

CLI mencetak pernyataan tanpa pengurutan kunci asing atau driver, sehingga identifier menggunakan pengutipan backtick default apa pun databasenya. Komponen ini meneruskan snapshot base untuk kolom identitas. Penggabungannya bekerja pada tingkat kolom, seperti `Merql::merge()`.
