use std::error::Error;
use std::path::Path;
use polars::prelude::*;
use crate::convert::common;
pub fn run(src: &Path, dest: &Path) -> Result<(), Box<dyn Error>> {
let usable = |name: &str| col(name).eq(lit("1")).or(col(name).eq(lit("")));
let predicate = usable("time_qc").and(usable("position_qc"));
let scan = || {
LazyFrame::scan_parquet(src, common::seq_scan_args())
.map_err(|e| format!("Cannot scan {}: {}", src.display(), e))
};
let total = scan()?
.select([len().alias("n")])
.collect()?
.column("n")?
.u32()?
.get(0)
.unwrap_or(0) as usize;
let out_file = std::fs::File::create(dest)?;
let empty = scan()?.slice(0, 0).collect()?;
let schema = empty.schema();
let mut writer = ParquetWriter::new(out_file).set_parallel(false).batched(&schema)?;
let step = common::chunk_rows();
let mut wrote_any = false;
let mut offset = 0usize;
while offset < total {
let count = step.min(total - offset);
let df = scan()?
.slice(offset as i64, count as IdxSize)
.filter(predicate.clone())
.collect()?;
if df.height() > 0 {
writer.write_batch(&df)?;
wrote_any = true;
}
offset += count;
}
if !wrote_any {
writer.write_batch(&empty)?;
}
writer.finish()?;
Ok(())
}