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>
工作项¶
选择要实现的聚合函数,例如 count、min、max、sum、avg
修改 congress/datalog/congress.g 以接受新的语句(可能)
修改 congress/datalog/compiler.g 以包含新的数据结构,用于在内部表示聚合函数
修改 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