我也能写数据库——UDF

直播改BUG

修复内联查询

在上期文章撰写的时候,我还认为只完成了单表查询,但经过几天的研究发现,上次那寥寥几十行代码,其实已经可以完成了表联接,过滤等功能了,只是由于当时粗心写错了一些东西,造成过滤失效了,下面我来剖析一下问题。

首先在这个文件里

只截取了部分片段, 在这里,我把列和列写颠倒了。更正过来,就可以进行正确的连接查询了。

过滤条件

在可以进行内联查询以后,我一直在对不能做过滤这点存在质疑,从关系代数的角度分析,应该是先做笛卡尔积,然后再过滤数据,那么就应该可以对数据进行过滤了,那么问题出在哪呢?

于是抱着试试看的心里,构建了一条查询,看看效果,果不其然,喜闻乐见...

看到报错一脸懵逼,这是把过滤条件当列处理了?在百思不得其解的时候,突然想起了mysql的引号问题,于是把sql修正为,于是喜闻乐见变了一下

对于开发者来说,有变化总是好事,说明可能找到问题点了,再仔细看看日志,果然,编码问题,搞起。于是在各种检索下,得到了答案

在获取连接之前,将入上述环境变量,就好了,代码片段如下:

数据类型处理

在写过滤的时候,其实就发现了,没有正确的数据类型,是走不远的,所以有必要把数据类型对应好,既然是模拟数据库,那么数据基本类型,还是使用SQL习惯的类型,而这里对java还是需要有一个映射关系。

栗子中,我使用了的结构,主要还是为了大家方便只管理解,,第一个泛型代表内部定义的数据类型字符串,第二个是SQL数据类型,第三个参数是对应的JAVA类型。由于的是模式,但实际上我们需要的是一个模式,所以在下面添加了两个辅助方法:通过拿到的数据类型的字符串,获得java的类型,这个方法则是拿到SQL的数据类型。

笔者一直对充血模型钟爱有加,所以在里为添加了两个方法

而在数据初始化的时候,我们可以使用正确的数据类型了

这样数据类型的准备工作就做好了,后面我们需要将数据类型正确的注册表里,所以在里我们原来写死的类型,需要根据实际数据进行设置了

到这里我们就搞定了数据类型。

UDF

有了基础数据类型,对于我们后面做函数处理就方便多了,现在我们以2个简单的UDF为例,让我们继续领略的魅力,

首先我们定义两个类,一个数学类,提供一个乘方的方法

另一个字符处理类,提供一个字符串连接方法,提供一个将参数转换成字符串的方法

接下来,在里,将函数注册到数据库上,

提供了一个方法,为函数名,这里提供了一个工具类,它可以通过方法,可以将你写好的函数类和其对应的方法反射出来。

接下来我们做一个测试:

结果

技术总结

这期新内容代码有点少,但是在实验成功以后,就克不住自己的兴奋了,一蹴而就写了这篇文章。

后续:

希望能对聚合函数做一些尝试。

函数的下推,这只是一个想法,目前实现的还是相当于UDF,那么实际上数据库层应该提供了很多函数的,那么在这里,是否可以透过将函数交给处理...

streaming sql

代码已更新:

文档的翻译工作感觉暂时鸽了:)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181219G15AN000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券