use std::collections::VecDeque;
use columnar::{Columnar, Clear, Len, Push};
use super::layout::ColumnarUpdate as Update;
use super::updates::UpdatesTyped;
use super::RecordedUpdates;
type TupleContainer<U> = <(<U as Update>::Key, <U as Update>::Val, <U as Update>::Time, <U as Update>::Diff) as Columnar>::Container;
pub struct ValBuilder<U: Update> {
current: TupleContainer<U>,
empty: Option<RecordedUpdates<U>>,
pending: VecDeque<RecordedUpdates<U>>,
}
use timely::container::PushInto;
impl<T, U: Update> PushInto<T> for ValBuilder<U> where TupleContainer<U> : Push<T> {
#[inline]
fn push_into(&mut self, item: T) {
self.current.push(item);
if self.current.len() > crate::columnar::LINK_TARGET {
use columnar::{Borrow, Index};
let records = self.current.len();
let mut refs = self.current.borrow().into_index_iter().collect::<Vec<_>>();
refs.sort();
let updates = UpdatesTyped::form(refs.into_iter()).into();
self.pending.push_back(RecordedUpdates { updates, records, consolidated: true });
self.current.clear();
}
}
}
impl<U: Update> Default for ValBuilder<U> {
fn default() -> Self {
ValBuilder {
current: Default::default(),
empty: None,
pending: Default::default(),
}
}
}
use timely::container::{ContainerBuilder, LengthPreservingContainerBuilder};
impl<U: Update> ContainerBuilder for ValBuilder<U> {
type Container = RecordedUpdates<U>;
#[inline]
fn extract(&mut self) -> Option<&mut Self::Container> {
if let Some(container) = self.pending.pop_front() {
self.empty = Some(container);
self.empty.as_mut()
} else {
None
}
}
#[inline]
fn finish(&mut self) -> Option<&mut Self::Container> {
if !self.current.is_empty() {
use columnar::{Borrow, Index};
let records = self.current.len();
let mut refs = self.current.borrow().into_index_iter().collect::<Vec<_>>();
refs.sort();
let updates = UpdatesTyped::form(refs.into_iter()).into();
self.pending.push_back(RecordedUpdates { updates, records, consolidated: true });
self.current.clear();
}
self.empty = self.pending.pop_front();
self.empty.as_mut()
}
}
impl<U: Update> LengthPreservingContainerBuilder for ValBuilder<U> { }