Описание

OneBridge - это система управления данными, разработанная для автоматизации сбора, преобразования и выгрузки данных в соответствии с заданными пользователем параметрами. Система включает два основных компонента: Веб-платформу и Дизайнер заданий.

Набор готовых алгоритмов обработки упрощает процесс управления данными и ускоряет загрузку и выгрузку данных.

Система позволяет проверить, очистить и получить качественные данные для дальнейшего использования.

Пользователи системы - разработчики, которые создают и поддерживают, например, корпоративные хранилища данных и нормативно-справочные информационные системы.

Функции OneBridge

Система выполняет задания по обработке данных. Для запуска задания пользователю нужно выбрать файл с готовым набором алгоритмов обработки данных.

Взаимодействие пользователя с системой может происходить двумя способами:

  • с помощью Модуля управления - позволяет запустить в работу задания на обработку данных, просмотреть в графическом виде алгоритмы заданий, отследить данные о состоянии сервера системы, настроить расписание запуска заданий и задать обработчики событий;
  • через локальное приложение Дизайнер заданий - он используется для создания алгоритмов заданий (графов) через графический редактор.

В обоих случаях после запуска задания данные обрабатываются в Модуле выполнения.

Структура OneBridge

Система состоит из двух основных компонентов - Веб-платформы и Дизайнера заданий.

Веб-платформа

Веб-платформа включает в себя два модуля:

  • Модуль управления представляет собой веб-интерфейс с возможностью выбора и запуска заданий, а также отслеживания истории запусков и состояния системы. Интерфейс Модуля управления описан в разделе "Интерфейс Модуля управления". Операции, которые можно выполнить с помощью модуля, описаны в разделе "Описание операций".
  • Модуль выполнения заданий обрабатывает данные в соответствии с алгоритмами из файлов заданий.

Модуль управления

Модуль управления предназначен для выбора и запуска в работу заданий на обработку данных, представления в графическом виде алгоритмов заданий и отслеживания данных о состоянии сервера системы.

Модуль управления состоит из нескольких компонентов:

  • на странице «Ресурсы» отображаются показатели рабочего сервера системы и список заданий, находящихся в процессе выполнения;
  • страница «История выполнения» показывает историю запуска заданий на выполнение и развёрнутую информацию о файлах заданий;
  • с помощью страницы «Проекты» можно увидеть дерево проектов, просмотреть подробную информацию о файлах заданий и содержимое выбранного файла в текстовом или графическом виде.
  • Расписания позволяют настраивать отложенный запуск заданий.
  • Обработчики событий могут совершать заданное действие в ответ на выполнение определённого пользователем условия.

Модуль управления обеспечивает:

  • отображение информации о ресурсах и производительности сервера;
  • просмотр истории выполнения заданий в виде таблицы;
  • фильтрацию истории по времени выполнения задания, по названию файла исполняемого задания;
  • просмотр информации о файле задания;
  • просмотр алгоритма задания в графическом виде;
  • просмотр журнала выполнения задания;
  • отображение структуры хранения файлов с заданиями;
  • выбор и запуск задания на выполнение;
  • создание и редактирование расписаний и обработчиков событий;
  • создание, редактирование и удаление проектов, папок и файлов с данными.

Модуль выполнения заданий

Модуль выполнения заданий обрабатывает данные по алгоритму, который выбрал пользователь, и собирает статистику использования ресурсов сервера. Этот модуль состоит из инструкций по обработке данных и содержит программные интерфейсы для передачи необходимой информации в модуль управления заданиями и взаимодействия с рабочими процессами.

Модуль выполнения заданий обеспечивает:

  • загрузку данных из источников - файлы CSV, базы данных;
  • обработку данных по указанному алгоритму - сортировка, фильтрация, преобразование данных;
  • отправку обработанных данных по указанному адресу - адресату по почте, запись в файл, в корпоративное хранилище данных;
  • распределение нагрузки между рабочими процессами, которые загружают и обрабатывают данные.

Дизайнер заданий

Дизайнер заданий - это локальное приложение для создания, редактирования, отладки и запуска файлов заданий.

Создание заданий в Дизайнере происходит с помощью графического интерфейса. Он описан в главе Интерфейс Дизайнера заданий.

Главные компоненты заданий - Шаги - представлены в виде прямоугольников, которые можно соединять друг с другом рёбрами и располагать в рабочей области нужным образом.

Результатом создания и соединения компонентов графа является xml-файл с алгоритмом обработки данных, который можно запустить в Дизайнере заданий или Модуле управления. Обработка алгоритма происходит в Модуле выполнения заданий.

Процесс создания графа в Дизайнере

Термины и определения

Шаг – минимальный алгоритм обработки информации.

Задание – алгоритм, последовательность шагов, описанная в файле.

Граф – разновидность задания, наименьшая исполняемая единица рабочего процесса. Графы состоят из шагов, имеющих порты для ввода и вывода данных. Порты шагов в графе соединены линиями - ребрами графа, которые отражают передачу данных между портами шагов.

Входной порт – точка входа потока данных в шаг.

Выходной порт – точка выхода результата обработки данных из шага.

Ребрам назначаются метаданные. Метаданные описывают структуру данных. Они состоят из названий полей, типов данных и их размера.

Поток заданий (рабочий поток/jobflow) – разновидность задания. Поток заданий позволяет объединять графы в сложные процессы, обеспечивая согласование, выполнение заданий в зависимости от условий и обработку ошибок.

Задача — это граф, поток заданий или другое действие, которое можно запустить вручную, с помощью расписания или обработчика событий. Задача описывает «что нужно сделать».

Источник данных – это массив информации, откуда данные загружаются в систему для обработки.

Приемник данных – целевая система, куда выгружаются данные после обработки. Это может быть база данных, простой файл, интернет-ресурс и так далее.

Плоский файл – это файл, в котором данные хранятся в виде записей. Записи отделяются друг от друга специальным символом-разделителем. Внутри каждой записи может быть несколько полей разных типов. Поля тоже разделяются символом-разделителем.

Обработчик событий - инструмент для отслеживания изменений в системе и совершения запланированных действий.

Расписание – график запуска заданий. Позволяет настроить запуск заданий в конкретное время.

Установка компонентов OneBridge

Установка Веб-платформы

Все описанные ниже действия должны производиться на устройстве с операционной системой Ubuntu, либо на виртуальной машине с ОС Ubuntu.

Перед началом работы необходимо установить Wget — (GNU Wget) свободную консольную программу для загрузки файлов по сети.

Затем:

  1. Открыть командную строку и выполнить команды:
  • для скачивания приложения OneBridge с сайта modernsolution.ru: wget http://repo.modernsolution.ru/ubuntu/pool/main/o/onebridge/onebridge_1.0-1_amd64.deb

  • для установки скачанных файлов приложения OneBridge: sudo apt install ./onebridge_1.0-1_amd64.deb -y

Вместе с файлами приложения OneBridge будут установлены зависимости из следующего списка: build-essential, linux-libc-dev, pkg-config, libssl-dev, libssl3, libgcc-s1, libc6.

После установки файлы OneBridge будут размещены в директории /opt/OneBridge/bin/.

  1. Перейти в вышеуказанную директорию с помощью команды cd /opt/OneBridge/bin/.
  2. Запустить приложение из директории /opt/OneBridge/bin/, введя команду: ./startup.sh

В случае успешной установки будет получен ответ: Startup.

Для подключения к модулю управления заданиями нужно открыть браузер на этой же операционной системе и ввести в поисковую строку локальный ip-адрес и порт подключения вот таким образом: 127.0.0.1:8000.

Откроется начальная страница приложения, с которой можно перейти на любую другую страницу из меню.

Список рекомендуемых браузеров: Google Chrome, Яндекс Браузер, Opera.

Установка Дизайнера заданий

Описание интерфейса Модуля управления

Каждая страница приложения поделена на три панели:

  • панель Меню;
  • Рабочая панель;
  • панель Дополнительной информации.

Деление экрана на панели

В Меню доступны для перехода несколько разделов: "Ресурсы", "История выполнения", "Проекты", "Расписания", "Обработчики событий".

  • На странице ресурсов отображается информация о задействованных ресурсах сервера и его производительности. Информация сгруппирована на нескольких панелях. Периодичность обновления данных можно настроить.
  • На странице истории выполнения отображается история выполнения заданий в виде таблицы, каждая строка которой содержит информацию по отдельному заданию. Данные в таблице можно фильтровать. Доступен просмотр подробных данных по каждому заданию.
  • В дереве проектов доступен просмотр информации о файлах заданий и их запуск на выполнение.
  • С помощью расписаний можно планировать запуск заданий.
  • Обработчики событий реагируют на произошедшие изменения и запускают выполнение назначенных задач.

Далее описан интерфейс страниц этих разделов.

Ресурсы

Страница ресурсов отображает информацию о производительности сервера приложения.

Интерфейс страницы «Ресурсы»

Деление экрана на панели

Рабочая панель поделена на несколько областей:

  • «Использование ресурсов». Здесь отображается объем используемой системной памяти на момент загрузки страницы.
  • «Рабочий сервер». Раздел содержит информацию о параметрах рабочего сервера.
  • «Операционная система». Содержит основную информацию об операционной системе.
  • «Производительность». В этом разделе отображаются два линейных графика: «Загрузка памяти» - RAM и «Загрузка ЦП» - CPU.
  • «Запущено заданий» отображает информацию о процессах, которые выполняются в данный момент.

История выполнения

История выполнения показывает историю всех запущенных заданий, которые выполнял OneBridge сервер. Вы можете использовать историю, чтобы узнать, почему задание завершилось ошибкой и просмотреть параметры, которые использовались для конкретного запуска.

Интерфейс страницы «История выполнения»

Интерфейс страницы «История выполнения»

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

Чтобы отфильтровать таблицу по дате или названию файла задания, заполните поля фильтров и используйте кнопку «Фильтровать».

Поля для фильтрации таблицы с историей выполнения заданий

Поля для фильтрации таблицы с историей выполнения заданий

Чтобы просмотреть информацию о конкретном задании, нужно кликнуть соответствующую строку в таблице. Подробная информация отображается справа, на панели просмотра дополнительной информации. На этой панели есть несколько вкладок.

Вкладка «Обзор» представлена на рисунке ниже. Она отражает номер задания, данные о времени выполнения, относительный путь к файлу задания и статус его выполнения.

Интерфейс вкладки «Обзор»

вкалдка "Обзор"

Ниже описаны данные, которые отображаются на этой вкладке.

Имя столбцаОписание
Идентификатор запуска задания, уникальный номер, идентифицирующий запуск задания.
НачалоДата и время начала выполнения задания.
КонецДата и время окончания выполнения задания.
ПродолжительностьДлительность выполнения.
Файл заданияОтносительный путь до файла задания
СтатусСтатус выполнения задания. "Выполнено" - задание выполнено успешно и "Не выполнено" - во время выполнения задания произошла ошибка, задание не выполнено.
Входные параметрыНаименования и значения входных параметров, которые были указаны при запуске задания.

Графический инструмент «Инспектор заданий», приведенный на рисунке ниже, позволяет пользователю исследовать процесс выполнения задания. Инспектор заданий визуализирует поток данных в виде графа. На графе выводятся компоненты - это шаги алгоритма, они представлены в виде прямоугольников, соединенных линиями. Линии в графе называются рёбрами и отражают потоки данных между компонентами.

Граф может быть очень большим и не помещаться в инспекторе полностью. Чтобы увидеть все компоненты и их связи, нужно перетащить рисунок, зажав его левой кнопкой мыши и потянув, сдвигая в сторону.

Вкладка «Инспектор заданий». Визуальное представление задания, состоящего из нескольких шагов.

Вкладка «Инспектор заданий»

На вкладке «Журнал», представленной на рисунке ниже, можно просмотреть подробную информацию о ходе выполнения задания. Каждый запуск задания имеет собственный файл журнала.

Вкладка «Журнал»

Вкладка «Журнал»

На вкладку «Содержимое файла» выводится контент файла задания.

Вкладка «Содержимое файла»

Вкладка «Содержимое файла»

Проекты

Проекты — это место, где хранятся все рабочие файлы. На рабочей панели этой страницы находится каталог проектов, внутри проектов – папки и файлы. На следующем рисунке приведен внешний вид страницы проектов.

Интерфейс страницы «Проекты»

Интерфейс страницы «Проекты»

Чтобы открыть содержимое проекта или папки нажмите знак «+» слева от названия объекта в каталоге.

Если нажать на название элемента каталога, появится панель дополнительной информации в правой части экрана. На ней есть несколько вкладок для просмотра подробной информации об открытом элементе и его содержимом.

Всегда доступна вкладка «Обзор». На ней отображаются данные файла или выбранной директории. Запуск заданий на выполнение производится на этой вкладке.

Для файлов с расширением .grf появляется вкладка «Инспектор заданий». На ней можно увидеть процесс выполнения задания в графическом виде.

Текст файла задания выводится во вкладку «Содержимое файла».

Создание проектов и управление ими описано в главе «Описание операций».

Расписания

Раздел расписаний позволяет планировать запуски заданий по графику, устанавливаемому пользователем. Периодичность запуска настраивается.

На странице планировщика расписания представлены в виде таблицы, в которой указан статус расписания (включено/выключено), название, дата и время последнего и следующего запусков.

Список созданных расписаний

Список расписаний

Каждый пункт расписания представляет собой определение времени запуска и указание файла задания для выполнения. После создания каждый пункт расписания можно редактировать или приостанавливать его выполнение.

Для создания пункта расписания необходимо указать его название, периодичность запуска и временной интервал работы, файл задания для запуска.

Периодичность запуска расписаний:

  • один раз;
  • с интервалом;
  • по определенному графику.

Таблица атрибутов расписания:

названиеобязательныйрежимописание
имя расписаниядалюбойназвания пункта расписания
периодичностьдалюбой

периодичность выполнения расписания:

один раз/интервал/расписание

время исполнениядаодин раздата и время в формате: yyyy-mm-dd hh:mm:ss
запускать каждыедаинтервалпериодичность запуска задания. Может быть задана в секундах, минутах или часах.
выражение cronдарасписаниевыражение, определяющее график запуска расписания
начало активациидаинтервал и расписаниевремя первого выполнения расписания
конец активациинетинтервал и расписаниевремя последнего выполнения расписания
файл заданиядалюбойимя файла задания, которое нужно запустить по расписанию

Обработчики событий

Обработчики событий – это инструменты для отслеживания изменений в системе и совершения запланированных действий. С их помощью можно настроить запуск выполнения определенной задачи, после выполнения указанного события.

Список созданных обработчиков событий

Список созданных обработчиков

Виды обработчиков:

  • обработчики событий заданий привязаны к определенному рабочему процессу и отрабатывают каждый раз, когда рабочий процесс выполняется;
  • обработчики файловых событий отслеживают изменения в файловой системе и реагируют на такие изменения запуском определенной задачи.

Обработчики ждут наступления события и запускают определенное в их настройках действие, если событие происходит. Созданные обработчики отображаются в списке обработчиков событий.

Отслеживаются следующие события:

  • События с заданиями – завершение работы
  • События с файлами – создание, удаление

Список обработчиков содержит следующую информацию:

названиеописание
ВключеноУказывает, включен ли обработчик или отключен. Щелчок по значку включает/отключает обработчик.
Обработчик событияПоказывает имя обработчика, тип задачи и событие, которого ожидает обработчик.
Файл заданияИмя файла, окончание работы которого отслеживается обработчиком.
Последний запускПоказывает дату и время последнего запуска обработчика.

Типы задач, которые можно выполнить с помощью обработчиков:

  • запуск задания;
  • выполнение системной команды.

Таблица атрибутов обработчика событий:

АтрибутОбязательныйОписаниеВозможные значения
name string название слушателя name="listener2000"
enabled bool состояние слушателя. Включён|выключен enabled=true
event string событие, которое слушает слушатель: "Job" или "File"
"event": {
   "job": {
       "finished": {
           "job_file": "/JobsForTests/graph/others/concat.grf"}}}
action string действие, которое необходимо выполнить, когда event завершится
"action": {
"start_job": {
    "job_file": {  "job_file":"/JobsForTests/graph/others/concat.grf",
                    "params": []}}}

Описание операций

В данной главе приведены способы взаимодействия с системой OneBridge через модуль управления.

Описаны все возможные операции, которые можно совершить, и приведены скришоты и инструкции.

Создать проект

Чтобы создать новый проект нажмите кнопку «Создать новый проект» в верхней части рабочей панели на странице «Проекты». Диалог создания проекта показан ниже.

Открытие диалога по созданию нового проекта

Открытие диалога по созданию нового проекта

Откроется диалоговое окно. Задайте название в поле «Имя проекта» и нажмите кнопку «Создать», чтобы создать проект. Чтобы выйти из диалога без сохранения – нажмите «Закрыть».

В случае создания проекта в верхнем правом углу будет выведено уведомление об этом. Название нового проекта появится в дереве проектов.

Новый проект создан

Новый проект создан

Создать папку

В существующих проектах можно создавать папки для упорядочивания файлов внутри ваших проектов. Для создания папки нажмите на название проекта, в котором нужно создать папку. На панели дополнительной информации отобразится вкладка «Обзор». Откройте список действий с проектом, нажав на троеточие в правой части вкладки. Выберите «Создать папку».

Меню директории при создании папки

Меню директории при создании папки

Отобразится диалоговое окно. Введите имя папки в поле «Имя папки». Нажмите «Создать». Для отмены создания нажмите «Закрыть».

Диалог создания папки

Диалог создания папки

После создания папки в верхнем правом углу появится всплывающее уведомление с названием созданного объекта.

Новая папка создана

Новая папка создана

После создания папки в пустом проекте рядом с её значком на рабочей панели появится значок «+». Это значит, что в проекте есть объекты. Чтобы посмотреть список объектов, нажмите на «+».

Папки можно создавать внутри существующих папок.

Создать файл

Файлы можно создавать как внутри проектов, так и внутри папок. Чтобы создать файл, выберите в рабочей панели нужную директорию щелчком мыши. Будет открыта вкладка «Обзор». С помощью троеточия в правом верхнем углу откройте меню директории, выберите «Создать файл».

Меню директории при создании файла

Меню директории при создании файла

Откроется диалог создания файла. Путь к создаваемому объекту будет указан в поле «Создать файл в». Задайте название файла вместе с расширением в поле «Имя файла». При необходимости, внесите содержимое файла в поле «Содержимое файла». Нажмите «Создать». Для отмены создания нажмите «Закрыть».

Диалог создания файла

Диалог создания файла

После создания файла в пустой папке рядом с её значком в дереве проектов появится значок «+». Это значит, что в папке есть объекты. Чтобы посмотреть список объектов, нажмите на «+», директория раскроется и станут видны содержащиеся в ней объекты. Значок «+» при этом изменится на «».

Новый файл создан

Новый файл создан

Загрузить файл

Для того, чтобы загрузить в систему файл с компьютера, можно воспользоваться функцией «Загрузить файл». Кнопка загрузки находится в том же выпадающем списке, что и создание файла.

Выбор пункта «Загрузка из файла» из выпадающего меню на вкладке «Обзор»

Выбор пункта «Загрузка из файла» из выпадающего меню на вкладке «Обзор»

Выбор файла, который нужно загрузить в систему, через диалоговое окно

Выбор файла, который нужно загрузить в систему, через диалоговое окно

Файл загружен из памяти компьютера на сервер системы OneBridge

Файл загружен из памяти компьютера на сервер системы OneBridge

Редактировать файл

Содержимое файла можно отредактировать. Для этого нажмите на иконку в виде пишущей ручки на панели дополнительной информации. Вы будете автоматически перенаправлены на вкладку «Содержимое файла».

Включение режима редакирования файла

Включение режима редакирования файла

Чтобы сохранить изменённый файл, нажмите «Сохранить».

Сохранение изменений

Сохранение изменений

Чтобы выйти из режима изменения без сохранения, нажмите «Закрыть».

Переименовать объект

Для того, чтобы переименовать объект каталога, выберите его из списка объектов на рабочей панели и нажмите кнопку «Переименовать файл» в выпадающем меню на панели дополнительной информации, если нужно переименовать файл, и «Переименовать папку», если нужно переименовать папку.

Выбор пункта меню для переименования файла

Выбор пункта меню для переименования файла

Пункт меню для переименования папки

Пункт меню для переименования папки

Исправьте имя файла и нажмите «Сохранить».

Диалог переименования объекта каталога

Диалог переименования объекта каталога

Имя файла в каталоге поменяется.

Объект переименован

Объект переименован

Удаление объектов каталога

Чтобы удалить объект каталога, выберите его в дереве проекта. Нажмите кнопку в виде мусорного ведра. Откроется диалог удаления. Для подтверждения нажмите «Удалить», для отмены действия нажмите «Закрыть».

Удаление объекта каталога

Удаление объекта каталога

После удаления файл сразу пропадёт из дерева проектов.

Запуск задания на выполнение

Чтобы запустить задание на выполнение перейдите на страницу «Проекты».

Выберите нужный файл в дереве проектов на рабочей панели.

Щелкнув по файлу перейдите на вкладку «Обзор» в панели дополнительной информации.

В правом верхнем углу вкладки «Обзор» нажмите кнопку «Запуск» , чтобы попасть в диалог запуска задания на выполнение.

Последовательность действий для запуска задания на выполнение

Последовательность действий для запуска задания на выполнение

В появившемся диалоговом окне заполните необходимые поля. Некоторые поля являются обязательными для заполнения. После заполнения полей в диалоговом окне нажмите кнопку «Запустить».

Диалоговое окно запуска задания

Диалоговое окно запуска задания

После этого в правом верхнем углу экрана появится уведомление с номером процесса, который система автоматически присвоила запущенному заданию. Нажав на номер в уведомлении, вы будете перенаправлены на страницу просмотра истории выполнения заданий.

Уведомление о запуске задания

Уведомление о запуске задания

Просмотр истории

Увидеть информацию о запущенных заданиях можно выбрав в панели меню пункт «История выполнения». Сделав это, вы перейдете на страницу просмотра истории выполнения заданий. В середине экрана отобразится таблица с информацией о статусах выполнения всех уже запущенных процессов:

  • во время выполнения задание будет иметь статус «В процессе»;
  • если процесс успешно завершен – проставляется статус «Выполнено»;
  • если процесс завершился с ошибкой статус будет «Не выполнено».

Для того, чтобы увидеть актуальную информацию о статусе процесса, нужно обновить страницу.

После выбора строки с нужным номером процесса, откроется панель дополнительной информации с открытой вкладкой «Обзор». Во вкладке будет отображаться информация о выбранном задании.

Страница просмотра истории выполнения заданий

Страница просмотра истории выполнения заданий

В просмотр истории выполнения задания также можно попасть, щелкнув по номеру в уведомлении о запуске задания. Вкладка «Обзор» с информацией о конкретном задании будет открыта автоматически.

Список заданий в таблице можно отфильтровать с помощью функции фильтрации. Чтобы отфильтровать таблицу по дате запуска задания, введите начальную и конечную даты в формате «год-месяц-день часы:минуты:секунды» в соответствующие поля на рабочей панели и нажмите «Фильтровать».

Фильтрация заданий по дате выполнения

Фильтрация заданий по дате выполнения

Чтобы отфильтровать процессы по статусу выполнения, выберите нужный статус из выпадающего списка в поле «Статус» как на рисунке ниже.

Фильтрация заданий по статусу выполнения

Фильтрация заданий по статусу выполнения

Для поиска исторических записей о выполнении заданий по имени файла задания, введите в поле «Файл задания» имя файла (см. рисунок 33). После заполнения полей для фильтрации нажмите кнопку «Фильтровать».

Результат фильтрации по имени файла задания

Результат фильтрации по имени файла задания

Чтобы выбрать задание и просмотреть информацию о нем, щелкните левой кнопкой мыши по строке с номером задания. Если вы попали на вкладку истории выполнения после запуска задания, нажав на уведомление, то просмотр информации по конкретному заданию будет доступен сразу.

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

Просмотр ресурсов

Чтобы проверить, сколько ресурсов потребляется при выполнении заданий, перейдите на страницу просмотра ресурсов, выбрав пункт меню «Ресурсы».

Выбор страницы «Ресурсы» в меню

Выбор страницы «Ресурсы» в меню

На этой странице доступно несколько разделов экрана, показывающих информацию об используемой памяти и нагрузке рабочего сервера, а также графики использования ресурсов.

В блоке «Использование ресурсов» на круговой диаграмме отражается процентное соотношение занятой оперативной памяти сервера ко всей доступной.

Блок «Рабочий сервер» содержит информацию о параметрах сервера.

В блоке «Операционная система» указаны атрибуты используемой операционной системы.

В блоке «Запущено заданий» отображаются задания в процессе выполнения.

Отображение запущенных процессов на странице ресурсов

Отображение запущенных процессов на странице ресурсов

В блоке «Производительность» видимую область графиков можно менять, двигая мышкой ползунок с указанием времени под графиком. Выбор временного отрезка проиллюстрирован на следующем рисунке.

Выбор временного отрезка на графике

Выбор временного отрезка на графике

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

Наведя указатель мыши на график, вы увидите всплывающую подсказку с описанием ресурсов в выбранный момент времени.

Всплывающая подсказка на графике производительности

Всплывающая подсказка на графике производительности

Для лучшей читаемости каждый из графиков можно включить или отключить, щелкнув его метку над областью графиков.

Метки, управляющие видимостью графиков

Метки, управляющие видимостью графиков

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

Уменьшение временного отрезка на графиках с помощью ползунка

Уменьшение временного отрезка на графиках с помощью ползунка

По умолчанию максимальный временной интервал для графиков на вкладке «Производительность» составляет 24 часа.

Настроить расписание

Для того, чтобы задать определенное время выполнения задачи, используйте планировщик. Перейдите на страницу планировщика, выбрав в панели меню строчку «Расписания». Чтобы запланировать выполнение задания щелкните по кнопке «Новое расписание».

Таблица расписаний

Таблица расписаний

Нажмите «Новое расписание» чтобы открыть диалог создания расписания.

В открывшемся окне введите имя будущего расписания, периодичность запуска задачи, время выполнения и выберите файл задания, который надо запустить. Нажмите «Создать», чтобы создать расписание.

Диалог создания нового расписания

Диалог создания нового расписания

Расписание будет создано и запущено в заданное время. Созданное расписание можно увидеть в таблице расписаний. Работающие расписания помечены как включенные с помощью синего переключателя. Чтобы выключить расписание – нажмите на переключатель, чтобы он стал серым.

Список запланированных задач

Список запланированных задач

Чтобы создать новое расписание откройте диалог на вкладке «Расписания», нажав «Новое расписание» в левом верхнем углу.

Выполнение расписания можно проверить на странице «История выполнения».

Проверка запуска запланированной задачи в истории выполнения

Проверка запуска запланированной задачи в истории выполнения

Для редактирования расписания нажмите значок в виде пишущей ручки на вкладке Обзор. В открывшемся окне можно изменить тип расписания, время и файл, который будет запущен.

Редактирование расписания

Редактирование расписания

Чтобы удалить расписание нажмите значок мусорной корзины на вкладке Обзор.

Удаление расписания

Удаление расписания

Настроить слушатель

Чтобы настроить обработчик щелкните «Новый обработчик» на вкладке «Обработчики событий». Появится диалоговое окно для внесения атрибутов. Задайте название обработчика, выберите отслеживаемое событие и назначьте действие, которое будет выполнено, когда отслеживаемое событие совершится. Нажмите «Создать».

Создание обработчика

Создание обработчика

Созданный обработчик отобразится в списке.

Список Обработчиков

Список Обработчиков

Для того чтобы отредактировать обработчик нажмите ...

Редактирование и удаление слушателя

Редактирование и удаление слушателя

Смена языка

По умолчанию язык интерфейса – русский. Язык можно сменить с помощью переключателя в правом верхнем углу экрана на любой странице приложения. Выберите нужный язык из выпадающего списка.

Смена языка интерфейса

Выбор языка из выпадающего списка в панели меню

Скрытие панелей

Чтобы скрыть панель меню для улучшения обзора, нажмите кнопку в виде двойной стрелки внизу данной панели. Чтобы раскрыть меню, еще раз нажмите на кнопку в виде стрелки.

Кнопка сворачивания панели меню

Кнопка сворачивания панели меню

Панель меню в свернутом виде

