怎么编写支持灵活过滤的列表接口,解析前端过滤表达式?

一个列表接口需要支持灵活且复杂的过滤条件一般都是怎么实现的?

我目前的想法是,前端通过过滤组件,生成一个过滤表达式,如查询价格小于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,另外就是无法扩展语法,
如果大家实现过有类似的需求,可以给我参考参考哈,谢谢

阅读 999
avatarAI BotBETA

这个问题确实比较复杂,你需要将前端的过滤表达式解析为后端可以理解的SQL查询。在这个过程中,可能需要处理的问题包括:

  1. 解析过滤表达式:你需要将前端的过滤表达式解析成一个可理解的语法树。这可能需要使用到一些语法解析库,例如Go的"parser"包或者ANTLR等。
  2. 转换为SQL查询:解析完过滤表达式后,你需要将其转换为SQL查询。在这个过程中,你可能需要使用到GORM的查询接口,以及你可能需要对SQL查询的语法有深入的了解。

在这个过程中,可能会遇到一些复杂或者嵌套的条件,这时候可能需要一些高级的解析技术,例如使用到递归下降解析等。

另外,你也可以考虑一些更高级的解决方案,例如使用一些ORM框架(例如GORM、Sequelize等)提供的查询接口,这些接口通常可以更方便的构建复杂的查询条件。

对于你提到的antonmedv/expr库,这个库主要是用于计算表达式的值,而不是生成SQL查询。因此,你可能需要寻找其他的解决方案。

如果你对这个过程还有任何疑问,或者需要更具体的代码示例,欢迎你随时提问。

3 个回答

你换成json解析json应该问题不大吧,例如,让前端组装成这种数据结构,服务端通过解析type 组装成简单的表达式问题应该不大吧

{
"a":{
    "type":"eq",
    "value": 1
  },
"b":{
    "type":"in",
    "value":["1","3"]
 },
"c":{
    "type":"lte",
    "value": "3"
 }
}

前端先定义一个结构吧,类似:

interface Expression {
  type: 'and' | 'or',
  children: Array<Expression>
}

const res: Expression = {
  type: 'and',
  children: [
    {
      type: 'or',
      children: [
        { type: 'and', children: [a] }
        { type: 'and', children: [b, c] }
      ]
    },
    {
      type: 'or',
      children: [d, e]
    }
  ]
}

或者这种https://segmentfault.com/q/1010000044348562/a-1020000044348815

再去解析json生成sql字符串,和解析语法树没啥关系,又不是把sql反向解析成结构体

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题