Преобразования

Преобразование — это фрагмент кода, который определяет, как входные данные преобразуются в выходные данные при прохождении через шаг. Преобразование определяется в атрибуте "transform" или "normalize".

Определение преобразования задается вручную в файле задания с помощью языка JavaScript.

Шаги, допускающие преобразования

Преобразователи можно использовать в таких шагах как HashJoin, MergeJoin, Map, Rollup. В этих шагах есть возможность задать алгоритм преобразования на своё усмотрение, в то время как для других шагов алгоритмы обработки данных чётко определены.

Возвращаемые значения преобразователей

Ниже в таблице представлены все возможные варианты возвращаемых преобразователями значений.

ЗначениеОписаниеПример использования
ALLВ этом случае запись отправляется на все выходные порты.
...
return ALL;
SKIPСообщает что мы пропускаем данный выход (пропускаем цикл преобразования)
...
else {
    ...
    return SKIP;
    }

Любое целое число больше или равное 0Запись отправляется на выходной порт, номер которого равен этому возвращаемому значению.
  • return [1, 4, 9] – вернет запись на 1-ый, 4-ый и 9-ый порт

  • return [ERROR: 2, 4, 5, 7] – сообщает, что произошли ошибки с номерами 2, 4, 5 и 7

Методы преобразования данных

В некоторых шагах можно самостоятельно определить алгоритм обработки данных. К таким шагам относятся HashJoin, MergeJoin, HashJoin, Map, Rollup. Пользовательский алгоритм преобразования в этих шагах определяется в атрибуте с именем "transform" с помощью JavaScript:

<Node id="m" type="Map">
    <Attr name="transform">
        <![CDATA[
            function transform() {
            //transform code
            $out[0].field1 = $in[0].field1 * 3,14;
            $out[0].field2 = $in[1].field2 + 'success_string';

            return ALL;
            }
        ]]>
    </Attr>
</Node>

В шагах, использующих функцию преобразования, можно применять методы для работы с записями, описанные в примере ниже:

<Node id="map" guiX="250" guiY="100" guiName="map" type="Map">
    <Attr name="transform"><![CDATA[
        $out[0].person = $in[0].name.toString() + "_" + $in[0].surname.toString();
        $out[1].person = $in[0].name.toString().toUpperCase() + " " + $in[0].surname.toString().toUpperCase();
        
        return ALL;

Param(param_name) возвращает значение param_name, но выдает ошибку unknown parameter 'param_name', если имя параметра не определено

                0 => $out[0].obj_type = param("X"),
                1 => $out[0].obj_type = param("RbISb"),
                2 => $out[0].obj_type = format!("secure number is {}", param("FILE_PRM_NUM")),

Param_or(param_name, default_value) возвращает значение параметра или default_value, если параметра нет


                3 => $out[0].obj_type = input.obj_type + " is not " + &param_or("XX", "goose") + "!",

Try_param(param_name) возвращает Some(value) (value является строкой) в случае, если параметр есть, None, если параметра нет


                4 => $out[0].obj_type = if let Some(obj_type) = try_param("X") { obj_type } else { "tuturu".to_string() },

Param_parse_or(param_name, default_value) возвращает преобразованное значение параметра, если он есть или default_value. Возвращает ошибку, если значение параметра не преобразуется к типу

                5 | 6 => {
                    $out[0].y_coord = param_parse_or("X", 24);
                    $out[0].obj_type = param_parse_or("X", "tururu".to_string());
                }
                 _ => $out[0].obj_type = input.obj_type,
            
                index += 1;

                return ALL;