pg2parquet 0.1.0

Command line tool for exporting PostgreSQL tables or queries into Parquet files
use std::{borrow::Cow, marker::PhantomData, sync::Arc};

use crate::level_index::LevelIndexList;

use super::{ColumnAppender, ColumnAppenderBase, DynamicSerializedWriter};

pub struct UnwrapOptionAppender<T: Clone, Appender2: ColumnAppender<T>> {
    appender: Appender2,
    _dummy: PhantomData<T>
}
impl<T: Clone, Appender2: ColumnAppender<T>> UnwrapOptionAppender<T, Appender2> {
    pub fn new(appender: Appender2) -> Self {
        UnwrapOptionAppender { appender, _dummy: PhantomData }
    }
}
impl<T: Clone, Appender2: ColumnAppender<T>> ColumnAppenderBase for UnwrapOptionAppender<T, Appender2> {
    fn write_null(&mut self, repetition_index: &LevelIndexList, level: i16) -> Result<usize, String> {
        self.appender.write_null(repetition_index, level)
    }

    fn write_columns<'b>(&mut self, column_i: usize, next_col: &mut dyn DynamicSerializedWriter) -> Result<(), String> {
        self.appender.write_columns(column_i, next_col)
    }

    fn max_dl(&self) -> i16 {
        self.appender.max_dl()
    }

    fn max_rl(&self) -> i16 {
        self.appender.max_rl()
    }
}
impl<T: Clone, Appender2: ColumnAppender<T>> ColumnAppender<Option<T>> for UnwrapOptionAppender<T, Appender2> {
    fn copy_value(&mut self, repetition_index: &LevelIndexList, value: Cow<Option<T>>) -> Result<usize, String> {
        self.appender.copy_value_opt(repetition_index, value)
    }
}

pub struct PreprocessAppender<T1: Clone, T2: Clone, Appender2: ColumnAppender<T2>, F: Fn(Cow<T1>) -> Cow<T2>> {
    appender: Appender2,
    f: F,
    _dummy: PhantomData<(T1, T2)>
}
impl<T1: Clone, T2: Clone, Appender2: ColumnAppender<T2>, F: Fn(Cow<T1>) -> Cow<T2>> PreprocessAppender<T1, T2, Appender2, F> {
    pub fn new(appender: Appender2, f: F) -> Self {
        PreprocessAppender { appender, f, _dummy: PhantomData }
    }
}
impl<T1: Clone, T2: Clone, Appender2: ColumnAppender<T2>, F: Fn(Cow<T1>) -> Cow<T2>> ColumnAppenderBase for PreprocessAppender<T1, T2, Appender2, F> {
    fn write_null(&mut self, repetition_index: &LevelIndexList, level: i16) -> Result<usize, String> {
        self.appender.write_null(repetition_index, level)
    }

    fn write_columns<'b>(&mut self, column_i: usize, next_col: &mut dyn DynamicSerializedWriter) -> Result<(), String> {
        self.appender.write_columns(column_i, next_col)
    }

    fn max_dl(&self) -> i16 {
        self.appender.max_dl()
    }

    fn max_rl(&self) -> i16 {
        self.appender.max_rl()
    }
}
impl<T1: Clone, T2: Clone, Appender2: ColumnAppender<T2>, F: Fn(Cow<T1>) -> Cow<T2>> ColumnAppender<T1> for PreprocessAppender<T1, T2, Appender2, F> {
    fn copy_value(&mut self, repetition_index: &LevelIndexList, value: Cow<T1>) -> Result<usize, String> {
        self.appender.copy_value(repetition_index, (self.f)(value))
    }
}
pub trait PreprocessExt<T2: Clone, Appender2: ColumnAppender<T2>> {
    fn preprocess<T1: Clone, F: Fn(Cow<T1>) -> Cow<T2>>(self, f: F) -> PreprocessAppender<T1, T2, Appender2, F>;
}
impl<T2: Clone, Appender2: ColumnAppender<T2>> PreprocessExt<T2, Appender2> for Appender2 {
    fn preprocess<T1: Clone, F: Fn(Cow<T1>) -> Cow<T2>>(self, f: F) -> PreprocessAppender<T1, T2, Appender2, F> {
        PreprocessAppender::new(self, f)
    }
}

pub struct RcWrapperAppender<T, TInner: ColumnAppender<Arc<T>>> {
	pub inner: TInner,
	pub dummy: PhantomData<T>
}
impl<T, TInner: ColumnAppender<Arc<T>>> RcWrapperAppender<T, TInner> {
	pub fn new(inner: TInner) -> Self {
		Self { inner, dummy: PhantomData }
	}
}
impl<T, TInner: ColumnAppender<Arc<T>>> ColumnAppenderBase for RcWrapperAppender<T, TInner> {
	fn write_null(&mut self, repetition_index: &crate::level_index::LevelIndexList, level: i16) -> Result<usize, String> {
		self.inner.write_null(repetition_index, level)
	}

	fn write_columns<'b>(&mut self, column_i: usize, next_col: &mut dyn crate::appenders::DynamicSerializedWriter) -> Result<(), String> {
		self.inner.write_columns(column_i, next_col)
	}

	fn max_dl(&self) -> i16 { self.inner.max_dl() }

	fn max_rl(&self) -> i16 { self.inner.max_rl() }
}
impl<T: Clone, TInner: ColumnAppender<Arc<T>>> ColumnAppender<T> for RcWrapperAppender<T, TInner> {
	fn copy_value(&mut self, repetition_index: &crate::level_index::LevelIndexList, value: Cow<T>) -> Result<usize, String> {
		let arc = Arc::new(value.into_owned());
		let cow = Cow::Owned(arc);
		self.inner.copy_value(repetition_index, cow)
	}
}


pub trait RcWrapperExt<TInner: ColumnAppender<Arc<T>>, T> {
    fn rc_wrapper(self) -> RcWrapperAppender<T, TInner>;
}
impl<TInner: ColumnAppender<Arc<T>>, T> RcWrapperExt<TInner, T> for TInner {
    fn rc_wrapper(self) -> RcWrapperAppender<T, TInner> {
        RcWrapperAppender::new(self)
    }
}