use crate::bridge::physical_plan::PhysicalPlan;
#[derive(Debug, Clone)]
pub struct TaskRoute {
pub plan: PhysicalPlan,
pub decision: RouteDecision,
pub vshard_id: u32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum RouteDecision {
Local,
Remote {
node_id: u64,
vshard_id: u64,
},
Broadcast { vshards: Vec<u64> },
LeaderUnknown {
vshard_id: u64,
},
}
#[cfg(test)]
mod tests {
use super::*;
use crate::bridge::physical_plan::{KvOp, PhysicalPlan};
#[test]
fn route_decision_equality() {
assert_eq!(RouteDecision::Local, RouteDecision::Local);
assert_ne!(
RouteDecision::Remote {
node_id: 1,
vshard_id: 0
},
RouteDecision::Local
);
}
#[test]
fn task_route_holds_plan() {
let plan = PhysicalPlan::Kv(KvOp::Get {
collection: "test".into(),
key: b"k".to_vec(),
rls_filters: vec![],
surrogate_ceiling: None,
});
let route = TaskRoute {
plan: plan.clone(),
decision: RouteDecision::Local,
vshard_id: 0,
};
assert_eq!(route.decision, RouteDecision::Local);
assert_eq!(route.plan, plan);
}
}