编写特定于域的语言,用于从表中选择行

Nic*_*son 5 python database algorithm dsl

我正在写一个服务器,我希望由许多不同的人经营,而不是我将直接联系的所有人.服务器将在群集中相互通信.服务器功能的一部分涉及从可能非常大的表中选择一小部分行.选择哪些行的确切选择将需要一些调整,并且重要的是运行集群的人(例如,我自己)可以更新选择标准而不让每个服务器管理员部署新版本的服务器.

简单地用Python编写函数实际上并不是一个选项,因为没有人会想要安装一个在运行时下载并执行任意Python代码的服务器.

我需要的是关于实现域特定语言以实现此目标的最简单方法的建议.该语言需要能够进行简单的表达式评估,以及查询表索引和迭代返回的行.易于编写和阅读语言是易于实现的第二步.我也不想编写整个查询优化器,所以明确指定要查询的索引是理想的.

必须编译的接口与App Engine数据存储区导出的功能类似:您可以查询表上任何索引的顺序范围(例如,小于,大于,范围和相等的查询) ,然后通过任何布尔表达式过滤返回的行.您还可以将多个独立的结果集连接在一起.

我意识到这个问题听起来很像我要求SQL.但是,我不想要求支持此数据的数据存储区是关系数据库,并且我不希望尝试自己重新实现SQL的开销.我也只处理一个具有已知模式的表.最后,不需要加入.更简单的东西更可取.

编辑:扩展描述以消除一些误解.

S.L*_*ott 4

构建由 Python 解释的 DSL。

步骤 1. 构建运行时类和对象。这些类将所有游标循环和 SQL 语句以及所有算法处理隐藏在它们的方法中。您将大量使用命令策略设计模式来构建这些类。大多数东西都是命令,选项和选择是插件策略。看看 Apache Ant 的任务API 的设计——这是一个很好的例子。

步骤 2. 验证该对象系统是否确实有效。确保设计简单且完整。您的测试将构造 Command 和 Strategy 对象,然后执行顶级 Command 对象。命令对象将完成这项工作。

至此,您已基本完成。您的运行时只是从上述域创建的对象的配置。[这并不像听起来那么容易。需要小心地定义一组可以实例化的类,然后“相互交谈”以完成应用程序的工作。]

请注意,您所拥有的内容只需要声明即可。程序上有什么问题吗?当您开始使用过程元素编写 DSL 时,您会发现需要越来越多的功能,直到您使用不同的语法编写 Python。不好。

此外,过程语言解释器很难编写。执行状态和引用范围很难管理。

您可以使用本机 Python,而无需担心“脱离沙箱”。事实上,这就是您对所有内容进行单元测试的方式,使用简短的 Python 脚本来创建对象。Python 将成为 DSL。

[“但是等等”,你会说,“如果我简单地使用 Python 作为 DSL,人们就可以执行任意的事情。” 取决于 PYTHONPATH 和 sys.path 上的内容。查看站点模块以了解控制可用内容的方法。]

声明性 DSL 最简单。这完全是一种代表性的练习。仅设置某些变量值的 Python 块很好。这就是 Django 使用的。

您可以使用ConfigParser作为表示对象的运行时配置的语言。

您可以使用JSONYAML作为表示对象运行时配置的语言。现成的解析器是完全可用的。

您也可以使用 XML。设计和解析比较困难,但效果很好。人们喜欢它。这就是 Ant 和 Maven(以及许多其他工具)使用声明性语法来描述过程的方式。我不推荐它,因为它是一个冗长的脖子痛。我建议简单地使用Python。

或者,您可以深入研究并发明自己的语法并编写自己的解析器。