OGSA-DAI通过数据服务对后端单个数据源查询,将整串SQL语句推送给后端数据库执行查询。而在面向分布式数据源的DQP查询中,组合查询在中间层被解析为针对不同数据源的子查询,子查询通过DAI数据服务获取查询结果,并在DQP中间层对不同数据源返回的结果进行组装,并返回给请求用户。
通俗来讲,DQP分布式数据服务查询类似于一个MapReduce过程,现将针对异构分布式数据源的复合查询语句解析拆散,提交给对应不同数据源的DAI服务进行查询,再将多个数据服务的返回结果汇总,有DQP中间层组装得到最终的查询结果。
现在的问题是,SQL语句在查询过程中允许嵌入查询函数,比如Count( )、Avg( )、Max( )、Min( )等聚合函数,甚至空间数据库中支持的ST_Buffer( )、ST_Union( )等空间分析函数,在查询过程中进行一定的数据处理操作。但DQP查询在查询语句分解时,由于复合查询语义分析的二义性,不能在将嵌套函数传递给子查询。为了弥补嵌入函数的操作,DQP提供了一种在中间层处理数据的UDF(用户自定义)函数拓展方式,使得函数处理过程,在子查询返回结果后由DQP中间层完成函数计算。
DQP已定义了基本的标量(Scalar)和聚合(Aggregate)函数,并为用户自定义函数提供了拓展接口。比方说我们在查询语句中定义一个缓冲区分析函数Buffer( ),其功能实现调用自JTS库提供的缓冲区分析API。Buffer操作需要返回每一列缓冲区分析结果,属于标量函数,需要继承LogicalExecutableFunctionBase类。同时,Buffer操作接受空间数据库子查询返回的Geometry类型输入数据,并需要用户在编写查询语句时给定一个Double型的缓冲区距离参数。
通过PostGIS驱动,子查询能够返回WKT格式的空间数据,DQP将返回数据以Parameters对象传入,我们可以使用JTS库的WKTReader( )读入返回的WKT数据并传给geom对象,再以类似Geometry result = geom.buffer(distance);的JTS调用完成缓冲区分析处理,并将结果以Object对象返回给DQP查询结果装配器,即可实现分布式查询中的空间分析函数嵌入工作。标量函数的拓展示例参见这里。对于聚合函数,则需要继承SQLAggregateFunction类,实现过程不在赘述,示例参见这里。
通过自定义函数的拓展,可以进一步丰富DQP分布式查询的功能和适用性。DQP对于复合查询的解析,应该是基于ANTLR提供的语法解析功能实现的,语法解析过程以后有时间研究一下再写出来。
根据OGSA-DAI项目组成员在OGF-28研讨会中公开的的开发线路图,OGSA-DAI 4.0将在2010年的4月份发布,更新的内容包括DQP的优化和拓展,增加SQL Views查询器,改进通用Activities,增加KML行为以及3.x版本中已报告的Bug修改等。
近3年时间里,我对OGSA-DAI项目始终保持关注,也在邮件沟通中认识了一些项目背后的开发者,他们一直在贡献代码和文档来推动着项目进程。希望DAI项目能够持续推进,并且在易用性方面得到进一步改善。