Если вы считаете, что вы в корне модели (без контекста, в частности) для того, чтобы отобрать 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()
)
- сортировать их (
...->sortedBy(...)
)
- с использованием суммы их продаж (
... sale->...->sum()
)
- a "sale" определяется мультипликатором. количеств по цене ссылочного продукта (
quantity*product.price
)
- для каждой продажи, вычислить этот материал (
...sale->collect(...)
)
- от этого конечного результата (
sum
один), инвертировать результат иметь вершины в первой позиции (... - sale->collect()->sum()...
)
- из этого окончательного списка выберите последовательность подменю (
...->subSequence(1,X)
)
EDIT>
Только подробно о классе ассоциации навигации (от «OCL Specification», с.21)
Для указания навигации к классам ассоциации (Работа и брак в данном примере), OCL использует точку и имя из ассоциация класса
После ранней версии спецификации, имя Association Class
называется положить в нижнем регистре, в более поздней версии, название выпускаемая нетронутым.
EDIT2>
Для того, чтобы получить более высокий балл, и агенты называют, кто попадает этот высокий балл:
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
Первый пусть выбрать более высокий балл (собрать все баллы, сортировать их в обратном порядке и выберите первый элемент), затем выберите всех работников, у которых оценка равна ранее вычисленной.
спасибо! Я видел ваш комментарий к другому сообщению. Я хотел бы знать, что означает «-» перед «продажей»? –
Что делать, если есть больше агентов, имеющих одинаковое значение?Например, агент1 и агент2 делали продажи на сумму по 100 штук каждый, и я не знаю, сколько у них было, но мне нужны имена всех агентов, попавших в максимальную цель. –
Просто унарная минусовая операция, чтобы отсортировать список по обратному порядку, чтобы иметь верхний агент в первой позиции в списке. В OCL нет функции 'reverse' (в Acceleo есть, но не в« чистом »OCL), так что это мой трюк, чтобы отменить список. –