mod act_executor;
mod event_executor;
mod message_executor;
mod model_executor;
mod package_executor;
mod process_executor;
mod task_executor;
use serde::Serialize;
use serde_json::json;
use crate::{scheduler::Runtime, store::query::*};
use std::sync::Arc;
#[derive(Default, Debug)]
pub struct ExecutorQuery {
pub query_by: Vec<(String, serde_json::Value)>,
pub order_by: Vec<(String, bool)>,
pub offset: usize,
pub count: usize,
}
#[derive(Clone)]
pub struct Executor {
msg: message_executor::MessageExecutor,
act: act_executor::ActExecutor,
model: model_executor::ModelExecutor,
proc: process_executor::ProcessExecutor,
task: task_executor::TaskExecutor,
pack: package_executor::PackageExecutor,
evt: event_executor::EventExecutor,
}
impl ExecutorQuery {
pub fn new() -> Self {
Self::default()
}
pub fn with_offset(mut self, offset: usize) -> Self {
self.offset = offset;
self
}
pub fn with_count(mut self, count: usize) -> Self {
self.count = count;
self
}
pub fn with_order(mut self, order: &str, rev: bool) -> Self {
self.order_by.push((order.to_string(), rev));
self
}
pub fn with_query<T: Serialize>(mut self, key: &str, value: T) -> Self {
self.query_by.push((key.to_string(), json!(value)));
self
}
pub fn into_cond(&self) -> Cond {
let mut cond = Cond::and();
for (k, v) in self.query_by.iter() {
let mut key: &str = k;
if k == "type" {
key = "kind";
}
cond = cond.push(Expr::eq(key, v))
}
cond
}
pub fn into_query(&self) -> Query {
let mut query = Query::new().set_offset(self.offset).set_limit(self.count);
if !self.query_by.is_empty() {
query = query.push(self.into_cond())
}
query.set_order(&self.order_by)
}
}
impl Executor {
pub(crate) fn new(rt: &Arc<Runtime>) -> Self {
Self {
msg: message_executor::MessageExecutor::new(rt),
act: act_executor::ActExecutor::new(rt),
model: model_executor::ModelExecutor::new(rt),
proc: process_executor::ProcessExecutor::new(rt),
task: task_executor::TaskExecutor::new(rt),
pack: package_executor::PackageExecutor::new(rt),
evt: event_executor::EventExecutor::new(rt),
}
}
pub fn msg(&self) -> &message_executor::MessageExecutor {
&self.msg
}
pub fn act(&self) -> &act_executor::ActExecutor {
&self.act
}
pub fn model(&self) -> &model_executor::ModelExecutor {
&self.model
}
pub fn proc(&self) -> &process_executor::ProcessExecutor {
&self.proc
}
pub fn task(&self) -> &task_executor::TaskExecutor {
&self.task
}
pub fn pack(&self) -> &package_executor::PackageExecutor {
&self.pack
}
pub fn evt(&self) -> &event_executor::EventExecutor {
&self.evt
}
}