Skip to content

Commit cfdea83

Browse files
committed
Add a test for reading empty pages
1 parent 0da6cc4 commit cfdea83

File tree

1 file changed

+57
-1
lines changed

1 file changed

+57
-1
lines changed

rust/parquet/src/arrow/array_reader.rs

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -932,7 +932,7 @@ mod tests {
932932
use super::*;
933933
use crate::arrow::converter::Utf8Converter;
934934
use crate::basic::{Encoding, Type as PhysicalType};
935-
use crate::column::page::Page;
935+
use crate::column::page::{Page, PageReader};
936936
use crate::data_type::{ByteArray, DataType, Int32Type, Int64Type};
937937
use crate::errors::Result;
938938
use crate::file::reader::{FileReader, SerializedFileReader};
@@ -998,6 +998,33 @@ mod tests {
998998
}
999999
}
10001000

1001+
#[test]
1002+
fn test_primitive_array_reader_empty_pages() {
1003+
// Construct column schema
1004+
let message_type = "
1005+
message test_schema {
1006+
REQUIRED INT32 leaf;
1007+
}
1008+
";
1009+
1010+
let schema = parse_message_type(message_type)
1011+
.map(|t| Rc::new(SchemaDescriptor::new(Rc::new(t))))
1012+
.unwrap();
1013+
1014+
let column_desc = schema.column(0);
1015+
let page_iterator = EmptyPageIterator::new(schema.clone());
1016+
1017+
let mut array_reader = PrimitiveArrayReader::<Int32Type>::new(
1018+
Box::new(page_iterator),
1019+
column_desc.clone(),
1020+
)
1021+
.unwrap();
1022+
1023+
// expect no values to be read
1024+
let array = array_reader.next_batch(50).unwrap();
1025+
assert!(array.is_empty());
1026+
}
1027+
10011028
#[test]
10021029
fn test_primitive_array_reader_data() {
10031030
// Construct column schema
@@ -1450,6 +1477,35 @@ mod tests {
14501477
}
14511478
}
14521479

1480+
/// Iterator for testing reading empty columns
1481+
struct EmptyPageIterator {
1482+
schema: SchemaDescPtr,
1483+
}
1484+
1485+
impl EmptyPageIterator {
1486+
fn new(schema: SchemaDescPtr) -> Self {
1487+
EmptyPageIterator { schema }
1488+
}
1489+
}
1490+
1491+
impl Iterator for EmptyPageIterator {
1492+
type Item = Result<Box<dyn PageReader>>;
1493+
1494+
fn next(&mut self) -> Option<Self::Item> {
1495+
None
1496+
}
1497+
}
1498+
1499+
impl PageIterator for EmptyPageIterator {
1500+
fn schema(&mut self) -> Result<SchemaDescPtr> {
1501+
Ok(self.schema.clone())
1502+
}
1503+
1504+
fn column_schema(&mut self) -> Result<ColumnDescPtr> {
1505+
Ok(self.schema.column(0))
1506+
}
1507+
}
1508+
14531509
#[test]
14541510
fn test_struct_array_reader() {
14551511
let array_1 = Arc::new(PrimitiveArray::<ArrowInt32>::from(vec![1, 2, 3, 4, 5]));

0 commit comments

Comments
 (0)