Add runnable graph spec
This commit is contained in:
@@ -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) {}
|
||||||
|
}
|
||||||
|
|||||||
109
src/graph.rs
109
src/graph.rs
@@ -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(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
16
src/lib.rs
16
src/lib.rs
@@ -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()),
|
||||||
|
|||||||
Reference in New Issue
Block a user