use std::io::Result;
use std::path::PathBuf;
use structopt::StructOpt;
use tpctools::tpcds::TpcDs;
use tpctools::tpch::TpcH;
use tpctools::Tpc;
#[derive(Debug, StructOpt)]
struct GenerateOpt {
#[structopt(short, long)]
benchmark: String,
#[structopt(short, long)]
scale: usize,
#[structopt(short, long)]
partitions: usize,
#[structopt(short, long, parse(from_os_str))]
generator_path: PathBuf,
#[structopt(short, long, parse(from_os_str))]
output: PathBuf,
}
#[derive(Debug, StructOpt)]
struct ConvertOpt {
#[structopt(short, long)]
benchmark: String,
#[structopt(parse(from_os_str), required = true, short = "i", long = "input")]
input_path: PathBuf,
#[structopt(parse(from_os_str), required = true, short = "o", long = "output")]
output_path: PathBuf,
#[structopt(short = "f", long = "format")]
file_format: String,
#[structopt(short = "c", long = "compression", default_value = "snappy")]
compression: String,
#[structopt(short = "p", long = "partitions", default_value = "1")]
partitions: usize,
#[structopt(short = "s", long = "batch-size", default_value = "8192")]
batch_size: usize,
}
#[derive(Debug, StructOpt)]
#[structopt(
name = "tpctools",
about = "Tools for generating and converting TPC data sets."
)]
enum Opt {
Generate(GenerateOpt),
Convert(ConvertOpt),
}
#[tokio::main]
async fn main() -> Result<()> {
match Opt::from_args() {
Opt::Generate(opt) => {
let scale = opt.scale;
let partitions = opt.partitions;
let generator_path = opt.generator_path.as_path().to_str().unwrap().to_string();
let output_path_str = opt.output.as_path().to_str().unwrap().to_string();
let tpc: Box<dyn Tpc> = match opt.benchmark.as_str() {
"tpcds" => Box::new(TpcDs::new()),
"tpch" => Box::new(TpcH::new()),
_ => panic!(),
};
tpc.generate(scale, partitions, &generator_path, &output_path_str)?;
}
Opt::Convert(opt) => {
let tpc: Box<dyn Tpc> = match opt.benchmark.as_str() {
"tpcds" => Box::new(TpcDs::new()),
"tpch" => Box::new(TpcH::new()),
_ => panic!(),
};
match tpc
.convert_to_parquet(
opt.input_path.as_path().to_str().unwrap(),
opt.output_path.as_path().to_str().unwrap(),
)
.await
{
Ok(_) => {}
Err(e) => println!("{:?}", e),
}
}
}
Ok(())
}