jeeflow-persist

    jeeflow dynamic table persist (DynamicTableWriter + PersistPostInterceptor + Meta)

    Download zip
    Author
    Version
    0.1.2
    License
    Apache-2.0
    Last updated
    2 hours ago
    Downloads
    8

    Dependencies

    #jeeflow-persist

    Workflow → business-table persistence for jeeflow — ARCHIVE / SYNC with field permissions.

    mooncakes License

    PersistPostInterceptor copies form data out of running workflow instances into your own business tables, driven entirely by the process definition — the role jeeflow-persist plays for the MoonBit build of jeeflow-moon.

    #Quickstart

    let provider = @persist.InMemoryMetaProvider::new()
    let meta = @persist.TableMeta::make("expense", "报销")
    meta.add_field(@persist.FieldMeta::make("note", "VARCHAR(200)", "备注"))
    provider.register(meta)

    let interceptor = @persist.PersistPostInterceptor::make(provider, my_writer)
    ctx.register_interceptor(interceptor.as_interceptor()) // order = 100 (post)

    Process definition drives everything:

    {"persistMode": "ARCHIVE", "relTableName": "expense"}

    • ARCHIVE — at the end node, on FINISHED + agree (submitType=1), insert the full f_* form once; idempotent by the process_instance_id key.
    • SYNC — insert at start → update at each task (business fields filtered by the target node's field.PERMISSION_*: readonly/hidden never write through) → final-state update at the end; a {nodeId}_{state} status column is probed automatically.
    • Safety — dynamic table names are validated (alnum+underscore, wf_/sys_/… prefixes refused) and failures are loud, never silent.

    #License

    Apache-2.0 — part of jeeflow-moon.

    DynamicTableWriter

    pub(open) trait DynamicTableWriter {
    fn insert(Self, String, Map[String, Json]) -> Int64 raise
    JeeflowError

    fn update(Self, String, Int64, Map[String, Json]) -> Unit raise
    JeeflowError

    fn exists(Self, String, Int64) -> Bool raise
    JeeflowError

    fn exists_by_key(Self, String, String, Int64) -> Bool raise
    JeeflowError

    fn update_by_key(Self, String, Map[String, Json], String, Int64) -> Unit raise
    JeeflowError

    fn columns(Self, String, Array[String]) -> Array[String] raise
    JeeflowError

    }

    DynamicTableWriter trait(MoonBit:大接口 trait 形态)

    FieldMeta

    pub(all) struct FieldMeta {
    column_name : String
    column_type : String
    display_name : String
    nullable : Bool
    default_value : String?
    permission : Int
    }

    字段元数据(动态表列)

    FieldMeta::is_editable

    fn FieldMeta::is_editable(self : FieldMeta) -> Bool

    FieldMeta::is_visible

    fn FieldMeta::is_visible(self : FieldMeta) -> Bool

    FieldMeta::make

    fn FieldMeta::make(column_name : String, column_type : String, display_name : String) -> FieldMeta

    InMemoryMetaProvider

    pub(all) struct InMemoryMetaProvider {
    tables : Map[String, TableMeta]
    }

    IDynamicMetaProvider 内存实现

    InMemoryMetaProvider::get_table_meta

    InMemoryMetaProvider::list_table_names

    fn InMemoryMetaProvider::list_table_names(self : InMemoryMetaProvider) -> Array[String]

    InMemoryMetaProvider::new

    InMemoryMetaProvider::register

    fn InMemoryMetaProvider::register(self : InMemoryMetaProvider, meta : TableMeta) -> Unit

    InMemoryTableWriter

    pub(all) struct InMemoryTableWriter {
    id_counter : Int64
    tables : Map[String, Map[Int64, Map[String, Json]]]
    }

    InMemoryTableWriter::get_row

    fn InMemoryTableWriter::get_row(self : InMemoryTableWriter, table_name : String, id : Int64) -> Map[String, Json]?

    InMemoryTableWriter::get_row_by_key

    fn InMemoryTableWriter::get_row_by_key(self : InMemoryTableWriter, table_name : String, key : String, value : Int64) -> Map[String, Json]?

    InMemoryTableWriter::get_table_rows

    fn InMemoryTableWriter::get_table_rows(self : InMemoryTableWriter, table_name : String) -> Array[Map[String, Json]]

    InMemoryTableWriter::new

    PersistMode

    pub enum PersistMode {
    Archive
    Sync
    } derive(Eq, Show)

    持久化模式

    PersistMode::from_str

    fn PersistMode::from_str(s : String) -> PersistMode?

    PersistPostInterceptor

    pub(all) struct PersistPostInterceptor {
    meta_provider : InMemoryMetaProvider
    table_writer : &DynamicTableWriter
    }

    PersistPostInterceptor::as_interceptor

    装配为引擎拦截器(order=100,后置)

    PersistPostInterceptor::make

    TableMeta

    pub(all) struct TableMeta {
    table_name : String
    display_name : String
    fields : Array[FieldMeta]
    }

    TableMeta::add_field

    fn TableMeta::add_field(self : TableMeta, field : FieldMeta) -> Unit

    TableMeta::get_field

    fn TableMeta::get_field(self : TableMeta, column_name : String) -> FieldMeta?

    TableMeta::make

    fn TableMeta::make(table_name : String, display_name : String) -> TableMeta

    fill_system_fields

    fn fill_system_fields(data : Map[String, Json], operator : String, is_insert : Bool) -> Unit

    系统字段填充(时间走 Clock 注入口,D-M0-3)

    is_table_name_safe

    fn is_table_name_safe(name : String) -> Bool

    动态表名安全检查:仅字母数字下划线 + 保留前缀拒绝