我的Python服务器接收的作业包含要对其采取行动的项目列表,而非搜索查询术语;输入示例:
(Customer:24 OR Customer:25 OR (Group:NW NOT Customer:26))
因此,当提交作业时,我必须解析此收件人模式并解析所有匹配的客户,并使用该输入创建作业。
要使问题复杂化,客户可以随时加入和离开小组,并且当这种情况发生时,应立即更新作业。
因此,当团体更改成员资格时,我必须通知所有当前正在运行的工作(并且他们会做他们的事情)。
如何最好地解析,应用和存储(在我的RDBMS中)这种约束列表?
eval()
,手写的FSM吃字符,yacc / bison /?或?答案 0 :(得分:1)
我建议使用pyparsing(http://pyparsing.wikispaces.com/),它可以让你整齐地描述一个语法,并为你提供一个充满数据的树。然后,希望您的语法足够接近SQL,以便您可以从解析结果中轻松地形成“where”子句。
您可以挑选并存储已解析的树,未解析的请求或现成的SQL子句。这取决于您获取和重用它们的频率,以及是否需要通过其他方式检查数据库并查看查询。我认为以非blob格式存储查询是没有意义的,除非你想针对它们运行有趣的选择 - 如果你这样做,你可能需要一个XML数据库或其他容易支持树的东西。
答案 1 :(得分:0)
考虑使用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注入问题?你需要解析它(如果你的表达被适当限制,不要太难)并且无论用什么语言都要检查它是否合理。