use vantage_dataset::ReadableValueSet;
use vantage_table::column::core::ColumnType;
use vantage_table::table::Table;
use vantage_table::traits::table_source::TableSource;
use vantage_types::EmptyEntity;
pub fn assert_condition_text_and_column<T: TableSource>(
db: &T,
p1: T::Value,
raw: T::Condition,
both: T::Condition,
) where
T::Id: ColumnType,
{
let eq = db.eq_value_condition("parent", p1).unwrap();
assert_eq!(db.describe_condition(&eq), "parent = 'p1'");
assert_eq!(db.condition_column(&eq), Some("parent".to_string()));
let invoices = Table::<T, EmptyEntity>::new("invoice", db.clone()).with_id_column("id");
let in_cond = db.related_in_condition("invoice_id", &invoices, "id");
assert_eq!(
db.condition_column(&in_cond),
Some("invoice_id".to_string())
);
assert_eq!(db.condition_column(&raw), None);
assert_eq!(db.condition_column(&both), None);
}
pub async fn assert_in_values_narrows_products<T: TableSource>(db: &T, id: fn(&str) -> T::Value)
where
T::Id: ColumnType + std::fmt::Display,
{
let products = |values: Vec<T::Value>| {
let condition = db.in_values_condition("id", values).unwrap();
Table::<T, EmptyEntity>::new("product", db.clone())
.with_id_column("id")
.with_column_of::<String>("name")
.with_condition(condition)
};
let listed = products(vec![id("flux_cupcake"), id("delorean_donut")])
.list_values()
.await
.unwrap();
let mut ids: Vec<String> = listed.keys().map(|k| k.to_string()).collect();
ids.sort();
assert_eq!(ids, ["delorean_donut", "flux_cupcake"]);
let none = products(vec![]).list_values().await.unwrap();
assert!(none.is_empty());
}
pub struct NarrowingShapes<C> {
pub negations: Vec<C>,
pub gt: C,
pub column_vs_column: C,
pub or_operand: C,
}
pub fn assert_condition_column_names_only_narrowing<T: TableSource>(
db: &T,
shapes: NarrowingShapes<T::Condition>,
) {
assert_eq!(
db.condition_column(&shapes.gt),
Some("invoice_id".to_string())
);
for (i, negation) in shapes.negations.iter().enumerate() {
assert_eq!(db.condition_column(negation), None, "negation #{i}");
}
assert_eq!(db.condition_column(&shapes.column_vs_column), None);
assert_eq!(db.condition_column(&shapes.or_operand), None);
}
pub fn assert_in_values_names_its_column<T: TableSource>(db: &T, value: T::Value) {
let condition = db.in_values_condition("invoice_id", vec![value]).unwrap();
assert_eq!(
db.condition_column(&condition),
Some("invoice_id".to_string())
);
}