use arrow::array::*;
#[derive(Debug, Clone)]
pub struct NotNullArrayIter<T: ArrayAccessor> {
array: T,
index: usize,
}
impl<T: ArrayAccessor> NotNullArrayIter<T> {
pub fn new(array: T) -> Option<NotNullArrayIter<T>> {
if array.nulls().is_some() {
None
} else {
Some(NotNullArrayIter { array, index: 0 })
}
}
}
impl<T: ArrayAccessor> Iterator for NotNullArrayIter<T> {
type Item = T::Item;
fn next(&mut self) -> Option<Self::Item> {
if self.index >= self.array.len() {
return None;
}
let datum = self.array.value(self.index);
self.index += 1;
Some(datum)
}
}
pub struct NullableValuesIterator<Values: Iterator, Nulls: Iterator<Item = bool>> {
values: Values,
nulls: Option<Nulls>,
}
impl<Values: Iterator, Nulls: Iterator<Item = bool>> NullableValuesIterator<Values, Nulls> {
pub fn new(values: Values, nulls: Option<Nulls>) -> Self {
NullableValuesIterator { values, nulls }
}
}
impl<Values: Iterator, Nulls: Iterator<Item = bool>> Iterator
for NullableValuesIterator<Values, Nulls>
{
type Item = Option<Values::Item>;
fn next(&mut self) -> Option<Self::Item> {
match &mut self.nulls {
None => self.values.next().map(Some), Some(ref mut nulls) => match nulls.next() {
Some(false) => {
Some(Some(self.values.next().expect(
"more 'false' bits in nulls() than there are values",
)))
}
Some(true) => Some(None),
None => None, },
}
}
}
impl<Values: ExactSizeIterator, Nulls: ExactSizeIterator<Item = bool>> ExactSizeIterator
for NullableValuesIterator<Values, Nulls>
{
fn len(&self) -> usize {
match &self.nulls {
None => self.values.len(),
Some(nulls) => nulls.len(),
}
}
}