开源代码结构
下载源码的位置
在官方的网站https://www.raqsoft.com.cn/download/download-jsq 上指明了下载地址
https://github.com/SPLWare/esProc;选择 tag 标记为 V20250313 版本。
源码的编译启动
1、编译的配置
(1) 设定 jdk 版本版本
指定 jdk1.8 版本,20250313 版本,依赖程序包 javax.xml.bind,如 1.8 版本之后,会报找不到依赖包的错误。
(2) 编译依赖的配置资源
编译的过程中,需要将 src/main/resources 及项目目录下的 config 作为资源纳入到编译过程中。
(3) 编译依赖的 lib 资源
在 spl 运行的时候,一般都会使用 mysql 的连接,可以提前在编译的时候,加载 mysql 的依赖。
将 mysql-connector-java-8.0.28.jar 加载到编译的依赖路径中
2、程序的入口
整个程序的入口在 SPL.java,在 com.scudata.ide.spl 包下,在开发环境下,右键运行就进入 SPL 的主界面。
开源代码结构
在 src/main/java 下有 2 个目录分别为 esproc.jdbc 及 scudata
包 esproc.jdbc
SPL 继承 JDBC 的接口,在这个包下,完全实现了 Jdbc 的接口。下面列举几个主要的实现类
Jdbc 的驱动 driver 接口实现:InternalDriver 类
Jdbc 的连接 connection 接口实现:InternalConnection 类
Jdbc 的 PreparedStatement 接口实现:InternalPreparedStatement 类
Jdbc 的 java.sql.Statement 接口实现:InternalStatement 类
Jdbc 的存储过程 CallableStatement 接口实现:InternalCallableStatement 类
Jdbc 的结果集 java.sql.ResultSet 接口实现:ResultSet 类
包 Scudata
这个包下是 spl 的主要逻辑,下面列举几个目录
界面的包 ide
Spl 的界面都在 ide 的包中
表达式的包 expression
在 spl 中,表达式是非常关键的元素。以 select 为例,它的类的主要继承关系如下
抽象类 Node:表达式节点基类
抽象 Function:函数节点的基类,它分为普通函数及成员函数;自定义函数可继承 Function 类
MemberFunction:成员函数节点的基类
SequenceFunction:序列成员函数节点的基类
Select:取序列中满足指定条件的元素生成新的序列
如在使用表达式的时候,对有些功能理解不清楚的情况,可以看一下源码或者跟踪一下,这样会理解更加深入。
表达式计算相关类包 Dm
序列类:Sequence,序表对象类,拥有数据结构,成员为结构相同的记录
上下文类:Context,计算用到的上下文
参数及选项的解析类
基类 Function
自定义函数 Java 类是从基类 com.scudata.expression.Function 继承,可以直接使用 Function 类中的属性,有以下常用属性:
protected String functionName 函数名
protected String option 函数选项,用户在函数表达式中添加的所有选项串,比如 f@tcq(),option 的值就是 "tcq"。
protected com.scudata.expression.IParam param 函数参数对象
public abstract class Function extends Node {
protected String functionName; // 函数名
protected String option; // 选项
protected String strParam; // 函数参数字符串,用于集群函数把参数字符串传到节点机
protected IParam param; // 函数参数
}
参数类 IParam
函数参数会被系统解析以后保存在基类 Function 中的 param 里,它是树形层次结构,param 就是参数树的根节点,可以用 com.scudata.expression.IParam 接口的方法来获取、分析函数参数,接口方法如下:
char getType() 返回参数节点的类型,即分隔符的类型,有 3 种:IParam.Semicolon( 分号)、IParam.Comma(逗号)、IParam.Colon(冒号)。例如 f(p1,p2;a1) 的参数节点类型是分号,f(p1,p2) 的节点类型是逗号,f(p1:p2) 的节点类型是冒号。
boolean isLeaf() 返回是否是叶子节点 (没有子节点)。例如 f(p1,p2) 中根节点有 p1 和 p2 两个子节点,不是叶子节点。p1 节点没有子节点,它是叶节点。
int getSubSize() 返回子节点数。例如 f(p1,p2;a1;k:n) 的根节点有 3 个子节点,第 3 个子节点 k:n 又有 2 个子节点,分别是 k 和 n。
IParam getSub(int index) 返回第 index 个子节点,编号从 0 开始。
Expression getLeafExpression() 返回当前叶子节点的表达式
参数及返回值数据类型
函数参数表达式计算后所得的参数值都是一个 Object 对象,函数返回值也是一个 Object 对象,Object 是 Java 中所有对象的 super 类,编程中应检查参数计算值实例是否是需要的数据类型,若是则进行转换后使用,否则应报参数数据类型错误。