use proc_macro2::TokenStream;
use quote::{format_ident, quote};
use crate::parser::Program;
use crate::build::relation::{rust_ident, user_struct_ident};
pub(crate) fn gen_batch_results(program: &Program) -> TokenStream {
let struct_ident = format_ident!("BatchResults");
let mut fields: Vec<TokenStream> = Vec::new();
for rel in program.output_idbs() {
let field = rust_ident(rel.name());
if rel.arity() == 0 {
fields.push(quote! { pub #field: bool });
} else {
let tuple_struct = user_struct_ident(rel);
fields.push(quote! { pub #field: Vec<rel::#tuple_struct> });
}
}
for rel in program.printsize_idbs() {
let field = format_ident!("{}_size", rel.name());
fields.push(quote! { pub #field: usize });
}
quote! {
#[derive(Clone, Debug, Default)]
pub struct #struct_ident {
#(#fields),*
}
}
}
pub(crate) fn gen_incremental_results(program: &Program) -> TokenStream {
let struct_ident = format_ident!("IncrementalResults");
let mut fields: Vec<TokenStream> = Vec::new();
for rel in program.output_idbs() {
let field = rust_ident(rel.name());
if rel.arity() == 0 {
fields.push(quote! { pub #field: i32 });
} else {
let tuple_struct = user_struct_ident(rel);
fields.push(quote! { pub #field: Vec<(rel::#tuple_struct, i32)> });
}
}
for rel in program.printsize_idbs() {
let field = format_ident!("{}_size", rel.name());
fields.push(quote! { pub #field: i32 });
}
quote! {
#[derive(Clone, Debug, Default)]
pub struct #struct_ident {
#(#fields),*
}
}
}