ROLLUP
ROLLUP создает одну или несколько выходных записей из одной или нескольких входных записей. Может отправлять разные записи на разные выходные порты, указанные пользователем. Записи должны быть отсортированы перед подачей в этот узел.
Метаданные на разных выходных портах могут различаться.
Порты ROLLUP:
| Тип порта | Номер | Обязательный | Описание | Метаданные |
|---|---|---|---|---|
| Input | 0 | да | Для входных записей | любые |
| Output | 0 | да | Для выходных записей | |
| 1-N | нет |
Атрибуты ROLLUP:
| Атрибут | Обязательный | Описание | Возможные значения |
|---|---|---|---|
| groupKeyFields | да | Ключ, по которому записи считаются включенными в одну группу. Выражается в виде последовательности имен отдельных входных полей, разделенных друг от друга символом «#». | name; salary |
| groupAccumulatorMetadataId | дa | Идентификатор метаданных, которые служат для создания групповых аккумуляторов. | metadataName |
| transform | да | Алгоритм обработки данных. Функции для преобразования на узле ROLLUP описаны в таблице ниже. |
|
Схема работы узла ROLLUP
Функции узла ROLLUP
Когда приходит первая запись, срабатывает initGroup(groupAccumulatorMetadataId). Он инициализирует группу записей, объединенных групповым акумулятором groupAccumulatorMetadataId.
| Параметр | Значение |
|---|---|
| Обязательный | Да |
| Входные параметры |
|
| Возвращает | void |
| Вызов | Вызывается по одному разу для первой входной записи каждой группы. Вызывается перед updateGroup(groupAccumulatorMetadataId). |
| Описание | Обновляет информацию для конкретной группы. |
| Пример |
|
Далее для каждой записи, которая соответствует этой группе, вызывается updateGroup(groupAccumulatorMetadataId).
| Параметр | Значение |
|---|---|
| Обязательный | Да |
| Входные параметры |
|
| Возвращает |
если true, то вызывается если false, то граф завершится с ошибкой. |
| Вызов |
Вызывается многократно (по одному разу для каждой входной записи группы, включая первую и последнюю запись). Вызывается после того, как функция |
| Описание | Инициализирует информацию для конкретной группы. |
| Пример |
|
Если updateGroup вернул true, то для каждой записи еще вызывается updateTransform(counter, groupAccumulatorMetadataId) столько раз сколько указан counter внутри, пока не вернётся SKIP.
| Параметр | Значение |
|---|---|
| Обязательный | Да |
| Входные параметры |
Целочисленный счетчик (начинается с 0, указывает количество созданных записей. Должен быть завершен, как показано в примере ниже. Вызовы функций заканчиваются, когда возвращается
Если |
| Возвращает | целочисленные значения |
| Вызов |
Вызывается неоднократно, как указано пользователем. Вызывается после того, как |
| Описание |
Создает выходные записи на основе информации об отдельных записях. Если |
| Пример |
|
Когда группа закончилась, отрабатывает finishGroup(groupAccumulatorMetadataId).
| Параметр | Значение |
|---|---|
| Обязательный | Да |
| Входные параметры |
Метаданные, указанные пользователем. Если |
| Возвращает |
если true, то вызывается если false, то граф завершится с ошибкой. |
| Вызов |
Вызывается повторно, один раз для последней входной записи каждой группы. Вызывается после того, как |
| Описание |
Если |
| Пример |
|
Затем выполняется transform(counter, groupAccumulatorMetadataId).
| Параметр | Значение |
|---|---|
| Обязательный | Да |
| Входные параметры |
целочисленный счетчик (начинается с 0, указывает количество созданных записей. должен быть завершен, как показано в примере ниже. Вызовы функций заканчиваются, когда возвращается SKIP.)
Если |
| Возвращает | целочисленные значения |
| Вызов |
Вызывается неоднократно, как указано пользователем. Вызывается после того, как |
| Описание |
Создает выходные записи на основе всех записей всей группы. Если функция |
| Пример |
|
Входные записи или поля
Входные записи или поля доступны в функциях initGroup(), updateGroup(), finishGroup(), updateTransform(), transform().
Выходные записи или поля
Выходные записи или поля доступны в функциях updateTransform(), transform().
Групповой аккумулятор
Групповой аккумулятор доступен в функциях initGroup(), updateGroup(), finishGroup(), updateTransform(), transform().
Пример. Сгруппировать записи.
На вход в ROLLUP подаются записи, некоторые из которых имеют одинаковое значение поля "num". Нужно соединить значения всех полей, у которых одинаковое значение num и подать на выходной порт.
- Создать метаданные.
rollin:
- stra (string),
- num (integer),
- stro (string),
- Поместить компоненты на рабочую область.
- Соединить узлы ребрами и назначить им метаданные.
- Задать значения атрибутов узлу ROLLUP.
groupKeyFields = "num",
groupAccumulatorMetadataId = "rollin",
transform =
function initGroup(groupAccumulator) {
groupAccumulator.s = null;
groupAccumulator.t = 0;
groupAccumulator.r = null;
}
function updateGroup(groupAccumulator) {
groupAccumulator.s = groupAccumulator.s + $in[0].stra;
groupAccumulator.t = groupAccumulator.t + $in[0].num;
groupAccumulator.r = groupAccumulator.r + $in[0].stro;
return true;
}
function finishGroup(groupAccumulator) {
return true;
}
function updateTransform(counter, groupAccumulator) {
return SKIP;
}
function transform(counter, groupAccumulator) {
if(counter > 0) return SKIP;
$out[0].s = groupAccumulator.s;
$out[0].t = groupAccumulator.t;
$out[0].r = groupAccumulator.r;
return ALL;
}
- Результатом выполнения графа будут строки из входных записей, значения полей которых соединенны при условии наличия одинакового значения поля "num".