一个列表接口需要支持灵活且复杂的过滤条件一般都是怎么实现的?
我目前的想法是,前端通过过滤组件,生成一个过滤表达式,如查询价格小于100,且列别为tools或者 toolbox 的项目,则表达式为 price <= 100 and category in ['tool', 'toolkit']
。
我目前使用go开发后端接口,我找到一个表达式库 https://github.com/antonmedv/expr,但是不知道该怎么将表达式转为SQL查询,数据库查询我使用的是 GORM。
这个库可以直接计算表达式的结果,但是这和我的需求不符合,我需要将表达式转为通过GORM的SQL查询,然后我尝试了通过这个库的ast 和 sqlbuilder 手动解析并转换成 SQL 查询,但是没有成功,有些复杂一点或者嵌套条件,我不知道怎么解析语法树。
有人有类似的需求么,请问都是怎么实现的?
类似的功能我在 jira 的查询中也见过,但是不知道他们是怎么实现的。
谢谢!
更新:我找到Jira的文档了,我就是想要这种效果,客户端可以通过一个Query表达式来查询,这个表达式可以通过搜索空间生成,也可以让用户自己编写,之所以要使用这种方式,而不是直接让用户写SQL,一是为了安全, 而是要和后端数据库解偶。
https://support.atlassian.com/jira-service-management-cloud/d...
目前的难点是,我不知道怎么解析这种表达式,https://github.com/antonmedv/expr 基本上可以满足需求,但是需要自己解析AST到SQL,另外就是无法扩展语法,
如果大家实现过有类似的需求,可以给我参考参考哈,谢谢