use std::collections::HashMap;
use serde_json::{Value, json};
#[allow(unused_imports)] use crate::error::FraiseQLError;
use crate::{compiler::aggregation::AggregationPlan, error::Result};
pub struct AggregationProjector;
impl AggregationProjector {
pub fn project(rows: Vec<HashMap<String, Value>>, _plan: &AggregationPlan) -> Result<Value> {
let projected_rows: Vec<Value> = rows
.into_iter()
.map(|row| {
let mut obj = serde_json::Map::new();
for (key, value) in row {
obj.insert(key, value);
}
Value::Object(obj)
})
.collect();
Ok(Value::Array(projected_rows))
}
#[allow(clippy::needless_pass_by_value)] #[must_use]
pub fn wrap_in_data_envelope(projected: Value, query_name: &str) -> Value {
json!({
"data": {
query_name: projected
}
})
}
pub fn project_single(row: HashMap<String, Value>, _plan: &AggregationPlan) -> Result<Value> {
let mut obj = serde_json::Map::new();
for (key, value) in row {
obj.insert(key, value);
}
Ok(Value::Object(obj))
}
}