首页 新闻 搜索 专区 学院

查询语句生成器

0
悬赏园豆:60 [已解决问题] 解决于 2014-08-11 13:07

3 查询语句生成器
客户的一个系统使用着一套陈旧的数据仓库,接受字符串查询语句来搜索符合条件的数据。
符合查询语法的每个子语句都符合下列格式的字符串:
[property-spec:]operator(operand [,operand]*)
方括号表示可省略内容,* 表示零个或者多个。property-spec 对应数据结构定义中的 name、age、
description 等字段。
目前初步极坏支持的查询关键字有:and、or、equals 和 not,下面是这些 operator 的介绍。
and, or 是布尔逻辑操作,可以接收两个的 operand,分别代表 “与” 和 “或” 操作;not 是逻辑否操作,只接
受一个 operand;equals 只接收一个 operand,用来选择指定 property-spec 和所提供的 operand 相等
的所有数据条目,例如:
equals(“adam”) // 返 回 所 有 任一个property-spec等 于 “adam” 的 数 据
name:equals(”adam jones”) // 返 回 所 有name等 于 “adam jones” 的 数 据
age:equals(40) // 返 回 所 有age等 于40的 数 据
我们最终需要生成各种复杂的嵌套查询,以下是其中一例:
and(or(name:equals(“adam”), age:equals(32)), not(gender:equals(“male”)))
为客户升级系统的其中一个步骤是设计一套 API,将查询条件转换成符合数据仓库查询语法的字符串。这样使
得我们的新系统能藉此 API 使用这个数据仓库。
请写代码设计这套 API,让我们的开发人员能够使用这套 API,来生成他期望的查询字符串。并写自动化测试
来证明你的 API 工作良好。

-不才-的主页 -不才- | 初学一级 | 园豆:116
提问于:2014-06-30 22:04
< >
分享
最佳答案
0

我的smartjs刚刚发布了filterBuilder,里面查询字符串的解析,不过是js的,你可以参考下,地址:https://github.com/zhh77/smartjs

稍后我会在博客上面具体说明。

收获园豆:40
Roy Zhang | 菜鸟二级 |园豆:336 | 2014-08-11 12:16

那就采用你了

-不才- | 园豆:116 (初学一级) | 2014-08-11 13:06
其他回答(3)
0

貌似是老外网站翻译过来的吧?

徐少侠 | 园豆:293 (菜鸟二级) | 2014-07-01 09:25

求助!!!

支持(0) 反对(0) -不才- | 园豆:116 (初学一级) | 2014-07-01 13:22
0

linq+ef不就行啦 还自己搞 不累吗

丫的 | 园豆:1575 (小虾三级) | 2014-07-01 11:06

求助題呢

支持(0) 反对(0) -不才- | 园豆:116 (初学一级) | 2014-07-01 13:22

多表关联复杂查询的时候你看过ef生成的语句吗 非常冗余 效率执行相当低下 索引命中率很差

支持(0) 反对(0) lihong1232 | 园豆:200 (初学一级) | 2014-07-02 23:17
0

这个自己搞得有模样,需要做语法分析和词法分析,及翻译成sql语句,都是编译原理的东西。可以借助第三方工具如groovy的dsl,beanshell。也可以用语法分析和词法分析第三方库。搞简单一点可以用正则表达式。最简单可以用if else匹配。还可以用if else+穷举匹配。还有一种方法,用软件穷举生成所有常用的模板,用近似度分析匹配。当然还有很多方法(如树形结构翻译,学习系统,规则系统,基于有限查询字段数据库表的硬拼方法)。简单的,我一般用"基于有限查询字段数据库表的硬拼方法",就是数据库表中设置好可以设置20个字段参加运算,表达式也存在表中,表达式的含义也存在表中,通过程序来搜索数据库表,翻译成sql。

收获园豆:20
无色 | 园豆:222 (菜鸟二级) | 2014-07-02 21:25

有没有实现的例子?

支持(0) 反对(0) -不才- | 园豆:116 (初学一级) | 2014-07-03 12:33

劳驾发下。。。

支持(0) 反对(0) -不才- | 园豆:116 (初学一级) | 2014-07-03 12:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册