Панель меню в свернутом виде

На странице истории заданий можно раздвинуть вкладку с инспектором заданий, чтобы просмотреть особенно большой граф, с помощью кнопки в виде двойной стрелки.

Кнопка для управления размером панели дополнительной информации

Кнопка для управления размером панели дополнительной информации

Полностью развернутая панель дополнительной информации

Полностью развернутая панель дополнительной информации

Чтобы уменьшить размер панели, нажмите на кнопку повторно.

Использование Дизайнера

Дизайнер заданий - это локальное приложение для создания и запуска файлов заданий.

Создание и изменение заданий в Дизайнере происходит с помощью графического интерфейса. Главные компоненты заданий - Шаги - представлены в виде прямугольников, которые можно соединять друг с другом рёбрами и располагать в Рабочей области нужным образом. Задание свойств шагов осуществляется через Редактор шага.

Результатом изменений в Рабочей области является автоматически создаваемый xml-файл, в котором прописан алгоритм обработки данных. Текст файла отображается на вкладке Источник. Обработка алгоритма происходит в Модуле выполнения заданий.

Интерфейс Дизайнера заданий

Интерфейс Дизайнера состоит из четырёх панелей:

  • Рабочая область со списком компонентов находится в верхней правой части окна. На этой панели вы можете создавать свои графы. Список компонентов служит для выбора компонентов, перемещения их в Рабочую область, соединения их рёбрами. Эта панель имеет две вкладки - Задание и Источник.

  • Панель Обозреватель проектов находится в верхней левой части окна. В этой панели находятся папки и файлы ваших проектов. Вы можете развернуть или свернуть их и открыть любой граф, дважды щелкнув на его название.

  • Панель Структура задания находится в нижней левой части окна. Панель содержит все части графа, открытого в Рабочей области в данный момент.

  • Панель состояний находится в нижней части окна. Она содержит несколько вкладок с уточняющей информацией.

Интерфейс Дизайнера заданий

Рабочая область

Рабочая область самая важная часть Дизайнера заданий. Она состоит из двух вкладок: на вкладке Задание отображаются Шаги, соединённые рёбрами, и заметки к графу, а на вкладке Источник отображается текст xml-файла, который автоматически создаётся в соответствии с набором компонентов со вкладки Задание. Рядом с Рабочей областью находится панель Списка компонентов, в которой отображаются компоненты, которые можно расположить в Рабочей области.

Вкладка "Задание"

Состоит из Рабочей области и Списка компонентов. Отображает все компоненты графа, соединения между ними и заметки к этому графу.

Список компонентов

Список компонентов (Список) содержит Шаги для размещения в Рабочей области и инструменты для работы с ними. Список позволяет выбрать Шаг и вставить его в Рабочую область. Помимо вышеперечисленных компонентов Список содержит инструменты для размещения заметок, а также для настройки списка доступных Шагов.

Чтобы найти Шаг в Списке, используйте поиск по компонентам. Он находится в верхней части панели Списка. Начните вводить название Шага в поле поиска, и Список Шагов отфильтруется на лету.

Рабочая область со Списком компонентов открываются после запуска Дизайнера заданий.

Вы можете изменить форму Списка, сдвинув ее границу относительно Рабочей области.

Заметки (примечания) позволяют пользователю оставлять сопутствующую информацию непосредственно в Рабочей области. Примечания могут служить документацией к конкретному графу.

Примечания визуализируются на слое ниже компонентов: если вы поместите примечание поверх компонента, вы увидите, что компонент отображается поверх примечания.

Заметки могут служить контейнерами для компонентов. Если вы перемещаете заметку, вы также перемещаете все её компоненты.

Значения параметров, заданные в тексте примечаний, не используются при выполнении задания.

Размещение Шагов в Рабочей области

Чтобы вставить компонент в Рабочую область, перетащите его из Списка компонентов в Рабочую область.

После того, как вы выбрали и вставили дополнительные Шаги в Рабочую область, вам нужно соединить их рёбрами.

Шаги в Списке компонентов

По умолчанию Дизайнер отображает все возможные компоненты в Списке компонентов. Однако вы можете выбрать, что должно быть включено в Список, а что нет.

Удаление компонентов из Списка

Удаление компонентов из Списка

Удаление компонентов из Списка

Затем вам нужно только закрыть и заново открыть файл задания, и компоненты будут удалены из Списка.

Список всех Шагов, принадлежащих текущему заданию, можно просмотреть на панели Структура задания.

Использование рёбер

Чтобы соединить два Шага ребром, выберите метку ребра в Списке, щелкните выходной порт первого Шага и щелкните входной порт второго Шага. Таким образом, два Шага будут соединены.

Редактор Шага

Если дважды щелкнуть по Шагу, откроется Редактор Шага (Редактор). Он нужен для того, чтобы определить значения атрибутов для конкретного Шага. В Редакторе содержатся все возможные атрибуты каждого Шага, например, Редактор FlatFileWriter будет содержать следующие поля:

АтрибутЗначениеОписание
fileproject_new/file-in.txtПуть к файлу для чтения.
encodingwindows-1251Кодировка символов, читаемых с помощью этого шага.
fieldDelimiter,Разделитель полей.
fieldDelimitersExc0:++; 2:\;\;\;; 3:\\Нестандартный разделитель полей, с указанием места в записи, на котором его использовать.
recordDelimiter>/~~/<Разделитель записей.
trimSymbs💙Начальный и конечный символы поля.
trimStyle01Стиль отображения trimSymbs

Редактор Шага FlatFileWriter

Редактор Шага FlatFileWriter

Сохранение задания

После создания или изменения задания его следует сохранить. Сохраните задание, выбрав пункт Сохранить в контекстном меню, либо нажав кнопку Сохранить в меню Файл, либо нажав Ctrl+S.

Файл задания будет отправлен на сервер OneBridge и его можно будет открыть в Веб-платформе.

Закрытие задания

Если вы хотите закрыть любое из заданий, открытых в Рабочей области, вы можете нажать кнопку в виде крестика в правой части вкладки с заданием. Если вы хотите закрыть сразу несколько вкладок, щелкните правой кнопкой мыши любую из вкладок и выберите соответствующий пункт в контекстном меню. Там есть пункты: Закрыть, Закрыть все и другие пункты.

Авторазметка задания

Щелкнув элемент Авторазметка задания, вы можете изменить макет задания — Шаги выравняются по верхнему левому углу Рабочей области.

Выделение компонентов

Чтобы выделить компоненты в Рабочей области, нажмите и удерживайте левую кнопку мыши внутри этой области, затем начните перетаскиваете мышь по всей панели, чтобы создать прямоугольник вокруг нескольких компонентов. Когда этот прямоугольник окружит нужные компоненты - отпустите кнопку мыши, компоненты станут выделенными.

Выравнивание компонентов

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

Кнопки на панели инструментов

Кнопки на панели инструментов

Кроме того, вы можете щелкнуть правой кнопкой мыши внутри Рабочей области и выбрать элемент Выравнивание в контекстном меню.

Копирование и вставка частей задания

Скопировать любую выделенную часть любого задания можно, нажав Ctrl+C, а затем вставить в Рабочую область другого задания с помощью Ctrl+V.

Вкладка "Источник"

Вкладка Источник содержит информацию о задании в виде xml-файла. Структура файлов заданий описана в главе Структура файлов заданий OneBridge

Имя пользователя, создавшего задание, и имя последнего редактировавшего автоматически сохраняются на этой вкладке.

Обозреватель проектов

На панели Обозревателя проектов есть список ваших проектов, их подпапок и файлов.

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

Панель "Обозреватель проекта"

Панель Обозреватель проекта

Структура задания

Панель Структура задания содержит список всех элементов редактируемого в данный момент задания. С её помощью можно просматривать и редактировать значения атрибутов Шагов, указывать параметры соединения с базами данных и т.д.

Порты - список подключенных входных и выходных портов.

Шаги - список компонентов, используемых в выбранном задании.

Метаданные — список метаданных, назначаемых ребрам в выбранном графе.

Соединения - список соединений, используемых в графе.

Параметры - свойства Шагов.

Заметки - дополнительная информация к графу.

?Словарь - объект для хранения данных во время запуска графа?

Компоненты графа, метаданные рёбер, соединения с базой данных, параметры и заметки доступны для просмотра и редактирования в Структуре задания. Вы можете как задавать внутренние параметры, так и создавать внешние (общие). Внутренние параметры содержатся в файле задания.

Если выбрать любой элемент на панели Структуры задания (компонент, соединение, метаданные и т. д.) и дважды щёлкнуть, откроется его редактор.

Активируйте иконку Link with Editor в правом верхнем углу, и каждый раз, когда вы выбираете компонент в Рабочей области, OneBridge будет выбирать его и в Структуре задания. Это удобно для упорядочивания информации при работе с заданиями.

Панель "Структура задания"

Панель Структура задания

Кнопки на панели структуры

Кнопки на панели Структуры задания влияют на то, что отображается в Структуре. В верхней правой части панели есть две кнопки для переключения между древовидным представлением и мини-картой графа, а также кнопка Связать с редактором.

В виде дерева

В древовидном представлении вы можете увидеть дерево компонентов, метаданных, соединений, параметров, последовательностей, поисковых запросов и примечаний. Представление в виде дерева — это представление структуры по умолчанию.

Миникарта

Мини-карта графа — это вид структуры, в котором не отображаются элементы графа, а отображается предварительный просмотр.

Чтобы переключиться на мини-карту графа, используйте вторую кнопку слева в верхней части схемы.

Панель структуры графа с миникартой

Панель структуры графа с миникартой

Вы можете увидеть примеры графов в Рабочей обасти и ту же структуру графа на панели Структура задания. В дополнение к нему на панели Структуры графа есть светло-голубой прямоугольник. Вы можете видеть точно такую же часть графа, как и в редакторе графов, внутри светло-голубого прямоугольника на панели «Структура». Перемещая этот прямоугольник в пространстве панели Структура задания, вы можете увидеть соответствующую часть графа в редакторе графов, когда он перемещается вместе с прямоугольником. И светло-голубой прямоугольник, и граф в Редакторе диаграмм перемещаются одинаково.

Вы можете сделать то же самое с помощью полос прокрутки справа и снизу редактора графов.

Чтобы переключиться на древовидное представление панели Структура задания, вам нужно всего лишь нажать первую кнопку слева в правой верхней части панели Структура задания.

Связь с редактором

Кнопка Связать с редактором включает связь между текущим выбранным элементом из схемы и текущим выбранным элементом из Рабочей области. Если вы щелкнете компонент в Рабочей области и эта опция включена, компонент также будет выделен в схеме.

Показать идентификаторы элементов

Показать идентификаторы элементов показывает или скрывает идентификаторы элементов графа (компоненты, метаданные и т. д.) в Структуре графа. Идентификатор элемента отображается за соответствующим именем элемента.

Показать элементы графа со включенными идентификаторами

Показать элементы графа со включенными идентификаторами

Очистить неиспользуемые элементы

Очистка помогает удалить неиспользуемые элементы с графа, такие как неиспользуемые метаданные, описания соединений или словари, но не удаляет неиспользуемые параметры. Удаление неиспользуемых параметров может повлиять на другие задания в проекте.

Очистку графа можно запустить, щелкнув правой кнопкой мыши на панели Структура или в Рабочей области, используя команду Очистить неиспользуемые элементы.

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

Диалоговое окно Очистка графа содержит кнопки Выбрать все элементы, Отменить выбор всех элементов и Восстановить выбор элементов по умолчанию.

Очистка графа

Очистка графа

Блокированные элементы

В Структуре задания вы можете заблокировать любой из элементов графа. Блокировка — это флаг (с необязательным текстовым сообщением), который вы намеренно назначаете компоненту, чтобы другие разработчики были уведомлены о том, что им не следует пытаться изменить этот элемент. Эти элементы графа могут быть заблокированы:

  • метаданные;
  • соединения с базами данных.

Как заблокировать

Чтобы заблокировать любой из этих элементов, щелкните его правой кнопкой мыши в Структуре задания и нажмите Заблокировать.

Введите сообщение, которое будет отображаться, если заблокированный элемент попытаются редактировать.

Блокировка элемента — диалоговое окно «Сообщение»

Блокировка элемента — диалоговое окно «Сообщение»

Блокировка не является средством безопасности — разблокировку может выполнить любой, а блокировки не принадлежат пользователям.

Заблокированные элементы

В различных местах (например, в Редакторе преобразований) вы будете предупреждены, если обращаетесь к заблокированному элементу, например, изменение заблокированных метаданных.

Доступ к заблокированному элементу графа — вы можете добавить любой текст, чтобы описать блокировку

Доступ к заблокированному элементу графа — вы можете добавить любой текст, чтобы описать блокировку

Панель состояний

В нижней правой части окна есть ряд вкладок:

Вкладка "Консоль"

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

По умолчанию консоль открывается всякий раз, когда OneBridge записывает в stdoutили stderr. Вы увидите stdout или stderr на вкладке.

Настройки консоли

Если вы хотите изменить его, вы можете снять любой из двух флажков, которые можно найти при выборе Настройки окна. Разверните категорию Run/Debug и откройте элемент Console.

Чтобы не переключаться на консоль, снимите флажки Показывать, когда программа записывает в стандартный вывод и Показывать, когда программа записывает в стандартную ошибку.

Кнопки проверки

Два флажка, которые управляют поведением консоли:

  • Показать, когда программа записывает в стандартный вывод

  • Показать, когда программа пишет стандартную ошибку

Обратите внимание, что вы также можете управлять буфером символов, хранящихся в консоли:

Есть еще один флажок (Ограничить вывод консоли) и два текстовых поля для буфера сохраняемых символов и ширины табуляции.

Вкладка "Консоль"

Вкладка Консоль

Вкладка "Обзор данных ребра"

Раздел в разработке

Вкладка "Дерево выполнения"

На вкладке Дерево выполнения отображаются сведения о выполнении графа и его подграфов. Вы можете подключиться к серверу OneBridge и просмотреть детали работы графа. Смотрите Подключение к выполняющемуся заданию.

Дерево выполнения графа, запущенного в OneBridge Designer

Дерево выполнения графа, запущенного в OneBridge Designer

Метка выполнения

Метка выполнения — это имя графа или конкретных компонентов подграфа.

Статус задания

Статус показывает, какие задания находятся в ожидании, выполняются, успешно завершены, а какие нет. Для подробной информации о статусах смотрите Статусы выполнения

Идентификатор запуска

Идентификатор запуска — это порядковый номер, присвоенный запущенному заданию.

Проекты OneBridge

Вся структура проектов OneBridge находится на сервере OneBridge. Файлы находятся на сервере и на вашем локальном компьютере.

Когда вы сохраняете файл локально, Дизайнер OneBridge синхронизирует его содержимое с сервером OneBridge. Когда файл создается в Модуле управления, содержимое файла загружается автоматически, и вы видите его в Дизайнере.

Структура проектов

Каждый из ваших проектов OneBridge имеет стандартную структуру проекта (если вы не изменили ее при создании проекта).

  • Файл .classpath определяет пути к файлам .class и .jar, которые могут быть загружены и использованы графами преобразования.
  • Файл Workspace.prm содержит основную информацию о проекте.

Структура папок проекта внутри панели Обозревателя проектов

Структура папок проекта внутри панели Обозревателя проектов

Создание проектов

Чтобы создать проект нажмите Новый проект в правом верхнем углу вкладки Обозреватель проектов.

Задайте имя проекта и сохраните.

Создание проекта через Обозреватель проектов

Создание проекта через Обозреватель проектов

Создание графа

Граф OneBridge — это наименьшая исполняемая единица рабочего процесса. Графы OneBridge создаются в проектах OneBridge. Далее описано, как вы можете создавать свои графы.

Например, вы можете создать граф для Project_01, выбрав Новый файл графа. Вы также можете щелкнуть правой кнопкой мыши нужный проект в панели Проводника проектов и выбрать Новый граф в контекстном меню.

Задайте имя графа и выберите место для его размещения. Сохраните граф в выбранной папке. Расширение .grf будет добавлено к выбранному имени автоматически. Затем в панели Проводника проектов появится файл new-graph.grf и откроется вкладка с названием графа.

Рабочая область с новым графом и Списком компонентов

Рабочая область с новым графом и Списком компонентов

Выполнение

Когда вы уже создали графы в своих проектах, вы можете запускать их различными способами:

  • выбрать путь в главном меню;
  • щёлкнуть правой кнопкой мыши в Рабочей области и выбрать Запустить граф;
  • нажать на зеленый кружок с белым треугольником на панели инструментов, расположенной в верхней части панели;
  • использовать сочетание клавиш Ctrl+R;

Успешное выполнение графа

После запуска графа процесс его выполнения можно увидеть в консоли и других вкладках на Панели состояний.

Вкладка "Консоль" с обзором выполнения задания

Вкладка Консоль с обзором выполнения задания

Под рёбрами должны появиться числа, обозначающие количество обработанных данных:

Подсчет проанализированных данных

Подсчет проанализированных данных

Подключение к выполняющемуся заданию

Можно подключиться к текущему или завершенному заданию. Действие Подключиться к заданию откроет граф с информацией о выполнении во вкладке Консоль, а также покажет иерархию заданий на Панели выполнения.

Диалоговое окно Подключиться к заданию доступно на главной панели инструментов и на Панели выполнения под значком подключения к запущенному заданию. Для этого требуется, чтобы Run ID1 был заполнен.

1

Run ID - идентификатор запуска задания. Его можно получить из Панели управления OneBridge (в случае работы сервера).

Подключение к заданию

Подключение к заданию

Статусы выполнения графа

Исполняемый граф может находиться в одном из следующих состояний:

СтатусСимволОписание
В процессе/In Progress

Статус "В процессе/In Progress"

Процесс выполняется.
Выполнено/Success

Статус "Выполнено/Success"

Работа завершилась без сбоев.
Не выполнено/Failure

Статус "Не выполнено/Failure"

Произошел сбой во время обработки данных.
Неизвестно/Unknown

Статус "Неизвестно/Unknown"

Когда сервер обнаруживает несоответствие статуса графа. Например, когда сервер запускается и в базе есть работающие процессы, что невозможно, так как сервер еще не запущен.

Отслеживание графа

OneBridge предоставляет различную отслеживающую информацию о работающих графах. Наиболее важная информация используется для заполнения вкладки Обзор данных ребра на Панели состояний.

Тот же источник данных используется для отображения информации на элементах графа. Количество переданных записей отображается на рёбрах текущего графа. Левый конец ребра показывает количество записей данных, отправленных на ребро, а правый конец ребра показывает количество записей, считанных с ребра.

Пример отображения информации на ребах графа

Пример отображения информации на ребах графа

Взаимодействие с Сервером

Когда Дизайнер OneBridge и модули управления и выполнения полностью настроены, вы можете получить доступ к данным сервера непосредственно из Дизайнера без необходимости копировать их туда и обратно вручную.

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

Диалоговые окна

Диалоговые окна служат для навигации по файловой системе и выбора входных или выходных файлов для шагов.

Во многих шагах нужно указать URL-адрес файла. Эти файлы могут служить источниками данных, быть целевыми хранилищами, в которые данные следует записывать, или файлами, которые необходимо использовать для преобразования данных, проходящих через шаг. Чтобы указать URL-адрес файла в локальной системе, вы можете использовать диалоговое окно.

Диалоговые окна могут быть нескольких видов:

Локальные файлы

Диалоговое окно может служить для поиска файлов в локальной файловой системе.

Диалоговое окно URL-адреса

Диалоговое окно URL-адреса

Порты

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

Порты

Порты

Словарь

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

Словарь

Словарь

Задания

Задание – это последовательность шагов по обработке данных, записанная в формате XML в файл с расширением .grf.jbf в будущем).

Шагом является минимальный алгоритм обработки данных.

Созданием файлов заданий занимается пользователь системы – разработчик заданий.

Задания бывают разных видов:

  • граф – наименьшая исполняемая единица рабочего процесса. Графы состоят из шагов, которые обрабатывают данные по определенным алгоритмам;
  • подграф -это особый тип графа, который можно использовать как компонент другого графа. Подграф относится к компонентам типа "управление заданиями".
  • поток заданий – позволяет объединить несколько графов в сложный процесс, обеспечивая координацию, выполнение заданий в зависимости от условий и обработку ошибок.

Граф

Граф – разновидность задания, наименьшая исполняемая единица рабочего процесса. Графы состоят из шагов, имеющих порты для ввода и вывода данных. Порты шагов в графе соединены линиями - ребрами графа, которые отражают передачу данных между портами шагов.

Шаги

Шаг – это компонент задания с определёнными значениями атрибутов, выполняющий конкретную функцию в рамках задания. Этот минимальный алгоритм обработки данных может исполнять функцию чтения, копирования, очистки, объединения данных и т.д.

Каждый Шаг должен обязательно иметь идентификатор id для указания в разных частях здания и тип Шага type для определения того, что должен сделать этот Шаг и какие параметры ему нужно подать на вход.

Строка с объявлением Шага для чтения данных из файла будет выглядеть следующим образом:

<Node id="reader" guiX="50" guiY="100" guiName="FlatFileReader" fileURL="${READ_DIR}" type="FlatFileReader"/>

Помимо обязательных идентификатора id и типа type, для этого Шага задан путь к файлу fileURL (обязательный атрибут для Шагов чтения и записи) и указаны координаты верхней левой точки guiX и guiY, а также имя Шага guiName для отображения в Инспекторе задач и рабочей области Дизайнера.

Отображение Шага FlatFileReader в рабочей области Дизайнера

Отображение Шага FlatFileReader в рабочей области Дизайнера

Типы Шагов

Все компоненты делятся на несколько групп:

  • Для чтения - Шаги для чтения обычно являются начальными компонентами графов. Они итают данные из входных файлов,подключенных входных портов либо генерируют данные по заданному шаблону.
  • Для записи - Шаги для записи обычно ставятся в конце графа. Они могут записать даннные в файлы или базу данных, передать на выходной порт либо прервать передачу даных.
  • Некоторые Шаги используются для трансформации данных. Еще они называются преобразователями, так как могут изменять данные в соответствии с заложенным в них алгоритмом. Преобразователи получают данные и могут копировать их на все выходные порты, удалять дубликаты, фильтровать, сортироватьт, отправлять обработанные данные на один или нескольо выходных портов.
  • Объединители получают данные из двух или более источников, объединяют их в соответствии с указанным ключом и отправляют объединенные данные через выходные порты.
  • Шаги для управления ходом заданий.
  • Шаги, которые не входят в вышеописанные группы объединены в группу Другие.

Порты

Порт Шага - это точка входа или выхода данных из Шага. У каждого Шага есть хотя бы один порт - входной или выходной. Портов одного вида также может быть несколько. К примеру, у Copy может быть несколько выходных портов.

Метаданные

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

Чтобы создать новые метаданные с рекомендуемой структурой, щелкните правой кнопкой мыши по ребру, подключённому к порту, для которого определён шаблон, выберите «Новые метаданные из шаблона» в контекстном меню, а затем выберите шаблон в подменю.

Общие свойства шагов

Некоторые свойства являются общими для большинства шагов:

Среди свойств, которые можно установить в этом диалоговом окне Редактирование компонента, более подробно описаны следующие:

Именование шагов

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

Вы можете переименовать любой шаг одним из четырех способов:

  • В диалоговом окне Редактировать шаг, указав атрибут Имя шага.

  • На вкладке Свойства, указав атрибут Имя шага.

  • Выделив и щелкнув метку шага.
    Если вы выделите какой-либо шаг (щелкнув сам шаг или щелкнув его элемент на панели Структура), появится подсказка с названием шага. После щелчка под шагом появится прямоугольник с именем шага на синем фоне. Вы можете изменить имя, отображаемое в этом прямоугольнике, и нажать Enter.

Простое переименование компонентов

Простое переименование компонентов
  • Вы можете щелкнуть шаг правой кнопкой мыши и выбрать Переименовать в контекстном меню. После этого под шагом появится тот же прямоугольник, что упоминался выше. Вы можете переименовать шаг описанным выше способом.

Фазы

Каждый граф можно разделить на несколько фаз, задав номера фаз на щагах. Вы можете увидеть этот номер фазы в верхнем левом углу каждого шага.

Смысл фазы заключается в том, что каждый граф выполняется параллельно в пределах одной фазы; т. е. каждый шаг и каждое ребро, имеющие одинаковый номер фазы, работают одновременно. Если процесс останавливается на какой-то фазе, более высокие фазы не начинаются. Только после того, как все процессы в рамках одной фазы успешно завершатся, начнется следующая фаза.

Вот почему фазы должны оставаться неизменными во время работы графа. Номер следующей фазы графа всегда больше, чем номер предыдущей.

Таким образом, когда вы увеличиваете номер фазы на любом из шагов графа, принадлежащей одной фазе, все шаги с тем же номером фазы (но не шаги с более высокими номерами фаз), лежащие дальше по графу, автоматически меняют свою фазу на это новое значение.

Вы можете выбрать несколько шагов и установить их номера фаз. Либо вы устанавливаете одинаковый номер фазы для всех выбранных шагов, либо можете выбрать шаг, на который номер фазы каждого отдельного шага должен увеличиваться или уменьшаться.

Для этого используйте следующий мастер настройки фазы:

Установка фаз для шагов

Установка фаз для шагов

Заметка: При назначении фаз внутри графа, можно указывать номер фазы с приращением больше, чем на 1 (например, 5, 10, 15…​). Таким образом, позже вы сможете добавлять новые фазы между уже существующими фазами без необходимости корректировки номерации всех фаз.

Включение/отключение шага

Раздел в разработке

Рёбра

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

При создании ребра в графе, его концы всегда связывают исходящий порт одного шага с входящим портом другого шага. Количество портов одних шагов строго задано, а другие имеют неограниченное количество портов. Если количество портов не ограничено, новый порт создается путем подключения нового ребра.

При описании ребра используется тег <Edge> и указываются обязательные атрибуты ребра, такие как имя ребра, начальный и конечный порты соединяемых шагов, при необходимости – имя метаданных:

<Edge id="edge1" fromNode="sort:0" toNode="writer:0" metadata="ObjectWithPos"/>

Соединение шагов FileSortNode и FlatFileReader с помощью ребра

Соединение шагов FileSortNode и FlatFileReader с помощью ребра

Метаданные

Метаданные — это данные, описывающие структуру данных. Каждое ребро графа несет некоторые данные. Эти данные должны быть описаны с использованием метаданных. Метаданные описывают как запись в целом, так и все ее поля.

Записи могут быть разных типов, каждое поле может иметь разный тип данных.

Метаданные могут быть как внутренними, так и внешними (общими). Метаданные указываются в файле задания или в файле параметров. Метаданные также могут быть созданы динамически на основе SQL-запроса или считываться из удаленных источников.

Подробную информацию о распространении метаданных смотрите в разделе "Автоматически распространяемые метаданные".

Редактор метаданных описан в разделе "Редактор метаданных".

Подробную информацию об изменении или определении разделителей в записях с разделителями или смешанных типах читайте в разделе "Определение и изменение разделителей".

Метаданные также можно редактировать в исходном коде. Смотрите раздел "Редактирование метаданных в исходном коде".

Метаданные могут служить источником для создания таблицы базы данных. Смотрите раздел "Создание таблицы базы данных из метаданных".

Поля и записи

Запись можно рассматривать как строку файла данных или как строку таблицы базы данных. Запись состоит из полей. Каждое поле может иметь разный тип данных.

В записи каждые два соседних поля отделяются друг от друга разделителем полей, и вся запись также завершается разделителем записи. По умолчанию в системе OneBridge разделителем полей является запятая, а разделителем записей – символ переноса строки, то есть стандартная запись в файл будет произведена в таком виде:

<поле>,<поле>
<поле>,<поле>

Типы данных в метаданных

Каждое поле метаданных может иметь разный тип. В системе определены следующие типы данных:

ТипОписаниеПример
BoolЛогическое значениеtrue
StringСтрока хранит набор символов в кодировке UTF-8«это пример значения поля с типом string»
IntЦелые числа42
FloatДробные числа (числа с плавающей точкой)345.65
DateДата01.01.2025
TimeВремя17:43:12
DateTimeДата и время01.01.2025 17:43:12

Редактирование метаданных в исходном коде

Вы также можете редактировать метаданные в исходном коде.

Внутренние метаданные

