mod common;
use common::*;
#[tokio::test]
async fn test_optimizer_count_star_uses_statistics() {
let ctx = create_test_context();
let (_, meta) = register_zarr_table(&ctx, "data", SYNTHETIC_V3);
let plan = get_physical_plan(&ctx, "SELECT COUNT(*) FROM data").await;
assert_no_zarr_exec(&plan);
let batch = execute_query_single(&ctx, "SELECT COUNT(*) FROM data").await;
let count = get_scalar_i64(&batch);
assert_eq!(count as usize, meta.total_rows);
}
#[tokio::test]
async fn test_optimizer_count_column_uses_statistics() {
let ctx = create_test_context();
let (_, meta) = register_zarr_table(&ctx, "data", SYNTHETIC_V3);
let batch = execute_query_single(&ctx, "SELECT COUNT(temperature) FROM data").await;
let count = get_scalar_i64(&batch);
assert_eq!(count as usize, meta.total_rows);
}
#[tokio::test]
async fn test_optimizer_count_with_filter_not_optimized() {
let ctx = create_test_context();
register_zarr_table(&ctx, "data", SYNTHETIC_V3);
let plan = get_physical_plan(&ctx, "SELECT COUNT(*) FROM data WHERE temperature > 0").await;
assert_has_zarr_exec(&plan);
}
#[tokio::test]
async fn test_optimizer_count_with_group_by_not_optimized() {
let ctx = create_test_context();
register_zarr_table(&ctx, "data", SYNTHETIC_V3);
let plan = get_physical_plan(&ctx, "SELECT time, COUNT(*) FROM data GROUP BY time").await;
assert_has_zarr_exec(&plan);
}
#[tokio::test]
async fn test_optimizer_min_coordinate_uses_statistics() {
let ctx = create_test_context();
register_zarr_table(&ctx, "data", SYNTHETIC_V3);
let plan = get_physical_plan(&ctx, "SELECT MIN(lat) FROM data").await;
assert_no_zarr_exec(&plan);
}
#[tokio::test]
async fn test_optimizer_max_coordinate_uses_statistics() {
let ctx = create_test_context();
register_zarr_table(&ctx, "data", SYNTHETIC_V3);
let plan = get_physical_plan(&ctx, "SELECT MAX(lon) FROM data").await;
assert_no_zarr_exec(&plan);
}
#[tokio::test]
async fn test_optimizer_minmax_multiple_coords() {
let ctx = create_test_context();
register_zarr_table(&ctx, "data", SYNTHETIC_V3);
let plan = get_physical_plan(
&ctx,
"SELECT MIN(lat), MAX(lat), MIN(lon), MAX(lon) FROM data",
)
.await;
assert_no_zarr_exec(&plan);
let batch = execute_query_single(
&ctx,
"SELECT MIN(lat), MAX(lat), MIN(lon), MAX(lon) FROM data",
)
.await;
assert_eq!(batch.num_rows(), 1);
assert_eq!(batch.num_columns(), 4);
}
#[tokio::test]
async fn test_optimizer_minmax_data_var_not_optimized() {
let ctx = create_test_context();
register_zarr_table(&ctx, "data", SYNTHETIC_V3);
let plan = get_physical_plan(&ctx, "SELECT MIN(temperature), MAX(temperature) FROM data").await;
assert_has_zarr_exec(&plan);
}
#[tokio::test]
async fn test_optimizer_minmax_with_filter_not_optimized() {
let ctx = create_test_context();
register_zarr_table(&ctx, "data", SYNTHETIC_V3);
let plan = get_physical_plan(&ctx, "SELECT MIN(lat) FROM data WHERE temperature > 0").await;
assert_has_zarr_exec(&plan);
}
#[tokio::test]
async fn test_optimizer_minmax_with_group_by_not_optimized() {
let ctx = create_test_context();
register_zarr_table(&ctx, "data", SYNTHETIC_V3);
let plan = get_physical_plan(&ctx, "SELECT time, MIN(lat) FROM data GROUP BY time").await;
assert_has_zarr_exec(&plan);
}
#[tokio::test]
async fn test_optimizer_count_result_matches_scan() {
let opt_ctx = create_test_context();
register_zarr_table(&opt_ctx, "data", SYNTHETIC_V3);
let base_ctx = create_baseline_context();
register_zarr_table(&base_ctx, "data", SYNTHETIC_V3);
let opt_result = execute_query_single(&opt_ctx, "SELECT COUNT(*) as cnt FROM data").await;
let base_result = execute_query_single(&base_ctx, "SELECT COUNT(*) as cnt FROM data").await;
let opt_count = get_scalar_i64(&opt_result);
let base_count = get_scalar_i64(&base_result);
assert_eq!(opt_count, base_count);
}
#[tokio::test]
async fn test_optimizer_minmax_result_matches_scan() {
use arrow::array::Int64Array;
let opt_ctx = create_test_context();
register_zarr_table(&opt_ctx, "data", SYNTHETIC_V3);
let base_ctx = create_baseline_context();
register_zarr_table(&base_ctx, "data", SYNTHETIC_V3);
let opt_result = execute_query_single(&opt_ctx, "SELECT MIN(lat), MAX(lat) FROM data").await;
let base_result = execute_query_single(&base_ctx, "SELECT MIN(lat), MAX(lat) FROM data").await;
let opt_min = opt_result
.column(0)
.as_any()
.downcast_ref::<Int64Array>()
.unwrap()
.value(0);
let opt_max = opt_result
.column(1)
.as_any()
.downcast_ref::<Int64Array>()
.unwrap()
.value(0);
let base_min = base_result
.column(0)
.as_any()
.downcast_ref::<Int64Array>()
.unwrap()
.value(0);
let base_max = base_result
.column(1)
.as_any()
.downcast_ref::<Int64Array>()
.unwrap()
.value(0);
assert_eq!(opt_min, base_min, "MIN values should match");
assert_eq!(opt_max, base_max, "MAX values should match");
}
#[tokio::test]
async fn test_optimizer_mixed_aggregate_not_fully_optimized() {
let ctx = create_test_context();
register_zarr_table(&ctx, "data", SYNTHETIC_V3);
let plan = get_physical_plan(&ctx, "SELECT COUNT(*), SUM(temperature) FROM data").await;
assert_has_zarr_exec(&plan);
}
#[tokio::test]
async fn test_optimizer_count_and_minmax_combined() {
let ctx = create_test_context();
let (_, meta) = register_zarr_table(&ctx, "data", SYNTHETIC_V3);
let batch = execute_query_single(&ctx, "SELECT COUNT(*), MIN(lat), MAX(lon) FROM data").await;
assert_eq!(batch.num_rows(), 1);
assert_eq!(batch.num_columns(), 3);
let count = get_scalar_i64(&batch);
assert_eq!(count as usize, meta.total_rows);
}