use rudb::Database;
use rudb_common::Value;
fn sniff(pattern: &str) -> String {
format!("'{}/../rudb-csv/testdata/sniff/{pattern}'", env!("CARGO_MANIFEST_DIR"))
}
fn one(what: &str, from: &str) -> Value {
let database = Database::new();
let sql = format!("SELECT {what} FROM {from}");
database.value(&sql).unwrap_or_else(|error| panic!("{sql} failed: {error}"))
}
fn types(from: &str) -> Vec<String> {
let database = Database::new();
let sql = format!("SELECT * FROM {from}");
let result = database.query(&sql).unwrap_or_else(|error| panic!("{sql} failed: {error}"));
result.types().iter().map(ToString::to_string).collect()
}
#[test]
fn every_file_is_sniffed_and_one_decimal_widens_the_whole_read() {
assert_eq!(types(&format!("read_csv({})", sniff("*.csv"))), ["DOUBLE", "VARCHAR"]);
assert_eq!(one("count(*)", &format!("read_csv({})", sniff("*.csv"))), Value::BigInt(4));
assert_eq!(one("sum(id)", &format!("read_csv({})", sniff("*.csv"))), Value::Double(10.5));
}
#[test]
fn the_files_that_hold_whole_numbers_are_read_as_the_type_the_set_settled_on() {
let database = Database::new();
let sql = format!("SELECT id, tag FROM read_csv({}) ORDER BY id", sniff("*.csv"));
let result = database.query(&sql).expect("runs");
assert_eq!(result.len(), 4);
let ids: Vec<Value> = (0..4).map(|row| result.value_at(row, 0)).collect();
assert_eq!(
ids,
[Value::Double(1.0), Value::Double(2.0), Value::Double(3.0), Value::Double(4.5)]
);
assert_eq!(result.value_at(3, 1), Value::Varchar("w".into()));
}
#[test]
fn a_pattern_that_leaves_out_the_decimal_file_is_an_integer_read() {
let two = format!("read_csv({})", sniff("s[12].csv"));
assert_eq!(types(&two), ["BIGINT", "VARCHAR"]);
assert_eq!(one("count(*)", &two), Value::BigInt(3));
assert_eq!(one("sum(id)", &two), Value::HugeInt(6));
}
#[test]
fn a_file_missing_a_column_the_first_one_has_is_the_csv_readers_own_complaint() {
let database = Database::new();
let sql = format!("SELECT * FROM read_csv({})", sniff("odd/*.csv"));
let message = database.query(&sql).expect_err("the files disagree").message().to_string();
assert!(message.starts_with("Schema mismatch between globbed files."), "{message}");
assert!(message.contains("Column with name: \"id\" is missing"), "{message}");
assert!(
message.contains("Potential Fixes \n* Consider setting union_by_name=true."),
"{message}"
);
assert!(message.contains("files_to_sniff = -1"), "{message}");
}