将逻辑表达式解析为通用查询语句的方法技术

技术编号:23787120 阅读:29 留言:0更新日期:2020-04-15 00:30
本发明专利技术涉及将逻辑表达式解析为通用查询语句的方法,包括:A.提取逻辑表达式中的元素,形成元素队列;B.将元素队列中的变量放入列表中、运算符和分隔符分别放入栈中,并根据放入栈中运算符的优先级,将该分隔符和相关的运算符从栈弹出并放入列表中;C.遍历完元素队列后将栈中的所有元素弹出放入列表形成可解析列表;D.配置运算符的映射表;将可解析列表中的元素放入栈,当前为运算符时,将运算符映射为数据源运算符并与已放入的相关变量组装为变量语句放入栈中;E.遍历完可解析列表后输出栈中查询语句。本发明专利技术能够适配不同的数据源的逻辑表达式,自动生成不同数据源的查询语句,极大的减少了开发人员代码的开发、维护工作。

The method of parsing logical expression into general query statement

【技术实现步骤摘要】
将逻辑表达式解析为通用查询语句的方法
本专利技术涉及对逻辑表达式的解析方法,具体讲是将逻辑表达式解析为通用查询语句的方法。
技术介绍
在软件的开发的过程中经常会遇到不同的数据库、系统、数据源之间的接口相互对接的问题,如页面与应用后台的接口对接、App与服务器间接口对接,不同系统内间接口的对接。通常在不同系统的接口对接过程中,开发人员会进行条件的约定,以适配不同的业务需求,如:(条件A>0&&条件B>1)||(条件C=0)等。通常情况下,后端接口会根据业务条件进行定制化的开发,但是面对复杂的业务场景,开发人员是不可能在接口里穷举所有的条件分支,这样就会造成每次业务的修改都要进行相应的定制化开发。例如,在开发的工程中引入Google的AviatorJava工具包文件(一种高性能、轻量级的java语言实现的表达式求值引擎,可以进行各种表达式的动态解析求值),然后需要在业务代码里动态组装具体的表达式,如:(2>1&&1>0)||(-1>-2),通过调用AviatorJava工具包提供的表达式API来进行解析。现有解析方法的弊端在于:(1)依赖于第三方工具包,在被动升级时会带来大量的维护工作;(2)业务场景单一,只支持内存中计算;(3)不能对现有的各种数据源进行动态的配置;(4)不能适配多种数据源,如Hbase(一种分布式的、面向列的开源数据库)、Solr(一种采用Java开发的全文搜索引擎)等。
技术实现思路
<br>本专利技术提供了一种将逻辑表达式解析为通用查询语句的方法,以适配不同的数据源的逻辑表达式,自动生成不同数据源的查询语句,从而适配复杂业务场景下的所有条件可能性。本专利技术将逻辑表达式解析为通用查询语句的方法,包括:A.将逻辑表达式中的元素分为变量、运算符和分隔符三类,在解析装置的内存中建立队列结构存储单元,将逻辑表达式中的所有元素从左到右逐一提取出来放入所述的队列结构存储单元中,形成元素队列;元素队列中每个元素分别存放在队列结构存储单元的不同内存地址;通常,将逻辑表达式中的数字、字母、数据库字段等元素认为是变量,具有运算或判断属性的符号为运算符,如“>”、“&&”、“||”等,成对的括号“()”为分隔符。B.在所述内存中建立列表结构存储单元和栈结构存储单元;遍历所述的元素队列,将元素队列中的变量依次放入所述列表结构存储单元中、运算符和分隔符分别依次放入栈结构存储单元中,并根据放入栈结构存储单元中的运算优先级属性的分隔符,将该分隔符和相关的运算符依次从栈结构存储单元弹出并放入列表结构存储单元中(弹出的元素不再保存于栈结构存储单元中);C.遍历完元素队列后,将栈结构存储单元中剩余的所有元素按后进先出的顺序弹出栈结构存储单元(弹出的元素不再保存于栈结构存储单元中),并依次放入列表结构存储单元中,形成可解析列表;D.解析逻辑表达式:配置逻辑表达式中的运算符和数据源运算符的映射表;遍历所述可解析列表,将可解析列表中的元素依次放入栈结构存储单元,如果当前放入的元素为运算符,则根据所述映射表将该运算符映射为数据源运算符,将栈结构存储单元中与当前运算符相关的变量分别从栈结构存储单元中弹出并与所述映射的数据源运算符组装为变量语句,再将所述变量语句放入栈结构存储单元中(弹出的变量不再保存于栈结构存储单元中);E.遍历完可解析列表后,栈结构存储单元中保存的数据为解析后的查询语句。本专利技术的核心在于,对逻辑表达式按运算的规律进行解析后,通过配置逻辑表达式中的运算符和数据源运算符的映射表,通过运算符的映射使不同数据源之间的查询语句能够相互适配,尤其是在复杂业务场景下通常调用的是数据源(如:Hbase、ES等数据源)的API接口,本专利技术能够提供统一的可配置的接口,极大减少了开发人员代码的开发、维护工作。进一步的,步骤B中在对栈结构存储单元放入元素时,如果当前放入栈结构存储单元中的元素为结束运算优先级属性的分隔符(例如右括号“)”),则将栈结构存储单元中所述结束运算优先级属性的分隔符和与该分隔符对应的开始运算优先级属性的分隔符(例如左括号“(”)之间的所有运算符、以及所述的开始运算优先级属性的分隔符和结束运算优先级属性的分隔符,按后进先出的顺序弹出栈结构存储单元,并依次放入列表结构存储单元中。具体的,步骤D中所述的与当前运算符相关的变量,是在栈结构存储单元中在当前运算符前2个变量。进一步的,步骤A中,如果逻辑表达式中的不同运算符之间有优先级区别,则将优先级高的运算符与其前一个变量和后一个变量合并视为一个组合变量提取到队列结构存储单元中,作为元素队列中的一个变量性质的元素;步骤C中,将栈结构存储单元中剩余的所有元素按后进先出的顺序弹出栈结构存储单元,并依次放入列表结构存储单元中后,再对所述组合变量进行解析。例如,逻辑表达式为:a>b&&c<d,因为运算符“>”和“<”的优先级高于“&&”,因此在步骤A的提取时,先进行“>”和“<”的计算,将“a>b”和“c<d”视为一个整体,作为一个变量性质的组合变量来提取。进一步的,在对组合变量进行解析时,先将组合变量中的变量依次放入栈结构存储单元的该组合变量的对应位置,再将组合变量中的运算符放入所述变量之后的该组合变量的对应位置。例如组合变量为“a>b”,解析后在栈结构存储单元中的存储为:(’a’,’b’,’>’)可选的,如果逻辑表达式中的变量均为数字变量,步骤B中根据放入栈结构存储单元中的运算优先级属性的分隔符,将该分隔符和相关的运算符依次从栈结构存储单元弹出后,只将所述相关的运算符放入列表结构存储单元中。当变量均为数字类型时,可以只将运算符放入列表结构存储单元中来简化运算,不影响最终的结果。本专利技术将逻辑表达式解析为通用查询语句的方法,能够适配不同的数据源的逻辑表达式,自动生成不同数据源的查询语句,从而能够广泛的适配复杂业务场景下的所有条件可能性,极大的减少了开发人员代码的开发、维护工作,同时还丰富了业务场景,有效增强了系统的扩展性。以下结合实施例的具体实施方式,对本专利技术的上述内容再作进一步的详细说明。但不应将此理解为本专利技术上述主题的范围仅限于以下的实例。在不脱离本专利技术上述技术思想情况下,根据本领域普通技术知识和惯用手段做出的各种替换或变更,均应包括在本专利技术的范围内。附图说明图1为本专利技术将逻辑表达式解析为通用查询语句的方法的流程图。具体实施方式名词解释:栈结构存储单元(Stack):一种数据存储结构,按照后进先出的原则存储数据。列表(List):一种数据存储结构,双向的循环链表,与数组类似。Hbase:一种分布式的、面向列的开源数据库。Solr:一种采用Java语言开发的高性能全文搜索引擎。如图1所示本专利技术将逻辑表达式解析为通用本文档来自技高网...

【技术保护点】
1.将逻辑表达式解析为通用查询语句的方法,其特征包括:/nA.将逻辑表达式中的元素分为变量、运算符和分隔符三类,在解析装置的内存中建立队列结构存储单元,将逻辑表达式中的所有元素从左到右逐一提取出来放入所述的队列结构存储单元中,形成元素队列;/nB.在所述内存中建立列表结构存储单元和栈结构存储单元;遍历所述的元素队列,将元素队列中的变量依次放入所述列表结构存储单元中、运算符和分隔符分别依次放入栈结构存储单元中,并根据放入栈结构存储单元中的运算优先级属性的分隔符,将该分隔符和相关的运算符依次从栈结构存储单元弹出并放入列表结构存储单元中;/nC.遍历完元素队列后,将栈结构存储单元中剩余的所有元素按后进先出的顺序弹出栈结构存储单元,并依次放入列表结构存储单元中,形成可解析列表;/nD.解析逻辑表达式:配置逻辑表达式中的运算符和数据源运算符的映射表;遍历所述可解析列表,将可解析列表中的元素依次放入栈结构存储单元,如果当前放入的元素为运算符,则根据所述映射表将该运算符映射为数据源运算符,将栈结构存储单元中与当前运算符相关的变量分别从栈结构存储单元中弹出并与所述映射的数据源运算符组装为变量语句,再将所述变量语句放入栈结构存储单元中;/nE.遍历完可解析列表后,栈结构存储单元中保存的数据为解析后的查询语句。/n...

【技术特征摘要】
1.将逻辑表达式解析为通用查询语句的方法,其特征包括:
A.将逻辑表达式中的元素分为变量、运算符和分隔符三类,在解析装置的内存中建立队列结构存储单元,将逻辑表达式中的所有元素从左到右逐一提取出来放入所述的队列结构存储单元中,形成元素队列;
B.在所述内存中建立列表结构存储单元和栈结构存储单元;遍历所述的元素队列,将元素队列中的变量依次放入所述列表结构存储单元中、运算符和分隔符分别依次放入栈结构存储单元中,并根据放入栈结构存储单元中的运算优先级属性的分隔符,将该分隔符和相关的运算符依次从栈结构存储单元弹出并放入列表结构存储单元中;
C.遍历完元素队列后,将栈结构存储单元中剩余的所有元素按后进先出的顺序弹出栈结构存储单元,并依次放入列表结构存储单元中,形成可解析列表;
D.解析逻辑表达式:配置逻辑表达式中的运算符和数据源运算符的映射表;遍历所述可解析列表,将可解析列表中的元素依次放入栈结构存储单元,如果当前放入的元素为运算符,则根据所述映射表将该运算符映射为数据源运算符,将栈结构存储单元中与当前运算符相关的变量分别从栈结构存储单元中弹出并与所述映射的数据源运算符组装为变量语句,再将所述变量语句放入栈结构存储单元中;
E.遍历完可解析列表后,栈结构存储单元中保存的数据为解析后的查询语句。


2.如权利要求1所述的将逻辑表达式解析为通用查询语句的方法,其特征为:步骤B中在对栈结构存储单元放入元素时,如果当前放入栈结构存储单元中的元素为结束运算优先级属性的分隔符,则将栈结构存储单元中所述...

【专利技术属性】
技术研发人员:赵伟
申请(专利权)人:四川新网银行股份有限公司
类型:发明
国别省市:四川;51

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1