代码之家  ›  专栏  ›  技术社区  ›  Will

解析复杂的查询参数

  •  1
  • Will  · 技术社区  · 14 年前

    我的python服务器接收的作业包含一个要对其执行操作的项目列表,而不是搜索查询词;示例输入:

    (Customer:24 OR Customer:25 OR (Group:NW NOT Customer:26))
    

    所以当提交一个作业时,我必须解析这个接收者模式,解析所有匹配的客户,并用这个输入创建作业。

    为了使事情复杂化,客户可以在任何时候加入和离开团队,并且当这种情况发生时,工作应该实时更新。

    因此,当组更改成员身份时,我必须通知所有当前正在运行的作业(他们会做他们的事情)。

    如何最好地解析、应用和存储(在我的RDBMS中)这种约束列表?

    • 解析: eval() ,手写的FSM吃字符,yacc/bison/?,还是?
    • 应用:如何存储这些约束并对其进行评估?
    • 存储:在数据库中,每个术语有一个计算顺序和一个非/和/或操作字段;还是作为一个blob?
    2 回复  |  直到 14 年前
        1
  •  1
  •   9000    14 年前

    我建议你分析一下( http://pyparsing.wikispaces.com/ )它可以让您整齐地描述语法,并为您提供一个充满数据的树。然后,希望您的语法足够接近SQL,这样您就可以从解析结果中轻松地形成一个“where”子句。

    您可以pickle和存储已分析的树、未分析的请求或现成的SQL子句。这取决于您获取和重用它们的频率,以及您是否需要通过其他方式检查数据库并查看查询。我认为将查询以非blob形式存储是没有意义的,除非您希望对它们运行有趣的选择,如果这样做,您可能需要一个XML数据库或其他易于支持树的东西。

        2
  •  0
  •   John Machin Santi    14 年前

    考虑使用SQL而不是发明另一种小型语言:

    (
    cust.id = 24
    or cust.id = 25
    or (cust.id = cust_group.cust_id and cust_group.id = 'NW' and cust.id != 26)
    ) // or somthing similar
    

    SQL注入担心?你需要分析它(如果你的表达式有适当的限制,那就不难了),并检查它的合理性,不管它是用什么语言写的。