1use std::fs::File;
5use std::io::{BufWriter, Write};
6use std::path::Path;
7
8use arrow::ipc::reader::FileReader;
9use serde_json::json;
10
11pub fn write_spool(spool: &Path, output: &Path, row_count: u64) -> anyhow::Result<()> {
12 let reader = FileReader::try_new(File::open(spool)?, None)?;
13 let columns: Vec<_> = reader
14 .schema()
15 .fields()
16 .iter()
17 .map(|f| json!({"name": f.name(), "type": f.data_type().to_string()}))
18 .collect();
19 let mut out = BufWriter::new(File::create(output)?);
20 write!(
21 out,
22 "{{\"schema_version\":\"dre/rows/v1\",\"columns\":{},\"row_count\":{},\"rows\":[",
23 serde_json::to_string(&columns)?,
24 row_count
25 )?;
26 let mut first = true;
27 for batch in reader {
28 for row in crate::values::batch_rows(&batch?) {
29 if !first {
30 out.write_all(b",")?;
31 }
32 first = false;
33 serde_json::to_writer(&mut out, &row)?;
34 }
35 }
36 out.write_all(b"]}\n")?;
37 out.flush()?;
38 Ok(())
39}