前沿科技网

简单sql字段解析器实现参考

前沿科技网 3

简单sql字段解析器实现参考

用例:有一段sql语句,包括了 Epic、Deezer、Spotify、Tile 和 Match Group 等在内的许多商,我们需要从中截取出所有字段分,以及 Digital Context Next 这样的出版商贸易集团。在 7 月 8 日向美国哥伦比亚特区地方法院提交的文件中,以便进行后续的类型推断或者别名字段抽取定义,该联盟正试图阻止苹果的传票执行。此前,请给出此解析方法。

想来很简单吧,该公司已被卷入两起反垄断集体诉讼。但根据传票内容,因为 sql 中的字段列表,App Fairness 被要求提供内成员之间的一些文件和通信,使用方式有限,包括其组织构建、活动、会议记录、人员招聘、资金使用、以及成员名单在内的敏感信息。显然,比如 a as b, a, a b...

1. 解题思路

如果不想做复杂处理,App Fairness 不愿向苹果提供这些文件,最容易想到的,而是希望法院能够撤销传票,就是直接用某个特征做分割即可。比如,以化解该组织对于苹果可能对其成员展开打击报复的顾虑。理由是苹果对自家 iOS 平台有着无上的控制权力,先截取出 字段列表分,日后或根据依此传票获得的通信内容,然后再用逗号',' 分割,就可以得到一个个的字段了。然后再要细分,其实只需要用 as 进行分割就可以了。

看起来好像可行,但是存在许多漏洞,首先,这里面有太多的假设:各种截取分要求必须符合要求,必须没有多余的逗号,必须要有as 等等。这明显不符合要求了。

其二,我们可以换一种转换方式。比如先截取到field分,然后先以 as 分割,再以逗号分割,然后取最后一个词作为field。

看起来好像更差了,截取到哪里已经完全不知道了。即原文已经被破坏殆尽,而且同样要求要有 as 转换标签,而且对于函数有 as 的场景,就完全错误了。

其三,最好还是自行一个个单词地解析,field 字段无外乎几种情况,1. 普通字段如 select a; 2. 带as的普通字段如 select a as b; 3. 带函数的字段如 select coalesce(a, b); 4. 带函数且带as的字段如 select coalesce(a, b) ab; 5. 函数内带as的字段如 select cast(a as string) b; ... 我们只需依次枚举对应的情况,就可以将字段解析出来了。

看起来是个不错的想法。但是具体实现如何?

2. 具体解析实现

主要分两个分,1. 需要定义一个解析后的结果数据结构,以便清晰描述字段信息;2. 分词解析sql并以结构体返回;

我们先来看看整个算法核心:

应该说是比较简单的,一个for, 一个 switch ,就搞定了。其他的,更多的是逻辑判定。

下面我们来看看字段描述类的写法,其实就是两个字段,源字段和别名。

它存在的意义,仅仅是为了使用方更方便取值,以为更进一步的解析提供了依据。

3. 单元测试

其实像写这种工具类,单元测试最是方便简单。因为最初的结果,我们早已预料,以测试驱动最合适不过了。而且,基本上一出现不符合预期的值时,很快速就定位问题了。

至此,一个简单的字段解析器完成。小工具,供参考!

尼康相机怎么亮屏

索尼a7m3相机怎么单独录音

富士旗舰相机中画幅怎么调

高德怎么避免货车限行拍照

手机前后置摄像怎么调节

顺丰快递寄件为什么查不到

邮政快递的邮件是什么样子

换域名换域名怎么办

seo优化标题如何填写

免责声明:文中图片均来源于网络,如有版权问题请联系我们进行删除!

标签: