[关闭]
@wddpct 2018-12-13T10:38:29.000000Z 字数 2559 阅读 855

数据引擎 DSL 编写说明


DSL 又称领域特定语言,旨在用特定的语言组织描述并解决某个特定领域下的问题。

0. 想解决的问题

通过定义注册数据引擎 DSL ,源数据库表,目标数据库表信息,经由数据引擎解析调用,完成针对源数据的提取处理传输(ETL)工作。

项目地址: http://git.sy/infrastructure/data_engine

1. 主要名词说明

  1. scope - 单个数据库表域,如 patient.patient_master_info 和 visit.visit_record 可分别作为不同 scope 看待,不同的 scope 之间存在关系,如 patient_master_info 是 visit_record 的父 scope,遵循实际表数据关系
  2. 源数据库表 - DSL 定义的变量数据来源
  3. 目标数据库 - 保存提取和处理后的数据

2. 工作流程

  1. def var 入院时间 scope visit_record <= sql(fmop.visit.visit_record.visit_time);
  1. // 定义 scope
  2. let visitScope = new Scope('visit_record');
  3. let parentScope = new Scope('patient_master_info');
  4. // 定义 scope 之间的关系
  5. visitScope.setParent(parentScope);

3. 基础语法

  1. def var $VARIABLE_NAME type $TYPE_NAME scope $SCOPE_NAME <= $EXPRESSION;
  2. #def var $VARIABLE_NAME type $TYPE_NAME scope $SCOPE_NAME <= $EXPRESSION;

$ 开头的单词代表用户自定义或是系统指定的几种类别,# 代表注释。

  1. $VARIABLE_NAME
    用户自定义变量名称,如 patient_id病患标识,可以在 $EXPRESSION 重复使用
  2. $TYPE_NAME
    变量类型,系统目前支持 any,bool,number,text,time,timeSpan,integer
  3. $SCOPE_NAME
    即上文中的 scope,scope 目前可省略,此时默认为表的全局 scope,即 patient
  4. $EXPRESSION
    简单来说,$EXPRESSION 可看成是各种 $EXPRESSION 的组合。是比如数字 1 就是一个 $EXPRESSION,同理 1 + 1 也是一个 $EXPRESSION$EXPRESSION 之间通过操作符,函数和操作过程连接。
    系统中支持的操作符包括 +, -, *, /, >, <, ==, AND, OR, LIKE, UNION,函数包括 sql(), any(), min(),操作过程包含 select $EXPRESSION where $EXPRESSION end 以及 CASE WHEN $EXPRESSION THEN $EXPRESSION WHEN $EXPRESSION THEN $EXPRESSION ELSE $EXPRESSION end

4. 示例

  1. def var patient_id type integer scope patient <= sql(fmop.patient.patient_master_info.patient_id);
  1. def var 性别 scope patient <= sql(fmop.patient.patient_master_info.sex_name);
  1. def var 出生日期 type time scope patient <= sql(fmop.patient.patient_master_info.birth_date);
  1. def var 入院时间 scope visit <= sql(fmop.visit.visit_record.visit_time);
  1. def var 首次入院时间 type time scope patient <= min(sql(fmop.visit.visit_record.visit_time));
  1. def var 首次就诊年龄 type integer scope patient <= var 首次入院时间 - var 出生日期;
  1. def var 首次肺癌确诊日期 type time scope patient <= select min(var 入院记录) where var 诊断为肺癌 == true end;
  1. def var 是否诊断为肺癌 type bool scope patient <= CASE WHEN var 诊断为肺癌 == true THEN true WHEN var 诊断为肺癌 == true THEN true ELSE false end;
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注