Datalog 聚合函数

为策略语言添加聚合函数 sum(求和)、count(计数)、min(最小值)、max(最大值)、avg(平均值)。

问题描述

许多策略需要计算具有特定属性的 VM 数量,或者计算某些值的平均值、最小值、最大值或总和。如果没有聚合函数,这些策略就无法用 Datalog 表达。

提议的变更

此更改为 Datalog 策略语言添加了聚合函数。

备选方案

另一种选择是不在语言中包含聚合函数。缺点是某些常见策略将无法表达,但优点是关于策略推理的算法会更简单。通过禁止聚合函数,我们排除了用户想要使用聚合函数的情况,但代价是它们被包含的可能性。

策略

示例:定义一个表,计算每个应用程序的 Web 层中 VM 的数量。

app_web_size(id, count(vm)) :-

appservice:app(id), appservice:webtier(id, vm)

另一种语法选项是将聚合函数放在规则的主体中。此选项可能需要新的语法限制才能正常工作。

app_web_size(id, cnt) :-

appservice:app(id), appservice:webtier(id, vm), count(vm, cnt)

其他语法的建议?

策略动作

N/A

数据源

N/A

数据模型影响

规则的语法将被扩展,但存储规则的数据库模式不会,因为它们存储为字符串。

REST API 影响

N/A

安全影响

N/A

通知影响

N/A

其他最终用户影响

N/A

性能影响

使用聚合函数会带来一些性能影响,因为它们的计算成本更高。这些聚合函数也会使关于策略本身的推理(即,当数据未知时)更加困难。

其他部署者影响

N/A

开发者影响

N/A

实现

负责人

主要负责人

<launchpad-id 或 None>

其他贡献者

<launchpad-id 或 None>

工作项

  1. 选择要实现的聚合函数,例如 count、min、max、sum、avg

  2. 修改 congress/datalog/congress.g 以接受新的语句(可能)

  3. 修改 congress/datalog/compiler.g 以包含新的数据结构,用于在内部表示聚合函数

  4. 修改 congress/datalog/topdown.py:TopDown.select() 以处理聚合函数。这将需要在计算所有解决方案之后添加一个步骤,以应用聚合函数。

依赖项

N/A

测试

  • 将在 congress/tests/datalog/test_nonrecur.py 中添加单元测试

  • 将在 congress/tests/test_congress.py 中添加一个或两个单元测试,以确保 API 正确接受新的语法

文档影响

需要向文档添加对新语法结构的解释。

参考资料

1. 具有聚合函数的 Datalog 语言概述:http://dexter.stanford.edu/main/dexlog.html

2. 关于聚合函数的斯坦福大学最新论文 http://stanford.edu/~abhijeet/papers/abhijeetSARA13.pdf