mod batch;
mod incremental;
pub(crate) use batch::gen_lib_engine;
pub(crate) use incremental::gen_lib_incremental_engine;
use proc_macro2::TokenStream;
use quote::quote;
use crate::build::relation::user::user_to_tuple_expr;
use crate::codegen::tuple_tokens;
use crate::parser::{DataType, Relation};
pub(crate) fn needs_conversion(rel: &Relation, string_intern: bool) -> bool {
rel.data_type().iter().any(|dt| {
matches!(dt, DataType::Float32 | DataType::Float64)
|| (string_intern && matches!(dt, DataType::String))
})
}
pub(crate) fn per_position_tuple(
rel: &Relation,
string_intern: bool,
identity: TokenStream,
mut src: impl FnMut(usize) -> TokenStream,
mut elem: impl FnMut(&DataType, TokenStream) -> TokenStream,
) -> TokenStream {
if !needs_conversion(rel, string_intern) {
return identity;
}
tuple_tokens(
rel.data_type()
.iter()
.enumerate()
.map(|(i, dt)| elem(dt, src(i))),
)
}
pub(crate) fn user_to_tuple_convert(rel: &Relation, string_intern: bool) -> TokenStream {
per_position_tuple(
rel,
string_intern,
quote! { item },
|i| {
let idx = proc_macro2::Literal::usize_unsuffixed(i);
quote! { item.#idx }
},
|dt, src| user_to_tuple_expr(dt, string_intern, src),
)
}