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 工作良好。
我的smartjs刚刚发布了filterBuilder,里面查询字符串的解析,不过是js的,你可以参考下,地址:https://github.com/zhh77/smartjs;
稍后我会在博客上面具体说明。
那就采用你了
貌似是老外网站翻译过来的吧?
求助!!!
linq+ef不就行啦 还自己搞 不累吗
求助題呢
多表关联复杂查询的时候你看过ef生成的语句吗 非常冗余 效率执行相当低下 索引命中率很差
这个自己搞得有模样,需要做语法分析和词法分析,及翻译成sql语句,都是编译原理的东西。可以借助第三方工具如groovy的dsl,beanshell。也可以用语法分析和词法分析第三方库。搞简单一点可以用正则表达式。最简单可以用if else匹配。还可以用if else+穷举匹配。还有一种方法,用软件穷举生成所有常用的模板,用近似度分析匹配。当然还有很多方法(如树形结构翻译,学习系统,规则系统,基于有限查询字段数据库表的硬拼方法)。简单的,我一般用"基于有限查询字段数据库表的硬拼方法",就是数据库表中设置好可以设置20个字段参加运算,表达式也存在表中,表达式的含义也存在表中,通过程序来搜索数据库表,翻译成sql。
有没有实现的例子?
劳驾发下。。。