use datafold::schema::types::key_value::KeyValue;
use datafold::transform::chain_parser::parser::ChainParser;
use datafold::transform::iterator_stack_typed::adapter::map_chain_to_specs;
use datafold::transform::iterator_stack_typed::engine::TypedEngine;
use datafold::transform::iterator_stack_typed::types::TypedInput;
use serde_json::json;
use std::collections::HashMap;
#[test]
fn test_implicit_cardinality_execution() {
let parser = ChainParser::new();
let engine = TypedEngine::new();
let mut input_data: TypedInput = HashMap::new();
let mut content_atoms = HashMap::new();
content_atoms.insert(
KeyValue::new(Some("row1".to_string()), None),
datafold::schema::types::field::FieldValue {
value: json!("Hello world"),
atom_uuid: "atom1".to_string(),
source_file_name: None,
},
);
content_atoms.insert(
KeyValue::new(Some("row2".to_string()), None),
datafold::schema::types::field::FieldValue {
value: json!("Another test"),
atom_uuid: "atom2".to_string(),
source_file_name: None,
},
);
input_data.insert("content".to_string(), content_atoms);
let test_cases = vec![
("content", 2, "1:1 mapping"),
("content.split_by_word()", 4, "1:N split"),
("content.split_by_word().count()", 2, "N:1 count per row"),
];
for (expr, expected_count, desc) in test_cases {
println!("Testing: {}", desc);
let parsed = parser.parse(expr).expect("Failed to parse");
let specs = map_chain_to_specs(&parsed);
let result = engine.execute_chain(&specs, &input_data, "output");
let emitted = result.get("output").expect("No output");
assert_eq!(emitted.len(), expected_count, "Failed: {}", desc);
}
}