2010-05-27 64 views
1

我的Python服务器接收包含要对其采取行动的项目列表的作业,而非搜索查询项;一个例子输入:解析复杂的查询参数

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

所以将作业提交的时候,我必须分析这个收件人模式,解决所有这些匹配的客户,并使用该输入工作。

使问题复杂化,客户可以随时加入和离开组,并且在发生这种情况时应该实时更新工作。

因此,当组织改变成员资格时,我必须通知所有正在运行的工作(并且他们做他们的事情)。

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

  • 解析:eval(),手写的FSM吃字符,yacc/bison /?还是?
  • 应用:你将如何存储这些约束,并评估它们?
  • 存储:在数据库中,每个项目有一个评估顺序和NOT/AND/OR操作字段的行;或作为一个blob?
+2

客户24两次? OR意味着什么?谁在写这些东西,程序员或最终用户?要完成3个不同客户的工作,最终用户将写入1和2和3,程序员将写入c == 1或c == 2或c == 3。 “工作应该现场更新”是什么意思? “工作”包含什么?哪些部分需要更新? – 2010-05-27 06:34:53

+0

这是一个错字,对不起 – Will 2010-05-27 07:36:30

+0

我们都猜测这是一个错字。现在尝试回答这些问题。 – 2010-05-27 07:46:53

回答

1

我建议pyparsing(http://pyparsing.wikispaces.com/),它可以让你描述一个文法整洁,并给你一棵树充满了数据。然后,希望你的语法足够接近SQL,这样你就可以从解析结果中形成一个“where”子句。

您可能会腌制并存储解析树,或未解析的请求或现成的SQL子句。这取决于你多频繁地提取和重用它们,以及是否需要通过其他方式检查数据库并查看查询。我认为没有必要将查询存储为非blob形式,除非您想针对它们运行有趣的选择 - 如果这样做,您可能需要一个XML数据库或其他支持树的其他方法。

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注入担忧?你需要解析它(并不难,如果你的表达式适当有限),并检查它的合理性,无论它被写入什么语言。

+0

但我会对SQL注入非常谨慎...... – Will 2010-05-27 07:37:02