1

我有以下架构: 在此处输入图像描述

对于 Boss 类,我需要所有销售额最高的代理的名称(例如:foreach 代理,如果他有,请选择代理名称 max(foreach command, total = total + price of the product * quantity from command). 如何在 OCL 中执行此操作?

4

1 回答 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)

请求背后的想法是(对于第一个):

  1. 获取所有代理 ( Agent.allInstances())
  2. 对它们进行排序 ( ...->sortedBy(...))
  3. 使用他们的销售额总和 ( ... sale->...->sum())
  4. “销售”由 mult 定义。按参考产品价格计算的数量 ( quantity*product.price)
  5. 对于每次销售,计算这些东西 ( ...sale->collect(...))
  6. 从这个最终结果(那个sum),反转结果以使顶部位于第一位置(... - sale->collect()->sum()...
  7. 从这个最终列表中,选择一个子序列 ( ...->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 回答