use super::*;
#[test]
fn test_phase_c_proof_of_concept_full_pipeline() {
let schema = vibesql_catalog::TableSchema::new(
"users".to_string(),
vec![
vibesql_catalog::ColumnSchema::new(
"id".to_string(),
vibesql_types::DataType::Integer,
false,
),
vibesql_catalog::ColumnSchema::new(
"name".to_string(),
vibesql_types::DataType::Varchar { max_length: None },
false,
),
vibesql_catalog::ColumnSchema::new(
"age".to_string(),
vibesql_types::DataType::Integer,
false,
),
],
);
let from_schema = CombinedSchema::from_table("users".to_string(), schema);
let from_rows = vec![
Row::new(vec![
SqlValue::Integer(1),
SqlValue::Varchar(arcstr::ArcStr::from("Alice")),
SqlValue::Integer(25),
]),
Row::new(vec![
SqlValue::Integer(2),
SqlValue::Varchar(arcstr::ArcStr::from("Bob")),
SqlValue::Integer(17),
]),
Row::new(vec![
SqlValue::Integer(3),
SqlValue::Varchar(arcstr::ArcStr::from("Charlie")),
SqlValue::Integer(30),
]),
Row::new(vec![
SqlValue::Integer(4),
SqlValue::Varchar(arcstr::ArcStr::from("Diana")),
SqlValue::Integer(16),
]),
Row::new(vec![
SqlValue::Integer(5),
SqlValue::Varchar(arcstr::ArcStr::from("Eve")),
SqlValue::Integer(22),
]),
];
let scan = TableScanIterator::new(from_schema.clone(), from_rows);
let where_expr = vibesql_ast::Expression::BinaryOp {
left: Box::new(vibesql_ast::Expression::ColumnRef(
vibesql_ast::ColumnIdentifier::qualified("users", false, "age", false),
)),
op: vibesql_ast::BinaryOperator::GreaterThan,
right: Box::new(vibesql_ast::Expression::Literal(SqlValue::Integer(18))),
};
let evaluator = CombinedExpressionEvaluator::new(&from_schema);
let filter = FilterIterator::new(scan, where_expr, evaluator);
let limited = filter.take(10);
let results: Vec<_> = limited.collect::<Result<Vec<_>, _>>().unwrap();
assert_eq!(results.len(), 3);
assert_eq!(results[0].values[0], SqlValue::Integer(1)); assert_eq!(results[0].values[2], SqlValue::Integer(25));
assert_eq!(results[1].values[0], SqlValue::Integer(3)); assert_eq!(results[1].values[2], SqlValue::Integer(30));
assert_eq!(results[2].values[0], SqlValue::Integer(5)); assert_eq!(results[2].values[2], SqlValue::Integer(22));
}
#[test]
fn test_phase_c_proof_of_concept_join_pipeline() {
let orders_schema = vibesql_catalog::TableSchema::new(
"orders".to_string(),
vec![
vibesql_catalog::ColumnSchema::new(
"id".to_string(),
vibesql_types::DataType::Integer,
false,
),
vibesql_catalog::ColumnSchema::new(
"customer_id".to_string(),
vibesql_types::DataType::Integer,
false,
),
vibesql_catalog::ColumnSchema::new(
"amount".to_string(),
vibesql_types::DataType::Integer,
false,
),
],
);
let customers_schema = vibesql_catalog::TableSchema::new(
"customers".to_string(),
vec![
vibesql_catalog::ColumnSchema::new(
"id".to_string(),
vibesql_types::DataType::Integer,
false,
),
vibesql_catalog::ColumnSchema::new(
"name".to_string(),
vibesql_types::DataType::Varchar { max_length: None },
false,
),
],
);
let orders_combined = CombinedSchema::from_table("orders".to_string(), orders_schema);
let customers_combined = CombinedSchema::from_table("customers".to_string(), customers_schema);
let orders_rows: Vec<_> = (1..=10)
.map(|i| {
Row::new(vec![
SqlValue::Integer(i),
SqlValue::Integer((i % 3) + 1), SqlValue::Integer(i * 50), ])
})
.collect();
let customers_rows = vec![
Row::new(vec![SqlValue::Integer(1), SqlValue::Varchar(arcstr::ArcStr::from("Alice"))]),
Row::new(vec![SqlValue::Integer(2), SqlValue::Varchar(arcstr::ArcStr::from("Bob"))]),
Row::new(vec![SqlValue::Integer(3), SqlValue::Varchar(arcstr::ArcStr::from("Charlie"))]),
];
let orders_scan = TableScanIterator::new(orders_combined.clone(), orders_rows);
let join_condition = vibesql_ast::Expression::BinaryOp {
left: Box::new(vibesql_ast::Expression::ColumnRef(
vibesql_ast::ColumnIdentifier::qualified("orders", false, "customer_id", false),
)),
op: vibesql_ast::BinaryOperator::Equal,
right: Box::new(vibesql_ast::Expression::ColumnRef(
vibesql_ast::ColumnIdentifier::qualified("customers", false, "id", false),
)),
};
let join = LazyNestedLoopJoin::new(
orders_scan,
customers_combined.clone(),
customers_rows,
vibesql_ast::JoinType::Inner,
Some(join_condition),
None, );
let mut combined_tables = orders_combined.table_schemas.clone();
for (name, (start_idx, schema)) in customers_combined.table_schemas.iter() {
combined_tables
.insert(name.clone(), (orders_combined.total_columns + start_idx, schema.clone()));
}
let combined_schema = CombinedSchema {
table_schemas: combined_tables,
total_columns: orders_combined.total_columns + customers_combined.total_columns,
hidden_columns: std::collections::HashSet::new(),
outer_schema: None,
duplicate_aliases: std::collections::HashSet::new(),
joined_columns: std::collections::HashSet::new(),
using_coalesce_indices: std::collections::HashMap::new(),
column_replacement_map: std::collections::HashMap::new(),
alias_tables: std::collections::HashSet::new(),
shadowed_tables: std::collections::HashMap::new(),
};
let where_expr = vibesql_ast::Expression::BinaryOp {
left: Box::new(vibesql_ast::Expression::ColumnRef(
vibesql_ast::ColumnIdentifier::qualified("orders", false, "amount", false),
)),
op: vibesql_ast::BinaryOperator::GreaterThan,
right: Box::new(vibesql_ast::Expression::Literal(SqlValue::Integer(100))),
};
let evaluator = CombinedExpressionEvaluator::new(&combined_schema);
let filter = FilterIterator::new(join, where_expr, evaluator);
let limited = filter.take(5);
let results: Vec<_> = limited.collect::<Result<Vec<_>, _>>().unwrap();
assert_eq!(results.len(), 5);
assert_eq!(results[0].values.len(), 5);
assert_eq!(results[0].values[0], SqlValue::Integer(3)); assert_eq!(results[0].values[2], SqlValue::Integer(150)); }