///|
fn main {
  let l : @join.Table = {
    name: "orders",
    columns: ["customer", "tenant"],
    rows: [
      { id: "order-A", values: [@join.Integer(7), @join.Text("A")], },
      { id: "order-B", values: [@join.Integer(7), @join.Text("B")], },
    ],
  }
  let r : @join.Table = {
    name: "customers",
    columns: ["customer", "tenant"],
    rows: [
      { id: "customer-A", values: [@join.Integer(7), @join.Text("A")], },
      { id: "customer-B", values: [@join.Integer(7), @join.Text("B")], },
    ],
  }
  let base = @join.plan(
    [{ left: "customer", right: "customer", }],
    require_left=true,
  ) catch {
    _ => abort("bad plan")
  }
  let candidate = @join.plan(
    [
      { left: "customer", right: "customer", },
      { left: "tenant", right: "tenant", },
    ],
    require_left=true,
  ) catch {
    _ => abort("bad candidate")
  }
  let result = @join.compare(l, r, base, candidate) catch {
    _ => abort("comparison failed")
  }
  println(
    "baseline pairs=\{result.baseline.inventory.matched_pairs}; candidate=\{result.candidate.inventory.matched_pairs}",
  )
  println(
    "retained=\{result.retained_pairs}, lost=\{result.lost_pairs}, gained=\{result.gained_pairs}",
  )
  let witness = result.baseline.witnesses[0]
  let (a, b) = @join.counterexample(l, r, base, witness) catch {
    _ => abort("cannot export witness")
  }
  println(
    "counterexample rows=\{a.rows.length()+b.rows.length()}; independently verified=\{@join.verify_witness(l,r,base,witness) catch {_=>false}}",
  )
  let output = @join.materialize(l, r, candidate) catch {
    _ => abort("safe materialization failed")
  }
  println("safe materialized pairs=\{output.length()}")
}