1、整体是自定义了一门dsl,并实现了指令集和执行器
2、核心数据结构
QueryModel 语法树 QIL 指令集 Query:整体dsl解析执行的门面 DataModel:通用数据类型,可以解包成具体的object list 原子类型等
UDF (User-Defined Function)用户定义函数,mysql的udf是用c写的,dataql的udf是用java写的(注册后可以在脚本中使用)
3、运行时核心逻辑
QueryResultImpl QueryImpl.execute(CustomizeScope customize)
1》创建上下文,塞入环境变量
2》准备好栈、堆、符号表等信息
3》依次执行每个指令(涉及到对栈等的处理)
4》通过栈取出执行的结果
4、内置标准库函数(fx)
集合操作、比较、时间日期日历、id生成、json、字符串下滑驼峰转换、自增自减
数据库操作(自己实现了sql的语句解析生成FxSql、适配了多数据库的分页)
加解密(base64、加解密、摘要)
servletFilter、request、response等的封装
5、dataway
抽象了api和release,把sql用dataql做了解析执行。
InterfaceApiFilter把所有配置的api路由到ApiCallService.doCall,
后者查询出脚本字符串、解析出get或post的参数,调用dataql返回结果
6、总结
如果我个人实现类似的项目,我会用j2v8的js做语法,udf范围会参考dataql的,但是db相关的可能会考虑nodejs的实现
js层的封装设计:
函数的参数包含 元数据、业务对象、上下文、实现一个简易的执行器吗?是的
初始加载的脚本: