Перейти к основному содержимому
Версия: 2.0 (WIP)

Сортировка, группировка и агрегация

Сортировка

Для изменения порядка значений массива есть два способа: функция $sort() и оператор order-by ^. Оператор удобно применять прямо в пути для сортировки последовательности по возрастанию или убыванию; $sort() требует больше синтаксиса, зато поддерживает пользовательскую функцию сравнения.

Account.Order.Product^(Price)
Account.Order.Product^(>Price, <Quantity)

Первый запрос сортирует по цене по возрастанию, второй — по цене по убыванию, затем по количеству по возрастанию.

Группировка

В конструкторе объекта выражением может быть ключ и значение, но ключ должен вычисляться в строку. Для каждого элемента входного контекста вычисляются ключ и значение, затем пара добавляется в объект результата. Если ключ уже есть, связанное значение группируется с прежним. Выражения значений вычисляются только после завершения группировки, поэтому могут агрегировать всю коллекцию группы.

Account.Order.Product{`Product Name`: Price}
Account.Order.Product { `Product Name`: {"Price": Price, "Qty": Quantity} }
Account.Order.Product { `Product Name`: $.{"Price": Price, "Qty": Quantity} }
Account.Order.Product{`Product Name`: $.(Price*Quantity)}
Account.Order.Product{`Product Name`: $sum($.(Price*Quantity))}

Во втором выражении все цены и все количества группы собираются отдельно: контекстом является последовательность сгруппированных Product. Для массива отдельных объектов цены и количества вычисляйте объект для каждого элемента явно через $.{ ... }, как в третьем выражении. Последнее выражение даёт итог группы: например, Bowler Hat: 206.7.

Агрегация

Агрегирующие функции возвращают одно значение для массива совпадений:

$sum(Account.Order.Product.Price)
$sum(Account.Order.Product.(Price*Quantity))

Результаты для примера — 198.56 и 336.36. Также доступны числовые $average, $min, $max, строковый $join и пользовательские сложные агрегаторы через функцию высшего порядка $reduce().