use crate::convert;
use crate::error::Result;
use crate::schema::CityModelArrowParts;
use crate::schema::{CityArrowHeader, ProjectionLayout};
use arrow::record_batch::RecordBatch;
use cityjson::relational::RelationalAccess;
use cityjson::v2_0::OwnedCityModel;
pub use crate::transport::{
CanonicalTable, CanonicalTableSink, canonical_table_order, canonical_table_position,
collect_tables, concat_record_batches, schema_for_table, single_or_concat_batches,
validate_schema,
};
pub fn encode_parts(model: &OwnedCityModel) -> Result<CityModelArrowParts> {
convert::encode_parts(&model.relational())
}
pub fn emit_tables<S: CanonicalTableSink>(model: &OwnedCityModel, sink: &mut S) -> Result<()> {
convert::emit_tables(&model.relational(), sink)
}
pub fn emit_part_tables<S: CanonicalTableSink>(
parts: &CityModelArrowParts,
sink: &mut S,
) -> Result<()> {
convert::emit_part_tables(parts, sink)
}
pub fn decode_parts(parts: &CityModelArrowParts) -> Result<OwnedCityModel> {
convert::decode_parts(parts)
}
pub fn build_parts_from_tables(
header: &CityArrowHeader,
projection: &ProjectionLayout,
tables: Vec<(CanonicalTable, RecordBatch)>,
) -> Result<CityModelArrowParts> {
convert::build_parts_from_tables(header, projection, tables)
}
pub fn write_stream_parts<W: std::io::Write>(parts: &CityModelArrowParts, writer: W) -> Result<()> {
crate::stream::write_parts_stream(parts, writer)
}
pub fn read_stream_parts<R: std::io::Read>(reader: R) -> Result<CityModelArrowParts> {
crate::stream::read_parts_stream(reader)
}
pub struct IncrementalDecoder(convert::IncrementalDecoder);
impl IncrementalDecoder {
pub fn new(header: CityArrowHeader, projection: ProjectionLayout) -> Result<Self> {
convert::IncrementalDecoder::new(header, projection).map(Self)
}
pub fn push_batch(&mut self, table: CanonicalTable, batch: &RecordBatch) -> Result<()> {
self.0.push_batch(table, batch)
}
pub fn finish(self) -> Result<OwnedCityModel> {
self.0.finish()
}
}