对于 Boss 类,我需要所有销售额最高的代理的名称(例如:foreach 代理,如果他有,请选择代理名称
max(foreach command, total = total + price of the product * quantity from command).
如何在 OCL 中执行此操作?
问问题
255 次
1 回答
2
如果您认为您是模型的根(没有特别的上下文)以便选择第20
一个顶级代理:
Agent.allInstances()->sortedBy(- sale->collect(quantity*product.price)->sum())->subSequence(1, 20)
并从一个Boss
实例:
self.workers->sortedBy(- sale->collect(quantity*product.price)->sum())->subSequence(1, 20)
请求背后的想法是(对于第一个):
- 获取所有代理 (
Agent.allInstances()
) - 对它们进行排序 (
...->sortedBy(...)
) - 使用他们的销售额总和 (
... sale->...->sum()
) - “销售”由 mult 定义。按参考产品价格计算的数量 (
quantity*product.price
) - 对于每次销售,计算这些东西 (
...sale->collect(...)
) - 从这个最终结果(那个
sum
),反转结果以使顶部位于第一位置(... - sale->collect()->sum()...
) - 从这个最终列表中,选择一个子序列 (
...->subSequence(1,X)
)
编辑>
只是有关关联类导航的详细信息(来自“OCL 规范”,第 21 页)
为了指定到关联类(示例中的工作和婚姻)的导航,OCL 使用点和关联类的名称
按照规范的早期版本,Association Class
名称被称为小写,在后来的版本中,名称保持不变。
编辑2>
为了获得更高的分数和达到这个最高分数的代理名称:
let score : Integer = -(self.workers->collect(sale->collect(quantity*product.price)->sum())->sortedBy(i | -i)->first())
in self.workers->select(sale->collect(quantity*product.price)->sum() = score).name
第一个让选择更高的分数(收集所有分数,以相反的顺序对它们进行排序并选择第一个元素),然后选择所有分数等于先前计算的分数的工人。
于 2015-12-08T14:49:12.760 回答