use arrow::{
datatypes::{Field, Schema},
error::Result,
};
use strawboat::{
read::reader::{read_meta, read_meta_async},
write::{NativeWriter, WriteOptions},
ColumnMeta, CommonCompression,
};
use crate::io::{new_test_chunk, WRITE_PAGE};
fn write_data(dest: &mut Vec<u8>) -> Vec<ColumnMeta> {
let chunk = new_test_chunk();
let fields: Vec<Field> = chunk
.iter()
.map(|array| {
Field::new(
"name",
array.data_type().clone(),
array.validity().is_some(),
)
})
.collect();
let mut writer = NativeWriter::new(
dest,
Schema::from(fields),
WriteOptions {
default_compression: CommonCompression::Lz4,
max_page_size: Some(WRITE_PAGE),
..Default::default()
},
);
writer.start().unwrap();
writer.write(&chunk).unwrap();
writer.finish().unwrap();
writer.metas
}
#[test]
fn test_read_meta() -> Result<()> {
let mut buf = Vec::new();
let expected_meta = write_data(&mut buf);
let mut reader = std::io::Cursor::new(buf);
let meta = read_meta(&mut reader)?;
assert_eq!(expected_meta, meta);
Ok(())
}
#[test]
fn test_read_meta_async() -> Result<()> {
async_std::task::block_on(test_read_meta_async_impl())
}
async fn test_read_meta_async_impl() -> Result<()> {
let mut buf: Vec<u8> = Vec::new();
let expected_meta = write_data(&mut buf);
let len = buf.len();
let mut reader = async_std::io::Cursor::new(buf);
{
let meta = read_meta_async(&mut reader, None).await?;
assert_eq!(expected_meta, meta);
}
{
let meta = read_meta_async(&mut reader, Some(len)).await?;
assert_eq!(expected_meta, meta);
}
Ok(())
}