超越SQL的能力
SPL不仅覆盖了SQL的所有计算能力,还提供了更强大语言功能。基于这些特性可以很方便原来在SQL中不易完成的运算,简化复杂计算可不是开玩笑的。
离散性及其支持下的更彻底的集合化
集合化是SQL的基本特性,即支持数据以集合的形式参与运算。但SQL的离散性很不好,所有集合成员必须作为一个整体参于运算,不能游离在集合之外。而Java等高级语言则支持很好的离散性,数组成员可以单独运算。但是,更彻底的集合化需要离散性来支持,集合成员可以游离在集合之外,并与其它数据随意构成新的集合参与运算 。
SPL兼具了SQL的集合化和Java的离散性,从而可以实现更彻底的集合化。
SPL很容易表达“集合的集合”,适合分组后计算。比如,找到各科成绩均在前10名的学生:
A |
|
1 | =db.query(“select * from score”) .group(subject) |
2 | =A2.(~.rank(score).pselect@a(~<=10)) |
3 | =A1.(~(A3(#)).(name)).isect() |
有序支持
有序计算是离散性和集合化的典型结合产物,成员的次序在集合中才有意义,这要求集合化,有序计算时又要将每个成员与相邻成员区分开,会强调离散性。SPL兼具集合化和离散性,天然支持有序计算。
具体来说,SPL可以按绝对位置引用成员,比如,取第3条订单可以写成Orders(3),取第1、3、5条记录可以写成Orders([1,3,5])。
SPL也可以按相对位置引用成员,比如,计算每条记录相对于上一条记录的金额增长率:
Orders.derive(amount/amount[-1]-1)
SPL还可以用#代表当前记录的序号,比如把员工按序号分成两组,奇数序号一组,偶数序号一组:
Employees.group(#%2==1)
在有序计算的支持下,再处理结构化数据计算中关于次序的运算(诸如比上月、比去年同期、前 20%、排名等)就很方便了。
对象引用
SPL序表的字段可以存储记录或记录集合,这样可以用对象引用的方式,直观地表达关联关系,即使关系再多,也能直观地表达。比如,根据员工表找到女经理下属的男员工:
Employees.select(gender:"male",department.manager.gender:"female")
更方便的函数语法
提供大量功能强大的结构化数据计算函数本来是一件好事,但这会让相似功能的函数不容易区分,无形中提高了学习难度。
SPL提供了特有的函数选项语法,功能相似的函数可以共用一个函数名,只用函数选项区分差别。比如select函数的基本功能是过滤,如果只过滤出符合条件的第1条记录,可以使用选项@1:
Orders.select@1(Amount>1000)
数据量较大时,用并行计算提高性能,只须改为选项@m:
Orders.select@m(Amount>1000)
对排序过的数据,用二分法进行快速过滤,可用@b:
Orders.select@b(Amount>1000)
函数选项还可以组合搭配,比如:
Orders.select@1b(Amount>1000)
结构化运算函数的参数常常很复杂,比如SQL就需要用各种关键字把一条语句的参数分隔成多个组,但这会动用很多关键字,也使语句结构不统一。SPL支持层次参数,通过分号、逗号、冒号自高而低将参数分为三层,用通用的方式简化复杂参数的表达:
join(Orders:o,SellerId ; Employees:e,EId)
方便的编辑调试功能
与SQL难用的编辑调试功能不同,SPL提供了简洁易用的开发环境,单步执行、设置断点,所见即所得的结果预览窗口…,使得开发调试效率更高。
SPL采用了网格式编码方式,代码不仅天然对齐层次清晰,在实施过程计算时可以直接使用格子名称来引用上一步的计算结果而不必费心定义变量(虽然也支持)非常方便。好用的开发环境自然起到事半功倍的效果,进一步简化复杂计算实施难度。
应用集成、低耦合与热切换
SPL提供了标准应用接口(JDBC/ODBC/RESTful)可以很方便与应用集成。尤其对于Java应用可以将SPL作为嵌入引擎集成,使得应用本身就具备强数据计算能力。
JDBC调用SPL 代码示例:
Class.forName("com.esproc.jdbc.InternalDriver"); Connection conn =DriverManager.getConnection("jdbc:esproc:local://"); Statement st = connection.(); CallableStatement st = conn.prepareCall("{call splscript(?, ?)}"); st.setObject(1, 3000); st.setObject(2, 5000); ResultSet result=st.execute();
同时,SPL采用解释执行机制,天然支持热切换。这样对于稳定性差、经常需要新增修改的数据处理需求非常友好。SPL脚本可以与Java程序独立,外置在Java之外,修改和维护都可以独立进行,脚本修改上传后就能实时生效,保证应用可以不中断地提供数据服务。
SPL外置算法不仅能有效降低应用与数据库的耦合性,独立的SPL模块还可以进一步降低应用各个模块间的耦合性,使得结构更为清晰,架构也更为合理。
总结一下,SPL之所以更简单是因为SPL相当于结合了SQL和其他高级语言(如Java)的优点,并在此基础上增加了诸多特性让复杂计算不再难写,同时可以与应用完美结合使得应用架构更为合理。有了SPL的帮助,我们相信,未来的某一天上千行的复杂SQL将不复存在。
SPL资料
- SPL下载
- SPL源代码