How-to: GROUP SUM
Пример 1
Условие
Есть набор книг, привязанных к определенной категории.
CLASS Book 'Книга';
CLASS Category 'Категория';
category 'Категория' = DATA Category (Book);
Необходимо посчитать количество книг в категории.
Решение
countBooks 'Количество книг' (Category c) = GROUP SUM 1 BY category(Book book);
Пример 2
Условие
Есть набор книг, привязанных к определенным тегам. Каждая книга может относиться к нескольким тегам одновременно.
CLASS Tag 'Тег';
in 'Вкл' = DATA BOOLEAN (Tag, Book);
Необходимо посчитать количество книг в теге.
Решение
countBooks 'Количество книг' (Tag t) = GROUP SUM 1 IF in(t, Book b);
Пример 3
Условие
Существует информация о движении книг, где для каждой записи есть ссылка на книгу и склад, по которому было движение, а также количество и тип операции (приход/расход).
CLASS Stock 'Склад';
CLASS Ledger 'Движение';
book 'Книга' = DATA Book (Ledger);
stock 'Склад' = DATA Stock (Ledger);
quantity 'Кол-во' = DATA INTEGER (Ledger);
out 'Расход' = DATA BOOLEAN (Ledger);
Необходимо посчитать текущей остаток по складу для книги.
Решение
TABLE bookStock (Book, Stock);
currentBalance 'Текущий остаток' (Book b, Stock s) = GROUP SUM IF out(Ledger l) THEN -quantity(l) ELSE quantity(l) BY book(l), stock(l) MATERIALIZED;
Свойство currentBalance
лучше всего помечать как MATERIALIZED
для того, чтобы при чтении текущего остатка система не считала его на основе движения за все время, а обращалась бы к таблице bookStock
с уже готовым значением. Это замедляет запись (так как при записи каждого движения будет требоваться обновление текущего остатка), однако значительно ускоряет чтение.
Для свойства currentBalance
нигде явно не задается, в какой таблице оно должно храниться, так как система может сама определить по сигнатуре, в какую таблицу его лучше всего положить (в данном случае это будет таблица bookStock
).