kafka-connect-bigtable-sink/doc/performance/terraform/main.rs (87 lines of code) (raw):
use std::env;
const FIELD_VALUE_SIZE_ENV: &str = "FIELD_VALUE_SIZE";
const COLUMN_FAMILIES_ENV: &str = "COLUMN_FAMILIES";
const COLUMNS_PER_FAMILI_ENV: &str = "COLUMNS_PER_FAMILY";
const DELIMITER: &str = "|";
const VALUE_CHAR: &str = "0";
fn main() {
let field_value_size: usize = get_env_var_u64(FIELD_VALUE_SIZE_ENV) as usize;
let column_families: u64 = get_env_var_u64(COLUMN_FAMILIES_ENV);
let columns_per_family: u64 = get_env_var_u64(COLUMNS_PER_FAMILI_ENV);
let field_value: String = VALUE_CHAR.repeat(field_value_size);
let (value_schema, value) = if column_families == 0 {
string_schema_and_value(field_value)
} else {
struct_schema_and_value(column_families, columns_per_family, field_value)
};
let schema_and_value: String = format!("{{\"schema\":{},\"payload\":{}}}", value_schema, value);
let mut i: u64 = 0;
loop {
println!("\"{}\"{}{}", i, DELIMITER, schema_and_value);
i += 1;
}
}
fn get_env_var_u64(name: &str) -> u64 {
let missing_error: String = format!("Missing env var: {}.", name);
let invalid_error: String = format!("Non-u64 env var: {}.", name);
env::var(name)
.expect(&missing_error)
.parse::<u64>()
.expect(&invalid_error)
}
fn struct_schema_and_value(
column_families: u64,
columns_per_family: u64,
field_value: String,
) -> (String, String) {
let columns: Vec<String> = (1..=columns_per_family)
.map(|i| format!("c{}", i))
.collect();
let column_families: Vec<String> = (1..=column_families).map(|i| format!("cf{}", i)).collect();
let column_family_schemas: Vec<String> = column_families
.iter()
.map(|cf| {
format!(
"{{\"type\":\"struct\",\"optional\":true,\"field\":\"{}\",\"fields\":[{}]}}",
cf,
columns
.iter()
.map(|c| format!(
"{{\"type\":\"string\",\"optional\":true,\"field\":\"{}\"}}",
c
))
.collect::<Vec<String>>()
.join(",")
)
})
.collect();
let schema: String = format!(
"{{\"name\":\"record\",\"type\":\"struct\",\"optional\":true,\"fields\":[{}]}}",
column_family_schemas.join(",")
);
let value: String = format!(
"{{{}}}",
column_families
.iter()
.map(|cf| {
format!(
"\"{}\":{{{}}}",
cf,
columns
.iter()
.map(|c| format!("\"{}\":\"{}\"", c, field_value))
.collect::<Vec<String>>()
.join(",")
)
})
.collect::<Vec<String>>()
.join(",")
);
(schema, value)
}
fn string_schema_and_value(field_value: String) -> (String, String) {
(
"{\"type\":\"string\",\"optional\":true}".to_string(),
format!("\"{}\"", field_value),
)
}