use serde_json::json;
use tellaro_query_language::Tql;
fn get_test_data() -> Vec<serde_json::Value> {
vec![
json!({"product": "laptop", "revenue": 1200, "quantity": 2, "region": "north", "status": "success"}),
json!({"product": "laptop", "revenue": 1500, "quantity": 3, "region": "south", "status": "success"}),
json!({"product": "phone", "revenue": 800, "quantity": 1, "region": "north", "status": "success"}),
json!({"product": "phone", "revenue": 900, "quantity": 2, "region": "south", "status": "failed"}),
json!({"product": "tablet", "revenue": 600, "quantity": 1, "region": "north", "status": "success"}),
json!({"product": "tablet", "revenue": 650, "quantity": 1, "region": "south", "status": "success"}),
json!({"product": "laptop", "revenue": 1100, "quantity": 2, "region": "north", "status": "success"}),
json!({"product": "phone", "revenue": 850, "quantity": 1, "region": "north", "status": "success"}),
]
}
#[test]
fn test_count_all() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats count(*)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_count_empty_parens() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats count()")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_count_with_pipe_prefix() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats count(*)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_sum_aggregation() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats sum(revenue)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_avg_aggregation() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats avg(revenue)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_min_aggregation() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats min(revenue)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_max_aggregation() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats max(revenue)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_median_aggregation() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats median(revenue)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_unique_count_aggregation() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats unique(product)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_multiple_aggregations() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats sum(revenue), count(*), avg(revenue)")
.expect("Query should succeed");
assert!(result.get("results").is_some());
}
#[test]
fn test_min_max_aggregations() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats min(revenue), max(revenue)")
.expect("Query should succeed");
assert!(result.get("results").is_some());
}
#[test]
fn test_group_by_single_field() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats sum(revenue) by product")
.expect("Query should succeed");
assert!(result.get("results").is_some());
}
#[test]
fn test_group_by_multiple_fields() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats sum(revenue), count(*) by product, region")
.expect("Query should succeed");
assert!(result.get("results").is_some());
}
#[test]
fn test_count_by_group() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats count(*) by product")
.expect("Query should succeed");
assert!(result.get("results").is_some());
}
#[test]
fn test_unique_count_by_group() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats unique(product) by region")
.expect("Query should succeed");
assert!(result.get("results").is_some());
}
#[test]
fn test_filtered_stats() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "status eq 'success' | stats sum(revenue)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_filtered_stats_with_group_by() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(
&data,
"status eq 'success' | stats sum(revenue), count(*) by product",
)
.expect("Query should succeed");
assert!(result.get("results").is_some());
}
#[test]
fn test_complex_filter_with_stats() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(
&data,
"region eq 'north' and revenue > 700 | stats count(*), avg(revenue)",
)
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_stats_empty_data() {
let tql = Tql::new();
let data: Vec<serde_json::Value> = vec![];
let result = tql
.evaluate_stats(&data, "| stats count(*)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_stats_with_null_values() {
let tql = Tql::new();
let data = vec![
json!({"value": 10}),
json!({"value": null}),
json!({"value": 20}),
];
let result = tql
.evaluate_stats(&data, "| stats sum(value)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_stats_with_missing_field() {
let tql = Tql::new();
let data = vec![json!({"a": 1}), json!({"a": 2})];
let result = tql
.evaluate_stats(&data, "| stats sum(b)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_stats_std_deviation() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats std(revenue)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_stats_percentile_via_median() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats median(revenue)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_stats_with_alias() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats sum(revenue) as total_revenue")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_stats_multiple_with_aliases() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(
&data,
"| stats sum(revenue) as total, count(*) as total_count",
)
.expect("Query should succeed");
assert!(result.get("results").is_some());
}
#[test]
fn test_count_with_asterisk() {
let tql = Tql::new();
let data = vec![
json!({"status": "success", "value": 100}),
json!({"status": "failed", "value": 200}),
json!({"status": "success", "value": 300}),
json!({"status": "pending", "value": null}),
];
let result = tql
.evaluate_stats(&data, "| stats count(*)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_count_without_asterisk() {
let tql = Tql::new();
let data = vec![
json!({"status": "success", "value": 100}),
json!({"status": "failed", "value": 200}),
json!({"status": "success", "value": 300}),
json!({"status": "pending", "value": null}),
];
let result = tql
.evaluate_stats(&data, "| stats count()")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_count_with_filter() {
let tql = Tql::new();
let data = vec![
json!({"status": "success", "value": 100}),
json!({"status": "failed", "value": 200}),
json!({"status": "success", "value": 300}),
json!({"status": "pending", "value": null}),
];
let result = tql
.evaluate_stats(&data, "status = 'success' | stats count(*)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_count_in_multiple_aggregations() {
let tql = Tql::new();
let data = vec![
json!({"status": "success", "value": 100}),
json!({"status": "failed", "value": 200}),
json!({"status": "success", "value": 300}),
json!({"status": "pending", "value": null}),
];
let result = tql
.evaluate_stats(&data, "| stats count(*), sum(value)")
.expect("Query should succeed");
assert!(result.get("results").is_some());
}
#[test]
fn test_count_with_groupby() {
let tql = Tql::new();
let data = vec![
json!({"status": "success", "value": 100}),
json!({"status": "failed", "value": 200}),
json!({"status": "success", "value": 300}),
json!({"status": "pending", "value": null}),
];
let result = tql
.evaluate_stats(&data, "| stats count(*) by status")
.expect("Query should succeed");
assert!(result.get("results").is_some());
}
#[test]
fn test_sum_specific_field() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats sum(quantity)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_avg_specific_field() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats avg(quantity)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}
#[test]
fn test_stats_by_region() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats sum(revenue) by region")
.expect("Query should succeed");
assert!(result.get("results").is_some());
}
#[test]
fn test_stats_by_status() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "| stats sum(revenue), count(*) by status")
.expect("Query should succeed");
assert!(result.get("results").is_some());
}
#[test]
fn test_complex_stats_query() {
let tql = Tql::new();
let data = get_test_data();
let result = tql.evaluate_stats(&data,
"status eq 'success' | stats sum(revenue), avg(revenue), min(revenue), max(revenue), count(*) by product")
.expect("Query should succeed");
assert!(result.get("results").is_some());
}
#[test]
fn test_stats_with_numeric_filter() {
let tql = Tql::new();
let data = get_test_data();
let result = tql
.evaluate_stats(&data, "revenue > 800 | stats count(*)")
.expect("Query should succeed");
assert!(result.get("results").is_some() || result.get("value").is_some());
}