Определение внутренних метаданных можно отображать и редактировать на вкладке «Источник» в панели Рабочая область.

Внешние метаданные

Если вы хотите редактировать внешние метаданные, щелкните правой кнопкой мыши по названию файла метаданных на панели Обзор проектов и выберите «Открыть с помощью текстового редактора» в контекстном меню. Содержимое файла откроется на панели редактора графов.

Создание таблицы базы данных из метаданных и подключение к базе данных

Вы также можете создать таблицу базы данных на основе метаданных (как внутренних, так и внешних). Когда вы выбираете элемент «Создать таблицу базы данных» в каждом из двух контекстных меню (вызываемых из панели структуры и/или редактора графов), открывается мастер с SQL-запросом, который может создать таблицу базы данных.

Создание таблицы базы данных из метаданных и подключения к базе данных

Создание таблицы базы данных из метаданных и подключения к базе данных

Поля и записи

Запись можно рассматривать как строку файла данных или как строку таблицы базы данных. Запись состоит из полей. Каждое поле может иметь разный тип данных. Подробнее описано в главе Типы данных в метаданных.

Каждая запись относится к одному из следующих трех типов:

  • C разделителями. В записи с разделителями каждые два соседних поля отделяются друг от друга разделителем, и вся запись также заканчивается разделителем записи.

  • Фиксированной длины. В записи фиксированной длины каждое поле имеет определенную длину (размер). Длина измеряется в количестве символов.

  • Смешанный. В смешанной записи каждое поле может быть отделено друг от друга разделителем, а также иметь определенную длину (размер). Размер рассчитывается в количестве символов. Этот тип записи представляет собой смесь обоих типов, описанных выше. Каждое отдельное поле может иметь разные свойства. Некоторые поля могут иметь только разделитель, другие могут иметь указанный размер, остальные могут иметь как разделитель, так и размер.

Типы метаданных

Внутренние метаданные

Внутренние метаданные являются частью графа, они содержатся в графе и их можно увидеть на вкладке "Источник".

Внутренние метаданные являются частью графа, они содержатся в файле задания и их можно увидеть на вкладке Источник.

Создание внутренних метаданных

Внутренние метаданные могут быть созданы следующими способами:

  • Структура

На панели «Структура» вы можете выбрать элемент «Метаданные» и открыть контекстное меню, щелкнув правой кнопкой мыши и выбрав «Новые метаданные».

  • Редактор графов — Ребро

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

  • Редактор графов — Компонент

Чтобы создать метаданные с помощью компонента, сначала заполните необходимые свойства. После этого щелкните правой кнопкой мыши компонент и выберите «Извлечь метаданные».

Смотрите Создание метаданных.

Создание внутренних метаданных: Структура и ребро

В обоих случаях после выбора «Новые метаданные» появляется новое подменю. Там вы можете выбрать способ определения метаданных.

Теперь у вас есть три возможности для любого случая, упомянутого выше: Если вы хотите определить метаданные самостоятельно, выберите элемент «Определено пользователем»; если вы хотите извлечь метаданные из файла, выберите пункт Извлечь из плоского файла или Извлечь из файла xls(x), если вы хотите извлечь метаданные из базы данных, выберите пункт Извлечь из базы данных. Таким образом, вы можете создавать только внутренние метаданные.

Если вы определяете метаданные с помощью контекстного меню, метаданные назначаются ребру сразу после его создания.

Создание внутренних метаданных: компонент

Многие программы чтения и записи позволяют извлекать метаданные, используя свойства компонентов. В зависимости от типа компонента метаданные извлекаются из файла, таблицы базы данных или других источников.

Поддерживаемые компоненты: FlatFileReader, DatabaseReader, FlatFileWriter, DatabaseWriter,

Контекстное меню "Извлечь метаданные" доступно только в том случае, если на компоненте заданы необходимые свойства файла, соединения или базы данных.

Экстернализация внутренних метаданных

Экстернализация внутренних метаданных — это преобразование внутренних метаданных во связанные внешние метаданные.

После того как вы создали внутренние метаданные как часть графа, вы можете преобразовать их во внешние (общие) метаданные. В таком случае вы сможете использовать одни и те же метаданные в других графах (другие графы будут использовать их совместно).

Чтобы экспортировать любой элемент внутренних метаданных во внешний (общий) файл, щелкните правой кнопкой мыши элемент внутренних метаданных на панели «Структура» и выберите «Энтернализировать метаданные» в контекстном меню. После этого откроется новый мастер, в котором метапапка вашего проекта будет предложена в качестве места для этого нового внешнего (общего) файла метаданных; теперь вы можете нажать ОК. Вы также можете переименовать предлагаемое имя файла метаданных.

После этого элемент внутренних метаданных исчезает из группы «Метаданные» панели «Структура», но в том же месте, уже связанном, появляется вновь созданный внешний (общий) файл метаданных. Тот же файл метаданных появляется в подпапке мета проекта, и его можно увидеть на панели Project Explorer.

Вы даже можете одновременно экспортировать несколько внутренних элементов метаданных. Для этого выберите их на панели Структура и, щелкнув правой кнопкой мыши, выберите Внедрить метаданные в контекстном меню. После этого откроется новый мастер, в котором метапапка вашего проекта будет предложена в качестве места для первого из выбранных элементов внутренних метаданных, а затем вы сможете нажать «ОК». Один и тот же мастер будет открываться для каждого из выбранных элементов метаданных, пока все они не будут экспортированы. При желании (файл с таким именем может уже существовать) вы можете изменить предлагаемое имя файла метаданных.

Вы можете выбрать соседние элементы метаданных, нажав клавишу Shift и переместив курсор вниз или клавишу курсора вверх. Если вы хотите выбрать несмежные элементы, вместо этого используйте Ctrl + щелчок по каждому из нужных элементов метаданных.

Экспорт внутренних метаданных

Экспорт метаданных создает новые внешние метаданные как копию внутренних метаданных.

Этот случай чем-то похож на случай экстернализации метаданных. Теперь вы создаете файл метаданных, находящийся за пределами графа, так же, как и внешний файл, но такой файл не связан с исходным графом. Создается только файл метаданных. Впоследствии вы можете использовать такой файл для большего количества графов в качестве внешнего (общего) файла метаданных, как упоминалось в предыдущих разделах.

Чтобы экспортировать внутренние метаданные во внешние (общие), щелкните правой кнопкой мыши некоторые элементы внутренних метаданных на панели «Структура», нажмите «Экспортировать метаданные» в контекстном меню, выберите и разверните проект, в который вы хотите добавить метаданные, выберите папку метаданных, при необходимости переименуйте файл метаданных и нажмите «Готово».

После этого папка метаданных панели «Структура» остается прежней, но в папке метаданных на панели «Проводник проекта» появляется вновь созданный файл метаданных.

Внешние метаданные

Внешние (общие) метаданные располагаются в отдельном файле и могут использоваться несколькими графами.

Создание внешних (общих) метаданных

Если вы хотите создать общие метаданные, выберите «Файл» «Новое другое» в главном меню.

Затем разверните элемент «Метаданные OneBridge» и решите, хотите ли вы определить метаданные самостоятельно (определяется пользователем) или извлечь их из одного из доступных источников.

Связывание внешних (общих) метаданных

После его создания (см. предыдущие разделы) внешние (общие) метаданные должны быть связаны с каждым графом, в котором они будут использоваться. Вам нужно щелкнуть правой кнопкой мыши группу «Метаданные» или любой из ее элементов и выбрать «Новое общее определение ссылки на метаданные» в контекстном меню. После этого откроется мастер выбора файлов, отображающий содержимое проекта. Вам необходимо развернуть папку метаданных в этом мастере и выбрать нужный файл метаданных из файлов, содержащихся в этом мастере.

Вы даже можете одновременно связать несколько внешних (общих) файлов метаданных. Для этого щелкните правой кнопкой мыши группу «Метаданные» или любой из ее элементов и выберите «Новое определение ссылки на метаданные» в контекстном меню. После этого откроется мастер выбора файлов, отображающий содержимое проекта. Вам необходимо развернуть папку метаданных в этом мастере и выбрать нужные файлы метаданных из файлов, содержащихся в этом мастере. Вы можете выбрать соседние элементы файла, нажав Shift и перемещая курсор вниз или клавишу курсора вверх. Если вы хотите выбрать несмежные элементы, вместо этого используйте Ctrl + щелчок по каждому из нужных элементов файла.

Связывание внешних (общих) метаданных из библиотеки

Вы можете связать внешние метаданные из библиотеки, щелкнув правой кнопкой мыши группу «Метаданные» или любой из ее элементов и выбрав «Новые метаданные» Связать общее определение из библиотеки. После этого откроется мастер выбора файлов, и вы сможете перечислить все установленные библиотеки на сервере OneBridge. Показаны только общедоступные метаданные.

Интернализация внешних (общих) метаданных

После того как вы создали и связали внешние (общие) метаданные, если вы хотите поместить их в граф, вам необходимо преобразовать их во внутренние метаданные. В таком случае вы увидите его структуру на самом графе.

Вы можете интернализировать любой связанный внешний (общий) файл метаданных, щелкнув правой кнопкой мыши элемент связанных внешних (общих) метаданных на панели «Структура» и выбрав «Интернализировать метаданные» в контекстном меню.

Вы даже можете одновременно интернализировать несколько связанных внешних (общих) файлов метаданных. Для этого выберите нужные внешние (общие) элементы метаданных на панели «Структура». Вы можете выбрать соседние элементы, нажав клавишу Shift и перемещая курсор вниз или клавишу курсора вверх. Если вы хотите выбрать несмежные элементы, вместо этого используйте Ctrl + щелчок по каждому из нужных элементов.

После этого выбранные связанные внешние (общие) элементы метаданных исчезнут из группы «Метаданные» панели «Структура», но в том же месте появятся вновь созданные внутренние элементы метаданных.

Исходные внешние (общие) файлы метаданных по-прежнему существуют в подпапке мета, и их можно увидеть на панели Проводник проектов.

Метаданные SQL-запроса

Раздел в разработке

Чтение метаданных из специальных источников

Раздел в разработке

Автоматическая передача метаданных

Во многих случаях OneBridge может автоматически обнаруживать метаданные на рёбрах благодаря автоматическому распространению метаданных. Автоматическое распространение метаданных — это процесс распространения метаданных по графу на основе набора правил. Метаданные для распространения берутся из таких источников как рёбра, с назначенными вручную метаданными и из шагов, которые могут вводить метаданные в граф.

Вам не нужно вручную назначать метаданные каждому ребру на графе, так как метаданные распространяются по умолчанию. Вы можете переопределить метаданные на рёбрах, вручную выбрав распространенные метаданные или метаданные, определенные пользователем.

Принципы передачи метаданных

Распространение метаданных зависит от макета графа, приоритетов распространения метаданных конкретного шага и назначенных вручную метаданных. Метаданные распространяются через прямо или косвенно связанные шаги и рёбра. Чтобы распространить метаданные на ребро в отдельной части графа, требуется действие от пользователя.

Шаги могут иметь разные приоритеты распространения метаданных с обеих сторон или могут распространяться только в одну сторону (например, Map).

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

Источники автоматически распространяемых метаданных

Шаг

Некоторые шаги имеют шаблоны метаданных, назначенные их портам. Метаданные из шаблонов распространяются от шага к подключенному ребру.

Например, метаданные для записей об ошибках автоматически распространяются на второй порт вывода SpreadsheetDataReader. Другим примером шага, которому назначены метаданные для порта, является ListFiles. Подграф также может распространять метаданные от самого себя.

Ребро

Некоторые шаги (например, Copy) передают метаданные от входных портов к выходным. Таким образом, метаданные могут автоматически распространяться на ребре как поступающие с другого ребра, даже на несколько шагов вперёд.

Метаданные могут распространяться слева направо или справа налево. Некоторые шаги могут распространять метаданные между портами на одной стороне шага, используя порт на другой стороне. Шаги, не меняющие структуру метаданных (например, FilterNode, Copy и т. д.), обычно распространяют метаданные с обеих сторон.

Подробные сведения о распространении метаданных для конкретных шагов можно найти на странице с описанием каждого шага.

Явно распространяемые метаданные

Ребро может иметь явно назначенные метаданные другого ребра графа. Оба ребра не обязательно должны быть соединены через какие-либо другие компоненты и ребра. Пользователь должен определить границу, с которой распространяются метаданные.

Назначение явно распространяемых метаданных

Щелкните правой кнопкой мыши ребро, которому нужно назначить метаданные, и выберите "Выбрать метаданные". "Выбрать метаданные из ребра".

Приоритезация метаданных

Автоматически распространяемые метаданные имеют более низкий приоритет, чем явно определенные метаданные. Вы можете заменить метаданные, назначенные ребру, другими метаданными. Автоматически распространяемые метаданные можно переопределить так же, как при назначении новых метаданных краю: либо путем перетаскивания из контура, либо щелчком правой кнопкой мыши по ребру и выбором "Выбрать метаданные" или "Новые метаданные".

Метаданные будут распространяться до тех пор, пока не достигнут компонента, в котором могут быть изменены (например, Map, Joiners и т. д.).

Создание метаданных

Извлечение метаданных из плоского файла

Если вы хотите создать метаданные, извлекая их из плоского файла, щелкните правой кнопкой мыши "Метаданные" в Структуре задания и выберите «Извлечь новые метаданные из плоского файла». После этого откроется редактор плоских файлов.

В редакторе введите имя файла или найдите его с помощью кнопки «Обзор…». После того, как вы выбрали файл, вы также можете указать параметры «Кодировка» и «Тип записи». Кодировка по умолчанию — UTF-8, а тип записи по умолчанию — с разделителями.

Если поля записей отделены друг от друга какими-либо разделителями, вы можете согласиться с параметром типа записи с разделителями по умолчанию. Если поля имеют определенные размеры, вам необходимо выбрать тип записи «с фиксированной длиной».

После выбора файла его содержимое отобразится на панели «Содержимое файла»:

Извлечение метаданных из плоского файла с разделителями

Извлечение метаданных из плоского файла с разделителями

Извлечение метаданных из плоского файла фиксированной длины

Извлечение метаданных из плоского файла фиксированной длины

Предварительный просмотр извлеченных метаданных

После нажатия кнопки «Далее» вы сможете увидеть более подробную информацию о содержимом входного файла и разделителях в диалоговом окне «Редактор метаданных». Он состоит из четырех панелей. Первые два находятся в верхней части окна, третий — в середине, четвертый — внизу. Каждую панель можно развернуть на все окно, щелкнув соответствующий символ в правом верхнем углу.

Первые две панели вверху — это панели, описанные в Редакторе метаданных. Левую и правую панели можно назвать панелями «Запись» и «Сведения» соответственно. На панели «Запись» отображаются либо разделители (для метаданных с разделителями), либо размеры (для метаданных фиксированной длины) полей, либо и то, и другое (только для смешанных метаданных).

После щелчка по любому из полей на панели «Запись» на панели «Сведения» отобразится подробная информация о выбранном поле или всей записи.

Некоторые свойства имеют значения по умолчанию, а другие — нет.

На этой панели вы можете увидеть основные свойства (Имя поля, Тип поля, Разделитель после поля, Размер поля, Обнуляемое значение, Значение поля по умолчанию, Пропустить исходные строки, Описание) и Дополнительные свойства (Формат , Локаль, Автозаполнение, Shift, EOF в качестве разделителя). Дополнительные сведения о том, как изменить структуру метаданных, см. в разделе Редактор метаданных.

Вы можете изменить некоторые настройки метаданных на третьей панели. Вы можете указать, содержит ли первая строка файла имена полей записи. В этом случае вам необходимо установить флажок Извлекать имена. При желании вы также можете щелкнуть заголовок какого-либо столбца и решить, хотите ли вы изменить имя поля («Переименовать») или тип данных поля («Повторить тип»). Если в файле нет имен полей, OneBridge Designer присваивает им имена Field# в качестве имен полей по умолчанию. По умолчанию тип всех полей записи установлен на строку. Вы можете изменить этот тип данных на любой другой тип, выбрав нужный вариант из представленного списка. Эти параметры следующие: логическое значение, байт, кбайт, дата, десятичное число, целое число, длинное, число, строка. Более подробное описание см. в разделе Типы данных в метаданных.

Эта третья панель отличается для файлов с разделителями и файлов фиксированной длины. Видеть:

  • Извлечение метаданных из файлов с разделителями
  • Извлечение метаданных из файлов фиксированной длины

В нижней части редактора на четвертой панели отображается содержимое файла.

Если вы создаете внутренние метаданные, нажмите кнопку «Готово». Если вы создаете внешние (общие) метаданные, нажмите предложенную кнопку «Далее», затем выберите папку (мета) и имя метаданных и нажмите «Готово». Расширение .fmt будет добавлено в файл метаданных автоматически.

Извлечение метаданных из файлов с разделителями

Если вы развернете панель посередине на все окно редактора, вы увидите следующее:

Настройка метаданных с разделителями

Настройка метаданных с разделителями

Вам потребуется указать, какой разделитель используется в файле. Разделителем может быть запятая, двоеточие, точка с запятой, пробел, табулятор или последовательность символов.

Наконец, нажмите кнопку «Повторно обработать», после чего вы увидите файл в том виде, в каком он был проанализирован, на панели ниже.

Опция "Нормализовать имена" позволяет избавиться от недопустимых символов в полях. Они будут заменены символом подчеркивания (_). Это доступно только при установленном флажке «Извлечь имена».

