Add runnable graph spec

This commit is contained in:
Michael Pivato
2024-05-12 16:52:17 +09:30
parent bd24b0b9be
commit 25180d3616
3 changed files with 103 additions and 30 deletions

View File

@@ -1,6 +1,6 @@
use std::{collections::HashMap, io::Read, str::FromStr}; use std::{collections::HashMap, io::Read, str::FromStr};
use crate::io::RecordSerializer; use crate::{graph::RunnableNode, io::RecordSerializer};
pub enum Comparator<T: PartialOrd> { pub enum Comparator<T: PartialOrd> {
Equal(T), Equal(T),
@@ -77,3 +77,9 @@ pub fn filter_file(
} }
Ok(()) Ok(())
} }
pub struct FilterNodeRunner {}
impl RunnableNode for FilterNodeRunner {
fn run(&self) {}
}

View File

@@ -1,27 +1,33 @@
use itertools::Itertools;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)] use crate::filter::FilterNodeRunner;
// TODO: Break all this up into separate files in the graph module
#[derive(Serialize, Deserialize, Clone)]
pub enum NodeConfiguration { pub enum NodeConfiguration {
FileNode, FileNode,
MoveMoneyNode(MoveMoneyNode), MoveMoneyNode(MoveMoneyNode),
MergeNode(MergeNode), MergeNode(MergeNode),
DeriveNode(DeriveNode), DeriveNode(DeriveNode),
CodeRuleNode(CodeRuleNode),
FilterNode(FilterNode),
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub struct NodeInfo { pub struct NodeInfo {
pub name: String, pub name: String,
pub output_files: Vec<String>, pub output_files: Vec<String>,
pub configuration: NodeConfiguration, pub configuration: NodeConfiguration,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub enum MoveMoneyAmountType { pub enum MoveMoneyAmountType {
Percent, Percent,
Amount, Amount,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub struct MoveMoneyRule { pub struct MoveMoneyRule {
pub from_account: String, pub from_account: String,
pub from_cc: String, pub from_cc: String,
@@ -31,7 +37,7 @@ pub struct MoveMoneyRule {
pub amount_type: MoveMoneyAmountType, pub amount_type: MoveMoneyAmountType,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub struct MoveMoneyNode { pub struct MoveMoneyNode {
pub departments_path: String, pub departments_path: String,
pub accounts_path: String, pub accounts_path: String,
@@ -39,38 +45,38 @@ pub struct MoveMoneyNode {
pub rules: Vec<MoveMoneyRule>, pub rules: Vec<MoveMoneyRule>,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub enum JoinType { pub enum JoinType {
Left, Left,
Inner, Inner,
Right, Right,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub struct MergeJoin { pub struct MergeJoin {
pub join_type: JoinType, pub join_type: JoinType,
pub left_column_name: String, pub left_column_name: String,
pub right_column_name: String, pub right_column_name: String,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub struct MergeNode { pub struct MergeNode {
pub input_files: Vec<String>, pub input_files: Vec<String>,
pub joins: Vec<MergeJoin>, pub joins: Vec<MergeJoin>,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub enum DeriveColumnType { pub enum DeriveColumnType {
Column(String), Column(String),
Constant(String), Constant(String),
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub struct MapOperation { pub struct MapOperation {
pub mapped_value: String, pub mapped_value: String,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub enum DatePart { pub enum DatePart {
Year, Year,
Month, Month,
@@ -81,20 +87,20 @@ pub enum DatePart {
Second, Second,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub enum SplitType { pub enum SplitType {
DateTime(String, DatePart), DateTime(String, DatePart),
Numeric(String, isize), Numeric(String, isize),
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub enum MatchComparisonType { pub enum MatchComparisonType {
Equal, Equal,
GreaterThan, GreaterThan,
LessThan, LessThan,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub enum DeriveOperation { pub enum DeriveOperation {
Concat(Vec<DeriveColumnType>), Concat(Vec<DeriveColumnType>),
Add(Vec<DeriveColumnType>), Add(Vec<DeriveColumnType>),
@@ -105,25 +111,43 @@ pub enum DeriveOperation {
Split(String, SplitType), Split(String, SplitType),
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub struct DeriveFilter { pub struct DeriveFilter {
pub column_name: String, pub column_name: String,
pub comparator: MatchComparisonType, pub comparator: MatchComparisonType,
pub match_value: String, pub match_value: String,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub struct DeriveRule { pub struct DeriveRule {
pub operations: Vec<DeriveOperation>, pub operations: Vec<DeriveOperation>,
pub filters: Vec<DeriveFilter>, pub filters: Vec<DeriveFilter>,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub struct DeriveNode { pub struct DeriveNode {
pub rules: Vec<DeriveRule>, pub rules: Vec<DeriveRule>,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
pub enum CodeRuleLanguage {
Javascript,
Rust,
Go,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct CodeRuleNode {
pub language: CodeRuleLanguage,
pub text: String,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct FilterNode {
pub filters: Vec<DeriveFilter>,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct Node { pub struct Node {
pub id: i64, pub id: i64,
pub info: NodeInfo, pub info: NodeInfo,
@@ -136,7 +160,56 @@ impl Node {
} }
} }
impl Into<RunnableGraphNode> for Node {
fn into(self) -> RunnableGraphNode {
RunnableGraphNode {
runnable_node: Box::new(FilterNodeRunner {}),
// TODO: Construct node objects
// runnable_node: match &self.info.configuration {
// NodeConfiguration::FileNode => todo!(),
// NodeConfiguration::MoveMoneyNode(_) => todo!(),
// NodeConfiguration::MergeNode(_) => todo!(),
// NodeConfiguration::DeriveNode(_) => todo!(),
// NodeConfiguration::CodeRuleNode(_) => todo!(),
// NodeConfiguration::FilterNode(_) => todo!(),
// },
node: self,
}
}
}
#[derive(Serialize, Deserialize, Clone)]
pub struct Graph { pub struct Graph {
pub name: String, pub name: String,
pub nodes: Vec<Node>, pub nodes: Vec<Node>,
} }
pub trait RunnableNode {
fn run(&self);
}
pub struct RunnableGraphNode {
pub runnable_node: Box<dyn RunnableNode>,
pub node: Node,
}
pub struct RunnableGraph {
pub name: String,
pub nodes: Vec<RunnableGraphNode>,
}
impl RunnableGraph {
pub fn from_graph(graph: &Graph) -> RunnableGraph {
RunnableGraph {
name: graph.name.clone(),
nodes: graph
.nodes
.iter()
.map(|node| {
let runnable_graph_node: RunnableGraphNode = node.clone().into();
runnable_graph_node
})
.collect_vec(),
}
}
}

View File

@@ -4,25 +4,19 @@ pub use self::move_money::*;
use std::ffi::c_char; use std::ffi::c_char;
use std::ffi::CStr; use std::ffi::CStr;
use std::ffi::CString; use std::ffi::CString;
mod overhead_allocation; mod overhead_allocation;
pub use self::overhead_allocation::*; pub use self::overhead_allocation::*;
mod products; mod products;
pub use self::products::create_products; pub use self::products::create_products;
pub use self::products::csv::SourceType; pub use self::products::csv::SourceType;
mod shared_models; mod shared_models;
pub use self::shared_models::*; pub use self::shared_models::*;
pub mod code_rule;
pub mod link;
pub mod filter; pub mod filter;
pub mod upload_to_db;
mod io;
mod graph; mod graph;
mod io;
pub mod link;
pub mod upload_to_db;
#[no_mangle] #[no_mangle]
pub extern "C" fn move_money_from_text( pub extern "C" fn move_money_from_text(
@@ -74,7 +68,7 @@ pub extern "C" fn move_money_from_file(
let safe_lines = unwrap_c_char(lines); let safe_lines = unwrap_c_char(lines);
let safe_accounts = unwrap_c_char(accounts); let safe_accounts = unwrap_c_char(accounts);
let safe_cost_centres = unwrap_c_char(cost_centres); let safe_cost_centres = unwrap_c_char(cost_centres);
move_money_2() // move_money_2()
// move_money( // move_money(
// , // ,
// &mut csv::Reader::from_reader(safe_lines.to_str().unwrap()), // &mut csv::Reader::from_reader(safe_lines.to_str().unwrap()),