///|
/// 互操作测试用的写入示例:创建一张 flat Delta 表并追加两批数据。
///
/// 用法:
/// moon run --target native src/examples/interop_flat_writer --
///
/// 表结构(与 docs/协议兼容性与互操作范围.md 第 4 节案例 A 对齐):
/// id: long NOT NULL, name: string, active: boolean
/// 追加两批 => 两个数据文件、两次 commit、含 null 值。
fn main {
let args = @env.args()
let root = if args.length() >= 2 { args[1] } else { "artifacts/interop-flat/moondelta-written" }
let schema = "{\"type\":\"struct\",\"fields\":[" +
"{\"name\":\"id\",\"type\":\"long\",\"nullable\":false,\"metadata\":{}}," +
"{\"name\":\"name\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}," +
"{\"name\":\"active\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}}" +
"]}"
let created = @delta.create_table(root, schema, []) catch {
err => {
println("create failed: \{err}")
return
}
}
println("created version \{created} at \{root}")
let batch1 : Array[@delta.ReadColumn] = [
{ name: "id", type_: @delta.Int64Type, cells: [@delta.CellI64(1L), @delta.CellI64(2L), @delta.CellI64(3L)] },
{ name: "name", type_: @delta.StringType, cells: [@delta.CellStr("alice"), @delta.CellNull, @delta.CellStr("bob")] },
{ name: "active", type_: @delta.BooleanType, cells: [@delta.CellBool(true), @delta.CellBool(false), @delta.CellNull] },
]
let v1 = @delta.append_rows(root, batch1, 1750000000000L) catch {
err => {
println("append batch1 failed: \{err}")
return
}
}
println("appended batch1 => version \{v1}")
let batch2 : Array[@delta.ReadColumn] = [
{ name: "id", type_: @delta.Int64Type, cells: [@delta.CellI64(4L), @delta.CellI64(5L)] },
{ name: "name", type_: @delta.StringType, cells: [@delta.CellStr("carol"), @delta.CellNull] },
{ name: "active", type_: @delta.BooleanType, cells: [@delta.CellBool(true), @delta.CellNull] },
]
let v2 = @delta.append_rows(root, batch2, 1750000001000L) catch {
err => {
println("append batch2 failed: \{err}")
return
}
}
println("appended batch2 => version \{v2}")
let table = @delta.DeltaTable::open(root) catch {
err => {
println("reopen failed: \{err}")
return
}
}
let snapshot = table.snapshot() catch {
err => {
println("snapshot failed: \{err}")
return
}
}
println("self-check: version=\{snapshot.version} files=\{snapshot.files.length()} rows=\{snapshot.total_rows}")
for f in snapshot.files {
let stats = match f.stats {
Some(s) => s
None => "(no stats)"
}
println(" file: \{f.path} size=\{f.size} stats=\{stats}")
}
}