Также можно использовать поле со списком «Символ кавычки», чтобы выбрать, какой тип кавычек следует удалить из строковых полей. Не забудьте нажать «Повторно обработать» после того, как вы выбрали один из вариантов: «или» или «Оба» и «. Кавычки должны образовывать пару, и выбор одного типа символов кавычек приводит к игнорированию другого (например, если вы выберете ", они будут удалены из каждого поля, а все символы ' будут считаться обычными символами строки). Если вам нужно сохранить фактический символ кавычки в поле, его необходимо экранировать, например "" - он будет извлечен как одиночный ". Разделители (выбранные в разделе «Разделитель»), заключенные в кавычки, игнорируются. Кроме того, вы можете ввести свой собственный разделитель в поле со списком в виде одного символа, например, только | (без кавычек).

Примеры:

"человек" — будет извлечено как человек (в кавычках установлено значение «или оба» и ').

"адрес"1 — не будет извлечен и в поле появится ошибка; причина в том, что разделитель ожидается сразу после кавычек («адрес»; подойдет, если в качестве разделителя будет ;).

первое"слово" — будет извлечено как первое первое"слово" — если в начале поля нет кавычек, все поле рассматривается как обычная строка.

«'doubleQuotes'» (для символов кавычек установлено значение «или оба» и ') — будет извлечено как «doubleQuotes», поскольку всегда удаляются только внешние кавычки, а остальная часть поля остается нетронутой.

'безпарный — не будет извлечен, так как кавычки должны стоять в паре; будет выведена ошибка

'разделитель;' (с символом кавычки, установленным на 'или оба' и ', а разделитель установлен на ;) - будет извлечен как разделитель; поскольку разделитель внутри кавычек игнорируется.

Извлечение метаданных из файлов фиксированной длины

Если вы развернёте панель посередине на все окно Редактора метадаты, то увидите следующее:

Настройка метаданных фиксированной длины

Настройка метаданных фиксированной длины

Необходимо указать размеры каждого поля. Вы также можете разделить любой столбец, объединить столбцы, добавить один или несколько столбцов, удалить столбцы. Изменить размеры можно, перемещая границы столбцов.

Редактор метаданных

Редактор метаданных — это визуальный инструмент для редактирования метаданных. Его можно использовать для создания новых метаданных или для просмотра, изменения существующих метаданных.

Открытие Редактора метаданных

Редактор метаданных можно открыть из Рабочей области, из панели Структура задания или из Обозревателя проектов.

Открытие Редактора метаданных из Рабочей области

Если вы хотите изменить какие-либо метаданные, назначенные ребру (как внутренние, так и внешние), вы можете сделать это в Рабочей области одним из следующих способов:

  • Дважды щелкните по ребру.
  • Выделите ребро и нажмите Enter.
  • Щелкните правой кнопкой мыши по ребру и выберите «Изменить» в контекстном меню.

Открытие Редактора метаданных из панели Структура задания

Если вы хотите отредактировать какие-либо метаданные (как внутренние, так и внешние), вы можете сделать это, развернув категорию Метаданные на панели Структура задания:

  • Дважды щелкните элемент метаданных.
  • Выберите элемент метаданных и нажмите Enter.
  • Щелкните правой кнопкой мыши элемент метаданных и выберите «Изменить» в контекстном меню.

Открытие Редактора метаданных из Обозревателя проектов

Если вы хотите отредактировать какие-либо внешние (общие) метаданные из любого проекта, вы можете сделать это, развернув подпапку meta на панели Обозревателя проектов:

  • Дважды щелкните файл метаданных.
  • Выберите файл метаданных и нажмите Enter.
  • Щелкните правой кнопкой мыши файл метаданных и выберите Открыть с помощью Редактор метаданных OneBridge из контекстного меню.

Устройство редактора метаданных

Редактор состоит из:

  • Панели "Запись", показывающей обзор информации о записи в целом, а также список ее полей с разделителями, размерами или и тем, и другим. Панель Запись находится слева.
  • Панели "Сведения", показывающей сведения об элементе, выбранном на панели записи. Панель Сведения находится справа.
  • Кнопок отмены, повтора, копирования, вырезания и вставки действий.
  • Флажка «Показать пробелы», позволяющий пользователю легко различать отдельные символы пробелов.

Значения по умолчанию для некоторых свойств напечатаны серым текстом.

Ниже вы можете увидеть пример метаданных с разделителями и метаданных фиксированной длины. Смешанные метаданные представляют собой комбинацию обоих случаев. Для некоторых имен полей будет определен разделитель и не будет указан размер; тогда как для других будет определен размер и не будет указан разделитель, или будут определены оба. Смешанные метаданные создаются вручную.

Редактор метаданных для файла с разделителями

Редактор метаданных для файла с разделителями

Функция «Сохранить как новое» доступна только для внутренних метаданных.

Запись

Панель Запись отображает данные о записи и всех ее полях.

Обзор записи

В первой строке представлен обзор всей записи.

Он состоит из следующих столбцов:

  • Имя записи отображается во втором столбце и может быть изменено.
  • Тип записи отображается в третьем столбце и может быть определён как с разделителями, фиксированный или смешанный.
  • Разделитель по умолчанию определяет символ или символы, отделяющие каждое поле от следующего (кроме последнего). Он доступен в типах записей с разделителями и в смешанных записях.
  • Размер — это размер всей записи. Он доступен для типа записи с фиксированной длиной.

Список полей записей

Остальные строки, кроме последней, представляют список полей записи:

  • В первом столбце отображается номер поля. Поля нумеруются начиная с 1.
  • Во втором столбце отображается имя поля. Там это можно изменить. Мы предлагаем использовать в именах полей только следующие символы: [a-zA-Z0-9_].
  • В третьем столбце отображается тип данных поля. Можно выбрать один из типов данных для метаданных. Дополнительные сведения смотрите в разделе Типы данных в метаданных.
  • В других столбцах отображается разделитель, следующий за полем, отображаемым в строке, размер поля или разделитель и размер. Если разделитель отображается серым, это разделитель по умолчанию, если он черный, это разделитель не по умолчанию.
  • Последняя строка, представляющая последнее поле, немного отличается:
  • Первые три столбца такие же, как и в других строках полей.
  • В других столбцах отображается разделитель записи, который следует за последним полем (если он отображается серым цветом) или разделитель, отличный от стандартного, который следует за последним полем и предшествует разделителю записи (если он отображается черным), размер поля или и то, и другое. разделитель и размер.

Подробную информацию о разделителях смотрите в разделе Определение и изменение разделителей.

Кнопки для изменения записи

Несколько кнопок, необходимых для изменения структуры записи, расположены в левой части панели «Запись».

  • Добавить поле
  • Удалить поле
  • Перейти наверх
  • Вверх
  • Двигаться вниз
  • Перейти вниз
  • Не печатать значение поля в журнале со статусом токена — удаляет элемент из списка в поле «Ключ». Этот вариант является эксклюзивным по отношению к предыдущему. Кнопка доступна только в рабочем процессе.

Фильтр

Фильтр в нижней части панели Запись позволяет пользователю фильтровать отображаемые поля записи. Выражение фильтра нечувствительно к регистру.

Каждый столбец панели Запись можно отсортировать по возрастанию или убыванию, щёлкнув по заголовку.

Сведения

Содержимое панели Сведения изменяется в соответствии со строкой, выбранной на панели Запись.

Если вы выберете первую строку, отобразятся сведения обо всей записи.

Сведения о записи

Когда на панели «Сведения» представлена ​​информация о записи в целом, отображаются ее свойства. Детали записи разделены на базовые, расширенные и пользовательские.

Если вы выберете другую строку, отобразятся сведения о выбранном поле.

Таблица с деталями записи

Сведения о поле.

Когда на панели «Сведения» представлена ​​информация о поле, отображаются его свойства. Детали полей бывают базовыми и расширенными.

Таблица с деталями поля

Значения по умолчанию для некоторых свойств напечатаны серым текстом.

Разделители

Разделители определяют правила, по которым будут прочитаны данные из файла шагом FlatFileReader и по которым будет произведена запись в файл в результате работы шага FlatFileWriter.

В системе существует два типа разделителей:

  • разделители полей fieldDelimiter и fieldDelimitersExc;
  • разделители записей recordDelimiter.

Разделители назначаются при определении метаданных в теге <Record> и могут быть переопределены в атрибутах шагов.

По умолчанию, разделителем записей является символ перевода строки «\n», а разделителем полей – запятая «,».

Для чтения файла такого вида: qwe|rty|uio;asd|fgh|jkl;zxc|vbn|mko в качестве разделителя полей следует задать вертикальную линию, а в качестве разделителя записей – точку с запятой: <Record fieldDelimiter="|" recordDelimiter=";">.

Если назначить метаданные для записи, установив разделитель полей <Record fieldDelimiter="_">, а разделитель записей не задать, то выходной файл будет выглядеть таким образом:

qwe_rty_uio
asd_fgh_jkl
zxc_vbn_mko

RecordDelimiter при этом будет по умолчанию равен символу переноса строки.

Во FlatFileReader и FlatFileWriter можно переопределять fieldDelimiter и recordDelimiter в атрибутах шага. Тогда, даже если в метаданных в элементе <Record> указаны одни разделители – в шагах для чтения или записи могут быть указаны другие разделители, переопределённые значения будут приоритетными при выполнении алгоритма.

В FlatFileReader можно указывать атрибуты trimSymbs и trimStyle для задания крайних символов полей и стилей их чтения. Эти атрибуты можно использовать, чтобы отсечь ненужные символы на концах полей при чтении файла.

Например, нужно прочитать запись "&пример записи&", где в начале и в конце есть символ "&". Создадим отдельный FlatFileReader на каждое возможное значение trimStyle. В атрибутах каждого созданного шага FlatFileReader зададим trimSymbs="&", а trimStyle пропишем как в таблице ниже.

значение trimStyleописаниезначение trimSymbsкак будет прочитана запись
00 (No)не удалять символы&"&пример записи&"
01 (End)удалить символ только в конце поля&"&пример записи"
10 (Start)удалить символ только в начале поля&"пример записи&"
11 (All)удалить символы и в начале поля и в конце&"пример записи"

Крайние символы поля (trimSymbs) – это символ, который может стоять в начале или конце поля. Например, во фразе "~|ох, рано~|;~|встаёт охрана~|" в начале и в конце стоят "~|", если в атрибутах FlatFileWriter указать trimSymb="\~|" , тогда строка при разных стилях отображения будет выглядеть так:

trimStyle="No": "~|ох, рано~|;~|встаёт охрана~|"

trimStyle="End": "~|ох, рано;~|встаёт охрана"

trimStyle="Start": "ох, рано~|;встаёт охрана~|"

trimStyle="All": "ох, рано;встаёт охрана"

По умолчанию trimSymbs=" " равен пробелу или символу табуляции, а trimStyle="All", поэтому при чтении строки с пробелами в начале или конце, они будут удалены, если trimSymbs не переопределён.

Составные разделители

Если в записи несколько разных разделителей (например: John;Whatson,London\16|Baker Street) вы можете указать все дополнительные разделители следующим образом:

Введите все дополнительные разделители в виде списка пар «номер-значение», с указанием места, на котором стоит каждый разделитель. Нумерация ведется с нуля.

В приведенном выше примере будет fieldDelimitersExc="0:;; 2:\; 3:|;", а в качестве разделителя по умолчанию - запятая.

То же самое можно использовать для любого другого разделителя, а также для разделителя записей и/или разделителя не по умолчанию. Например, разделитель записи может быть следующим: \n\|\r\n

Разделитель может являться частью значения поля плоских файлов, если поставить знаки квотирования в начале и конце поля. Например, если есть запись с запятой в качестве разделителя полей, можно обрабатывать следующие поля как одно поле: "John,Smith".

Символ квотирования «"» используется для заключения содержимого полей, содержащего специальные/служебные символы (запятая, перевод строки или двойная кавычка).

Непечатаемые разделители

Если нужно использовать любой непечатаемый разделитель, вы можете записать его как выражение. Например, вы можете ввести следующую последовательность символов в качестве разделителя записей в метаданных: RecordDelimeter=\u0014.

Такие выражения состоят из кода Unicode \uxxxx без кавычек. Обратите внимание, что каждый символ обратной косой черты «\», содержащийся во входных данных, на самом деле будет дублироваться при просмотре. Таким образом, вы увидите «\» в своих метаданных.

Соединения с базами данных

Соединение с базой данных позволяет получить доступ к источникам данных в виде различных баз данных. При подключении к базе данных вы можете считывать данные из таблиц базы данных, выполнять SQL-запросы или вставлять записи в таблицы базы данных. Эти действия выполняются шагами, использующими соединение с базой данных. Существует два способа доступа к базе данных:

  • использование клиента на компьютере, который подключается к базе данных, расположенной на каком-либо сервере, с помощью какой-либо клиентской утилиты. Этот подход используется в массовых загрузчиках;
  • использование драйвера JDBC. Для каждого подключения к базе данных требуется драйвер JDBC. Драйверы JDBC для часто используемых баз данных включены в OneBridge.

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

<Connection id="CONN\_A" dbURL="${PG\_CONN}://${DB\_USR}:${USR\_PWD}@${HOST}:${PORT}/${DB\_NAME}"/>

Значения параметров можно указать следующим образом в файле задания либо в файле параметров:

<GraphParameters>

<!--тип соединения с базой данных-->
<GraphParameter name="PG\_CONN" value="postgresql"/>

<!--имя пользователя в базе-->
<GraphParameter name="DB\_USR" value="user1"/>

<!--пароль пользователя в базе-->
<GraphParameter name="USR\_PWD" value="password"/>

<!--хост-->
<GraphParameter name="HOST" value="10.1.1.4"/>

<!--порт базы данных-->
<GraphParameter name="PORT" value="5432"/>

<!--имя базы данных-->
<GraphParameter name="DB\_NAME" value="MyDB"/>

</GraphParameters>

Возможные типы соединения с базами данных:

  • "postgres" или "postgresql" – PostgreSQL;
  • "oracle" – Oracle;
  • "mysql" – MySQL.

Подключение других баз возможно по запросу пользователя. Можно подключить базы данных с драйвером, совместимым с JDBC.

Параметры

Параметры аналогичны константам, которые можно определить один раз и использовать в различных местах конфигурации задания.

Значения параметров графа всегда конвертируются в строку. Каждое значение, номер, путь, имя файла, атрибут и т. д. можно настроить или изменить с помощью параметров.

Основными преимуществами параметров являются возможность использовать шаблон для указания параметра и изменять его значение только в одном месте. Для подстановки значения параметра используйте шаблон "${PARAMETER_NAME}. Значение параметра при этом указать в атрибуте value элемента <GraphParameter>.


<Graph>
    <Global>
... 
        <GraphParameter name="SQL_QUERY" value="SELECT * FROM customers"/>
...
    </Global>
    <Phase number="0">
...
        <Node id="db_reader" guiX="50" guiY="100" guiName="DbReader" dbConnection="CONN_A" type="DbReader">
            <Attr name="sqlQuery">
                <![CDATA[${SQL_QUERY}]]>
            </Attr>
        </Node>
    </Phase>
<Graph>

Создание параметров

Внутренние и внешние

Параметры могут быть

  • внутренними – указываются непосредственно в файле задания;
  • внешними – указываются в отдельном файле и подключаются с помощью элемента <GraphParameterFile>.

Внутренние параметры хранятся в графе и, таким образом, присутствуют в источнике. Внутренние параметры полезны для параметризации в рамках одного графа.

Внешние (общие) параметры хранятся вне графика в отдельном файле с расширением *.prm в папке проекта. Внешние параметры подходят для параметров, используемых несколькими графами.

Чтобы подключить в файл задания внешние параметры, укажите путь к файлу в элементе <GraphParameterFile> следующим образом:

<GraphParameterFile fileURL="params/db_reader.prm"/>

А в файле db_reader.prm пропишите необходимые параметры в элементе <GraphParameters>:


<?xml version="1.0" encoding="UTF-8"?>
    <GraphParameters>
        <GraphParameter name="SQL_QUERY" value="SELECT * FROM customers"/>
    </GraphParameters>
...

Защищенные параметры

Защищенные (безопасные) параметры позволяют хранить конфиденциальную информацию (например, пароль базы данных) в зашифрованном виде. Обычные параметры графа сохраняются либо в файлах .grf (внутренние параметры), либо в файлах .prm (внешние параметры). Это означает, что значения параметров вашего графа хранятся в обычных xml-файлах. Такое поведение абсолютно корректно для большинства вариантов использования параметров графа. Но иногда параметр графа может представлять конфиденциальную информацию, которую не следует сохранять в текстовом файле в файловой системе, например, пароль к базе данных. Для этой цели OneBridge предоставляет функцию безопасных параметров.

Для использования безопасных параметров нужно в элементе задать атрибут scopeNonce - последовательность, которая усложняет подбор пароля или других кодируемых данных. Используя алгоритм шифрования, нужно зашифровать конфеденциальные данные с помощью scopeNonce, чтобы получить шифр для заполнения атрибута value. В элементе присвоить атрибуту secure значение «true» и задать шифрованное значение атрибута value. Пример объявления зашифрованных параметров и их подстановки в строку для соединения с базой данных:


<GraphParameters scopeNonce="cUXO8xbK78a3">
    <GraphParameter name="[DB] USER" secure="true" value="QNTqyPPeyaEoxhJppURKNLFf"/>
    <GraphParameter name="[DB]: PWD" secure="true" value="SKD+C6Kfd+5pl8OR+4unI1lJ"/>
    <GraphParameter name="[DB]addr" secure="true" value="SN+xn4T1yfX7lL5XwRhecFLz6"/>
    <GraphParameter name="[DB] db name" secure="true" value="CukaVyASrVMi+RU580e4hZ"/>
</GraphParameters>
...
<GraphParameters>
    <GraphParameter name="[DB]full" value="${[DB] USER}:${[DB]: PWD}@${[DB]addr}/${[DB] db name}"/>
</GraphParameters>

Конфиденциальная информация в параметрах безопасности сохраняется в зашифрованном виде в файловой системе. Расшифровка защищенного параметра выполняется автоматически во время выполнения задания.

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

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

Определение преобразования задается вручную в файле задания с помощью внутреннего языка системы PsdeudoRust. Он схож с языком программирования Rust, но поддерживает только нужные методы, не требует установки, прост в освоении и позволяет самостоятельно написать алгоритм преобразования.

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

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

Таблица со списком шагов, допускающих преобразования, находится в разработке

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

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

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

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

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

Словарь

Словарь — это объект хранения данных, связанный с каждым запуском графа в OneBridge. Его цель — обеспечить простое и надежное хранение различных параметров, необходимых графу.

Словарь также может использоваться как способ обмена данными между различными компонентами одного графа.

Между двумя запусками любого графа словарь сбрасывается до настроек по умолчанию, так что все изменения удаляются. По этой причине словарь нельзя использовать для передачи значений между разными запусками одного и того же графа.

Создание словаря

Чтобы создать словарь, щелкните правой кнопкой мыши элемент «Словарь» на панели «Структура» и выберите «Редактировать» в контекстном меню. Откроется редактор словаря.

Нажмите кнопку «Плюс» слева, чтобы создать новую словарь. После этого укажите его Имя. Также необходимо указать другие свойства записи:

  1. Имя

Указывает имя словаря. Имена чувствительны к регистру и должны быть уникальными в пределах словаря.

Правила составления словарей в разработке

  1. В качестве входных данных
  2. В качестве выходных данных
  3. Тип
  4. Тип содержимого
  5. Начальное значение

Типы словарей

Раздел в разарботке

Свойства записи словаря

Каждая запись может иметь некоторые свойства (пары имя-значение). Чтобы добавить свойство, нажмите кнопку «Плюс» справа и введите имя и значение нового свойства.

Использование словарей в графах

Доступ к словарю может осуществляться разными способами с помощью различных компонентов графа. Доступ к нему можно получить из:

  • шагов для чтения и записи. Оба они поддерживают словари в качестве источника данных или цели данных через атрибут URL-адреса файла.

  • с помощью внутреннего языка описания преобразований из любом компоненте, определяющем преобразование (все соединители, Map, Normalizer и т. д.).

Доступ к словарю со стороны шагов для чтения и записи

Чтобы ссылаться на параметр словаря в атрибуте fileURL компонента графа, этот атрибут должен иметь следующую форму:

dict:<имя параметра>[:processingType]

В зависимости от типа параметра в словаре и processingType значение может использоваться либо как имя входного или выходного файла, либо непосредственно в качестве источника данных или целевого объекта данных (т. е. данные будут считываться из или записываться в параметр напрямую).

Типы обработки следующие:

  1. Для чтения

    • Дискретный. Считывает данные из словаря. Это тип обработки по умолчанию. Его не обязательно указывать.
    • Источник. Считывает данные из словаря так же, как и дискретный тип обработки, но ожидает, что значения словаря являются URL-адресами входных файлов. Данные с этого входа передаются в шаг для чтения.

Информацию об URL-адресах в шагах для чтения смотрите в разделе Чтение из словаря.

  1. Для записи

    • Источник. Записывает данные в файл, URL-адрес которого указан в словаре. URL-адрес целевого файла извлекается из указанной записи словаря. Является типом обработки по умолчанию.
    • Поток. Записывает данные в словарь. Создает WritableByteChannel
    • Дискретный. список значений типа byte.

Информацию об URL-адресах в шагах для записи смотрите в разделе Запись в словарь.

Например, dict:mountains.csv можно использовать как входной или выходной поток для чтения или звписи соответственно (в данном случае тип свойства — writable.channel).

Заметки

Заметки позволяют пользователю хранить информации непосредственно в Рабочей панели графа. Они могут служить документацией к конкретному графу.

Заметки визуализируются на слое ниже компонентов: если вы поместите заметку поверх компонента, вы увидите, что компонент отображается поверх заметки.

Заметки могут служить контейнерами для компонентов. Если вы перемещаете заметку, вы также перемещаете компоненты внутри заметки.

Если вы вводите какой-либо параметр в заметке, этот параметр не заменяется его значением.

Подграфы

Подграф — это определяемый пользователем компонент для многократного использования. Подграф представляет собой обычный граф и может содержать любые элементы графа (компоненты, связи, параметры). Подграфы могут быть вложенными, т.е. в подграфе могут быть использованы другие подграфы.

Определение подграфа хранится в отдельном файле с расширением .sgrf.

Потоки заданий

Поток заданий (рабочий процесс) позволяет объединять графы с другими действиями в сложные процессы, обеспечивая координацию, условное выполнение заданий и обработку ошибок. Действия, которые могут участвовать в рабочем процессе, включают:

  • Графы
  • Собственные приложения и скрипты ОС
  • Вызовы веб-служб (REST/SOAP)
  • Операции с локальными и удаленными файлами

Алгоритмы обработки данных

В этом разделе описаны запрограммированные шаги, которые пользователь может использовать для составления своего файла задания для обработки данных.

Каждый шаг представляет собой готовый алгоритм обработки данных, например, FileSort – это шаг для сортировки данных.

Данные поступают в шаг через входной порт, обрабатываются согласно алгоритму и выводятся через выходной порт. Входных и выходных портов у шага может быть разное количество. Например, у Сoncat может быть несколько входов, а у Trash не бывает выходных портов.

Шагов в задании может быть сколько угодно, но обязательно должен присутствовать шаг для чтения данных в начале алгоритма и для записи данных - в конце алгоритма. Между ними могут быть добавлены шаги для преобразования, объединения данных и другие.

Шаги в задании соединяются ребрами для передачи информации. Каждому ребру необходимо назначать метаданные для описания данных, передаваемых между шагами.

Подробное описание создания файла задания описано в главе Как создать задание.

Каждое поле метаданных может иметь разный тип. Для метаданных определены следующие типы данных:

Тип данныхОписаниеПример
BoolЛогическое значениеtrue
StringСтрока хранит набор символов в кодировке UTF-8«это пример значения поля с типом string»
IntЦелые числа42
FloatДробные числа (числа с плавающей точкой)345.65
DateДата01.01.2025
TimeВремя17:43:12
DateTimeДата и время01.01.2025 17:43:12

Для чтения данных

Шаги для чтения (считыватели) могут считывать данные из входных файлов, получать их из подключенного дополнительного входного порта, читать из базы данных. Шаг DataGenerator занимается генерацией данных и тоже относится к этой группе, поскольку является начальным шагом.

Различают следующие шаги для чтения:

FlatFileReader - читает данные из плоского файла

DbReader - читает данные из базы данных

DataGenerator - генерирует данные по шаблону

SpreadSheetReader - читает данные из файла в форматах xlsx, xls

RawReader - читает данные из файла в формате OneBridgeFile

FlatFileReader

FlatFileReader считывает данные из плоских файлов в формате CSV и TXT с разделителями, фиксированной длины или смешанных текстовых файлов.

Порты FlatFileReader:

Тип портаНомерОбязательныйОписаниеМетаданные
Output0даДля корректных записейЛюбые
Output1 (в разработке)нетДля не корректных записейСтруктура метаданных ошибок приведена ниже

Атрибуты FlatFileReader:

АтрибутОбязательныйОписаниеВозможные значения
fileURLдаПуть к источнику данных (плоский файл) для чтения.${READ_DIR}/in.txt
charsetнетКодировка файла, читаемого с помощью этого шага.encoding="windows-1251"
dataPolicyнетОпределяет обработку неправильно отформатированных или неверных данных. Может принимать значения "strict", "lenient"dataPolicy="strict" по умолчанию
trimнетУказывает, следует ли удалять начальные и конечные пробелы из строк в момент прохождения данных через FlatFileReader.trim="true" по умолчанию

quotedStrings1

нетПоля, содержащие специальные символы (запятая, новая строка или двойные кавычки), должны быть заключены в кавычки. В качестве символа кавычки принимаются только одинарные/двойные кавычки. Если установлено значение true, специальные символы не рассматриваются как разделители и удаляются при чтении компонентом.
Пример: Чтобы прочитать входные данные "25"|"Джон", установите для параметра quotedStrings значение true и установите для символа кавычки значение quoteChar="&quot;". В результате будут получены два поля: 25|Джон.
quotedStrings="true" по умолчанию

quoteChar1

нетСимволы, в которые будет заключено значение поля при quotedStrings="true".quoteChar="&quot;"

fieldDelimiter

нетРазделитель полейfieldDelimiter=","

recordDelimiter

нетРазделитель записейrecordDelimiter="/n"
1

По умолчанию значение этого атрибута наследуется из метаданных порта ?вывода? 0.

Пример. Чтение файла.

Например, есть файл customers.csv. Каждая запись в нем содержит три поля: «дата», «фамилия» и «имя», разделенные символом «|». Нужно считать этот файл для дальнейшей обработки в системе.

Данные в файле:

01.02.2011|Горилов|Алексей
29.12.2013|Нечаев|Илья
25.11.2016|Васькин|Николай
23.10.2019|Иванов|Григорий
19.09.2022|Горбунов|Евгений

Решение:

В файле задания нужно описать выходные метаданные шага. Опишите поля «date», «last_name» и «first_name». Установите для них типы данных «date», «string» и «string» соответственно.


    <Metadata id="ObjectWithPos">
        <Record fieldDelimiter="|" recordDelimiter="\n">
            <Field name="date" type="date" format="dd.mm.YY"/>
            <Field name="last_name" type="string"/>
            <Field name="first_name" type="string"/>
        </Record>
    </Metadata>

С помощью атрибута format="yyyy-MM-dd HH:mm:ss.SSS" можно указать используемый формат даты.

Файл будет считан системой во внутреннюю память:

datelast_namefirst_name
01.02.2011ГончаровАлексей
29.12.2013НечаевИлья
25.11.2016ВаськинНиколай
23.10.2019СеровГригорий
19.09.2022ГлинкаЕвгений

Обрезание данных

  1. Входные строки обрабатываются в соответствии с типом данных поля следующим образом:
  • Пробелы удаляются как из начала, так и из конца поля для типов данных boolean, date, integer.
  • Входная строка остаётся полем, включающим начальные и конечные пробелы в случае типа данных string.
  1. Если для атрибута trim установлено значение true, все начальные и конечные пробельные символы удаляются. Поле, состоящее только из пробелов, преобразуется в нулевое значение (строка нулевой длины). Значение false подразумевает сохранение всех начальных и конечных символов пробелов. Входная строка может содержать пробелы только если представляет строковый тип данных.

DbReader

DbReader считывает данные из базы данных. Поддерживает подключение к СУБД PostgreSQL, Oracle, MySQL. Подробнее про подключение к базам данных можно прочитать в разделе Соединения с базами данных.

DbReader считывает данные из базы данных

Порты DbReader:

Тип портаНомерОбязательныйОписаниеМетаданные
Output0даДля корректных записейЛюбые, но одинаковые на всех подключённых портах
1-nнет

Атрибуты DbReader:

АтрибутОбязательныйОписаниеВозможные значения
dbConnectionдаИдентификатор соединения с базой данных, которое будет использоваться для доступа к базе данных

<Connection id="conn0" dbURL="postgres://admin:admin@localhost:5432/dev"/>
sqlQueryдаSQL-запрос к базе, определенный в графе.

<attr name="sqlQuery">
<![CDATA[
    select * from table;
]]>
</attr>

Пример. Чтение записей из базы данных.

С помощью DbReader прочитайте данные из базы данных OneBridge из таблицы Customers.

Решение:

Для описания параметров соединения можно указать строку подключения в элементе Connection в атрибуте dbURL.

Описание параметров соединения в элементе Connection:


<Global>
    ...
    <Connection id="CONN_A" dbURL="${CONN_TYPE}://${DB_USER}:${DB_PASSWORD}@${DB_URL}:${DB_01_PORT}/${DB_DATABASE}"/>
    <GraphParameters>
        <GraphParameter name="CONN_TYPE" value="mysql"/>
        <GraphParameter name="DB_USER" value="user007"/>
        <GraphParameter name="DB_URL" value="234.1.1.0"/>
        <GraphParameter name="DB_PORT" value="5432"/>
        <GraphParameter name="DB_DATABASE" value="OneBridge"/>
    </GraphParameters>
<!--    <GraphParameters scopeNonce="d3WVmJ8eCaIC">
        <GraphParameter name="DB_PASSWORD" secure="true" value="Ir2m0qTbu12WW7RJILIvlv499fpbggCl02"/>
    </GraphParameters>--> 
    ...
</Global>

SQL-запрос для чтения данных из базы, записывается в атрибут Attr, определенный в элементе Node:


<Node id="db_reader" guiX="250" guiY="100" guiName="DbReader" dbConnection="CONN_A" type="DATABASE_READER">
    <Attr name= “sqlQuery”>
    <![CDATA[
        SELECT date, last_name, first_name 
        FROM public."Customers";
    ]]>
    </Attr>
</Node>

Этот запрос считает значения полей date, last_name, first_name из таблицы Customers из базы данных во внутреннюю память системы.

DataGenerator

DataGenerator генерирует данные по шаблону, вместо чтения данных из файла, базы данных или любого другого источника данных. Этот шаг может отправлять разные записи на разные выходные порты, используя возвращаемые значения функции generate.

Порты DataGenerator:

Тип портаНомерОбязательныйОписаниеМетаданные
Output0даДля сгенерированных записейЛюбые
1-nнет

Метаданные на выходных портах могут отличаться.

Атрибуты DataGenerator:

АтрибутОбязательныйОписаниеВозможные значения
generateдаОпределение способа создания записей, записанное в графе на языке преобразований
<attr name="generate">
    <![CDATA[
    let counter = 4;

    function generate() {
        counter+=1;
        $out[0].foo = counter;

        return ALL;
    }
    ]]>
</attr>
recordsNumberнетКоличество записей, которые необходимо создать. Отрицательное значение позволяет создать количество записей, ограниченное кодом в generate.recordsNumber="1"

Шаблон записи

Шаблон записи — это строка, содержащая все постоянные поля сгенерированных записей в виде записей с разделителями (с разделителями, определенными в метаданных на выходном порте) или фиксированной длины (с размерами, определенными в метаданных на выходном порте).

Последовательность полей

Последовательность полей можно определить в диалоговом окне, которое открывается после нажатия атрибута Последовательности. Диалоговое окно «Последовательности» выглядит следующим образом:

Диалоговое окно «Последовательности»

Диалоговое окно «Последовательности»

Случайные поля

Этот атрибут определяет значения всех полей, которые генерируются случайным образом. Для каждого поля вы можете определить его диапазон (т.е. минимальное и максимальное значения). Эти значения относятся к соответствующим типам данных согласно метаданным. Вы можете назначить случайные поля в диалоговом окне «Редактировать ключ», которое открывается после нажатия атрибута «Случайные поля».

Диалоговое окно «Редактирование значения»

Диалоговое окно «Редактирование значения»

Слева находится панель «Поля», справа — «Случайные поля», а внизу — панель «Случайные диапазоны». На последней панели вы можете указать диапазоны выбранного случайного поля. Там вы можете ввести конкретные значения. Перемещать поля между панелями «Поля» и «Случайные поля» можно, как описано выше – нажатием кнопок «Стрелка влево» и «Стрелка вправо».

Пример. Создание записей.

Пример в разработке

SpreadSheetReader

SpreadSheetReader считывает данные с указанных листов файлов формата .xls или .xlsx. Позволяет указывать маппинг данных из таблицы и метаданных OneBridge.

Должен иметь один выходной порт для успешно считанных записей.

Порты SpreadSheetReader:

Тип портаНомерОбязательныйОписаниеМетаданные
Output0даДля успешно считанных записейЛюбые
1неДля некорректных считанных записей

Атрибуты SpreadSheetReader:

АтрибутОбязательныйОписаниеВозможные значения
fileURLдаПуть к файлу проекта, из которого читать данные.fileURL="testFile.txt"
sheetнетНазвание или номер листа в excel документе. Нумерация страниц начинается с 0. Можно перечислить в атрибуте sheet через запятую либо указать множество листов с помощью «*», чтобы все листы читались по порядку с использованием одного маппинга для всех.sheet="Sheet1"
mappingнетСопоставляет ячейки электронной таблицы с полями OneBridge.
<Node fileURL="ssr01_in.xlsx" id="SPREADSHEET_DATA_READER" sheet="Sheet1" type="SPREADSHEET_READER">
	<attr name="mapping">
		<![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
			<mapping>
                <globalAttributes>
                    <orientation>VERTICAL</orientation>
                    <step>1</step>
                    <writeHeader>false</writeHeader>
                </globalAttributes>
                <defaultSkip>1</defaultSkip>
                <headerGroups>
                    <headerGroup skip="1">
                        <autoMappingType>ORDER</autoMappingType>
                        <headerRanges>
                            <headerRange begin="A2"/>
                            <headerRange begin="B2"/>
                        </headerRanges>
                    </headerGroup>
                </headerGroups>
            </mapping>
		]]>
	</attr>
</Node>
dataPolicy (в разработке)нетОпределяет обработку неправильно отформатированных или неверных данных. Может принимать значения "strict", "lenient"dataPolicy="strict" по умолчанию
passwordнетПароль для расшифровки файла,если он запаролен. Актально только для формата xlsx.password="faihfi4t9(&Yhflaieg)"

Пример. Сопоставление полей по порядку.

Нужно прочитать из файла таблицы с количеством проданных некой компанией товаров за первый квартал года. Таблицы имеют одинаковую структуру: название товара, январь, февраль, март. Компания международная. Каждый партнер может использовать свой язык, поэтому вы не можете сопоставить поля по имени.

лист 1:

ProductJanuaryFebruaryMarch
T1620600700
T2150150100

лист 2:

ТоварЯнварьФевральМарт
T1500400600
T2300400500

Решение:

Укажите атрибуты: fileURL, sheet, mapping.

Заполните маппинг следующим образом:

<Node fileURL="${DATAIN_DIR}/Book2.xlsx" sheet="*" type="SPREADSHEET_READER">
<attr name="mapping"><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<mapping>
    <globalAttributes>
        <orientation>VERTICAL</orientation>
        <step>1</step>
        <writeHeader>true</writeHeader>
    </globalAttributes>
    <defaultSkip>1</defaultSkip>
    <headerGroups>
        <headerGroup skip="1">
            <autoMappingType>ORDER</autoMappingType>
            <headerRanges>
                <headerRange begin="A1"/>
                <headerRange begin="B1"/>
                <headerRange begin="C1"/>
                <headerRange begin="D1"/>
            </headerRanges>
        </headerGroup>
    </headerGroups>
</mapping>
]]></attr>
</Node>

RawReader

RawReader считывает данные, хранящиеся во внутренних двоичных файлах формата OneBridgeFile.

Порты RawReader:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0нетДля корректных входных записейПоля с типом данных byte/cbyte
Output0даВыходной порт для корректных данныхЛюбые
1-nнетВыходной порт для корректных данныхКак на Output 0

Атрибуты RawReader:

АтрибутОбязательныйОписаниеВозможные значения
fileURLдаАтрибут, определяющий, какой файл данных OneBridgeFile будет считываться

Пример. Чтение файла во внутреннем формате.

Чтобы прочитать файл ${DATAIN_DIR}/my-file.obf нужно заполнить атрибут fileURL.

АтрибутЗначение
fileURL${DATAIN_DIR}/my-file.obf

RawReader прочтёт все данные из этого файла.

Для записи данных

Шаги для записи данных могут записывать данные в локальные выходные файлы, отправлять их через подключенный дополнительный выходной порт или вставлять в таблицу базы данных.

Шаги для записи — это компоненты графа, которые выполняются последними, поэтому они не имеют выходных портов. Компонент Trash, который отбрасывает все полученные записи, относится к этой группе, поскольку его можно настроить на сохранение записей в файл отладки.

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

Шаги для записи могут либо добавлять данные в существующий файл или таблицу базы данных, либо заменять существующее содержимое новым. Для этой цели шаги для записи в файлы, имеют атрибут Append. По умолчанию для этого атрибута установлено значение false. Это означает, что данные необходимо заменить, а не добавить к имеющимся.

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

Чтобы увидеть результат работы конкретного шага, щёлкните по нему правой кнопкой мыши и выберите в открывшемся меню опцию «Просмотр данных отладки». Это позволяет просматривать записанные данные используя панель состояний. Панель отображает данные только после того, как граф уже запущен.

FlatFileWriter - запись в файл

DbWriter - запись в базу данных

PgDbWriter - запись в базу данных Postgres с помощью утилиты

Trash - прерывание потока данных

RawWriter - записывает данные в файл в формате OneBridgeFile

Общие свойства шагов для записи

Поддерживаемые форматы URL-адресов для записывающих шагов

Запись в локальные файлы

  • /path/filename.out - записывает указанный файл на диск.

Запись на выходной порт

  • port:$0.FieldName:discrete - если этот URL-адрес используется, выходной порт шага для записи должен быть подключен к другому компоненту. Выходные метаданные должны содержать FieldName с типом string. Каждая запись данных, полученная шагом для записи через входной порт, обрабатывается в соответствии с входными метаданными, отправляется через дополнительный выходной порт и записывается как значение указанного поля метаданных выходного ребра.

Запись в словарь

  • dict:keyName:source - записывает данные в файл с URL-адресом, указанным в словаре. URL-адрес целевого файла извлекается из указанной записи словаря.
  • dict:keyName:discrete - записывает данные в словарь. Создаёт список ArrayList<byte[]>.
  • dict:keyName:stream - Записывает данные в словарь. Создает WritableByteChannel.

Просмотр записанных данных

После создания выходного файла вы можете просмотреть данные в нём с помощью Испектора данных.

Запись на выходной порт

Некоторые устройства записи позволяют передавать данные через дополнительный выходной порт.

Установите атрибут fileURL в формате:

port:$0.FieldName[:processingType]

Здесь ProcessingType является необязательным и может быть установлен в одно из следующих значений:

  • discrete - cодержимое файла сохраняется в поле (одной записи). Данные должны быть достаточно маленькими, чтобы поместиться в это одно поле. Если данные разделены на несколько файлов, отправляется несколько выходных записей. Каждая выходная запись содержит входные данные одного раздела.
  • stream - содержимое файла записывается в поток, который разбивается на фрагменты. Фрагменты записываются в указанное пользователем поле вывода. Один фрагмент относится к одной выходной записи, поэтому ваши данные не обязательно должны помещаться в одно поле данных.

Поток завершается другой записью с нулевым значением в поле (в качестве контрольного сигнала). Если данные разделены на несколько файлов, значение null также служит разделителем между файлами.

Количество выходных записей зависит от значения параметра PortReadingWriting.DATA_LENGTH. Значение по умолчанию — 2048 Б.

Добавление или перезапись

Если целевой файл существует, есть два варианта:

  • существующий файл можно заменить;
  • записи могут быть добавлены к существующему содержимому.

Добавление или замена настраивается с помощью атрибута Append.

  • Если для параметра Append установлено значение true, записи добавляются в файл.
  • Если для параметра Append установлено значение false, файл перезаписывается. Append=false по умолчанию.

Функция Append доступна в следующих шагах для записи: FlatFileWriter, RawWriter, Trash.

Создание каталогов

Если вы указываете несуществующий каталог в URL-адресе файла, установите для атрибута Create directories значение true. Каталог будет создан. В противном случае граф выдаст ошибку.

Значение по умолчанию Create directories=false.

Атрибут Create directories доступен в следующих шагах для записи: FlatFileWriter, RawWriter, Trash.

FlatFileWriter

FlatFileWriter записывает данные в плоские файлы.

Порты FlatFileWriter:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входящего потока записейЛюбые

Атрибуты FlatFileWriter:

АтрибутОбязательныйОписаниеВозможные значения
fileURLдаПуть к файлу, в который должен быть записан результирующий набор данных${WRITE_DIR}/out.txt
charsetнетКодировка входного файлаcharset="UTF-8" по умолчанию
appendнетЕсли записи печатаются в существующий непустой файл, они по умолчанию заменяют более старые (при append="false"). Если установлено значение "true", новые записи добавляются в конец существующего содержимого выходного файла(ов).append="false" по умолчанию
quotedStrings1нетПри quotedStrings="true" все поля заключаются в кавычки.quotedStrings="true"
quoteChar1нетСимволы, в которые будет заключено значение поля при quotedStrings="true". По умолчанию значение этого атрибута наследуется из метаданных порта ввода 0.quoteChar="&quot;"
fieldDelimiterнетРазделитель полейfieldDelimiter=","
recordDelimiterнетРазделитель записейrecordDelimiter=">/~~/<"
1

По умолчанию значение этого атрибута наследуется из метаданных порта ?ввода? 0.

Пример. Запись данных в файл.

Например, нужно записать обработанные системой данные в файл, используя разделитель «|».

Данные в системе:

datelast_namefirst_name
01.02.2011ГончаровАлексей
29.12.2013НечаевИлья
25.11.2016ВаськинНиколай
23.10.2019СеровГригорий
19.09.2022ГлинкаЕвгений

Данные, записанные шагом FlatFileWriter в файл:

01.02.2011|Горилов|Алексей
29.12.2013|Нечаев|Илья
25.11.2016|Васькин|Николай
23.10.2019|Иванов|Григорий
19.09.2022|Горбунов|Евгений

DbWriter

DbWriter предназначен для выгрузки обработанной информации в базу данных и совершения изменений в базе. Позволяет выполнять несколько SQL-запросов в рамках одной транзакции, для этого выражения в атрибуте sqlQuery разделяются точкой с запятой.

Поддерживает подключение к базам MySQL, Oracle, PostgreSQL.

Подробнее про подключение к базам данных можно прочитать в разделе Соединения с базами данных.

Порты DbWriter:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даЗаписи для загрузки в базу данныхЛюбые
Output0нетДля отклонённых записейТакие же, как на выходном порте
Output1нетДля возвращённых записейТакие же, как на выходном порте

Атрибуты DbWriter:

АтрибутОбязательныйОписаниеВозможные значения
dbConnection да

Параметры соединения с базой данных. В список параметров для подключения могут входить: database, user, password, host, port.
Параметры можно указать в атрибуте конкретного шага либо в глобальных параметрах графа.

dbConnection="postgres://admin:admin@localhost:5432/dev"  
sqlQuery нет Запрос к базе
            <Attr name="sqlQuery"> <![CDATA[
                INSERT INTO public."Customers" (id, surname, name)
                VALUES (16, 'surname16', 'name16');
                ]]>
            </Attr> 


<attr name="sqlQuery">
    <![CDATA[
        insert into test_table (num,str,test_date) 
        values($num,$str,$test_date) 
        returning str;
    ]]>
</attr>
batchSize нет Количество записей для объединения. Актуально если batchMode="true". batchSize="5"
batchMode нет Определяет режим записи в таблицу. Записывать сразу по несколько записей – true, по одной – false. Пакетный режим ускоряет загрузку данных в базу данных. batchMode="true"
commit нет Определяет, после обработки скольких записей (без ошибок) выполняется коммит (возможные значения -1,0,N). commit="10"
maxErrorCount нет Максимальное количество разрешенных ошибок. При превышении этого числа ошибок граф выходит из строя. По умолчанию ошибки не допускаются. Если установлено значение -1, все ошибки разрешены. maxErrorCount="0"
actionOnError нет Действие при превышении допустимого количества ошибок maxErrorCount. Если установлено значение ROLLBACK, фиксация текущего пакета не выполняется (актуально только для Oracle). Commit для Postgres делает тоже, что и Rollback, MsSql автоматически делает Rollback. actionOnError="commit"

Пример. Загрузка записей из OneBridge в SQLite.

Нужно загрузить данные из OneBridge в базу данных SQLite в таблицу Tracking, в поля client, items, total.

Данные в системе:

customerproductamount_of_purch
JazzveCoffeeCoffea arabica19513
Arabica Legasy LLCCoffea canephora12735
BlackBean GroupExcelsa34010

Решение:

Задайте соединение с базой:


<Connection id="CONN_A" dbURL="${CONN_TYPE}://${DB_01_USR}:${DB_01_PWD}@${DB_01_HOST}:${DB_01_PORT}/${DB_01_DATABASE}"/>

Пропишите в файл задания SQL-запрос:


<Phase ...>
    ...
    <Node id="db_writer" guiX="250" guiY="100" guiName="DatabaseWriter" dbConnection="CONN_A" type="WriterDB">
        <Attr name= “sqlQuery”><![CDATA[
            INSERT INTO public."Tracking" ("client", "items", "total")
            VALUES ($customer, $product, $amount_of_purch)
        ]]></Attr>
    </Node>
    ...
</Phase>

Чтобы вставить значения полей из системы нужно указать название полей из метаданных после знака «$».

Данные будут выгружены в базу данных, соответствующую указанному типу соединения, в таблицу Tracking.

PgDbWriter

PgDbWriter массовый загрузчик, подходящий для загрузки большого количества записей в базу данных PostgreSQL. Считывает данные через входной порт. Использует специальную утилиту Copy, которая позволяет загружать данные очень быстро. Для остальных случаев лучше использовать DbWriter, для которого не требуется использование специальной утилиты.

Порты PgDbWriter:

Тип портаНомерОбязательныйОписаниеМетаданные
Input1-nдаЗаписи для загрузки в базу данныхЛюбые

Пример: необходимо загрузить записи с метаданными «Product» (string), «Amount» (int), «date» (date) и «Price» (float) в таблицу Products в базу данных postgres с именем пользователя user001.

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


<Connection id="CONN_A" dbURL="postgresql://user:password/host:port/database"/>

Данные будут внесены в базу:

PgDbWriter записывает данные в базу PostgreSQL

Атрибуты PgDbWriter

АтрибутОбязательныйОписаниеВозможные значения
dbConnectionдаИдентификатор соединения с базой данных`dbConnection="CONN_A"`
dbURLнетПараметры соединения с базой данных. В список параметров для подключения могут входить: database, user, password, host, port

<Connection id="CONN_A" dbURL="${PG_CONN}://${DB_01_USR}:${DB_01_PWD}@${DB_01_URL}:${DB_01_PORT}/${DB_01_DATABASE}"/>

dbTableнетНазвание таблицы, в которую будет производится запись.`dbTable="test_date_02"`
columnsнетПеречисление конкретных столбцов таблицы, в которые будет произведена запись (по умолчанию - во все).

columns="id, count, price"

sendFreqнетУказывает количество записей, которые должны быть записаны в базу данных за один раз.

sendFreq="40000"

sendMsgSizeнетРазмер отправляемой записи.

sendMsgSize="20kb" (килобайт) или sendMsgSize="20" (байт)

binaryнетФормат файла, в который производится запись.

binary="true" — в бинарном,
если binary="false" — в CSV.

dencodingнетКодировка, используемая при записи. При binary="true" игнорируется.

encoding="UTF8"

Trash

Trash используется для прерывания потока данных, когда не нужно передавать данные дальше. Шаг не имеет выходных портов и не имеет атрибутов.

Trash прерывает поток данных.

Trash прерывает поток данных

Порты Trash:

Тип портаНомерОбязательныйОписаниеМетаданные
Input1-nнетДля входящего потока записей.Любые

Атрибуты Trash:

АтрибутОбязательныйОписаниеВозможные значения
debugOutputнетПо умолчанию все записи удаляются. Если установлено значение true, все записи записываются в лог на вкладку «Консоль». Этот режим поддерживается при подключении любого количества входных портов.debugOutput="true"

RawWriter

RawWriter записывает обрабатываемые данные во внутренние файлы формата OneBridgeFile.

Порты RawWriter:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля полученных записей данныхЛюбые
Output0нетДля записи на выходной портс типом данных byte/cbyte

Атрибуты RawWriter:

АтрибутОбязательныйОписаниеВозможные значения
fileURLдаАтрибут, указывающий, куда будут записаны полученные данные.fileURL="${DATATMP_DIR}/bl/${trgFilePath}/loadHub/${tableName}.sql"
appendПо умолчанию новые записи перезаписывают старые. Если установлено значение true, новые записи добавляются к старым записям, хранящимся в выходном файле(ах). append="false" по умолчанию append="true"

Пример. Запись данных во внутренний формат.

Чтобы записать данные в файл ${DATAOUT_DIR}/my-file.obf нужно заполнить атрибут fileURL.

АтрибутЗначение
fileURL${DATAOUT_DIR}/my-file.obf

RawWriter запишет данные в указанный файл.

Пример. Добавление к существующему файлу.

Добавить записи каждого запуска графа в существующий файл ${DATAOUT_DIR}/my-file.obf. Для этого нужно заполнить атрибут fileURL и append.

АтрибутЗначение
fileURL${DATAOUT_DIR}/my-file.obf
appendtrue

Для преобразования данных

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

Список шагов для преобразования данных:

Sort - сортирует записи

Filter - фильтрует записи

Gather - собирает записи из разныых потоков в один

Copy - копирует записи

Concat - объединяет записи

Map - пользовательский алгоритм обработки

Dedup - устраняет копии по ключу

Normalizer - преобразует запись с несколькими полями, разбивая её на несколько записей с одним полем (нормальзует запись)

DataIntersection - объединяет отсортированные потоки данных, может применять преобразование

Sort

Sort сортирует полученные записи в соответствии с указанным ключом сортировки и копирует каждую из них на все подключенные выходные порты. Позволяет использовать несколько параллельных потоков для сортировки больших данных.

Порты Sort:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входящего потока записейОдинаковые метаданные на входных и выходных портах
Output0даДля отсортированных записей
1-nнетДля отсортированных записей

Атрибуты Sort:

АтрибутОбязательныйОписаниеВозможные значения
sortKeyдаИмена полей и порядок сортировкиsortKey="x_coord(a); y_coord(d)"
sortInMemoryнетПри sortInMemory="true" выполняется внутренняя сортировка.sortInMemory="false" (по умолчанию)

Пример. Сортировка данных.

Входные записи содержат имена файлов и их размер. Нужно отсортировать файлы по размеру, начиная с самого большого (descending – по убыванию). Метаданные содержат поля «FileName», «FileSize».

Входящие записи:

FileNameFileSize
file.txt2048
file.docx1048576
file.xml65536

Решение:

Ключ сортировки: FileSortKey="FileSize(d)"

Исходящие записи:

FileNameFileSize
file.docx1048576
file.xml65536
file.txt2048

Filter

Filter фильтрует входные данные в соответствии с логическим выражением. Отправляет все записи, соответствующие выражению фильтра, в первый выходной порт и все отклоненные записи во второй выходной порт.

Порты Filter:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входящего потока записейОдинаковые метаданные на входных и выходных портах
Output0даДля отфильтрованных записей
1нетДля отклонённых записей

Атрибуты Filter:

АтрибутОбязательныйОписаниеВозможные значения
filterExpressionдаВыражение, по которому фильтруются записи. Для записи преобразования используется JavaScript. Возвращает логическое значение.
<attr name="filterExpression">
    <![CDATA[ 
        $in[0].count != 177 && $in[0].product == «карандаш» 
    ]]>
</attr>

Пример. Фильтрация данных.

Входные данные содержат данные о продуктах, проданных в прошлом году. Нужно узнать данные только по карандашам. Метаданные содержат поля Product, Count и Location.

Входящие записи:

ProductCountLocation
карандаш1553екатеринбург
бумага6475новгород
ручка598владикавказ
карандаш177омск
карандаш239волгоград
бумага19казань
ластик53ростов

Решение:

Выражение для фильтрации: $in[0].product == «карандаш»

Исходящие записи:

ProductCountLocation
карандаш1553екатеринбург
карандаш177омск
карандаш239волгоград

Gather

Gather собирает записи со всех входящих портов и отправляет в порядке получения на все выходные порты. Порядок получения записей не зависит от порядка входных портов. Этот шаг соблюдает порядок записей в потоках, но не соблюдает порядок потоков. На выходе получается список записей в непредсказуемом порядке. Порядок записей на разных выходах будет одинаков. Шаг не имеет атрибутов.

Порты Gather:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входящего потока записейОдинаковые метаданные на входных и выходных портах
1-nнетДля входящего потока записей
Output0даДля отфильтрованных записей
1-nнетДля отклонённых записей

Пример. Сбор записей с нскольких входных портов.

Нужно собрать записи с нескольких входов. Метаданные содержат одно поле «id».

Входящие записи:

Gather input

Решение:

Описание метаданных:

    <Global>
        <Metadata id="ObjectWithPos">
                <Field name="id" type="int"/>
        </Metadata>
    </Global>

Объявление шага:


<Node id="x" guiX="250" guiY="220" guiName="Gather" type="Gather"/>

Исходящие записи:

Gather output

Copy

Copy получает записи через один входной порт и копирует каждую из них на все подключенные выходные порты. Шаг не имеет атрибутов.

Порты Copy:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входящего потока записейЛюбые
Output0даДля скопированных записейКак у Input 0
1-nнетКак у Output 0

Пример. Копирование данных.

Нужно скопировать записи с метаданными «carID» и «mark» в три потока.

Входящие записи:

порт 0:

carIDmark
145mercedes
856toyota
245chevrolet

Решение:

Для копирования в несколько потоков нужно подключить Copy несколько выходных портов. Записи на всех выходных портах будут идти в одинаковом порядке.

Исходящие записи:

порт 0:

carIDmark
145mercedes
856toyota
245chevrolet

порт 1:

carIDmark
145mercedes
856toyota
245chevrolet

порт 2:

carIDmark
145mercedes
856toyota
245chevrolet

Concat

Concat получает записи, поступившие из первого входного порта, отправляет их на общий выходной порт и добавляет к ним записи, из остальных входных портов. Если шаг имеет более двух входных портов, записи принимаются и отправляются на выход в соответствии с порядком входных портов. Если некоторые входные порты не содержат записей, такие порты пропускается. Шаг не имеет атрибутов.

Порты Concat:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входящего потока записейЛюбые
1-nнетКак у Input 0
Output0даДля объединенных записей

Пример. Объединение записей.

Нужно объединить записи. Поданные на вход метаданные имеют поля «flower», «color».

Входящие записи:

порт 0:

flowercolor
маккрасный
ромашкабелый
василекголубой

порт 1:

flowercolor
розасиреневый
лилиярозовый

порт 2:

flowercolor
подсолнухжелтый
анемонвишневый
гипсофилазеленый

Решение:

После конкатенации будут получены следующие записи.

Исходящие записи:

порт 0:

flowercolor
маккрасный
ромашкабелый
василекголубой
розасиреневый
лилиярозовый
подсолнухжелтый
анемонвишневый
гипсофилазеленый

Map

Map позволяет написать пользовательский алгоритм обработки данных, используя внутренний язык системы. Можно по своему усмотрению трансформировать данные между входным и выходными портами, если предложенных шагов не хватает для выполнения необходимых преобразований данных.

Имеет единственный входной порт и как минимум один выходной. Может отправлять разные записи в разные выходные порты или даже отправлять одну и ту же запись на несколько выходных портов. Работает только с одним элементом, сохраняет порядок записей.

С помощью Map можно:

  • удалить ненужные значения полей
  • проверить записи с помощью функций или регулярных выражений
  • создать новые или изменить существующие поля
  • преобразовать типы данных

Порты Map:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входящего потока записейЛюбые
Output0даДля преобразованных записей
1-nнет

Атрибуты Map:

АтрибутОбязательныйОписаниеВозможные значения
transform

1

Алгоритм преобразования данных
transformURL 1Имя внешнего файла, в котором описано преобразввание
charsetнетКодировка внешнего файла, определяющего преобразование

<attr name="transform">
    <![CDATA[
        function transform() {
            $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;
        }
    ]]>
</attr>
1

Один из атрибутов должен быть указан.

Пример. Обработка данных с помощью Map.

Нужно получить произведение и сумму полученных на вход данных и отправить результаты на разные выходные порты. Входные метаданные содержат поля a, b. Нужно отправить результат перемножения a*b на первый порт, а результат сложения a+b на второй порт.

Входящие записи:

ab
56
24
12

Решение:

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


<Attr name="transform"><![CDATA[
    pub fn transform() -> OutPort {
        let res_mul = $in[0].a * $in[0].b;
        let res_add = $in[0].a + $in[0].b;

        $out[0].res_mul = res_mul;
        $out[1].res_add = res_add;

        return ALL;
    }

    ]]>
</Attr>

Исходящие записи:

порт 0:

multiplied
30
6
2

порт 1:

added
11
5
3

Dedup

Dedup удаляет повторяющиеся записи по ключу.

Порты Dedup:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входных записейЛюбые
Output0даДля дедуплицированных записей.Как у Input 0
Output1нетДля дубликатов записей.Как у Input 0

Атрибуты Dedup:

АтрибутОбязательныйОписаниеВозможные значения
dedupKeyнетКлюч, по которому производится дедупликация (удаление дубликатов) записей. Если ключ не установлен, весь входной поток рассматривается как одна группа и удаляются только полные дубликаты (по всем полям записи).dedupKey="x_coord"
sortedнетПризнак, ортированы ли входные записи.1sorted="true" по умолчанию
dupAmountнетЕсли dedupKey задан, отбирается только указанное в dupAmount количество записей с одинаковыми значениями в полях, указанных в качестве ключа.dupAmount="1" по умолчанию
equalNULLнетПо умолчанию записи с нулевыми значениями ключевых полей считаются равными. Если equalNULL="false", записи считаются разными.equalNULL="true" по умолчанию
1

Dedup может обрабатывать данные в двух режимах: сортированном и несортированном.

Сортированный и несортированный ввод

Если вы хотите обработать огромное количество записей с множеством различных значений ключей, сначала отсортируйте записи, а затем используйте Dedup с отсортированными входными данными.

Если ваши данные содержат несколько разных значений ключей, вы можете использовать несортированный ввод.

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

Если вы используете несортированные входные записи, порядок выходных записей не обязательно будет таким же, как порядок входных записей.

Пример. Дедупликация сортированных записей.

Записи содержат время входов на некоторый ресурс с различных ip адресов. Записи отсортированы по времени входа. Нужно найти время первого входа для каждого ip адреса. Метаданные содержат поля «ip» и «time».

Входящие записи:

iptime
67.249.105.11811:46:12
208.25.71.8805:14:15
161.100.209.23523:12:32
161.100.209.23523:19:34
67.249.105.11815:34:09
223.78.208.18415:35:43
52.151.181.421:51:17
223.78.208.18415:38:49
161.100.209.23523:28:16

Решение:

Ключ дедупликации: dedupKey = «ip»

Исходящие записи:

iptime
67.249.105.11811:46:12
208.25.71.8805:14:15
161.100.209.23523:12:32
223.78.208.18415:35:43
52.151.181.421:51:17

Normalizer

Normalizer создает одну или несколько выходных записей из каждой отдельной входной записи. Входные записи не обязательно сортировать.

Порты Normalizer:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входных записейЛюбые
Output0даДля нормализованных записейЛюбые

Атрибуты Normalizer:

АтрибутОбязательныйОписаниеВозможные значения
normalizeдаОпределение способа нормализации записей
<attr name="normalize"><![CDATA[
    function count() {
	n++;

	return length($in[0]);
    }
    function transform(integer idx) {
	$out[0].rn = n;
	$out[0].name = getFieldLabel($in[0], idx);
	$out[0].value = getStringValue($in[0], idx);
	
	return ALL;
    }
]]></attr>
charsetнетКодировка файла, в котором описано преобразование normalizecharset="UTF-8"

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

Порядок вызова функций описан ниже.

Алгоритм нормализации записей

Алгоритм нормализации записей

Функции шага Normalizer:

integer count()

ПараметрЗначение
ОбязательныйДа
Входные параметрынет
ВозвращаетЧисло, которое определяет количество вызовов функции Transform() для каждой записи. Если функция count() возвращает 0, то последующий вызов Transform() не производится.
ВызовВызывается по одному разу для каждой входной записи.
ОписаниеОписывает количество повторений вызова функции transform()
Пример
function integer count() {
   customers = split($in.0.customers,";");
   return length(customers);
}

integer transform(integer idx)

ПараметрЗначение
ОбязательныйДа
Входные параметрыinteger idx - целые числа от 0 до count-1 (здесь count — это число, возвращаемое функцией count().
ВозвращаетЦелое число. Число соответствует ![возвращаемому значению преобразования]().
ВызовВызывается один раз для каждой выходной записи. Количество вызовов определяется возвращаемым значением функции count().
ОписаниеСоздает выходные записи.
Пример
function integer transform(integer idx) {
   myString = customers[idx];
   $out.0.OneCustomer = str2integer(myString);
   $out.0.RecordNo = $in.0.recordNo;
   $out.0.OrderWithinRecord = idx;

   return OK;
}

Пример. Преобразование записи с многозначными полями в несколько записей.

Входные записи содержат название должности и список имён сотрудников. Нужно преобразовать записи в кортежи, содержащие название должности и одно имя сотрудника.

менеджер | [Егор, Алина]
разработчик | [Артём, Никита, Данил]

Решение

Определим преобразование, используя атрибуты Normalize:

function integer count() {
    return length($in.0.users);
}

function integer transform(integer idx) {
    $out.0.group = $in.0.group;
    $out.0.user = $in.0.users[idx];
    return OK;
}

Normalizer вернёт следующие записи:

менеджер |Егор
менеджер |Алина
разработчик|Артём
разработчик|Никита
разработчик|Данил

Заметка: Если преобразование указано во внешнем файле, рекомендуется явно указать исходную кодировку в артибуте charset.

DataIntersection

DataIntersection получает отсортированные данные с двух портов, сравнивает значения ключей в обоих и обрабатывает записи следующим образом:

  • Такие входные записи, которые находятся как на входном порте 0, так и на входном порте 1, обрабатываются в соответствии с определяемым пользователем преобразованием, и результат отправляется на выходной порт 1.

  • Такие входные записи, которые находятся только на входном порте 0, отправляются без изменений на выходной порт 0.

  • Такие входные записи, которые есть только на входном порте 1, отправляются без изменений на выходной порт 2.

Записи считаются находящимися на обоих портах, если значения всех полей ключа соединения в них совпадают.

Преобразование должно быть определено, если подключён выходной порт 1.

Порты DataIntersection:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входящего потока записей (поток А)

Любые2

1даДля входящего потока записей (поток B)

Любые2

Output3

0нетДля неизмененных входных записей (содержащихся только в потоке A).как на Input 0
1нетДля измененных выходных записей (содержащихся в обоих входных потоках)Любые
2нетДля неизмененных выходных записей (содержащихся только в потоке B).как на Input 1
2

Часть полей метаданных должна совпадать с полями ключа соединения.

3

Хотя бы один выходной порт из трех должен быть подключён.

Атрибуты DataIntersection:

АтрибутОбязательныйОписаниеВозможные значения
joinKeyдаКлюч соединенияjoinKey="$client_plan_gid=$client_plan_gid"
transform

4

Функция преобразования данных, определённая в графе
transformURL

4

Функция преобразования данных, определённая во внешнем файле
charsetКодировка внешнего файла, содержащего преобразование.charset="UTF-8" по умолчанию
equalNULLПо умолчанию записи с нулевыми значениями ключевых полей считаются равными. Если установлено значение false, они считаются отличными друг от друга.equalNULL="true" по умолчанию
keyDuplicatesРазрешает дублирование ключа. По умолчанию записи с нулевыми значениями ключевых полей считаются равными. Если установлено значение false, они считаются отличными друг от друга.keyDuplicates="true" по умолчанию
4

Должен быть указан хотя бы один из этих атрибутов.

Ключ соединения

Выражается как последовательность отдельных подвыражений, отделенных друг от друга точкой с запятой. Каждое подвыражение представляет собой присвоение имени поля из первого входного порта (с префиксом в виде знака доллара $) слева и имени поля из второго входного порта (с префиксом $) с правой стороны.

Заметка: Компонент может возвращать количество записей, отличное от исходного количества входных записей.
Если для параметра keyDuplicates установлено значение false, количество выходных записей может быть меньше количества входных записей, поскольку используется только первая из записей с дубликатом ключа.
Если для параметра keyDuplicates установлено значение true, количество выходных записей может быть больше, чем количество входных записей. На выходе создается декартово произведение записей, имеющих одинаковый ключ.

Для объединения данных

Шаги этой группы называются "Соединители". Они служат для объединения записей из потоков с потенциально разными метаданными в соответствии с заданным ключом соединения и способом преобразования.

Соединители имеют как входные, так и выходные порты. Первый входной порт шага-соединителя называется "главным" или "мастером" и обозначается номером «0», остальные входные порты — "подчинённые".

Соединители всегда объединяют только записи из главного порта с записями из подчинённых портов. И не объединяют записи из ведомых портов между собой.

HashJoin - объединяет потоки данных из двух и более источников по ключу, не требует предварительной сортировки

MergeJoin - объединяет потоки данных из двух и более источников по ключу, требует предварительной сортировки

DBJoin - объединяет по ключу два потока данных, один из которых - база данных, не требует предварительной сортировки

CrossJoin - создает декартово произведение записей из подключенных входных портов, не требует предварительной сортировки

HashJoin

HashJoin объединяет потоки данных по ключу.

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

Сначала HashJoin считывает записи из всех подчинённых портов и сохраняет их в хэш-таблицы. Для каждого подчинённого порта создается отдельная хэш-таблица. Размер всех созданных хэш-таблиц не должен превышать размер оперативной памяти сервера, так как хэш-таблицы хранятся в оперативной памяти и ее переполнение приведет к завершению задания с ошибкой. Поэтому имеет смысл в главный входной поток подавать большое количество записей, а в подчинённые потоки – небольшие группы записей.

Затем для каждой записи из мастера производится поиск совпадения с записями из каждой хэш-таблицы по заданному ключу соединения.

Если совпадение найдено, кортеж из записи главного порта и хэш-таблицы подчинённого порта трансформируется заданным образом. Полученная после преобразования запись подаётся на первый выходной порт. Метод преобразования вызывается для каждого кортежа главной и соответствующих подчинённых записей. Записи из главного порта, которые не были объединены подаются на второй выходной порт.

Пример: даны два потока записей. В одном потоке содержится информация о названии продукта в поле «Product» и его цвете на русском языке «rus_color», во втором потоке – названию цвета на русском языке соответствует название на английском «eng_color». Задача сопоставить продукт и его цвет на английском языке.

порт0:

productrus_color
шарфкрасный
носокбелый
свитерзеленый

порт1:

rus_coloreng_color
синийblue
желтыйyellow
красныйred

Ключ соединения: joinKey="$rus_color"

Формула для объединения:


<Attr name="transform">
<![CDATA[//#PseudoRust:code
     pub fn transform() -> OutPort {
        output.out_0.Product = input.in_0.Product;
        output.eng_color = input.in_1.eng_color;
        return out_port![ALL]
    }
]]></Attr>

Исходящие записи:

порт0:

producteng_color
шарфred

порт0:

productrus_color
носокбелый
свитерзеленый
Как у Input 0

Порты HashJoin:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входящего потока записейЛюбые
1да
2-nнет
Output0даДля исходящего потока записей
1нетДля записей, которые не подошли по ключу соединенияКак у Input 0

Атрибуты HashJoin:

АтрибутОбязательныйОписаниеВозможные значения
joinKeyдаКлюч, по которому объединяются входящие потоки данных

joinKey="$obj_type#$obj_type=$x_type;lvl"

joinTypeнетТип объединения. Бывает "inner"(по умолчанию) и "leftOuter"joinType="leftOuter"
transformда

Преобразование, определенное в файле задания на внутреннем языке системы1


<Attr name="transform"><![CDATA[//#Rust:init
    obj_type:   input_0.obj_type,
    lvl:        input_0.lvl + 1,
    x_coord:    input_0.x_coord,
    y_coord:    input_0.y_coord,
    max_hp:     input_1.max_hp + 15,
    max_mana:   input_1.max_mana,
    exp:input_1.exp * input_1.exp,
    prob:input_2.prob,
]]>
</Attr>

1

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

MergeJoin

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

MergeJoin получает данные через два или более входных порта, каждый из которых может иметь различную структуру метаданных. Затем объединенные данные отправляются на первый выходной порт. Необъединенные данные можно вывести на второй выходной порт.

Порты MergeJoin:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даГлавный входной портлюбые
1даВедомый входной порт
2-nнетДополнительные ведомые входные порты
Output0даВыходной порт для объединенных данных
1нетВыходной порт для необъединённых данныхкак на Input 0

Метаданные на первом входе и втором выходе должны быть одинаковыми. (Поля метаданных должны иметь одинаковые типы, имена полей метаданных могут отличаться.)

Атрибуты MergeJoin:

АтрибутОбязательныйОписаниеВозможные значения
joinKeyдаКлюч, по которому объединяются входящие потоки данных. Представляет собой последовательность выражений сопоставления для всех ведомых портов. Выражения сопоставления отделяются друг от друга хешем #. Каждое из выражений сопоставления представляет собой последовательность имен полей из главной и подчинённой записей, разделенных знаком равно. Выражения внутри joinKey отделяются друг от друга точкой с запятойjoinKey="$name(a);$color(d)#$product;$tint;#$name;$tone"
joinTypeнетТип объединенияinner (по умолчанию) | leftOuter
transformдаПреобразование, определенное в файле задания на внутреннем языке системы

<Attr name="transform"><![CDATA[//#PseudoRust:code
    pub fn transform() -> OutPort {
        if !is_full_match {
            output.id = input.in_0.id_id;

        if let Some(in_1) = input.in_1 {
            output.out_0.x = in_1.field_int;
            } else {
                output.out_0.x = 42;
            }

        if let Some(in_2) = input.in_2 {
            output.out_0.y = in_2.field_string;
            } else {
                output.out_0.y = "text Text TEXT".into();
            }

            return out_port![ALL]
            } else {
                return out_port![SKIP]
            }
        }
        pub fn on_error(_: OutPort) { }
    }
]]>
</Attr>

DBJoin

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

После объединения данные отправляются на первый выходной порт. Второй выходной порт может дополнительно использоваться для вывода несовпадающих записей из основного потока.

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

Ключ соединения — это последовательность имен полей из основного источника данных, отделенных друг от друга точкой с запятой, двоеточием или вертикальной чертой. Вы можете определить ключ в мастере редактирования ключей. Порядок имен этих полей должен соответствовать порядку ключевых полей таблицы базы данных (и их типам данных). подчинённая часть ключа соединения должна быть определена в атрибуте запроса SQL.

Выходные данные создаются путем применения преобразования, которое сопоставляет объединенные входные данные с выходными.

Главное отличие от других шагов из группы Соединителей в том, что нужно прописывать в атрибутах шага подключение к базе и запрос данных.

Порты DBJoin:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даГлавный входной портлюбые
1даВедомый входной порт
2-nнетДополнительные ведомые входные порты
Output0даВыходной порт для объединенных данных
1нетВыходной порт для необъединённых данныхкак на Input 0

Атрибуты DBJoin:

АтрибутОбязательныйОписаниеВозможные значения
joinKeyдаКлюч, по которому объединяются входящие потоки данных.joinKey="schemaName;tableName"
leftOuterJoinФлаг для внутреннего объединенияleftOuterJoin="true"
dbConnectionдаИдентификатор соединения с БД, который будет использоваться в качестве ресурса подчинённых записей.dbConnection="JDBC0"
sqlQuery

да

Путь к внешнему файлу, определяющему SQL-запрос.

<attr name="sqlQuery">
    <![CDATA[
        select c.ordinal_position
        from information_schema.tables t
            join information_schema.columns c on c.table_name=t.table_name
                                              and c.table_schema=t.table_schema
        where lower(t.table_schema)=lower(?)
            and lower(t.table_name)=lower(?)
            and lower(c.column_name)=lower(?)
   ]]>
</attr>
transform

да

Функция преобразования
maxCachedМаксимальное количество записей с разными значениями ключей, которые можно сохранить в памяти.maxCached="100"
charsetКодировка файла, в котором хранится алгоритм преобразования.charset="UTF-8" (по умолчанию)

Ключ соединения для DbJoin

$first_name;$last_name

Это поля, которые служат для объединения основных записей с подчинёнными записями. SQL-запрос должен содержать выражение, которое может выглядеть следующим образом:

... where fname=? and lname=?

Значение first_name будет подставлено на место первого знака вопроса в этом условии, а last_name - на место второго. Сначала будет произведён поиск совпадений по joinkey в кеш-памяти, если подходящих записей не обнаружится, то данные будут запрошены из базы данных, иначе - найденная запись сразу отправится для преобразования в функцию transform.

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

Преобразование (transform) в DBJoin позволяет определить способ сопоставления данных, с помощью которого записи буду отправлены на первый выходной порт. Несоединенные записи из основного потока, отправляемые на второй выходной порт, не могут быть изменены в рамках преобразования DBJoin.

Заметка: Если преобразование указано во внешнем файле, рекомендуется явно указать кодировку файла в артибуте Transform source charset.

CrossJoin

CrossJoin создает декартово произведение записей из подключенных входных портов.

Каждая строка из первого порта соединяется с каждой строкой из последующих портов, в результате получаются все возможные сочетания значений со всех портов. Возможно преобразование данных с помощью атрибута transform.

CrossJoin автоматически передаёт метаданные на выходной порт в соответствии с метаданными на его входных портах.

Заметка: если вы обрабатываете очень большое количество записей, на вашем жёстком диске могут быть созданы временные файлы с обрабатываемыми записями. Это предотвращает чрезмерное использование оперативной памяти.

Порты CrossJoin:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даГлавный входной портлюбые
1-nнетВедомый входной порт(ы)
Output0даДля выходных записей

Атрибуты CrossJoin:

АтрибутОбязательныйОписаниеВозможные значения
transform

нет2

Функция преобразования данных, определённая в графе

<Attr name="transform">
    <![CDATA[//#PseudoRust:code
        pub fn transform() -> OutPort {
            output.out_0.Product = input.in_0.Product;
            output.eng_color = input.in_1.eng_color;

            return out_port![ALL]
        }
    ]]>
</Attr>
url

нет2

Функция преобразования данных, определённая во внешнем файле
charsetКодировка внешнего файла, содержащего преобразование.по умолчанию UTF-8
2

В случае необходимости описать преобразование, можно указать только один из этих атрибутов.

Пример.

Создать таблицу со всеми возможными сочетаниями игроков в бильярд из двух команд:

Игроки первой команды:

Вася
Маша
Никита

Игроки второй команды:

Алёна
Петя
Лиза

Решение: Вам нужно только подключить источники данных к портам компонента CrossJoin. Настройка атрибутов компонента не требуется.

В результате получится такой набор пар игроков в бильярд:

Вася | Алёна
Вася | Петя
Вася | Лиза
Маша | Алёна
Маша | Петя
Маша | Лиза
Никита | Алёна
Никита | Петя
Никита | Лиза

Заметка: Ребро, по которому передаётся наибольшее количество записей, должно быть подключено к первому входному порте.

Для управления заданиями

Управление заданиями — это группа компонентов, выполняющая различные типы задач — выполнение графов, мониторинг выполнения, прерывание графов и потоков заданий.

Все компоненты этой группы шагов имеют схожий подход к управлению выполнением заданий. Каждый из них имеет один входной порт. Каждая входящая запись из этого порта обрабатывается шагом и запускает соответствующее задание. Параметры выполнения по умолчанию задаются непосредственно через различные атрибуты шага. Эти настройки по умолчанию могут быть переопределены значениями из входящего потока — атрибут inputMapping переопределяет значения атрибутов. Описание входящего маппинга в разделе Сопоставление входных данных.

Результаты успешных запусков отправляются на первый выходной порт, а результаты неудачных запусков отправляются на второй выходной порт. Это описано в разделах Сопоставление выходных данных и Сопоставление ошибок.

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

Атрибут redirectErrorOutput можно использовать для маршрутизации всех успешных и неуспешных результатов выполнения задания на первый выходной порт.

ExecuteGraph

Шаг ExecuteGraph запускает граф с определенными настройками, ожидает завершения графа и предоставляет результаты и детали выполнения на выходные порты.

С помощью этого шага запускаются подграфы - файлы с расширением .sgrf.

Подробности хода выполнения

Компонент считывает входную запись, выполняет граф на основе значений входящих данных, ждет завершения графа и отправляет результаты на соответствующий порт. Результаты успешного запуска графа отправляются на первый выходной порт. Результаты неудачного запуска отправляются на второй выходной порт (порт ошибки).

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

Подключенные и отключенные порты

В случае, если входной порт не подключен, выполняется только один граф с настройками по умолчанию, указанными в атрибутах компонента.

В случае, если первый выходной порт не подключен, компонент просто выводит результаты выполнения графа в журнал.

Если второй выходной порт (порт ошибки) не подключен, первый граф с ошибкой приведет к прерыванию родительского задания. Если вы используете атрибут redirectErrorOutput, отключенный порт ошибки не приводит к прерыванию родительского задания.

Конфигурация компонента

Для выполнения графа необходимо указать местоположение графа. При желании вы можете настроить тип выполнения, начальные значения параметров графа и содержимое словаря, таймаут и ряд других атрибутов.

Большинство настроек выполнения можно указать в шаге с помощью атрибутов компонента, описанных ниже.

Настройки выполнения графа можно изменять для каждого запуска графа на основе данных из входящего потока в атрибуте Input mapping.

Порты ExecuteGraph:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0нетВходные записи с настройками выполнения графа.Любые
Output0нетИнформация об успешном выполнении графов.
1нетИнформация о неудачном выполнении графов.

Атрибуты ExecuteGraph:

АтрибутОбязательныйОписаниеВозможные значения
jobURLдаПуть к исполняемому графу. В этом атрибуте можно указать только один граф. Значение может быть переопределено значением из входного потока, см. атрибут «inputMapping». Граф, на который ссылается этот атрибут, также используется для всех диалоговых окон маппинга — они отображают словари и информацию отслеживания на основе знаачения этого атрибута.jobURL="${GRAPH_DIR}/fldr/fldr/work.grf"
executionTypeнетУказывает тип выполнения — синхронная (последовательная) или асинхронная (параллельная) модель выполнения. Может быть переопределено значением из входного потока записей, см. атрибут `inputMapping`. executionType="synchronous" по умолчаниюexecutionType="asynchronous"
timeoutнетМаксимальное количество времени, отведенное на прогон графа; по умолчанию в миллисекундах. Атрибут timeout игнорируется для асинхронного типа выполнения. timeout="0" - без ограничения времениtimeout="1000"
inputMappingнетМаппинг входных данных определяет, как данные из входящего потока переопределяют параметры выполнения по умолчанию.Преобразование
outputMappingнетМаппинг выходных данных сопоставляет результаты успешного выполнения графа с метаданными первого выходного порта.Преобразование
errorMappingнетСопоставление ошибок отображает результаты неудачных запусков графов на второй выходной порт.Преобразование
redirectErrorOutputнетПо умолчанию результаты неудачных запусковграфов отправляются на второй выходной порт (порт ошибки). Если для этого атрибута установлено значение true, результаты неудачных запусков отправятся на первый выходной порт так же, как и информация об успешных запусках. redirectErrorOutput="false" по умолчанию redirectErrorOutput="true"
executorsNumberнетОпределяет, сколько графов может быть выполнено одновременно. Все они отслеживаются, и как только один из работающих графов завершает обработку, запускается другой. Эта опция применяется только к графам, выполняемым в синхронном режиме.executorsNumber="4"

Компонент ExecuteGraph запускает граф с определенными настройками, ожидает завершения выполнения графа и отслеживает результаты выполнения.

Типы выполнения графа

Этот шаг поддерживает синхронное (последовательное) и асинхронное (параллельное) выполнение графов.

  • В режиме синхронного выполнения (по умолчанию) — компонент блокируется до завершения обработки графа, поэтому графы отслеживаются этим компонентом до конца выполнения.

  • В асинхронном режиме выполнения — шаг запускает граф и сразу отправляет информацию о состоянии на выходной порт.

Если поток заданий, выполняющий граф, завершается раньше, чем исполняемый граф, граф уничтожается.

Сопоставление входных данных

Атрибут Input mapping позволяет переопределить настройки шага на основе данных из входящего потока.

Маппинг входных данных — это обычное преобразование, которое выполняется перед каждым выполнением графа. Выходные данные преобразования состоят из трёх записей: RunConfig, JobParameters и Dictionary.

  • Запись RunConfig представляет параметры выполнения. Если поле записи не заполняется этим сопоставлением, вместо него используется значение по умолчанию из соответствующего атрибута шага.

  • Запись JobParameters представляет все внутренние и внешние параметры запускаемого графа.

  • Запись Dictionary представляет входные записи словаря запускаемого графа.

Заметка: записи JobParameters и Dictionary доступны в диалоговом окне Редактора преобразования только в том случае, если атрибут компонента jobURL ссылается на существующий граф, который используется в качестве шаблона для извлечения параметров графа и структуры словаря. Только параметры графа и записи словаря из этого графа могут быть заполнены путем маппинга входных данных.

Сопоставление выходных данных

Сопоставление вывода — это преобразование, которое используется для заполнения потока, передаваемого в первый выходной порт. Маппинг выполняется для успешно выполненных графов. Для этого сопоставления доступно до четырех записей входных данных.

Если маппинг вывода пустой, поля записи RunStatus сопоставляются с выходными записями по имени поля.

  • Входная запись, содержащая настройки выполнения графа. Эта запись недоступна для шага без входного порта. В этой записи в столбце type отображается порт 0. Это очень полезно для передачи некоторых полей из входного потока в выходной.

  • Запись RunStatus предоставляет информацию о выполнении графа.

таблица с атрибутами выходной записи (в разработке)

  • Запись словаря предоставляет содержимое выходных словарных записей графа. Эта запись доступна для сопоставления только в том случае, если атрибут graphURL графа ссылается на экземпляр графа, который имеет запись выходного словаря.

  • Запись отслеживания предоставляет информацию отслеживания. Эта запись доступна для сопоставления, только если атрибут graphURL графа ссылается на экземпляр графа.

    • Поля отслеживания, доступные для всего графа:

    таблица с атрибутами выходной записи (в разработке)

    • Поля отслеживания, доступные для фазы графа:

    таблица с атрибутами выходной записи (в разработке)

    • Поля отслеживания, доступные для порта ввода или вывода:

    таблица с атрибутами выходной записи (в разработке)

Сопоставление ошибок

Сопоставление ошибок — это обычное преобразование. Поля такие же, как и в маппинге вывода.

Сопоставление ошибок используется в том случае, если граф завершился неудачно и вместо первого заполняется второй выходной порт.

Если сопоставление ошибок не определено, поля записи RunStatus сопоставляются с выводом по имени поля.

Пример. Запуск графа.

Чтобы запустить граф заполните атрибут jobURL названием нужного графа additional-task.grf.

АтрибутЗначение
jobURL${GRAPH_DIR}/additional-task.grf

SUCCESS

FALL

Другие

Шаги этой группы служат для выполнения множества разнородных задач.

DbExecute - выполняет указанный SQL-запрос к базе данных

Rollup - создает записи с помощью преобразования

HTTPConnector - обращается к серверу посредством HTTP-запросов

DeleteFiles - удаляет файлы и каталоги

DbExecute

DbExecute выполняет указанные операторы SQL/DML/DDL для базы данных, подключенной с помощью драйвера JDBC. Шаг не имеет входных портов, а ответы на запрос к базе отправляются на первый выходной порт.

Порты DbExecute:

Тип портаНомерОбязательныйОписаниеМетаданные
Output0даДля выходных записейлюбые

Атрибуты DbExecute:

АтрибутОбязательныйОписаниеВозможные значения
dbConnectionдаИдентификатор соединения с БД, которое будет использоваться.
dbConnection="JDBC0"
sqlQueryдаSQL-запрос, определенный на графе.

<Attr name="transform"><![CDATA[
CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (id INT,surname TEXT,name TEXT);
    TRUNCATE TABLE ${TABLE_NAME};
    SELECT * FROM ${TABLE_NAME};
    ]]> 
</Attr>
urlлибо имя внешнего файла, включая путь, определяющий запрос SQL с теми же характеристиками, которые описаны в атрибуте запроса SQL, либо строка атрибута URL-адреса файла, которая используется для чтения порта.url="port:$0.ddl:discrete"
charsetнет

Кодировка внешнего файла, указанная в атрибуте sqlQuery.

Rollup

Rollup создает одну или несколько выходных записей из одной или нескольких входных записей. Может отправлять разные записи на разные выходные порты, указанные пользователем.

Метаданные на разных выходных портах могут различаться.

Порты Rollup:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входных записейлюбые
Output0даДля выходных записей
1-Nнет

Атрибуты Rollup:

АтрибутОбязательныйОписаниеВозможные значения
groupKeyFields / groupKeyдаКлюч, по которому записи считаются включенными в одну группу. Выражается в виде последовательности имен отдельных входных полей, разделенных друг от друга символом «#».name; salary
groupAccumulatorMetadataId / groupAccMd / groupMdдaИдентификатор метаданных, которые служат для создания групповых аккумуляторов.InputData
inputSorted / sortedдаПо умолчанию записи считаются отсортированными. Либо по возрастанию, либо по убыванию. Разные поля могут даже иметь разный порядок сортировки. Если ваши записи не отсортированы, установите для этого атрибута значение false.False
transformдаАлгоритм обработки данных. Функции для преобразования на шаге Rollup описаны в таблице ниже.
<Attr name="transform">
    <![CDATA[//#PseudoRust:code 
    Пользовательский алгоритм обработки.
    ]]>
</Attr>

Функции шага Rollup:

void initGroup( groupAccumulator)

ПараметрЗначение
ОбязательныйДа
Входные параметры
<metadata name> groupAccMd

Метаданные, указанные пользователем. Если groupAccMd не определен, выполнение графа завершится с ошибкой.

Возвращаетvoid
ВызовВызывается по одному разу для первой входной записи каждой группы. Вызывается перед updateGroup(groupAccMd).
ОписаниеИнициализирует информацию для конкретной группы.
Пример

pub fn init_group() { }

boolean updateGroup ( groupAccumulator)

ПараметрЗначение
ОбязательныйДа
Входные параметры
<metadata name> groupAccumulatorMetadataId

Метаданные, указанные пользователем. Если groupAccMd не определен, выполнение графа завершится с ошибкой.

Возвращает

если true, то вызывается updateTransform(counter, groupAccMd)

если false, то вызывается updateTransformOnError(counter, groupAccMd)

Вызов

Вызывается многократно (по одному разу для каждой входной записи группы, включая первую и последнюю запись). Вызывается после того, как функция initGroup(groupAccumulator) уже была вызвана для всей группы.

ОписаниеИнициализирует информацию для конкретной группы.
Пример

pub fn update_group() -> bool {
    group.count += 1;
    group.sum += input.salary;
return true}

boolean finishGroup( groupAccumulator)

ПараметрЗначение
ОбязательныйДа
Входные параметры
<metadata name> groupAccMd

Метаданные, указанные пользователем. Если groupAccMd не определен, выполнение графа завершится с ошибкой.

Возвращает

если true, то вызывается transform(counter,groupAccMd)

если false, то вызывается transformOnError(counter,groupAccMd)

Вызов

Вызывается повторно, один раз для последней входной записи каждой группы. Вызывается после того, как updateGroup(groupAccMd) уже был вызван для всех входных записей группы.

Описание

Если finishGroup() завершается с ошибкой, то весь граф завершится ошибкой.

Пример

pub fn finish_group() -> bool {
    if input.name.chars().count() < 5 { 
        return false }
        return true}

integer updateTransform(integer counter, groupAccumulator)

ПараметрЗначение
ОбязательныйДа
Входные параметры

Целочисленный счетчик (начинается с 0, указывает количество созданных записей. Должен быть завершен, как показано в примере ниже. Вызовы функций заканчиваются, когда возвращается SKIP.)

<metadata name> groupAccMd (метаданные, указанные пользователем).

Если groupAccMd не определен, выполнение графа завершится с ошибкой.

Возвращаетцелочисленные значения
Вызов

Вызывается неоднократно, как указано пользователем. Вызывается после того, как updateGroup(groupAccumulator) возвращает значение true. Функция вызывается до тех пор, пока не будет возвращен SKIP.

Описание

Создает выходные записи на основе информации об отдельных записях. Если updateTransform() завершится ошибкой, а updateTransformOnError() не определено, весь граф завершится ошибкой. Если какая-либо часть функции transform() для какой-либо выходной записи вызывает сбой функции updateTransform(), и если определена другая (updateTransformOnError()), обработка продолжается в этом updateTransformOnError() в том месте, где произошел сбой updateTransform(). Функция updateTransformOnError() получает информацию, собранную функцией updateTransform(), полученную из ранее успешно обработанного кода. Сообщение об ошибке и трассировка стека также передаются в updateTransformOnError().

Пример

pub fn update_transform(counter: usize) -> OutPort {
    if counter > 1 { 
        return out_port![SKIP] }

    output.out_0 = input.clone();
    return out_port![0]

integer transform(integer counter, groupAccumulator)

ПараметрЗначение
ОбязательныйДа
Входные параметры

целочисленный счетчик (начинается с 0, указывает количество созданных записей. должен быть завершен, как показано в примере ниже. Вызовы функций заканчиваются, когда возвращается SKIP.)

<metadata name> groupAccMd (метаданные, указанные пользователем).

Если groupAccMd не определен, выполнение графа завершится с ошибкой.

Возвращаетцелочисленные значения
Вызов

Вызывается неоднократно, как указано пользователем. Вызывается после того, как updateGroup(groupAccumulator) возвращает значение true. Функция вызывается до тех пор, пока не будет возвращен SKIP.

Описание

Создает выходные записи на основе всех записей всей группы. Если функция transform() завершается ошибкой, а функция transformOnError() не определена, весь граф завершится ошибкой. Если какая-либо часть функции transform() для какой-либо выходной записи вызывает сбой функции transform(), и если функция transformOnError() определена, обработка продолжается в transformOnError() в том месте, где произошла ошибка transform(). Функция transformOnError() получает информацию, собранную функцией transform(), которая была получена из ранее успешно обработанного кода. Также сообщение об ошибке и трассировка стека передаются в transformOnError().

Пример

pub fn transform(counter: usize) -> OutPort {
    if counter > 0 { 
        return out_port![SKIP] }
        
    output.out_0.name = input.name.clone() + "[AVG]";
    output.out_0.salary = group.sum / (group.count as f64);
    output.out_1 = output.out_0.clone();
    return out_port![ALL]

integer updateTransformOnError(string errorMessage, string stackTrace, integer counter, groupAccumulator)

ПараметрЗначение
ОбязательныйДа
Входные параметры

string errorMessage

string stackTrace

integer counter (начинается с 0, указывает количество созданных записей. должно быть завершено, как показано в примере ниже. Вызов функции завершается, когда возвращается SKIP.)

<metadata name> groupAccMd (метаданные, указанные пользователем).

Если groupAccMd не определен, выполнение графа завершится с ошибкой.

Возвращаетцелочисленные значения
Вызов

Вызывается, если updateTransform() вызывает исключение

Описание Создает выходные записи на основе информации об отдельных записях
Пример

pub fn update_transform_on_error(_: OutPort) { }
integer transformOnError(string errorMessage, string stackTrace, integer counter, groupAccumulator)
ПараметрЗначение
ОбязательныйДа
Входные параметры

string errorMessage

string stackTrace

integer counter (начинается с 0, указывает количество созданных записей. должно быть завершено, как показано в примере ниже. Вызов функции завершается, когда возвращается SKIP.)

<metadata name> groupAccMd (метаданные, указанные пользователем).

Если groupAccMd не определен, выполнение графа завершится с ошибкой.

Возвращаетцелочисленные значения
Вызов

Вызывается, если transform() выдает исключение

Описание Создает создает выходные записи на основе всех записей всей группы.
Пример

pub fn transform_on_error(_: OutPort) { }

Доступ к полям ввода и вывода

Все остальные функции шаблона PseudoRust не позволяют получить доступ ни к входам, ни к выходам, ни к groupAccMd.

Ввод записей или полей

Входные записи или поля доступны в функциях initGroup(), updateGroup(), finishGroup(). Они также доступны в функциях updateTransform(), transform(), updateTansformOnError() и transformOnError().

Выходные записи или поля

Выходные записи или поля доступны в функциях updateTransform(), transform(), updateTansformOnError() и transformOnError().

Групповой аккумулятор

Групповой аккумулятор доступен в функциях initGroup(), updateGroup(), finishGroup(). Он также доступен в функциях updateTransform(), transform(), updateTansformOnError() и transformOnError().

HTTPConnector

HTTPConnector отправляет запросы к указанному серверу и получает ответы. Запрос записывается в атрибут url. Ответ может быть отправлен на выходной порт или сохранён в указанном в атрибуте outputURL файле. Путь к выходному файлу может быть отправлен на указанный выходной порт.

Порты HTTPConnector:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0нетДля установки различных атрибутов шагаЛюбые
Output0Содержимое ответа, путь к файлу ответа, код состояния, атрибуты шага
1Подробности об ошибках

Метаданные

таблица входных метаданных

таблица выходных метаданных (исходящих)

таблица ошибок

Атрибуты HTTPConnector:

АтрибутОбязательныйОписаниеВозможные значения
urlдаURL-адрес сервера, к которому подключается компонент. Формат URL-адреса смотрите в разделе [Поддерживаемые форматы](). Поддерживаются протоколы HTTP, HTTPS, FTP и SFTP.
requestMethodдаМетод запроса.requestMethod="POST"
addInputFieldsAsParametersУказывает, следует ли добавлять в URL-адрес дополнительные параметры из входящего ребра.addInputFieldsAsParameters="false" по умолчанию
addInputFieldsAsParametersToОтправить параметры в - указывает, следует ли добавлять входные поля в строку запроса или в тело метода. Параметры можно добавлять в тело метода только в том случае, если для метода запроса установлено значение POST. По умолчанию параметры передаются в QUERY. addInputFieldsAsParametersTo="BODY"
multipartEntitiesСоставные сущности - указывает поля, которые следует добавлять как составные объекты в запрос POST. Имя поля используется в качестве имени сущности. Ожидается список входных полей, разделенных точкой с запятой.
charsetКодировка символов входных/выходных файлов.charset="UTF-8" по умолчанию.
requestContentCодержимое запроса, указывается в сопоставлении входных данных inputMapping.
output.out_0.requestContent = input.in_0.xmlConfig;
inputURLURL-адрес входного файла, из которого считывается один HTTP-запрос. Подробнее о выборе файла в разделе [Диалоговое окно URL-файла]().
outputURLURL-адрес выходного файла, в который записывается HTTP-ответ. Подробнее о выборе файла в разделе [Диалоговое окно URL-файла]().
appendOutputПо умолчанию любой новый ответ перезаписывает старый. Если вы переключите этот атрибут на true, новый ответ будет добавлен к старым. Применяется только к выходным записям.
inputMappingСопоставление входных данных. Позволяет устанавливать соответствие между полями входных записей и атрибутами шага.
<attr name="inputMapping">
    <![CDATA[//#PseudoRust:code

        pub fn transform() -> OutPort {
            output.out_0.requestContent = input.in_0.xmlConfig;

            return out_port![ALL]
        }
    ]]>
</attr>
outputMappingСопоставление выходных данных. Позволяет сопоставить данные ответа (например, содержимое тела ответа, код состояния и т. д.) с полями выходной записи. Также можно сопоставить значения из входных полей и сведений об ошибке (если для параметра «Redirect error output» установлено значение true).
errorMappingСопоставление ошибок. Позволяет сопоставить сообщение об ошибке с выходной записью.
<attr name="errorMapping">
    <![CDATA[//#PseudoRust:code

        pub fn transform() -> OutPort {
            let message = "Ошибка удаления папки из директории";
            let logType = "ERROR";
            
            output.out_1.message = message;
            output.out_1.logType = logType;

            return out_port![ALL]
        }
    ]]>
</attr>
authenticationMethodнетУказывает, какой метод аутентификации следует использовать. HTTP BASIC | HTTP DIGEST | ANY authenticationMethod="BASIC" по умолчанию
usernameИмя пользователя, необходимое для подключения к серверу. username="${USER}"
passwordПароль, необходимый для подключения к серверу. password="${PASSWORD}"

Сопоставление входных данных

Для сопоставления входных данных через атрибут inputMapping используется Редактор преобразований, в котором можно решить, какие поля из входной записи следует назначить атрибутам шага.

Редактор преобразований для HTTPConnector

Редактор преобразований для HTTPConnector

Диалоговое окно предоставляет вам все возможности и функции Редактора преобразований.

Составные объекты

Вы можете настраивать составные объекты в Редакторе преобразований. inputMapping предлагает поля, производные от значения атрибута multipartEntities. Например, поле1;поле2 в качестве значения составных сущностей генерирует следующие поля:

Составные объекты в сопоставлении входных данных

Составные объекты в сопоставлении входных данных

Сгенерированные поля можно использовать для управления составными объектами.

Если вы имеете дело с составными объектами, вам необходимо использовать метод POST. При указании составного объекта к HTTP-запросу автоматически добавляется дополнительный Content-type заголовок, содержащий значение «multipart/form-data». Более того, рёбра будут указываться и распределяться автоматически и в HTTP-запросе. Настройка HTTP-заголовка Content-type как «multipart/form-data» вручную нарушит автоматическую спецификацию рёбер.

Возможные способы настройки составных сущностей (расписать подробнее):

  • Список входных полей
  • Содержимое карты составного объекта
  • Содержимое карты и имя файла
  • Использовать файл как составной объект

Список входных полей

Атрибут Multipart entities содержит список полей из входной записи, разделенных точкой с запятой. Каждое поле представляет собой составную сущность. Имя совпадает с именем поля, значение поля используется в качестве содержимого.

Содержимое карты составного объекта

Используйте сопоставление входных данных inputMapping, чтобы установить содержимое составных сущностей. Составное имя будет таким же, как имя поля, а содержимое будет определяться сопоставлением.

Содержимое карты и имя файла

Составная сущность будет использоваться при сопоставлении данных, но в запросе будет дополнительный составной заголовок, использующий сопоставленное имя файла.

Использовать файл как составной объект

Раздел в разработке

Сопоставление выходных данных

При редактировании атрибута outputMapping открывается Редактор преобразования, в котором вы можете решить, что следует отправить на выходной порт.

Редактор преобразований для HTTPConnector

Редактор преобразований для HTTPConnector

Чтобы выполнить сопоставление, выполните несколько основных шагов:

  1. Если у вас уже есть выходные метаданные, щелкните левой кнопкой мыши элемент на левой панели и перетащите его в поле вывода. Это отправит данные результата на выход.
  2. Если у вас нет выходных метаданных:
    • Перетащите поле с левой панели на правую панель (пустое место).
    • Это создает новое поле в выходных метаданных.

Вы можете сопоставить различные данные с выходным портом:

  • Значения полей из входных метаданных — вы можете отправлять значения из полей ввода в выходной порт. Это особенно полезно, когда вы используете какой-то идентификатор сеанса для HTTP-запросов.

  • Результат — предоставляет данные о результате. К ним относятся:

    • content — содержимое HTTP-ответа в виде строки. Это поле будет иметь значение null, если ответ записывается в файл.
    • contentByte — необработанное содержимое HTTP-ответа в виде массива байтов. Это поле будет иметь значение null, если ответ записывается в файл.
    • outputFilePath - путь к файлу, в который записан ответ. Будет нулевым, если ответ не записывается в файл.
    • statusCode — код состояния HTTP ответа. заголовок — карта, представляющая свойства HTTP-заголовка из ответа.
    • rawHeaders — заголовки ответа.
    • errorMessage — сообщение об ошибке в случае, если вывод ошибки перенаправляется на стандартный порт вывода.
  • Атрибуты — предоставляет значения атрибутов компонента:

    • URL-адрес — URL-адрес, по которому был отправлен запрос.
    • requestMethod — метод, который использовался для запроса.
    • requestContent — содержимое отправленного запроса (если указано в виде строки).
    • inputFileUrl — URL-адрес файла, содержащего содержимое запроса.

Сопоставление выходных данных использует внутренний язык для описания преобразований (вы можете переключиться на вкладку «Источник»). Доступны все виды функций для изменения значения, которое будет сохранено в поле вывода.

Пример в разработке

Сопоставление ошибок

При редактировании атрибута errorMapping открывается редактор преобразований, в котором можно сопоставить сведения об ошибке с выходным портом. Поведение очень похоже на отображение вывода. Если вы оставите сопоставление ошибок пустым, будет использовано сопоставление ошибок по умолчанию:

output.out_1.* = input.in_0.*;
output.out_1.* = input.in_1.*;

Пример. Скачать Web-страницу

Загрузите содержимое веб-страницы modernsolution.ru с помощью HTTPConnector. Сохраните результат в файл для дальнейшей обработки.

Решение

Используйте атрибуты URL-адреса и URL-адреса выходного файла. Загруженная страница будет сохранена в файле result.html в каталоге ${DATAOUT_DIR}.

АтрибутЗначение
URL

https://modernsolution.ru

Output file URL${DATAOUT_DIR}/result.html

DeleteFiles

DeleteFiles используется для удаления файлов и каталогов (в том числе, рекурсивно).

Порты DeleteFiles:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0нетДля входных записей, которые необходимо сопоставить с атрибутами шага.любые
Output0нетРезультаты
1нетОшибки

Атрибуты DeleteFiles:

АтрибутОбязательныйОписаниеВозможные значения
fileURL

да1

Путь к файлу или каталогу, который необходимо удалитьfileURL="${DATATMP_DIR}/bl/esb/loadHub/${srcName}_${tableName}.csv"
recursiveнетУдалять каталоги рекурсивно.recursive="true" по умолчанию
inputMapping

2

Определяет маппинг входных записей с атрибутами шага.

<attr name="inputMapping">
    <![CDATA[//#PseudoRust

        pub fn transform() -> OutPort {
            output.out_0.fileURL = input.in_0.url;

            return out_port![ALL]
        }
    ]]>
</attr>
standardOutputMapping

2

Определяет маппинг результатов работы шага на стандартный порт вывода.

<attr name="standardOutputMapping">
    <![CDATA[//#PseudoRust
        pub fn transform() -> OutPort {
            output.out_0.message[0] = "Файл удален из архива: "+input.in_0.name;
            output.out_0.logType[0] = "INFO";

            return out_port![ALL]
        }
    ]]>
</attr>
errorOutputMapping

2

Определяет отображение ошибок на порт вывода ошибок.

<attr name="errorOutputMapping"><![CDATA[//#PseudoRust
pub fn transform() -> OutPort {
	output.out_1.message[0] = "Ошибка удаления файла из архива: "+input.in_0.name+"\n"+input.in_1.errorMessage;
	output.out_1.logType[0] = "ERROR";

	return out_port![ALL]
}

]]></attr>
redirectErrorOutputнетЕсли этот параметр включен, ошибки будут отправляться на стандартный порт вывода вместо порта ошибок.redirectErrorOutput="false" по умолчанию
stopOnFailнетПо умолчанию сбой при обработке графа приведёт к тому, что шаг пропустит все последующие входные записи и отправит информацию о них на порт вывода ошибок. Такое поведение можно отключить с помощью этого атрибута.

false: если произойдет ошибка (например, файл не найден), шаг продолжит удаление последующих файлов.

true: в случае возникновения ошибки шаг прекратит удаление последующих файлов и отправит информацию об оставшихся неудалёнными файлах на порт ошибки.

Примечание: эта функция работает только в том случае, если к порту ошибки шага подключено ребро.

stopOnFail="false" по умолчанию
1

Атрибут является обязательным, если он не указан в маппинге входных записей.

2

Требуется, если соответствующее ребро подключено.

При редактировании любого маппинга открывается Редактор преобразований.

Сопоставление входных данных

Редактор позволяет перезаписать выбранные атрибуты шага значениями входящих записей.

АтрибутТипВозможные значения
fileURLstringfileURL="${DATA_DIR}/folder/log.txt"
recursivebooleantrue | false

Сопоставление выходных данных

Редактор позволяет сопоставлять результаты и входные данные с выходным портом.

Если выходное сопоставление пусто, поля входной записи и результирующей записи сопоставляются с выходными данными по имени.

Имя поляТипВозможные значения
fileURLstringПуть к файлу или каталогу, который был удален.
resultbooleanTrue, если операция завершилась успешно (может быть false, если включено перенаправление ошибок).
errorMessagestringЕсли операция не удалась, поле содержит сообщение об ошибке (используется, когда включено перенаправление ошибок).
stackTracestringЕсли операция не удалась, поле содержит трассировку стека ошибки (используется, когда включено перенаправление ошибок).

Сопоставление ошибок

Редактор позволяет сопоставлять ошибки и входные данные с портом ошибки.

Если сопоставление ошибок пусто, поля входной записи и записи результата сопоставляются с выходными данными по имени.

Имя поляТипОписание
resultbooleanВсегда будет установлено значение false.
errorMessagestringСообщение об ошибке
stackTracestringТрассировка ошибок.
fileURLstringURL-адрес удаленного файла или каталога.

Пример. Удаление файла

Чтобы удалить файл ${PROJECT_DIR}/delete_me.txt нужно заполнить атрибут fileURL.

АтрибутЗначение
fileURL${PROJECT_DIR}/delete_me.txt

Пример. Удаление директории

Чтобы удалить директорию ${OLD_PROJECT}/old_folder нужно заполнить атрибуты fileURL и recursive.

АтрибутЗначение
fileURL${PROJECT_DIR}/delete_me.txt
recursivetrue

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

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

<Node id="m" type="Map">
    <Attr name="transform">
        <![CDATA[//#PseudoRust:code...]]>
    </Attr>
</Node>

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

<Node id="map" guiX="250" guiY="100" guiName="map" type="Map">
    <Attr name="transform"><![CDATA[//#PseudoRust:code
        let index = 0;

        pub fn transform() -> OutPort {
            output.out_0.x_coord = input.y_coord;
            output.out_0.y_coord = input.x_coord;

            match index {

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

                0 => output.out_0.obj_type = param("X"),
                1 => output.out_0.obj_type = param("RbISb"),
                2 => output.out_0.obj_type = format!("secure number is {}", param("FILE_PRM_NUM")),

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


                3 => output.out_0.obj_type = input.obj_type + " is not " + &param_or("XX", "goose") + "!",

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


                4 => output.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 => {
                    output.out_0.y_coord = param_parse_or("X", 24);
                    output.out_0.obj_type = param_parse_or("X", "tururu".to_string());
                }
                 _ => output.out_0.obj_type = input.obj_type,
            }
            index += 1;
            return out_port![ALL]
        }

        pub fn on_error(_: OutPort) { }
        pub fn post_exec() { }
        ]]>
    </Attr>
</Node>

Возвращаемые значения

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

else {

return out_port![SKIP]

}

Любое целое число больше или равное 0Запись отправляется на выходной порт, номер которого равен этому возвращаемому значению.

out_port![1, 4, 9] -- вернет запись на 1-ый, 4-ый и 9-ый порт

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

Типы задач

Задача — это граф, поток заданий, системный скрипт и т. д., которые можно запустить вручную, настроить запуск в запланированное время или запустить по какому-либо событию. В задаче указано что именно надо сделать. Существует несколько типов задач:

  • запуск заданий;
  • прерывание выполнения задания;
  • выполнение системной команды;

Задачи используются:

  • для создания расписаний;
  • в обработчиках событий;
  • при ручном запуске задач.

Каждая задача имеет атрибуты запуска. В таблицах ниже описаны атрибуты существующих задач:

Атрибуты задачи «Запуск задания».

названиеописание
Task typeЗапустить граф
JobИмя графа, который необходимо выполнить. Список для выбора заполнен всеми файлами графов.
ParametersСписок параметров, передаваемых графу.

Атрибуты задачи «Прерывание выполнения заданий».

названиеописание
Task typeПрервать выполнение задания
JobЭто поле выбора заполнено всеми заданиями. Все экземпляры выбранного задания, которые в данный момент выполняются и будут уничтожены.

Атрибуты задачи «Выполнение системной команды».

названиеописание
Task typeВыполнение системной команды
ProgramПрограмма
ArgsАргументы

Что такое файл задания

Задание – это последовательность шагов по обработке данных, записанная в формате XML в файл с расширением .grf. Шагом является минимальный алгоритм обработки данных.

Созданием файла занимается пользователь системы – разработчик заданий.

Структура файла задания соответствует стандартной структуре XML документа. Файл задания должен быть синтаксически верным XML документом.

В следующих главах описана структура файла задания, описаны атрибуты всех элементов и приведен пример создания такого файла.

Структура файлов заданий OneBridge

В системе определены некоторые элементы, которые стоит использовать для корректной передачи информации и отображения графов в инспекторе задач.

После декларации следует указать начальный тег корневого элемента документа <Graph>. В этот элемент помещается все описание алгоритма обработки данных, все используемые шаги, ребра и их метаданные.

За ним следуют строки, описывающие дочерние элементы корневого элемента. Два главных дочерних элемента это <Global> и <Phase>. В элементе <Global> описываются метаданные и параметры подключения.

Система OneBridge обрабатывает данные в виде записей. Каждая запись может состоять из нескольких полей разных типов. Метаданные хранят тип данных этих полей. Метаданные являются частью задания, они содержатся в файле задания и их нужно описывать в элементе <Metadata>, чтобы четко определить типы обрабатываемых данных.

Параметры подключения к базе данных, файлы с настройками, можно указать и подключить в элементе <GraphParameters>.

В <Phase> задаются атрибуты шагов задания <Node> и описываются ребра <Edge>. Описание шагов может содержать в себе дочерние элементы <Attr>, в которых описываются методы преобразования записей данных.

Последняя строка файла содержит конечный тег корневого элемента: </Graph>.

На схеме ниже представлена иерархия элементов в файле задания.

Рисунок 1. Схема вложенности элементов заданий в OneBridge.

Элементы

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

ЭлементРодительский элементОписание элемента
Graphнет

Является главным элементом, определяющим граф. Содержит информацию о файле задания.*

Обязательный тег для отрисовки графа в инспекторе заданий.

GlobalGraph

Содержит информацию о файле, не имеет атрибутов. Дочерние элементы:

- Metadata - используемые метаданные;

- GraphParameters – параметры графа;

- Connection – подключения к базам данных.

MetadataGlobalОпределяет тип данных записи
RecordMetadata

Используется для определения символов-разделителей полей и записей для шагов FlatFileReader и FlatFileWriter, которые читают и записывают данные изв плоские файлы.

По умолчанию разделитель полей — "," разделитель строк — "n", если необходимо использовать другие разделители – нужно задать их в элементе Record с помощью конструкции:

<Record fieldDelimiter=";" recordDelimiter="_">

FieldRecord

Содержит имя поля и его тип.

Если задан Record, то все Field должны идти внутри него.

<Field name="y_coord" type="int"/>

GraphParametersGlobalСодержит элементы, в которых хранится информация для подключения к базам данных или путь к файлу для чтения. Может иметь атрибут scopeNonce - дополнительный параметр для защищенных параметров, например, пароля от базы данных.
GraphParameterGraphParameters

Хранит параметры для используемых в файле шагов, например, путь к файлу для шага чтения данных.

Атрибуты элемента описаны в таблице "Атрибуты элемента GraphParameter"

GraphParameterFileGraphParameters

Подключает файл параметров.

Атрибуты описаны в таблице "Атрибуты элемента GraphParameterFile"

ConnectionGlobalХранит параметры подключения к базе данных.
PhaseGraph

Номер фазы присваивается шагам графа, если есть необходимость запускать часть шагов после завершения выполнения другой части шагов. Фаз в графе может быть несколько, так что им нужно присваивать атрибут number, указывающий очередность выполнения.

Каждый граф выполняется параллельно в рамках одного и того же номера фазы; т. е. каждый шаг и каждое ребро с одинаковым номером фазы выполняются одновременно. Если процесс останавливается на какой-то фазе, более высокие фазы не запускаются. Только после успешного завершения всех процессов в рамках одной фазы начнется следующая фаза.

Ребра графа, в которых описывается соединение шагов должны быть описаны в одной фазе с используемыми шагами. То есть нельзя объявлять шаги в одной фазе, а связывать их ребром - в другой.

NodePhaseОписывает атрибуты шага. Атрибуты описаны в таблице "Атрибуты элемента Node"
AttrNodeОписывает логическое выражение для фильтрации и сортировки или метод преобразования данных.
EdgePhaseОписывает связь между шагами графа. Атрибуты описаны в таблице "Атрибуты элемента Edge"

Атрибуты элементов

Для заданий: <GraphParameter> и <GraphParameterFile>

Для шагов:<Node>

Для рёбер:<Edge>

Атрибуты элемента GraphParameter

НазваниеОбязательныйОписаниеВозможные значения
nameдаИмя параметраname="READ_DIR"
valueнетЗначение параметраvalue="test/files/generated"
publicнетПубличность параметраЗначение по умолчанию: public="false"
requiredнетОбязательность указания значения параметра при запуске заданияЗначение по умолчанию : required="false"
secureнетПараметр зашифрованЗначение по умолчанию: secure="false"
  • если public="true" и required="true", тогда value игнорируется;
  • если public="true" и value не задан, тогда required устанавливается в "true";
  • если public="false", то required игнорируется;
  • если public="false", то value должно быть задано;
  • значение name не может содержать в себе подпоследовательность "${".

Атрибуты элемента GraphParameterFile

Атрибут Обязательный Описание Возможные значения
fileURL да Путь к файлу с параметрами

fileURL="${PRM_DIR}/db_01__full_conn.prm"

Атрибуты элемента Node

НазваниеОбязательныйОписаниеВозможные значения
idдаУдобное название шага для указания в атрибутах ребер графа.id="reader"
guiNameнетИмя шага, отражаемое в инспекторе заданий. Может быть любым.guiName="read"
guiXнетКоордината X левого верхнего угла шага для визуального отображения шага в инспекторе задач.guiX="-132"
guiYнетКоордината Y левого верхнего угла шага для визуального отображения шага в инспекторе задач.guiY="212"
typeдаТип шага. Определяет функциональность данного шага.

Все имеющиеся в системе типы шагов:

type="FlatFileReader"

type="DbReader"

type="FlatFileWriter"

type="DbWriter"

type="PgDbWriter"

type="Trash"

type="Sort"

type="Filter"

type="Gather"

type="Copy"

type="Concat"

type="Map"

type="Dedup"

type=" Rollup"

type="HashJoin"

type="MergeJoin"

type=" DbExecute"

type=" HTTPConnector"

type=" DataGenerator"

type=" Normalizer"

Атрибуты элемента Edge

НазваниеОбязательныйОписаниеВозможные значения
idнетУникальное название ребра в пределах графа.id="edge0"
fromNodeнет1Используется для описания направления ребра в теге <Edge>. Обозначает «из какого порта какого шага выходит ребро»fromNode="filter_short:0"
toNodeнет1Используется для описания направления ребра в теге <Edge>. Обозначает «в какой порт какого шага входит ребро»toNode="sort_long:0"
chunkAmountнеткол-во chunk'ов которые могут одновременно находится внутри данного ребраchunkAmount="42"
chunkSizeнет2из какого количества записей состоит один chunkchunkSize="5"
chunkMemSizeнет2сколько памяти занимает один chunkchunkMemSize="40_KB"
metadataнетАтрибут ребра, определяющий тип данных, передающихся по данному ребруmetadata="Purchase"
1

Хотя бы один из атрибутов должен быть указан.

2

chunkSize и chunkMemSize не могут быть заданы одновременно.

Описание задачи

Создать файл с заданием для обработки данных следующим образом:

  1. Прочитать данные из нескольких файлов.
  2. Объединить считанные потоки данных.
  3. Скопировать получившийся поток данных в несколько потоков.
  4. Вывести один из потоков в файл.
  5. Записи из второго потока отсортировать.
  6. Затем отфильтровать.
  7. Полученные данные записать в файл.

На рисунке ниже представлено графическое представление такого графа:

Отображение графа example_01.grf в инспекторе заданий

Заполнение файла задания

В начале создания файла нужно объявить, что его содержимое является заданием-графом, для этого открываем тег <Graph>.

Далее нужно открыть тег <Global>, в котором будут описаны метаданные и параметры графа.

Далее открываем элемент <Record>, атрибутами которого можно назначить fieldDelimiter – для объявления разделителя полей записи, и recordDelimiter – для указания символа, разделяющего записи.

Дочерним элементу <Record> является пустой элемент <Field>, у которого нет закрывающего тега. Его используем, чтобы указать имя (name) и тип данных (type) для полей записей.

Теперь поочередно закрываем теги </Record>, </Metadata> и </Global>.

Следующий открывающий тег - <Phase> с атрибутом number, указывающим номер фазы для определения очередности выполнения шагов. В этом примере фаза всего одна, ее номер можно не указывать.

Далее открываем три пустых элемента <Node>, атрибуты которых, описывают имя шага (id), входные и выходные файлы для шагов чтения и записи (file), типы шагов (type) и координаты для отрисовки шагов в инспекторе задач.

У элемента <Node> может быть дочерний элемент <Attr>, которому нужно задать имя name, а внутри записать логическое выражение для фильтрации или метод преобразования данных.

Еще нужно указать пустые теги <Edge> для описания ребер графа. В атрибутах этого элемента можно пояснить, какими ребрами какие шаги связать в этом графе и указать ссылку на метаданные, указанные в начале файла в теге <Metadata>.

В конце закрываем элементы </Phase> и </Graph>.

Получился файл задания:


<?xml version="1.0" encoding="UTF-8"?>
<Graph>
    <Global>
        <Metadata id="ObjectWithPos">
            <Record fieldDelimiter="|" recordDelimiter="\n">
                <Field name="a" type="string"/>
                <Field name="b" type="integer"/>
                <Field name="c" type="float"/>
            </Record>
        </Metadata>
    </Global>
    
    <Phase number="0">
        <Node id="reader0" guiX="50"   guiY="100" guiName="FlatFileReader" file="data-in/others/example_01_in1.txt"   type="FlatFileReader"/>
        <Node id="reader1" guiX="50"   guiY="300" guiName="FlatFileReader" file="data-in/others/example_01_in2.txt"   type="FlatFileReader"/>
        <Node id="writer0" guiX="1050" guiY="300" guiName="FlatFileWriter" file="data-out/others/example_01_out1.txt" type="FlatFileWriter"/>
        <Node id="writer1" guiX="650"  guiY="100" guiName="FlatFileWriter" file="data-out/others/example_01_out2.txt" type="FlatFileWriter"/>
        <Node id="concat"  guiX="250"  guiY="200" guiName="Concat" type="Concat"/>
        <Node id="copy"    guiX="450"  guiY="200" guiName="Copy" type="Copy"/>
        <Node id="sort"    guiX="650"  guiY="300" guiName="FileSortNode" sortKey="c(d)" type="FileSortNode"/><!--"d" - descending-->
        
        <Node id="filter"  guiX="850" guiY="300" guiName="FilterNode" type="FilterNode">
            <Attr name="filterExpression">
                <![CDATA[//#Rust:closure
                |input| input.a.chars().count() < 15
                ]]>
            </Attr>
        </Node>
    
        <Edge id="edge0" fromNode="reader0:0" toNode="concat:0"/>
        <Edge id="edge1" fromNode="reader1:0" toNode="concat:1"/>
        <Edge id="edge2" fromNode="concat:0"  toNode="copy:0"/>
        <Edge id="edge6" fromNode="copy:0"    toNode="writer1:0" metadata="ObjectWithPos"/>
        <Edge id="edge5" fromNode="copy:1"    toNode="sort:0"/>
        <Edge id="edge3" fromNode="sort:0"    toNode="filter:0"/>
        <Edge id="edge4" fromNode="filter:0"  toNode="writer0:0" metadata="ObjectWithPos"/>
    </Phase>
</Graph>

Результат

На вход были поданы два файла:

файл 1:

werwr|234|25.45
krlgkrgw|63|-65.8
srgehdhdfxyjset___g_jgsn|72465|92745972
fbsb!efb|-42536356|0
glsdgh|453453|4524.545

файл 2:

Лёша на горе рога нашёл|-123|-123
Около Мити молоко|234|454.4
Тина барабанит|12|12.12

На выходе получены файлы:

файл 1 (содержит результат работы задания целиком):

glsdgh|453453|4524.545
werwr|234|25.45
Тина барабанит|12|12.12
fbsb!efb|-42536356|0.0
krlgkrgw|63|-65.8

файл 2 (содержит результат конкатенации двух потоков данных на втором шаге задания):

werwr|234|25.45
krlgkrgw|63|-65.8
srgehdhdfxyjset___g_jgsn|72465|92745970.0
fbsb!efb|-42536356|0.0
glsdgh|453453|4524.545
Лёша на горе рога нашёл|-123|-123.0
Около Мити молоко|234|454.4
Тина барабанит|12|12.12

Атрибуты используемых шагов

Атрибуты FlatFileReader:

АтрибутОбязательныйОписаниеВозможные значения
idдаНазвание шага для указания в атрибутах ребра fromNode и toNode. Может быть произвольным.id="reader"
guiXнетКоордината верхнего левого угла шага для отрисовки графа в инспекторе заданий.guiX="50"
guiYнетКоордината верхнего левого угла шага для отрисовки графа в инспекторе заданий.guiY="100"
guiNameнетИмя шага, указываемое на графе. Равно type шага. Нельзя изменять.guiName="FlatFileReader"
fileнетПуть к источнику данных для чтенияfile="data-in/others/example_01_in1.txt"
typeдаТип шага. Определяет функциональность данного шага.type="FlatFileReader"

Атрибуты Concat:

АтрибутОбязательныйОписаниеВозможные значения
idдаНазвание шага для указания в атрибутах ребра fromNode и toNode. Может быть произвольным.id="concat"
guiXнетКоордината верхнего левого угла шага для отрисовки графа в инспекторе заданий.guiX="50"
guiYнетКоордината верхнего левого угла шага для отрисовки графа в инспекторе заданий.guiY="100"
guiNameнетИмя шага, указываемое на графе. Равно type шага. Нельзя изменять.guiName="Concat"
typeдаТип шага. Определяет функциональность данного шага.type="Concat"

Атрибуты Copy:

АтрибутОбязательныйОписаниеВозможные значения
idдаНазвание шага для указания в атрибутах ребра fromNode и toNode. Может быть произвольным.id="copy"
guiXнетКоордината верхнего левого угла шага для отрисовки графа в инспекторе заданий.guiX="50"
guiYнетКоордината верхнего левого угла шага для отрисовки графа в инспекторе заданий.guiY="100"
guiNameнетИмя шага, указываемое на графе. Равно type шага. Нельзя изменять.guiName="Copy"
typeдаТип шага. Определяет функциональность данного шага.type="Copy"

Атрибуты FileSortNode:

АтрибутОбязательныйОписаниеВозможные значения
idдаНазвание шага для указания в атрибутах ребра fromNode и toNode. Может быть произвольным.id="sort"
guiXнетКоордината верхнего левого угла шага для отрисовки графа в инспекторе заданий.guiX="50"
guiYнетКоордината верхнего левого угла шага для отрисовки графа в инспекторе заданий.guiY="100"
guiNameнетИмя шага, указываемое на графе. Равно type шага. Нельзя изменять.guiName="FileSortNode"
sortKeyда

Имя поля для ключа и порядок сортировки.

«d» - «descending» - по убыванию

«a» - «ascending» - по возрастанию

sortKey="component(d)"
typeдаТип шага. Определяет функциональность данного шага.type="FileSortNode"

Атрибуты FilterNode:

АтрибутОбязательныйОписаниеВозможные значения
idдаНазвание шага для указания в атрибутах ребра fromNode и toNode. Может быть произвольным.id="filter"
guiXнетКоордината верхнего левого угла шага для отрисовки графа в инспекторе заданий.guiX="50"
guiYнетКоордината верхнего левого угла шага для отрисовки графа в инспекторе заданий.guiY="100"
guiNameнетИмя шага, указываемое на графе. Равно type шага. Нельзя изменять.guiName="FilterNode"
Filter expressionдаВыражение, по которому фильтруются записи. Возвращает логическое значение.
<Attr name="filterExpression">
    <![CDATA[//#Rust:closure
    |input| input.Product == "карандаш"
    ]]>
</Attr>
typeдаТип шага. Определяет функциональность данного шага.type="FilterNode"

Атрибуты FlatFileWriter:

АтрибутОбязательныйОписаниеВозможные значения
idнетНазвание шага для использования в атрибутах ребра fromNode и toNode.id="writer"
guiXнетКоордината верхнего левого угла шага для отрисовки графа в инспекторе заданий.guiX="50"
guiYнетКоордината верхнего левого угла шага для отрисовки графа в инспекторе заданий.guiY="100"
guiNameнетИмя шага, указываемое на графе. Равно type шага. Нельзя изменять.guiName="FlatFileWriter"
file URLдаПуть к файлу, в который должен быть записан результирующий набор данных.${WRITE_DIR}/out.txt
typeдаТип шага. Определяет функциональность данного шага.type="FlatFileWriter"

API

В API OneBridge используются POST-, GET-, PUT- и DELETE-запросы. Тип запроса указан отдельно для каждого метода.

Структура URI-запросов:

Каждый URI начинается с URL-адреса API http://<IP-address:port>/api/, за ним следует название метода и параметры, при необходимости. Например, полный запрос для получения информации о сервере может быть записан так: http://127.0.0.1:8000/api/info.

Список API-методов ядра системы OneBridge, доступных для вызова:

Resources

get info

ПараметрЗначение
Описаниевозвращает основную информацию о сервере, локальное и мировое время
МетодGET
Пример запроса

http://127.0.0.1:8000/api/info

Пример ответа

"name":"root@mironov1.fvds.ru",
"uptime":16279,
"local_time":"2023-06-13T14:17:42.919911616+00:00",
"utc_time":"2023-06-13T14:17:42.919951526Z"

Параметры запросабез параметров
Ответ возвращает JSON файл со структурой:
name: string,  
uptime: integer,  
local_time: date-time,  
utc_time: date-time.

get performance

ПараметрЗначение
Описаниевозвращает данные по работе сервера для отображения графиков работы памяти и процессора
МетодGET
Пример запроса

http://127.0.0.1:8000/api/performance

Пример ответа

"ram": {
    "system_ram": 
    [
        {
        "datetime": "2023-06-13T06:37:36Z",
        "total": "16777785344",
        "used": "1356226560"
        },
    ...],
    "worker_ram": []  },
"cpu": {
    "system_cpu": 
    [
        {
        "datetime": "2023-06-13T06:37:36Z",
        "usage": "0.21265951"
        },
    ...],
    "worker_cpu": []  }

Параметры запросабез параметров
Ответ возвращает JSON файл со структурой, которая содержит объекты, описывающие состояние памяти и процессора:

ram: массив объектов с информацией о памяти

datetime: date-time,  
total: string, 
used: string

cpu: массив объектов с информацией о процессоре

datetime: date-time,
usage: string

get utilization

ПараметрЗначение
Описаниевозвращает данные по количеству используемой памяти сервера
МетодGET
Пример запроса

http://127.0.0.1:8000/api/utilization

Пример ответа

"name":"System RAM",
"total":16777785344,
"used":1351917568

Параметры запросабез параметров
Ответ возвращает JSON файл со структурой:
name: string,
total: integer,
used: integer

Execution

get job_params

ПараметрЗначение
Описаниевозвращает информацию о параметрах запуска задания
МетодGET
Пример запроса

http://127.0.0.1:8000/api/job_params?path=/JobsForTests/graph/others/concat_pub_prms.grf

Пример ответа
name: "DIR_IN", 
required: true
Параметры запросаpath: string
Ответ возвращает JSON файл со структурой:
name: string,
required: bool

get run_by_id

ПараметрЗначение
Описаниевозвращает задание по идентификатору
МетодGET
Пример запроса

http://127.0.0.1:8000/api/run_by_id?id=14

Пример ответа
"id":"14","parent_id":null,"started":"2023-06-08T12:21:01.923351217Z","finished":"2023-06-08T12:21:29.912137285Z","job_file":"/JobsForTests/data-in/others/concat_in2.txt","status":"Success"
Параметры запросаid: string
Ответ возвращает JSON файл со структурой:
id: string,
parent_id: string,
started: date-time,
finished: date-time, (не обязательный)
job_file: string,
status: Success/Failure/InProgress

get runs

ПараметрЗначение
Описаниевозвращает информацию об отработавшем задании
МетодGET
Пример запроса

http://127.0.0.1:8000/api/runs?offset=0&limit=3

Пример ответа
{
    "id":"161",
    "parent_id":null,
    "started":"2023-06-15T08:25:55.001469354Z",
    "finished":"2023-06-15T08:25:59.366660393Z",
    "job_file":"/JobsForTests/graph/others/concat.grf",
    "status":"Success"
},
{
    "id":"160",
    "parent_id":null,
    "started":"2023-06-15T07:22:21.001189359Z",
    "finished":"2023-06-15T07:22:38.409859493Z",
    "job_file":"/JobsForTests/graph/others/dedup.grf",
    "status":"Success"
},
{
    "id":"159",
    "parent_id":null,
    "started":"2023-06-14T19:04:56.310805953Z",
    "finished":"2023-06-14T19:05:01.355260657Z",
    "job_file":"/JobsForTests/graph/others/map03.grf",
    "status":"Failure"
}
Параметры запроса

from: date-time, (не обязательный)
to: date-time, (не обязательный)
job_file: string, (не обязательный)
status: string, (не обязательный)
offset: integer, (не обязательный, начальный индекс в актуальном списке запущенных заданий)
limit: integer, (не обязательный, количество записей, которые нужно прислать)
order: Asc/Desc (по умолчанию order: Desc)

Ответ возвращает JSON файл со структурой:
id: string,  
parent_id: string, (не обязательный)  
started: date-time,  
finished: date-time, (не обязательный)  
job_file: string,  
status: Success/Failure/InProgress

get runs_log

ПараметрЗначение
Описаниезапрашивает журнал выполнения запуска задания
МетодGET
Пример запроса

http://127.0.0.1:8000/api/runs/log?id=151&last_bytes=4096

Пример ответа
[14.06.2023 08:36:29 990 ms][INFO][worker/src/xml_path.rs:174]: [compile] no redis server connection. Cant use memoization.
[14.06.2023 08:36:29 990 ms][INFO][worker/src/xml_path.rs:213]: [xml] start parse
[14.06.2023 08:36:29 990 ms][WARN][codegen/src/xml/table/param_table.rs:325]: [xml][xml position: [line:11 symb:12]:[line:11 symb:57]] param `DIR_IN` is public and not required but there is no `value` attribute!
[14.06.2023 08:36:29 990 ms][INFO][codegen/src/xml/table/edge_table.rs:359]: [xml][xml position: [line:24 symb:8]:[line:24 symb:62]] metadata resolved: <Edge id="B --> x" metadata="ObjectWithPos">
[14.06.2023 08:36:29 990 ms][INFO][codegen/src/xml/table/edge_table.rs:359]: [xml][xml position: [line:25 symb:8]:[line:25 symb:66]] metadata resolved: <Edge id="x --> writer" metadata="ObjectWithPos">
[14.06.2023 08:36:29 990 ms][INFO][codegen/src/xml/table/edge_table.rs:359]: [xml][xml position: [line:26 symb:8]:[line:26 symb:62]] metadata resolved: <Edge id="C --> x" metadata="ObjectWithPos">
[14.06.2023 08:36:29 990 ms][INFO][worker/src/xml_path.rs:215]: [xml] end parse
[14.06.2023 08:36:29 991 ms][INFO][worker/src/xml_path.rs:221]: [cgen] start code generation
[14.06.2023 08:36:29 993 ms][INFO][worker/src/xml_path.rs:223]: [cgen] end code generation
[14.06.2023 08:36:29 993 ms][INFO][worker/src/xml_path.rs:225]: [compile] start
[14.06.2023 08:36:34 691 ms][INFO][worker/src/xml_path.rs:245]: [compile] end(exit status: 0)
[14.06.2023 08:36:34 691 ms][INFO][worker/src/xml_path.rs:251]: [compile|stdout] Output:``
Параметры запроса

id: string,
last_bytes: integer (не обязательный)

Ответвозвращает строку (текст)

get runs_num

ПараметрЗначение
Описаниевозвращает общее количество заданий, можно фильтровать по статусу, дате и имени файла
МетодGET
Пример запроса

http://127.0.0.1:8000/api/runs/num

Пример ответа
{"runs_num":152}
Параметры запроса

from: date-time, (не обязательный)
to: date-time, (не обязательный)
job_file: string, (не обязательный)
status: Option (не обязательный)

Ответ возвращает JSON файл со структурой:
runs_num: integer

get runs_params

ПараметрЗначение
Описаниевозвращает значение параметров для указанного задания
МетодGET
Пример запроса

http://127.0.0.1:8000/api/runs/params?id=150

Пример ответа
"name":"DIR_IN",
"value":"data-in/others"
Параметры запросаid: string
Ответ возвращает JSON файл со структурой:
name: string,
value: string

post runs

ПараметрЗначение
Описаниезапускает задание в работу и возвращает номер запущенного задания
МетодPOST
Пример запроса

http://127.0.0.1:8000/api/runsjob_file: "/JobsForTests/graph/others/concat.grf", params: []

Пример ответа
"id":"162"
Параметры запроса на вход нужно подать JSON файл со структурой:
job_file: string,  
parent_id: string, (не обязательный)  
params: вектор<name: string,   
value: string> (по умолчанию - пусто)
Ответ возвращает JSON файл со структурой:
id: string

Projects

get directory

ПараметрЗначение
Описаниевозвращает информацию по указанной папке
МетодGET
Пример запроса

http://127.0.0.1:8000/api/directory?path=/JobsForTests/data-in

Пример ответа

"name":"data-in",
"path":"/JobsForTests/data-in"

Параметры запросаpath: string
Ответ возвращает JSON файл со структурой:
name: string,
path: string

get project

ПараметрЗначение
Описаниевозвращает информацию по указанному проекту
МетодGET
Пример запроса

http://127.0.0.1:8000/api/project?path=/JobsForTests

Пример ответа

"name":"JobsForTests",
"path":"/JobsForTests"

Параметры запросаpath: string
Ответ возвращает JSON файл со структурой:
name: string,
path: string

get file

ПараметрЗначение
Описаниевозвращает информацию по выбранному файлу
МетодGET
Пример запроса

http://127.0.0.1:8000/api/file?path=/JobsForTests/graph/others/concat.grf

Пример ответа

"name":"concat.grf",
"path":"/JobsForTests/graph/others/concat.grf",
"size":1278,
"modified":"2023-04-17T12:47:39.073986214Z"

Параметры запроса
path: string,
content: bool (не обязательный, по умолчанию равен false, content=true вернёт содержимое выбранного файла)
Ответ возвращает JSON файл со структурой:
name: string,
path: string

get tree

ПараметрЗначение
Описаниевозвращает информацию о содержимом дерева проектов
МетодGET
Пример запроса

http://127.0.0.1:8000/api/tree

Пример ответа

"name": "JobsForTests",
"path": "/JobsForTests",
"type": "project",
"children": 
[{
    "name": "data-in",
    "path": "/JobsForTests/data-in",
    "type": "directory",
    "children": [{
        "name": "others",
        "path": "/JobsForTests/data-in/others",
        "type": "directory",
        "children": [{
            "name": "x",
            "path": "/JobsForTests/data-in/others/x",
            "type": "directory",
            "children": [{
                "name": "rollup_02.txt",
                "path": "/JobsForTests/data-in/others/x/rollup_02.txt",
                "type": "file",
                "children": []    
            }]
        }]
    }]
}]

Параметры запросабез параметров
Ответ возвращает JSON файл со структурой:
name: string,
path: string,
type: string (project|directory|file),
children: вектор, может содержать подобную структуру name+path+type+children.

post project

ПараметрЗначение
Описаниесоздает проект
МетодPOST
Пример запроса

http://127.0.0.1:8000/api/project?path=/test2

Пример ответа
"name":"test2",
"path":"/test2"
Параметры запроса
path: string (путь к создаваемому проекту)
Ответ возвращает JSON файл со структурой:
name: string,
path: string

post project_rename

ПараметрЗначение
Описаниеменяет имя проекта
МетодPOST
Пример запроса

http://127.0.0.1:8000/api/project/rename?path=/test33&to=test44

Пример ответа
"name":"test44",
"path":"/test44"
Параметры запроса
path: string, (путь к проекту, который переименовываем)
to: string (новое имя проекта)
Ответ возвращает JSON файл со структурой:
name: string,
path: string

post directory

ПараметрЗначение
Описаниесоздает папку
МетодPOST
Пример запроса

http://127.0.0.1:8000/api/directory?path=/test33/tururu/lalala/kuku/oshshshs

Пример ответа
"name":"oshshshs",
"path":"/test33/tururu/lalala/kuku/oshshshs"
Параметры запроса
path: string, (путь к проекту, который переименовываем)
Ответ возвращает JSON файл со структурой:
name: string,
path: string

post directory_rename

ПараметрЗначение
Описаниеменяет название папки
МетодPOST
Пример запроса

http://127.0.0.1:8000/api/directory/rename?path=/test22/folder1&to=folder10

Пример ответа
"name":" folder10",
"path":"/test22/folder10"
Параметры запроса
path: string, (путь к проекту, который переименовываем)
to: string (новое имя папки)
Ответ возвращает JSON файл со структурой:
name: string,
path: string

post file

ПараметрЗначение
Описаниесоздает новый файл
МетодPOST
Пример запроса

http://127.0.0.1:8000/api/file?path=/test44/tururu/lalala/kuku/oshshshs/kudo.grf

Пример ответа
"name": "kudo.grf",
"path": "/test44/tururu/lalala/kuku/oshshshs/kudo.grf",
"size": 0,
"modified": "2023-06-15T08:10:21.261541736Z"
Параметры запроса
path: string, (путь к проекту, который переименовываем)
Ответ возвращает JSON файл со структурой:
name: string,
path: string,
size: integer,
modified: date-time

post file_rename

ПараметрЗначение
Описаниеменяет имя файла
МетодPOST
Пример запроса

http://127.0.0.1:8000/api/file/rename?path=/test44/tururu/lalala/kuku/bip/filefile2&to=fileNEW

Пример ответа
"name": "fileNEW",
"path": "/test44/tururu/lalala/kuku/bip/fileNEW",
"size": 0,
"modified": "2023-06-14T14:04:37.625674537Z"
Параметры запроса
path: string, (путь к проекту, который переименовываем)
to: string (новое имя файла)
Ответ возвращает JSON файл со структурой:
name: string,
path: string,
size: integer,
modified: date-time

put file

ПараметрЗначение
Описаниезаменяет контент существующего файла
МетодPUT
Пример запроса

http://127.0.0.1:8000/api/file?path=/test44/tururu/lalala/kuku/oshshshs/kudo.grfsent_file: "qwa"

Пример ответа
"name": "kudo.grf",
"path": "/test44/tururu/lalala/kuku/oshshshs/kudo.grf",
"size": 3,
"modified": "2023-06-15T08:15:08.343008889Z"
Параметры запроса
path: string (путь к изменяемому файлу)
sent_file: string (текст изменённого файла)
Ответ возвращает JSON файл со структурой:
name: string,
path: string,
size: integer,
modified: date-time

delete directory

ПараметрЗначение
Описаниеудаляет папку
МетодDELETE
Пример запроса

http://127.0.0.1:8000/api/directory?path=/test22

Пример ответа
Параметры запроса
path: string (путь к удаляемой папке)
Ответничего не возвращает

delete file

ПараметрЗначение
Описаниеудаляет файл
МетодDELETE
Пример запроса

http://127.0.0.1:8000/api/file?path=/test/file

Пример ответа
Параметры запроса
path: string (путь к удаляемому файлу)
Ответничего не возвращает

delete project

ПараметрЗначение
Описаниеудаляет проект
МетодDELETE
Пример запроса

http://127.0.0.1:8000/api/project?path=/test

Пример ответа
Параметры запроса
path: string (путь к удаляемому проекту)
Ответничего не возвращает

Schedules

get schedules

ПараметрЗначение
Описаниевозвращает список расписаний
МетодGET
Пример запроса

http://127.0.0.1:8000/api/schedules

Пример ответа
"name":"test1",
"enabled":false,
"once":"2023-06-15T07:22:21Z",
"active_from":null,
"active_to":null,
"job_file":"/JobsForTests/graph/others/dedup.grf",
"params":[],"last_run":"2023-06-15T07:22:21Z",
"next_run":null
Параметры запроса
name_contains: string (не обязательный)
Ответ возвращает JSON файл со структурой:
name: string,
enabled: bool,
trigger:    "Once": date-time или 
            "Interval": integer или 
            "Cron": string,
active_from: date-time, (не обязательный)
active_to: date-time, (не обязательный)
job_file: string,
params: вектор <name: string, value: string>,
last_run: date-time, (не обязательный)
next_run: date-time, (не обязательный)

post schedules

ПараметрЗначение
Описаниесоздаёт расписание
МетодPOST
Пример запроса
http://127.0.0.1:8000/api/schedules

{
    name: "test2", 
    enabled: true, 
    "once":"2023-06-15T11:07:21Z",
    job_file: "/JobsForTests/graph/others/concat.grf", 
    params: [],
}
Пример ответа
"last_run":null,"next_run":"2023-06-15T11:07:21Z"
Параметры запроса
name: string,
enabled: bool,
trigger:    "Once": date-time или 
            "Interval": integer или 
            "Cron": string,
active_from: date-time, (не обязательный)
active_to: date-time, (не обязательный)
job_file: string,
params: вектор <name: string, value: string>,
last_run: date-time, (не обязательный)
next_run: date-time, (не обязательный)
Ответ возвращает JSON файл со структурой:
last_run: date-time, (не обязательный)
next_run: date-time, (не обязательный)

post schedules_toggle

ПараметрЗначение
Описаниеизменяет состояние расписания (вкл/выкл) и возвращает новое состояние
МетодPOST
Пример запроса
http://127.0.0.1:8000/api/schedules/toggle?name=test1
Пример ответа
"enabled":false,
"next_run":null
Параметры запроса
name: string
Ответ возвращает JSON файл со структурой:
enabled: bool,
next_run: date-time, (не обязательный)

post schedules_rename

ПараметрЗначение
ОписаниеМеняет название расписания
МетодPOST
Пример запроса
http://127.0.0.1:8000/api/schedules/rename/old_name?to=new_name
Пример ответа
{
    "name": "new_name",
    "enabled": true,
    "once": "2023-09-05T12:48:05Z",
    "active_from": null,
    "active_to": null,
    "job_file": "/JobsForTests/graph/others/concat.grf",
    "params": [],
    "last_run": "2023-09-05T12:48:05Z"
}
Параметры запроса
name: string
new-name: string
Ответ возвращает JSON файл со структурой:
name: string,
enabled: bool,
trigger:    "Once": date-time или 
            "Interval": integer или 
            "Cron": string,
active_from: date-time,
active_to: date-time,
job_file: string,
params: {
    name: string,
    value: string,
    },
last_run: date-time,

delete schedules

ПараметрЗначение
ОписаниеУдаляет расписание
МетодDELETE
Пример запроса
http://127.0.0.1:8000/api/schedules/schedule_name
Пример ответа
Параметры запроса
path: string (путь к удаляемому файлу)
Ответничего не возвращает

patch schedules

ПараметрЗначение
ОписаниеИзменяет атрибуты расписания
МетодPATCH
Пример запроса
http://127.0.0.1:8000/api/schedules/schedule_name
"enabled": true,
"cron": "*/5 * * * * *",
"active_from": "2023-04-13T11:08:22.381473400Z",
"active_to": "2023-09-07T11:08:22.381473400Z",
"job_file": "/proj1/job1.grf",
"params": [
    {
        "name": "parname",
        "value": "parvalue"
    }
]
Пример ответа
"name": "test6",
"enabled": true,
"cron": "*/5 * * * * *",
"active_from": "2023-04-13T11:08:22.381473400Z",
"active_to": "2023-09-07T11:08:22.381473400Z",
"job_file": "/proj1/job1.grf",
"params": [
{
    "name": "parname",
    "value": "parvalue"
}
],
"last_run": "2023-09-07T10:43:50Z"
Параметры запроса
enabled: bool,  (не обязательно)
trigger:        (не обязательно)
         "Once": date-time или
         "Interval": integer или
         "Cron": string,
active_from: date-time, (не обязательно)
active_to: date-time,   (не обязательно)
job_file: string,       (не обязательно)
params: vec[],          (не обязательно)
Ответ возвращает JSON файл со структурой:
name: string,
enabled: bool,
trigger: "Once": date-time или
         "Interval": integer или 
         "Cron": string,
active_from: date-time, 
active_to: date-time, 
job_file: string,
params: {
    name: string,
    value: string,
},
last_run: date-time,

Event listeners

get event_listeners

ПараметрЗначение
Описаниевозвращает список обработчиков событий
МетодGET
Пример запроса

http://127.0.0.1:8000/api/event_listeners

Пример ответа

"name":"stub abc",
"enabled":true,
"event":{
    "job":{
        "finished":{
            "job_file":"/proj1/alice_bob.xml"}}},
"action":{
    "command":{
        "program":"bash",
        "args":["-c","ls"]}},
"last_run":null

Параметры запроса
name_contains: string (не обязательный)
Ответ возвращает JSON файл со структурой:
name: string,
enabled: bool,
event: {
    Job{
        Finished { 
            job_file: string 
        }
    },
или
    File {
        filesystem: string (Local), 
        path: string, 
        check: string (Added/Removed), 
        interval: integer, 
    }
},
action: {
    Command {
        program: string,
        args: string,
    },
или
    StartJob {
        job_file: string,
        params: {
            name: string,
            value: string
        },
    }
},
last_run: date-time

post event_listeners

ПараметрЗначение
Описаниесоздает обработчик событий
МетодPOST
Пример запроса

http://127.0.0.1:8000/api/event_listeners


"name": "listener_name",
"enabled": false,
"event": {
        "job": {
            "finished": {
                "job_file": "/JobsForTests/graph/others/concat.grf"
            }
        }
},
"action": {
        "start_job": {
            "job_file": "/JobsForTests/graph/others/copy.grf", 
            "params": []  
    }
}

Пример ответабез ответа
Параметры запроса

name: string,   (имя слушателя событий)
enabled: bool,  (переключатель)
event:          (отслеживаемое событие)
{
    Job{
        Finished { 
            job_file: string 
        }
    },
    File {
        filesystem: Local, 
        path: string, 
        check: string (Added/Removed), 
        interval: integer, 
    }
},
action:         (действие, которое необходимо выполнить, когда event завершится)
{
    Command {
        program: string,
        args: string
    },
    StartJob {
        job_file: string,
        params: {
            name: string,
            value: string
        }
    }
} 

Ответбез ответа

post event_listeners_toggle

ПараметрЗначение
Описаниеизменяет состояние обработчика событий (вкл/выкл) и возвращает новое состояние
МетодPOST
Пример запроса

http://127.0.0.1:8000/api/event_listeners/toggle?name=listener1

Пример ответа
"enabled":false
Параметры запроса
name: string
Ответ
enabled: bool

post event_listeners_rename

ПараметрЗначение
ОписаниеМеняет название обработчика событий
МетодPOST
Пример запроса
http://127.0.0.1:8000/api/event_listeners/rename/old_name?to=new_name
Пример ответа
Параметры запроса
to: string (новое название обработчика)
Ответничего не возвращает

delete event_listeners

ПараметрЗначение
ОписаниеУдаляет обработчик событий
МетодDELETE
Пример запроса
http://127.0.0.1:8000/api/event_listeners/listener_name
Пример ответа
Параметры запроса
path: string (путь к удаляемому файлу)
Ответничего не возвращает

patch event_listeners

ПараметрЗначение
ОписаниеИзменяет значения атрибутов обработчика событий
МетодPATCH
Пример запроса
http://127.0.0.1:8000/api/event_listeners/listener_name

изменить jobfile в action с "copy.grf" на "filter.grf"

{
    "name": "listener_name",
    "enabled": false,
    "event": {
            "job": {
                "finished": {
                    "job_file": "/JobsForTests/graph/others/concat.grf"
                }
            }
    },
    "action": {
            "start_job": {
                "job_file": "/JobsForTests/graph/others/filter.grf", 
                "params": []  
        }
    }
}


Пример ответа
{
    "name": "listener_name",
    "enabled": false,
    "event": {
        "job": {
            "finished": {
                "job_file": "/JobsForTests/graph/others/concat.grf"
            }
        }
    },
    "action": {
        "start_job": {
            "job_file": "/JobsForTests/graph/others/filter.grf",
            "params": []
        }
    }
}
Параметры запроса Все поля опциональные. Но при смене типа события event с "job" на "file" и наоборот, а так же при смене действия action с "Command" на "StartJob" и наоборот - нужно заполнить все сопутствующие атрибуты. Например, если обработчик был настроен на event "job", и нужно заменить его на event "file", то нужно будет задать значение и для атрибутов filesystem, check, path, interval.
name: string,
enabled: bool,  (не обязательно)
event:          (не обязательно)
        "job": Finished { 
            job_file: string 
        }
        "file": { 
            filesystem: "Local",
            path: string,
            check: "Added" или "Removed",
            interval: int,
        }
action:         (не обязательно)
        Command {
            program: string,
            args: string
        },
        StartJob {
            job_file: string,
            params: [
                name: String,
                value: String,
            ]
        } 
Ответ возвращает JSON файл со структурой:
name: string,   (имя остаётся прежним при использовании API patch event_listeners, меняется с помощью API post event_listeners_rename)
enabled: bool,  (новое состоние)
event:  Job     (новое задание или файл)
        {       
            Finished { 
                job_file: string 
            }
        }
        или
        File { 
            filesystem: Local,
            path: string,
            check: {
                Added,
                или
                Removed
            },
            interval: int,
        },
action: Command (новая команда или задание)
        {   
            program: string,
            args: string,
        }
        или
        StartJob {
            job_file: string,
            params: { 
                name: string,
                value: string,
            }
        }