Описание

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

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

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

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

Функции OneBridge

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

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

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

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

Структура OneBridge

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Установка и активация OneBridge

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

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

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

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

Затем:

  1. Открыть командную строку и выполнить команды:
  • для скачивания приложения OneBridge с сайта modernsolution.ru:
    wget *ссылка на актуальную версию OneBridge*
  • для установки скачанных файлов приложения OneBridge:
    sudo apt install ./onebridge.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.

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

Дизайнер поставляется в zip-архиве. Архив содержит папки "cash", "config", "projects", "templates" и файл запуска приложения client.exe.

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

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

Конфигурация OneBridge

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

http

Имя параметраОписание параметраПример значения параметра
addrbind address (адрес интерфейса + порт), приоритет отдаётся значению переменной окружения ONEBRIDGE_HTTP_BIND_ADDRESSaddr = "127.0.0.1:8000"
ui_pathпуть к папке с uiui_path = "../ui/dist"

resources

Имя параметраОписание параметраПример значения параметра
intervalинтервал сбора статистики сервера (равен горизонтальному интервалу между точками на графиках во вкладке ресурсов)interval = 5

execution

Имя параметраОписание параметраПример значения параметра
run_storage.sqliteпуть к файлу с информацией о запусках графовpath = "../data/sqlite-storage/execution_run.sqlite"
run_params_storage.sqliteпуть к хранилищу параметров запусковpath = "../data/sqlite-storage/execution_run_params.sqlite"
worker.embeddedпуть к хранилищу журнала выполнения запусковjob_logs_path = "../data/job-logs"

projects

Имя параметраОписание параметраПример значения параметра
fs.mountedпуть к проектамpath = "../projects"

auth

Имя параметраОписание параметраПример значения параметра
pathпуть к хранилищу пользователейpath = "../data/sqlite-storage/users_storage.sqlite"
exp_longэкспирация длинного токена (рт), в секундахexp_long = 86400
exp_shortэкспирация короткого токена (ат), в секундахexp_short = 86400
at_secretсид для генерации токена доступаat_secret = "87ac0287d16540e3f9cb307327411ffb39bb4008"
rt_secretсид для генерации токена обновленияrt_secret = "390aed9f00981f4a4c9ae2c1a5e4c115d56f6101"
api_tokensспецтокен для доступа ко всем апиapi_tokens = ["test"]
ldap_dnпараметры для подключения к базе ldapldap_dn = "uid={},ou=onebridge,dc=example,dc=org"
ldap_addr ip и порт ldap сервераldap_addr = "127.0.0.1:389"
auth_triesколичество попыток авторизации (после использования всех попыток, пользователь блокируется)auth_tries = 5

Активация OneBridge

Активация позволяет убедиться, что ваша копия OneBridge не используется на нескольких устройствах и содержит заявленную версию продукта.

Чтобы активировать вашу копию OneBridge, нужно будет разместить ключ активации в папке ./data/license. Ключ активации представляет собой файл с расширением .lic, который можно получить от сотрудника поддержки OneBridge. Процедура активации однократная и выполняется только при первом запуске системы.

При первом запуске OneBridge создаст папку ./data/license и сгенерирует файл с вашим machine-id. Путь к файлу будет прописан в консоли. Этот файл нужно будет передать сотруднику поддержки СБАР. В ответ вы получите другой файл, который нужно будет положить в папку рядом с machine-id и повторно запустить установку. В случае успешной проверки указанных файлов OneBridge будет активирован и вы сможене использовать все его функции.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ресурсы

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

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

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

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

  • «Использование ресурсов». Здесь отображается объем используемой системной памяти на момент загрузки страницы.
  • «Рабочий сервер». Раздел содержит информацию о параметрах рабочего сервера.
  • «Операционная система». Содержит основную информацию об операционной системе.
  • «Производительность». В этом разделе отображаются два линейных графика: «Загрузка памяти» - 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-файл, в котором прописан алгоритм обработки данных. Текст файла отображается на вкладке Источник. Обработка алгоритма происходит в Модуле выполнения заданий.

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

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

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

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

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

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

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

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

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

Вкладка "UI"

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

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

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

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

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

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

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

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

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

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

Все возможные компоненты отображаются в Списке компонентов в правой части Рабочей области.

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

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

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

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

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

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

Если требуется добавить ребро к компоненту, в котором нет свободных портов - щелкните по компоненту правой кнопкой и выберите add input или add output - это добавит входной или выходной порт и вы сможете прикрепить к нему новое ребро.

Редактор компонента

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

АтрибутЗначениеОписание
phase0Фаза, которой принадлежит компонент.
fileURLproject_new/file-in.txtПуть к файлу для чтения.
charsetwindows-1251Кодировка символов, читаемых с помощью этого компонента.
appendtrueЕсли записи печатаются в существующий непустой файл, они по умолчанию заменяют более старые (при append=false). Если установлено значение true, новые записи добавляются в конец существующего выходного файла.
fieldDelimiter,Разделитель полей.
recordDelimitern/Разделитель записей.

Редактор атрибутов Шага FlatFileWriter

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

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

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

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

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

Если нужно закрыть все открытые файлы выберите в контекстном меню вкладки Закрыть все.

Вкладка "Source"

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

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

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

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

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

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

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

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

Структура проектов подробнее описана в главе Проекты

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Проекты OneBridge

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

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

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

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

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

ОписаниеСтандартное имя папкиСтандартное имя параметраПример использования параметра
все соединенияconnCONN_DIR${CONN_DIR}
входные данныеdata-inDATAIN_DIR${DATAIN_DIR}
выходные данныеdata-outDATAOUT_DIR${DATAOUT_DIR}
временные данныеdata-tmpDATATMP_DIR${DATATMP_DIR}
графыgraphGRAPH_DIR${GRAPH_DIR}
потоки данныхjobflowJOBFLOW_DIR${JOBFLOW_DIR}
метаданныеmetaMETA_DIR${META_DIR}
параметрыparamPRM_DIR${PRM_DIR}

Так же будет создан файл Workspace.prm, содержащий стандартные параметры проекта.

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

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

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

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

Чтобы подключить проект, нажмите правую кнопку в области панели Project structure и выберите Новый проект в контекстном меню.

В параметрах подключения укажите URL cсервера в формате http://ip-adress:port, логин и пароль пользователя, имеющего доступ. Проверить подключение можно с помощью Test Connection. Затем выберите проект из существующих на сервере или создайте новый. Проверьте имя проекта и завершите подключение.

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

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

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

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

Размещение проекта

Размещение проекта

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

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

После создания проекта вы можете создать новый граф, выбрав в контекстном меню проекта New grf file.

Задайте имя графа в открывшемся диалоговом окне. Граф будет помещен в выбранный проект. Расширение .grf будет добавлено к выбранному имени автоматически. Затем в панели Project structure появится файл new-graph.grf. Откройте файл, дважды щёлкнув по его названию.

Размещение компонентов

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

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

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

Сделайте то же самое с FlatFileWriter из Writers. Поместите их по порядку, слева направо.

Размещение компонента для записи

Размещение компонента для записи

Соединение компонентов рёбрами

Теперь нужно соединить компоненты ребром. Для этого нажмите на выходной порт FlatFileReader, появится ребро. Перетащите свободный конец ребра на выходной порт FlatFileWriter.

Соединение компонентов ребром

Соединение компонентов ребром

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

Назначение метаданных ребру

На панели Outline кликните на Metadata правой кнопкой, откроется контекстное меню. Выберите New Metadata, откроется редактор метаданных.

Задйте имя метаданных, тип записей и разделитель записей.

Кнопкой + создайте новую запись и укажите ее атрибуты. Сохраните изменения кнопкой Save.

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

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

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

Назначение метаданных

Назначение метаданных

Метаданные назначены

Метаданные назначены

Выполнение

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

  • выбрать Run -> Run graph в главном меню;
  • использовать сочетание клавиш Ctrl+R;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Решение конфликтов

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

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

Если файл открыт в Дизайнере и после синхронизации является модифицированным или несуществующим - происходит конфликт.

Диалоговое окно решения конфликта

Диалоговое окно решения конфликта

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

  • Для модифицированных файлов: Accept Local - оставит текущую вкладку открытого файла без изменений, Accept Remote - обновит текущую вкладку открытого файла.
  • Для удаленных файлов: Accept Local - оставит текущую вкладку открытого файла без изменений, Accept Remote - закроет вкладку.

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

Выбор действия при конфликте

Выбор действия при конфликте

Задания

Задание – это последовательность шагов по обработке данных, записанная в формате 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 может быть несколько выходных портов.

Метаданные

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

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

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

Каждый шаг можно настроить с помощью Редактора компонента.

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

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

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

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

Фазы

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

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

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

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

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

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

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

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

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

Рёбра

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

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

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

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

Соединение компонентов ребром

Соединение компонентов ребром

Метаданные

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

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

Метаданные могут быть как внутренними, так и внешними (общими). Метаданные указываются в файле задания или в файле параметров. Метаданные также могут быть созданы динамически на основе 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

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

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

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

Поля и записи

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

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

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

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

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

Формат даты и времени

Форматирование описывает, как значения даты/времени должны считываться и записываться из/в строковое представление. На форматирование и синтаксический анализ (парсинг) дат также влияют локаль и часовой пояс.

В OneBridge используется указание префикса для форматирования данных. Доступны два встроенных механизма обработки данных: стандартный для языка Rust модуль (описан в таблицах ниже) и международный формат ISO 8601 (https://en.wikipedia.org/wiki/ISO_8601).

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

Для указания даты:

СпецификаторПримерОписание
%Y2001

Полный год пролептического1 григорианского календаря, дополненный нулями до 4 цифр. Поддерживаются годы от -262144 до 262143. Годы до 1 г. до н.э. или после 9999 г. н.э. требуют начального знака (+/-).

%C20

Год, разделенный на 100, дополненный нулями до 2 цифр2.

%y01

Год, по модулю 100, дополненный нулями до 2 цифр2.

%m07Номер месяца (01–12), дополненный нулями до 2 цифр.
%bJulСокращенное название месяца. Всегда 3 буквы.
%BJulyПолное название месяца. Также принимает соответствующую аббревиатуру при парсинге данных.
%hJulТо же, что %b
%d08Номер дня (01–31), дополненный нулями до 2 цифр.
%e 8То же, что %d, но дополнено пробелами.
%aSunСокращенное название дня недели. Всегда 3 буквы.
%ASundayПолное название дня недели. Также принимает соответствующую аббревиатуру при парсинге.
%w0Числовое обозначение дня недели. Sunday = 0, Monday = 1, …, Saturday = 6.
%u7Числовое обозначение дня недели. Monday = 1, Tuesday = 2, …, Sunday = 7. (ISO 8601)
%U28

Номер недели, начинающийся с воскресенья (00–53), дополненный нулями до 2 цифр3.

%W27То же, что и %U, но неделя 1 начинается с первого понедельника этого года.
%G2001

То же, что %Y, но использует номер года в недельном календаре ISO 86014.

%g01

То же, что %y, но использует номер года в недельном календаре ISO 86014.

%V27

То же, что и %U, но использует номер недели в недельном календаре ISO 8601 (01–53)4.

%j256День года (001–366), дополненный нулями до 3 цифр.
%D07/08/01Формат `месяц-день-год`. То же, что %m/%d/%y.
%x07/08/01Представление даты в локали (например, 31.12.99).
%F2001-07-08Формат `год-месяц-день` (ISO 8601). То же, что %Y-%m-%d.
%v8-Jul-2001Формат `день-месяц-год`. То же, что %e-%b-%Y.
1

Пролептический григорианский календарь (предваряющий григорианский календарь, от др.-греч. πρόληψις «предвосхищение») — календарь, расширяющий григорианский календарь на период до его введения 15 октября 1582 года.

2

%C, %y разделяют года по группам, поэтому для 100 г. до н.э. (номер года -99) будут напечатаны -1 и 99 соответственно.

3

%U: Неделя 1 начинается с первого воскресенья этого года. Неделя 0 может быть указана за несколько дней до первого воскресенья.

4

%G, %g, %V: неделя 1 — это первая неделя, в которой в этом году содержится не менее 4 дней. Недели 0 не существует, поэтому ее следует использовать с %G или %g.

Для указания времени:

СпецификаторПримерОписание
%H00Количество часов (00–23), дополненное нулями до 2 цифр.
%k 0То же, что %H, но дополнено пробелами. То же, что %_H.
%I12Количество часов в 12-часовом формате (01–12), дополненное нулями до 2 цифр.
%l12То же, что %I, но дополнено пробелами. То же, что %_I.
%Pamam или pm в 12-часовом формате.
%pAMAM или PM в 12-часовом формате.
%M34Количество минут (00–59), дополненное нулями до 2 цифр.
%S60

Количество секунд (00–60), дополненное нулями до двух цифр5.

%f

26490000

Количество наносекунд с последней целой секунды6.
%.f

.026490

Доля секунды. Съедает ведущую точку6.
%.3f.026Доля секунды с фиксированной длиной 3.
%.6f.026490Доля секунды с фиксированной длиной 6.
%.9f.026490000Доля секунды с фиксированной длиной 9.
%3f026Доля секунды, как %.3f, но без начальной точки.
%6f026490Доля секунды, как %.6f, но без начальной точки.
%9f026490000Доля секунды, как %.9f, но без начальной точки.
%R00:34Формат `час-минута`. То же, что %H:%M.
%T00:34:60Формат `час-минута-секунда`. То же, что %H:%M:%S.
%X00:34:60Представление местного времени (например, 23:13:48).
%r12:34:60 AM12-часовое местное время. (например, 23:11:04). Возвращает %X, если языковой стандарт не поддерживает 12-часовой формат времени.
5

%S: учитываются дополнительные секунды, поэтому возможно 60.

6

%f, %.f:
%f и %.f — это совершенно разные спецификаторы форматирования.
%f подсчитывает количество наносекунд, прошедших с последней целой секунды, а %.f — доли секунды. Пример: 7 мкс форматируется как 7000 с %f и форматируется как .000007 с %.f.

Для указания часового пояса:

СпецификаторПримерОписание
%ZACST

Название местного часового пояса. Пропускает все символы без пробелов во время парсинга. Идентичен %:z при форматировании7.

%z+0930Смещение местного времени по отношению к UTC (при этом UTC равно +0000).
%:z+09:30То же, что %z, но с двоеточием.
%::z+09:30:00Смещение от местного времени до UTC в секундах.
%:::z+09Смещение от местного времени до UTC без учета минут.
%#z+09Только при парсинге: то же, что и %z, но позволяет использовать или не использовать минуты.
7

%Z: поскольку встроенный модуль не знает часовых поясов за пределами их смещений, этот спецификатор печатает смещение только при использовании для форматирования. Аббревиатура часового пояса НЕ будет напечатана.
Смещение не будет заполнено из проанализированных данных и не будет проверено. Часовой пояс полностью игнорируется.
Невозможно надежно преобразовать аббревиатуру в смещение, например, CDT может означать либо центральное летнее время (Северная Америка), либо летнее время Китая.

Для указания даты и времени:

СпецификаторПримерОписание
%cSun Jul 8 00:34:60 2001Дата и время региона (например, четверг, 3 марта, 23:05:25 2005 г.).
%+2001-07-08T00:34:60.026490+09:30

Формат даты и времени ISO 8601/RFC 33398.

%s994518299

Временная метка UNIX, количество секунд, прошедших с 01.01.1970 00:00 UTC9.

8

%+: То же, что %Y-%m-%dT%H:%M:%S%.f%:z, т. е. 0, 3, 6 или 9 дробных цифр для секунд после двоеточия в смещении часового пояса.
Этот формат также поддерживает использование Z или UTC вместо %:z. Они эквивалентны +00:00.
Обратите внимание, что все T, Z и UTC анализируются без учета регистра.
Типичные реализации функции для преобразования даты и времени имеют разные (и зависящие от локали) форматы этого спецификатора. Лучше избегать этого спецификатора, если вы хотите точно контролировать результат.

9

%s: значение может быть отрицательным. Учитываются только невисокосные секунды.

Специальные спецификаторы:

СпецификаторПримерОписание
%tЗнак табуляции (\t).
%nЗнак перевода строки (\n).
%%Знак процента.

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

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

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

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

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

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

  • Панель Структура

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

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

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

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

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

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

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

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

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

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

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

В данный момент реализовано только назначение метаданных вручную каждому ребру.

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

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

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

Указание метаданных в источнике

Указание в источнике производится вручную в заголовке файла, в теге Metadata. Создайте внутри тег Record, задайте значение параметра name и укажите значения атрибутов для Field.

Указание метаданных в источнике

Указание метаданных в источнике

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

Для создания метаданных в редакторе, откройте его из панели Outline из конекстного меню Metadata -> New metadata. Задайте имя записи, задайте имена полей метаданных, резделители полей и строк, укажите тип данных для каждого поля. Сохраните изменения кнопкой Save.

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

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

Подробнее редактор метаданных описан в следующей главе - Редактор метаданных.

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

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

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

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

Дважды щелкните элемент метаданных, чтобы открыть редактор.

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

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

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

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

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

Запись

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

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

Обзор записи

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

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

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

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

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

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

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

Сведения

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

Разделители

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

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

  • разделители полей fieldDelimiter;
  • разделители записей 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> указаны одни разделители – в шагах для чтения или записи могут быть указаны другие разделители, переопределённые значения будут приоритетными при выполнении алгоритма.

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

Если нужно использовать любой непечатаемый разделитель, вы можете записать его как выражение. Например, вы можете ввести следующую последовательность символов в качестве разделителя записей в метаданных: 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" или "normalize".

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

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

Преобразователи можно использовать в таких шагах как 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

Подграфы

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

Определение подграфа хранится в отдельном файле с расширением .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

Для чтения данных

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

Различают следующие шаги для чтения:

FLAT_FILE_READER - читает данные из плоского файла

DATABASE_READER - читает данные из базы данных

DATA_GENERATOR - генерирует данные по шаблону

SPREADSHEET_READER - читает данные из файла в форматах xlsx, xls

FLAT_FILE_READER

FLAT_FILE_READER считывает данные из плоских файлов в формате CSV и TXT с разделителями, фиксированной длины или смешанных текстовых файлов.

Порты FLAT_FILE_READER:

Тип портаНомерОбязательныйОписаниеМетаданные
Output0даДля корректных записейЛюбые
Output1 (в разработке)нетДля не корректных записейСтруктура метаданных ошибок приведена ниже

Атрибуты FLAT_FILE_READER:

АтрибутОбязательныйОписаниеВозможные значения
fileURLдаПуть к источнику данных (плоский файл) для чтения.${READ_DIR}/in.txt
charsetнетКодировка файла, читаемого с помощью этого шага.encoding="windows-1251"
dataPolicyнетОпределяет обработку неправильно отформатированных или неверных данных. Может принимать значения "strict", "lenient"dataPolicy="strict" по умолчанию
trimнетУказывает, следует ли удалять начальные и конечные пробелы из строк в момент прохождения данных через FLAT_FILE_READER.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 подразумевает сохранение всех начальных и конечных символов пробелов. Входная строка может содержать пробелы только если представляет строковый тип данных.

DATABASE_READER

DATABASE_READER считывает данные из базы данных. Поддерживает подключение к СУБД PostgreSQL, Oracle, MySQL. Подробнее про подключение к базам данных можно прочитать в разделе Соединения с базами данных.

DATABASE_READER считывает данные из базы данных

Порты DATABASE_READER:

Тип портаНомерОбязательныйОписаниеМетаданные
Output0даДля корректных записейЛюбые, но одинаковые на всех подключённых портах
1-nнет

Атрибуты DATABASE_READER:

АтрибутОбязательныйОписаниеВозможные значения
dbConnectionдаИдентификатор соединения с базой данных, которое будет использоваться для доступа к базе данных

<Connection id="conn0" dbURL="postgres://admin:admin@localhost:5432/dev"/>
sqlQueryдаSQL-запрос к базе, определенный в графе.

<attr name="sqlQuery">
<![CDATA[
    select * from table;
]]>
</attr>

Пример. Чтение записей из базы данных.

С помощью DATABASE_READER прочитайте данные из базы данных 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="DATABASE_READER" 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 из базы данных во внутреннюю память системы.

DATA_GENERATOR

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

Порты DATA_GENERATOR:

Тип портаНомерОбязательныйОписаниеМетаданные
Output0даДля сгенерированных записейЛюбые
1-nнет

Метаданные на выходных портах могут отличаться.

Атрибуты DATA_GENERATOR:

АтрибутОбязательныйОписаниеВозможные значения
generateдаОпределение способа создания записей, записанное в графе на языке преобразований
<attr name="generate">
    <![CDATA[
    let counter = 4;

    function generate() {
        counter+=1;
        $out[0].foo = counter;

        return ALL;
    }
    ]]>
</attr>
recordsNumberнетКоличество записей, которые необходимо создать. Отрицательное значение позволяет создать количество записей, ограниченное кодом в generate.recordsNumber="1"

Шаблон записи

Шаблон записи — это строка, содержащая все постоянные поля сгенерированных записей в виде записей с разделителями (с разделителями, определенными в метаданных на выходном порте) или фиксированной длины (с размерами, определенными в метаданных на выходном порте).

Последовательность полей

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

Диалоговое окно «Последовательности»

Диалоговое окно «Последовательности»

Случайные поля

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

Диалоговое окно «Редактирование значения»

Диалоговое окно «Редактирование значения»

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

Пример. Создание записей.

Пример в разработке

SPREADSHEET_READER

SPREADSHEET_READER считывает данные с указанных листов файлов формата .xls или .xlsx. Позволяет указывать маппинг данных из таблицы и метаданных OneBridge.

Должен иметь один выходной порт для успешно считанных записей.

Порты SPREADSHEET_READER:

Тип портаНомерОбязательныйОписаниеМетаданные
Output0даДля успешно считанных записейЛюбые
1неДля некорректных считанных записей

Атрибуты SPREADSHEET_READER:

АтрибутОбязательныйОписаниеВозможные значения
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>

Для записи данных

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

Шаги для записи — это компоненты графа, которые выполняются последними, поэтому они не имеют выходных портов.

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

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

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

FLAT_FILE_WRITER - запись в файл

DATABASE_WRITER - запись в базу данных

POSTGRESQL_DATA_WRITER - запись в базу данных Postgres с помощью утилиты

TRASH - прерывание потока данных

Общие свойства шагов для записи

Поддерживаемые форматы URL-адресов для записывающих шагов

Запись в локальные файлы

  • /path/filename.out - записывает указанный файл на диск.

Просмотр записанных данных

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

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

Если целевой файл существует, есть два варианта:

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

Добавление или замена настраивается с помощью атрибута Append.

  • Если для параметра Append установлено значение true, записи добавляются в файл.
  • Если для параметра Append установлено значение false, файл перезаписывается. Append=false по умолчанию.

Функция Append доступна в следующих шагах для записи: FLAT_FILE_WRITER, TRASH.

FLAT_FILE_WRITER

FLAT_FILE_WRITER записывает данные в плоские файлы.

Порты FLAT_FILE_WRITER:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входящего потока записейЛюбые

Атрибуты FLAT_FILE_WRITER:

АтрибутОбязательныйОписаниеВозможные значения
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ГлинкаЕвгений

Данные, записанные шагом FLAT_FILE_WRITER в файл:

01.02.2011|Горилов|Алексей
29.12.2013|Нечаев|Илья
25.11.2016|Васькин|Николай
23.10.2019|Иванов|Григорий
19.09.2022|Горбунов|Евгений

DATABASE_WRITER

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

Поддерживает подключение к базам MySQL, Oracle, PostgreSQL.

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

Порты DATABASE_WRITER:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даЗаписи для загрузки в базу данныхЛюбые
Output0нетДля отклонённых записейТакие же, как на выходном порте
Output1нетДля возвращённых записейТакие же, как на выходном порте

Атрибуты DATABASE_WRITER:

АтрибутОбязательныйОписаниеВозможные значения
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.

POSTGRESQL_DATA_WRITER

POSTGRESQL_DATA_WRITER массовый загрузчик, подходящий для загрузки большого количества записей в базу данных PostgreSQL. Считывает данные через входной порт. Использует специальную утилиту Copy, которая позволяет загружать данные очень быстро. Для остальных случаев лучше использовать DATABASE_WRITER, для которого не требуется использование специальной утилиты.

Порты POSTGRESQL_DATA_WRITER:

Тип портаНомерОбязательныйОписаниеМетаданные
Input1-nдаЗаписи для загрузки в базу данныхЛюбые

Пример.

Необходимо загрузить записи с метаданными «Product» (string), «Amount» (int), «date» (date) и «Price» (float) в таблицу Products в базу данных postgres с именем пользователя user001.

Укажите параметры подключения в атрибутах шага POSTGRESQL_DATA_WRITER:


<Node database="bl" guiName="out_P0" guiX="1100" guiY="170" host="${DB_HOST}" id="OUT_P0" parameters="port=&quot;${DB_PORT}&quot;" psqlPath="/usr/bin/psql" table="${outP0}" type="POSTGRESQL_DATA_WRITER" username="${DB_USER_BL}"/>

Данные будут внесены в базу:

POSTGRESQL_DATA_WRITER записывает данные в базу PostgreSQL

Атрибуты POSTGRESQL_DATA_WRITER

АтрибутОбязательныйОписаниеВозможные значения
psqlPathдаПуть к утилите copypsqlPath="psql"
hostнетИмя хостаhost="10.13.109.14"
databaseдаИмя базы данныхdatabase="postgres"
tableдаИмя таблицы, в которую производится записьtable="${tableNameTo}"
usernameнетИмя пользователяusername="sofiko"
parametersнетПараметры, которые могут использоваться в качестве параметров утилитой psql или оператором \copy. Указывается последовательность ключ=значение, отделенные друг от друга точкой с запятой, двоеточием или вертикальной чертой. Если значение какого-либо параметра содержит точку с запятой, двоеточие или вертикальную черту, такое значение должно быть заключено в двойные кавычки. Сейчас доступны к указанию columns и port
parameters="port=&quot;${DB_PORT}&quot;|columns=&quot;in_market_sale_channel_gid,date_from,hashsum&quot;"

TRASH

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

TRASH прерывает поток данных.

TRASH прерывает поток данных

Порты TRASH:

Тип портаНомерОбязательныйОписаниеМетаданные
Input1-nнетДля входящего потока записей.Любые

Атрибуты TRASH:

АтрибутОбязательныйОписаниеВозможные значения
debugOutputнетПо умолчанию все записи удаляются. Если установлено значение true, все записи записываются в лог на вкладку «Консоль». Этот режим поддерживается при подключении любого количества входных портов.debugOutput="true"

Для преобразования данных

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

Список шагов для преобразования данных:

EXT_SORT - сортирует записи

EXT_FILTER - фильтрует записи

SIMPLE_COPY - копирует записи

MAP - пользовательский алгоритм обработки

ROLLUP - создает записи с помощью преобразования

EXT_SORT

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

Порты EXT_SORT:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входящего потока записейОдинаковые метаданные на входных и выходных портах
Output0даДля отсортированных записей
1-nнетДля отсортированных записей

Атрибуты EXT_SORT:

АтрибутОбязательныйОписаниеВозможные значения
sortKeyдаСписок полей метаданных, по которым производится сортировка и порядок сортировки. Наивысший приоритет сортировки имеет первое поле в последовательности. Порядок сортировки выражается отдельно для каждого ключевого поля (по возрастанию или по убыванию). Порядок сортировки по умолчанию — по возрастанию.sortKey="x_coord(a); y_coord(d)"
sortInMemoryнетПри sortInMemory="true" выполняется внутренняя сортировка. По умолчанию false.sortInMemory="true"
runSizeнетКоличество записей, сортируемых одновременно в памяти; размер одного буфера чтения. По умолчанию 8192.runSize="15456"

Пример. Сортировка данных.

Входные записи содержат имена файлов и их размер. Нужно отсортировать файлы по размеру, начиная с самого большого (descending – по убыванию). Метаданные содержат поля «FileName», «FileSize».

Входящие записи:

FileNameFileSize
file.txt2048
file.docx1048576
file.xml65536

Решение:

Ключ сортировки: FileSortKey="FileSize(d)"

Исходящие записи:

FileNameFileSize
file.docx1048576
file.xml65536
file.txt2048

EXT_FILTER

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

Порты EXT_FILTER:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входящего потока записейОдинаковые метаданные на входных и выходных портах
Output0даДля отфильтрованных записей
1нетДля отклонённых записей

Атрибуты EXT_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волгоград

SIMPLE_COPY

SIMPLE_COPY получает записи через один входной порт и копирует каждую из них на все подключенные выходные порты. Шаг не имеет атрибутов.

Порты SIMPLE_COPY:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входящего потока записейЛюбые
Output0даДля скопированных записейКак у Input 0
1-nнетКак у Output 0

Пример. Копирование данных.

Нужно скопировать записи с метаданными «carID» и «mark» в три потока.

Входящие записи:

порт 0:

carIDmark
145mercedes
856toyota
245chevrolet

Решение:

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

Исходящие записи:

порт 0:

carIDmark
145mercedes
856toyota
245chevrolet

порт 1:

carIDmark
145mercedes
856toyota
245chevrolet

порт 2:

carIDmark
145mercedes
856toyota
245chevrolet

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

ROLLUP

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

Метаданные на разных выходных портах могут различаться.

Порты ROLLUP:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входных записейлюбые
Output0даДля выходных записей
1-Nнет

Атрибуты ROLLUP:

АтрибутОбязательныйОписаниеВозможные значения
groupKeyFields (groupKey)даКлюч, по которому записи считаются включенными в одну группу. Выражается в виде последовательности имен отдельных входных полей, разделенных друг от друга символом «#».name; salary
groupAccumulatorMetadataId (groupAccMd, groupMd)дaИдентификатор метаданных, которые служат для создания групповых аккумуляторов.metadataName
transformдаАлгоритм обработки данных. Функции для преобразования на шаге ROLLUP описаны в таблице ниже.
<Attr name="transform">
    <![CDATA[//
    Пользовательский алгоритм обработки.
    ]]>
</Attr>

Функции шага ROLLUP:

Когда приходит первая запись, срабатывает initGroup(groupAccumulator). Он инициализирует группу записей, объединенных групповым акумулятором groupAccumulator.

ПараметрЗначение
ОбязательныйДа
Входные параметры
<metadata name> groupAccMd

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

Возвращаетvoid
ВызовВызывается по одному разу для первой входной записи каждой группы. Вызывается перед updateGroup(groupAccMd).
ОписаниеИнициализирует информацию для конкретной группы.
Пример

pub fn init_group() { }

Далее для каждой записи, которая соответствует этой группе, вызывается 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}

Если updateGroup вернул true, то для каждой записи еще вызывается updateTransform(counter, groupAccumulator) столько раз сколько указан counter внутри, пока не вернётся SKIP.

ПараметрЗначение
ОбязательныйДа
Входные параметры

Целочисленный счетчик (начинается с 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]

Когда группа закончилась, отрабатывает 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}

Затем выполняется transform(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]

Входные записи или поля

Входные записи или поля доступны в функциях initGroup(), updateGroup(), finishGroup(). Они также доступны в функциях updateTransform(), transform().

Выходные записи или поля

Выходные записи или поля доступны в функциях updateTransform(), transform().

Групповой аккумулятор

Групповой аккумулятор доступен в функциях initGroup(), updateGroup(), finishGroup(). Он также доступен в функциях updateTransform(), transform().

Для объединения данных

Шаги этой группы называются "Соединители". Они служат для объединения записей из потоков с потенциально разными метаданными в соответствии с заданным ключом соединения и способом преобразования.

Соединители имеют как входные, так и выходные порты. Первый входной порт шага-соединителя называется "главным" или "мастером" и обозначается номером «0», остальные входные порты — "подчинённые".

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

HASH_JOIN - объединяет потоки данных из двух и более источников по ключу, не требует предварительной сортировки

MERGE_JOIN - объединяет потоки данных из двух и более источников по ключу, требует предварительную сортировку

CROSS_JOIN - создает декартово произведение записей из подключенных входных портов, не требует предварительной сортировки

HASH_JOIN

HASH_JOIN объединяет потоки данных по ключу.

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

Сначала HASH_JOIN считывает записи из всех подчинённых портов и сохраняет их в хэш-таблицы. Для каждого подчинённого порта создается отдельная хэш-таблица. Размер всех созданных хэш-таблиц не должен превышать размер оперативной памяти сервера, так как хэш-таблицы хранятся в оперативной памяти и ее переполнение приведет к завершению задания с ошибкой. Поэтому имеет смысл в главный входной поток подавать большое количество записей, а в подчинённые потоки – небольшие группы записей.

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

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

Пример.

Даны два потока записей. В одном потоке содержится информация о названии продукта в поле «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
носокбелый
свитерзеленый

Порты HASH_JOIN:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даГлавный входной портЛюбые
1даДополнительный входной порт
2-nнетОпциональные дополнительные входные порты
Output0даИсходящий порт
1нетПорт для записей, которые не подошли по ключу соединенияКак у Input 0

Атрибуты HASH_JOIN:

АтрибутОбязательныйОписаниеВозможные значения
joinKeyдаКлюч, по которому объединяются входящие потоки данных

joinKey="$obj_type#$obj_type=$x_type;lvl"

joinTypeнетТип объединения. Бывает "inner"(по умолчанию) и "leftOuter"joinType="leftOuter"
transformда

Преобразование, определенное в файле задания на внутреннем языке системы1

<attr name="transform"><![CDATA[
    function transform() {
    $out[0].user_code = $in[0].user_id;
    $out[0].bind_code = $in[1].bind_code;
    $out[0].bind_datetime = $in[1].bind_datetime;
            
    return ALL;
    }]]>
</attr>
slaveDuplicatesнетЕсли установлено значение true, разрешены записи с повторяющимися значениями ключей. Если false, для объединения используется только последняя запись. По умолчанию true.slaveDuplicates="false"
1

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

MERGE_JOIN

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

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

Порты MERGE_JOIN:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даГлавный входной портлюбые
1даВедомый входной порт
2-nнетДополнительные ведомые входные порты
Output0даВыходной порт для объединенных данных
1нетВыходной порт для необъединённых данныхкак на Input 0

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

Атрибуты MERGE_JOIN:

АтрибутОбязательныйОписаниеВозможные значения
joinKeyдаКлюч, по которому объединяются входящие потоки данных. Представляет собой последовательность выражений сопоставления для всех ведомых портов. Выражения сопоставления отделяются друг от друга хешем #. Каждое из выражений сопоставления представляет собой последовательность имен полей из главной и подчинённой записей, разделенных знаком равно. Выражения внутри joinKey отделяются друг от друга точкой с запятойjoinKey="$name(a);$color(d)#$product;$tint;#$name;$tone"
joinTypeнетТип объединенияinner (по умолчанию) | leftOuter
transformдаПреобразование, определенное в файле задания на внутреннем языке системы
<attr name="transform"><![CDATA[
    function transform() {
        $out[0].id = $in[0].id;
        $out[0].name = $in[0].name;

        return ALL;
    }
    ]]>
</attr>
slaveDuplicatesнетЕсли установлено значение true, разрешены записи с повторяющимися значениями ключей. Если false, для объединения используется только последняя запись. По умолчанию true.slaveDuplicates="false"

CROSS_JOIN

CROSS_JOIN создает декартово произведение записей из подключенных входных портов.

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

CROSS_JOIN автоматически передаёт метаданные на выходной порт в соответствии с метаданными на его входных портах.

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

Порты CROSS_JOIN:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даГлавный входной портлюбые
1-nнетВедомый входной порт(ы)
Output0даДля выходных записей

Атрибуты CROSS_JOIN:

АтрибутОбязательныйОписаниеВозможные значения
transform

нет2

Функция преобразования данных, определённая в графе

<attr name="transform"><![CDATA[
    function transform() {
        $out[0].id = $in[1].id;
        $out[0].name = $in[1].name;
        $out[0].test_data_id = $in[0].test_data_id;
        $out[0].tmstmp = $in[0].tmstmp;
        $out[0].category_id = $in[0].category_id;

        return ALL;
    }
    ]]>
</attr>
2

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

Пример.

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

Игроки первой команды:

Вася
Маша
Никита

Игроки второй команды:

Алёна
Петя
Лиза

Решение: Нужно только подключить источники данных к портам компонента CROSS_JOIN. Настройка атрибутов компонента не требуется.

В результате получится такой набор пар игроков в бильярд:

Вася | Алёна
Вася | Петя
Вася | Лиза
Маша | Алёна
Маша | Петя
Маша | Лиза
Никита | Алёна
Никита | Петя
Никита | Лиза

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

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

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

<Node id="m" type="Map">
    <Attr name="transform">
        <![CDATA[//...]]>
    </Attr>
</Node>

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

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

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

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

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


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

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


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

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

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

                return ALL;

Возвращаемые значения

ЗначениеОписаниеПример использования
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-, PATCH- и DELETE-запросы. Тип запроса указан в таблице для каждого метода.

Каждый URL начинается с http://<host:port>, за этим следует название метода и параметры, при необходимости. Например, запрос для получения информации о запуске графа может быть записан так: http://127.0.0.1:3000/api/run-by-id?id=14. В таблицах с описанием методов будут указаны относительные пути URL-запросов.

Список API-методов системы OneBridge, доступных для вызова:

Auth

login

ПараметрЗначение
ОписаниеЛогин
МетодPOST
URL запроса
/api/auth/login
Параметры запросабез параметров
Тело запроса
username: string,  
password: string
Структура ответа
access_token: string,   
refresh_token: string, необязательно
Пример ответа
{
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRlc3QwMyIsInBhc3N3b3JkX2NoYW5nZV9yZXF1aXJlZCI6dHJ1ZSwicmVsb2dfcmVxdWlyZWQiOmZhbHNlLCJwcml2aWxlZ2VzIjpbXSwiZXhwIjoxNzA1NTA2MjM5fQ.Ec1gQ9fR6MN5uNDejJbHk4vnKyySrnv2ZOs3nuoYNvQ",
  "refresh_token": ""
}

logout

ПараметрЗначение
ОписаниеЛогаут
МетодPOST
URL запроса
/api/auth/logout
Параметры запросабез параметров
Структура ответаничего не возвращает

refresh

ПараметрЗначение
ОписаниеРефреш токена
МетодPOST
URL запроса
/api/auth/refresh
Параметры запросабез параметров
Структура ответа
access_token: string,    
refresh_token: string
Пример ответа
{
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRlc3Q0IiwicGFzc3dvcmRfY2hhbmdlX3JlcXVpcmVkIjpmYWxzZSwicmVsb2dfcmVxdWlyZWQiOmZhbHNlLCJwcml2aWxlZ2VzIjpbXSwiZXhwIjoxNzA1NTYzNzk5fQ.YdxxXEr-1Ur8BB5nI27OZh3Ueo7BwFwJkx2vg8t44wA",
  "refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRlc3Q0IiwicGFzc3dvcmRfY2hhbmdlX3JlcXVpcmVkIjpmYWxzZSwicmVsb2dfcmVxdWlyZWQiOmZhbHNlLCJwcml2aWxlZ2VzIjpbXSwiZXhwIjoxNzA1NTYzNzk5fQ.MBJeIlWnI_BH3MT2TjfhfmoTFhTQGylhpMYu32G6tOw"
}

change password

ПараметрЗначение
ОписаниеСмена пароля
МетодPOST
URL запроса
/api/auth/change_password
Тело запроса
old_pass: string,
new_pass: string
Структура ответаничего не возвращает

Users

create user

ПараметрЗначение
ОписаниеСоздание пользователя
МетодPOST
URL запроса
/api/users
Параметры запросабез параметров
Тело запроса
username: string,     
first_name: string,     
last_name: string, необязательно    
email: string,  
Структура ответа
password: string 
Пример ответа
sNCYtII5bGcFRLJ9

toggle user status

ПараметрЗначение
ОписаниеИзменение статуса пользователя
МетодPOST
URL запроса
/api/users/username/toggle_status
Параметры запросабез параметров
Структура ответа
status: string, возможные значения: "Active", "Block"
Пример ответа
"Blocked"

reset user password

ПараметрЗначение
ОписаниеСброс пароля пользователя
МетодPOST
URL запроса
/api/users/username/reset_password
Параметры запросабез параметров
Структура ответа
password: string
Пример ответа
"B4YjaIGX8tTod6ZU"

update user

ПараметрЗначение
ОписаниеОбновление пользователя. Поменять можно first_name, last_name, email
МетодPATCH
URL запроса
/api/users/username
Параметры запросабез параметров
Тело запроса
first_name: string,    
last_name: string,    
email: string
Структура ответаничего не возвращает

view user

ПараметрЗначение
ОписаниеПросмотр пользователя
МетодGET
URL запроса
/api/users/username?type=full
Параметры запроса
type: string, возможные значения: "full", "basic"
Структура ответа
username: string, - логин пользователя,   
password: string, - пароль, всегда "null",  
first_name: string, - имя пользователя,     
last_name: string,  - фамилия пользователя, необязательно  
auth_method: string, - метод аутентификации в системе, возможные значения: "Internal", "Ldap",   
email: string, - адрес электронной почты пользователя,   
user_status: string, - статус пользователя, возможные значения: "Active", "Blocked",     
password_required: bool, - необходимость ввода пароля,   
last_login_status: string, - статус последнего входа, возможные значения: "NotSet", "Success", "Failure",   
login_attempts: integer, - количество попыток входа,   
last_login_date: date-time,  - дата последней попытки входа, необязательно
Пример ответа
auth_method: "Internal"
email: "sammi@ya.ru"
first_name: "sam"
last_login_date: "2024-01-15T09:37:37.246933528Z"
last_login_status: "Success"
last_name: "smit"
login_attempts: 0
password: null
password_required: false
user_status: "Active"
username: "samael"

list users

ПараметрЗначение
ОписаниеПросмотр списка пользователей
МетодGET
URL запроса
/api/users
Параметры запросаБез параметров
Структура ответа
username: string, - логин пользователя,   
password: string, - пароль, всегда "null",  
first_name: string, - имя пользователя,     
last_name: string,  - фамилия пользователя, необязательно  
auth_method: string, - метод аутентификации в системе, возможные значения: "Internal", "Ldap",   
email: string, - адрес электронной почты пользователя,   
user_status: string, - статус пользователя, возможные значения: "Active", "Blocked",     
password_required: bool, - необходимость ввода пароля,   
last_login_status: string, - статус последнего входа, возможные значения: "NotSet", "Success", "Failure",   
login_attempts: integer, - количество попыток входа,   
last_login_date: date-time,  - дата последней попытки входа, необязательно
Пример ответа
[
    {
        "username": "admin",
        "password": null,
        "first_name": "admin",
        "last_name": "",
        "auth_method": "Internal",
        "email": "",
        "user_status": "Active",
        "password_required": false,
        "last_login_status": "Success",
        "login_attempts": 0,
        "last_login_date": "2024-01-15T07:31:37.106209272Z"
    },
    {
        "username": "test01",
        "password": null,
        "first_name": "test",
        "last_name": "",
        "auth_method": "Internal",
        "email": "test@test.ru",
        "user_status": "Active",
        "password_required": false,
        "last_login_status": "NotSet",
        "login_attempts": 0,
        "last_login_date": "1970-01-01T00:00:00Z"
    },
    {
        "username": "test02",
        "password": null,
        "first_name": "test",
        "last_name": "",
        "auth_method": "Internal",
        "email": "test@test.ru",
        "user_status": "Active",
        "password_required": false,
        "last_login_status": "NotSet",
        "login_attempts": 0,
        "last_login_date": "1970-01-01T00:00:00Z"
    }
]

Roles

view all roles

ПараметрЗначение
ОписаниеПросмотр списка ролей
МетодGET
URL запроса
/api/roles
Параметры запросабез параметров
Структура ответа
role_id: integer,   
name: string, необязательно   
description: string, необязательно
Пример ответа
[
  {
    "role_id": 1,
    "name": "admin",
    "description": "Роль администратора"
  },
  {
    "role_id": 2,
    "name": "test-role1",
    "description": "something"
  },
  {
    "role_id": 3,
    "name": "test-role2",
    "description": "описание тестовой роли"
  },
  {
    "role_id": 4,
    "name": "testrole3",
    "description": "описание новой тестовой роли"
  }
]

view role

ПараметрЗначение
ОписаниеПросмотр конкретной роли по её id
МетодGET
URL запроса
/api/roles/id
Параметры запросабез параметров
Структура ответа
role_id: integer,   
name: string, необязательно   
description: string, необязательно
Пример ответа
[
  {
    "role_id": 1,
    "name": "admin",
    "description": "Роль администратора"
  }
]

create role

ПараметрЗначение
ОписаниеСоздание роли
МетодPOST
URL запроса
/api/roles
Параметры запросабез параметров
Тело запроса
name: string, - новое имя роли, необязательно  
description: string, - новое описание роли, необязательно
Пример ответаничего не возвращает

update role

ПараметрЗначение
ОписаниеОбновление роли
МетодPATCH
URL запроса
/api/roles/id
Параметры запросабез параметров
Тело запроса
name: string,
description: string    
Пример ответаничего не возвращает

delete role

ПараметрЗначение
ОписаниеУдаление роли
МетодDELETE
URL запроса
/api/roles/id
Параметры запросабез параметров
Структура ответаничего не возвращает

view all privileges

ПараметрЗначение
ОписаниеПросмотр списка всех существующих привилегий
МетодGET
URL запроса
/api/privileges
Параметры запросабез параметров
Структура ответа
privilege_id: integer,
name_ru: string,
name_en: string,
api_method_name: string
Пример ответа
[
  {
    "privilege_id": 1,
    "name_ru": "Создание пользователя",
    "name_en": "Create User",
    "api_method_name": "POST /users"
  },
  {
    "privilege_id": 2,
    "name_ru": "Изменение статуса пользователя",
    "name_en": "Toggle User Status",
    "api_method_name": "POST /users/:username/toggle_status"
  },
  {
    "privilege_id": 7,
    "name_ru": "Просмотр ролей",
    "name_en": "View Roles",
    "api_method_name": "GET /roles"
  },
  {
    "privilege_id": 19,
    "name_ru": "Просмотр параметров задания",
    "name_en": "View Job Parameters",
    "api_method_name": "GET /job_params"
  },
   {
    "privilege_id": 21,
    "name_ru": "Просмотр статистики запуска",
    "name_en": "View Run Stats",
    "api_method_name": "GET /runs/:id/stats"
  },
   {
    "privilege_id": 51,
    "name_ru": "Создание расписания",
    "name_en": "Create Schedule",
    "api_method_name": "POST /schedules"
  }
]

view role assigned privileges

ПараметрЗначение
ОписаниеПросмотр привилегий роли
МетодGET
URL запроса
/api/roles/privileges
Параметры запросабез параметров
Структура ответа
role_name: string,
privilege_api_method: string
Пример ответа
[
  {
    "role_name": "admin",
    "privilege_api_method": "POST /users"
  },
  {
    "role_name": "admin",
    "privilege_api_method": "POST /users/:username/toggle_status"
  },
  {
    "role_name": "admin",
    "privilege_api_method": "POST /users/:username/reset_password"
  },
  {
    "role_name": "admin",
    "privilege_api_method": "PATCH /users/:username"
  },
  {
    "role_name": "admin",
    "privilege_api_method": "GET /info"
  },
  {
    "role_name": "role03",
    "privilege_api_method": "GET /schedules"
  },
  {
    "role_name": "role03",
    "privilege_api_method": "POST /schedules"
  },
  {
    "role_name": "role03",
    "privilege_api_method": "PATCH /users/:username"
  },
  {
    "role_name": "testrole2",
    "privilege_api_method": "GET /users/:username"
  },
  {
    "role_name": "testrole2",
    "privilege_api_method": "GET /users"
  }
]

view role privileges

ПараметрЗначение
ОписаниеПросмотр привилегий роли
МетодGET
URL запроса
/api/roles/id/privileges
Параметры запросабез параметров
Структура ответа
id: privileges
Пример ответа
0: "POST /users"
1: "POST /users/:username/toggle_status"
2: "POST /users/:username/reset_password"
3: "PATCH /users/:username"
4: "GET /users/:username"
5: "GET /users"
6: "GET /roles"
7: "POST /roles"
8: "PATCH /roles/id"
9: "DELETE /roles/id"
10: "GET /roles/id/privileges"
11: "PATCH /roles/id/privileges"
12: "GET /roles/id/parent_roles"
13: "PATCH /roles/id/parent_roles"
14: "GET /users/id/roles"
15: "PATCH /users/id/roles"
16: "GET /users/id/privileges"
17: "PATCH /users/id/privileges"
18: "GET /job_params"
19: "GET /runs/id"
20: "GET /runs/id/stats"
21: "GET /runs/id/job_content"
22: "GET /runs/id/log"
23: "GET /runs/num"
24: "GET /runs/position"
25: "GET /runs"
26: "POST /runs"
27: "GET /event_listeners"
28: "POST /event_listeners"
29: "POST /event_listeners/toggle"
30: "PATCH /event_listeners/:name"
31: "POST /event_listeners/rename/:name"
32: "GET /file"
33: "POST /file"
34: "PATCH /file"
35: "POST /file/rename"
36: "DELETE /file"
37: "GET /directory"
38: "POST /directory"
39: "DELETE /directory"
40: "POST /directory/rename"
41: "GET /project"
42: "POST /project"
43: "DELETE /project"
44: "POST /project/rename"
45: "GET /tree"
46: "GET /utilization"
47: "GET /performance"
48: "GET /info"
49: "GET /schedules"
50: "POST /schedules"
51: "PATCH /schedules/:name"
52: "POST /schedules/toggle"
53: "DELETE /schedules/:name"
54: "POST /schedules/rename/:name"

update role privileges

ПараметрЗначение
ОписаниеОбновление привилегий роли
МетодPATCH
URL запроса
/api/roles/id/privileges
Параметры запросабез параметров
Тело запроса
{
  "privileges": [4,5,6]
}
Структура ответаничего не возвращает

view all assigned subroles

ПараметрЗначение
ОписаниеПросмотр всех присвоенных ролям субролей
МетодGET
URL запроса
/api/roles/subroles
Параметры запросабез параметров
Структура ответа
role_name: string,
subrole_name: string
Пример ответа
[
  {
    "role_name": "testrole1",
    "subrole_name": "admin"
  },
  {
    "role_name": "testrole1",
    "subrole_name": "testrole1"
  }
]

view role subroles

ПараметрЗначение
ОписаниеПросмотр субролей роли
МетодGET
URL запроса
/api/roles/id/subroles
Параметры запросабез параметров
Структура ответа
subrole_name: string
Пример ответа
[
  "admin",
  "testrole1"
]

update role subroles

ПараметрЗначение
ОписаниеИзменение субролей роли
МетодPATCH
URL запроса
/api/roles/id/subroles
Тело запроса
sub_roles: [список id субролей для роли, указываемой в URL-запросе]
Структура ответаничего не возвращает

view all assigned roles

ПараметрЗначение
ОписаниеПросмотр списка ролей, присвоенных каждому пользователю
МетодGET
URL запроса
/api/users/roles
Параметры запросабез параметров
Структура ответа
username: string,
role_name: string
Пример ответа
[
  {
    "username": "admin",
    "role_name": "admin"
  }
]

view user roles

ПараметрЗначение
ОписаниеПросмотр ролей конкретного пользователя
МетодGET
URL запроса
/api/users/username/roles
Параметры запросабез параметров
Структура ответа
role_name: string
Пример ответа
[
  "admin"
]

update user roles

ПараметрЗначение
ОписаниеОбновление ролей пользователя
МетодPATCH
URL запроса
/api/roles/id/roles
Тело запроса
"roles": [список id присваеваемых ролей]
Структура ответаничего не возвращает

view all privileges

ПараметрЗначение
ОписаниеПросмотр всех присвоеннных пользователям привилегий
МетодGET
URL запроса
/api/users/privileges
Параметры запросабез параметров
Структура ответа

view user assigned privileges

ПараметрЗначение
ОписаниеПросмотр привилегий пользователя
МетодGET
URL запроса
/api/users/username/privileges
Параметры запросабез параметров
Структура ответа

update user privileges

ПараметрЗначение
ОписаниеОбновление привилегий пользователя
МетодPATCH
URL запроса
/api/users/username/privileges
Тело запроса
"privileges": [список id присваемых пользователю привилегий]
Структура ответаничего не возвращает

Resources

get info

ПараметрЗначение
ОписаниеПросмотр основной информации о сервере
МетодGET
URL запроса
/api/info
Параметры запросабез параметров
Структура ответа
name: string,  
uptime: integer,  
local_time: date-time,  
utc_time: date-time.
Пример ответа

"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"

get performance

ПараметрЗначение
ОписаниеВозвращает данные о работе сервера для отображения графиков работы памяти и процессора
МетодGET
URL запроса
/api/performance
Параметры запросабез параметров
Структура ответа возвращает JSON файл со структурой, которая содержит объекты, описывающие состояние памяти и процессора:

ram: объект с информацией о памяти

datetime: date-time,  
total: string, 
used: string

cpu: объект с информацией о процессоре

datetime: date-time,
usage: string
Пример ответа

"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": []  }

get utilization

ПараметрЗначение
ОписаниеВозвращает данные о количеству используемой памяти сервера
МетодGET
URL запроса
/api/utilization
Параметры запросабез параметров
Структура ответа
name: string,
total: integer,
used: integer
Пример ответа

"name":"System RAM",
"total":16777785344,
"used":1351917568

Execution

get runs

ПараметрЗначение
ОписаниеВозвращает информацию об отработавшем задании
МетодGET
URL запроса
/api/runs?offset=0&limit=3
Параметры запроса
from: date-time, начало интервала работы графа, необязательно  
to: date-time, конец интервала работы графа, необязательно  
job_file: string, имя файла, необязательно  
status: string, статус выполнения, необязательно  
offset: integer, начальный индекс в актуальном списке запущенных заданий, необязательно   
limit: integer, количество записей, которые нужно прислать, необязательно   
order: string, порядок сортировки ответов, возможные значения: "Asc", "Desc", по умолчанию order = "Desc"
Структура ответа
id: string,  
parent_id: string, (необязательно)  
started: date-time,  
finished: date-time, (необязательно)  
job_file: string,  
status: string, возможные значения: "Succeeded", "Failed", "InProgress"
params: {
    JOB_FILE: string,
    SANDBOX_ROOT: string
}
Пример ответа
[
  {
    "id": "582",
    "parent_id": null,
    "started": "2024-01-19T08:10:06.071318370Z",
    "finished": "2024-01-19T08:10:06.078330903Z",
    "job_file": "/test-cases/graphs/flatFileReader05.grf",
    "status": "Failed",
    "params": {
      "JOB_FILE": "graphs/flatFileReader05.grf",
      "SANDBOX_ROOT": "../projects/test-cases"
    }
  },
  {
    "id": "581",
    "parent_id": null,
    "started": "2024-01-19T08:10:03.027899738Z",
    "finished": "2024-01-19T08:10:03.033412280Z",
    "job_file": "/test-cases/graphs/flatFileReader04.grf",
    "status": "Succeeded",
    "params": {
      "JOB_FILE": "graphs/flatFileReader04.grf",
      "SANDBOX_ROOT": "../projects/test-cases"
    }
  },
  {
    "id": "580",
    "parent_id": null,
    "started": "2024-01-19T08:09:59.364359664Z",
    "finished": "2024-01-19T08:09:59.369674486Z",
    "job_file": "/test-cases/graphs/flatFileReader03.grf",
    "status": "Failed",
    "params": {
      "JOB_FILE": "graphs/flatFileReader03.grf",
      "SANDBOX_ROOT": "../projects/test-cases"
    }
  }
]

post runs

ПараметрЗначение
Описаниезапускает задание в работу и возвращает номер запущенного задания
МетодPOST
URL запроса
/api/runs
Параметры запросабез параметров
Тело запроса
job_file: string, имя задания   
params: {        
    name: string, имя параметра  
    value: string, значение параметра  
}
Структура ответа
id: string
Пример ответа
"id":"162"

get run position

ПараметрЗначение
ОписаниеПросмотр данных о запуске задания
МетодGET
URL запроса
/api/runs/position?id=14
Параметры запроса
id: string
Структура ответа
position: integer
Пример ответа
{
  "position": 577
}

get run by id

ПараметрЗначение
ОписаниеВозвращает информацию об отработавшем задании
МетодGET
URL запроса
/api/runs/id
Параметры запросабез параметров
Структура ответа
id: string,  
parent_id: string, (необязательно)  
started: date-time,  
finished: date-time, (необязательно)  
job_file: string,  
status: string, возможные значения: "Succeeded", "Failed", "InProgress"
params: {
    JOB_FILE: string,
    SANDBOX_ROOT: string
}
Пример ответа
{
  "id": "576",
  "parent_id": null,
  "started": "2024-01-19T08:09:29.696150450Z",
  "finished": "2024-01-19T08:09:29.700902340Z",
  "job_file": "/test-cases/graphs/flatFileReader01_1.grf",
  "status": "Succeeded",
  "params": {
    "JOB_FILE": "graphs/flatFileReader01_1.grf",
    "SANDBOX_ROOT": "../projects/test-cases"
  }
}

get runs log

ПараметрЗначение
ОписаниеВозвращает журнал выполнения запуска задания
МетодGET
URL запроса
/api/runs/id/log?last_bytes=1024
Параметры запроса
last_bytes: integer, ограничение длины логов, необязательно
Структура ответаlog: string
Пример ответа
2024-01-17T18:51:13.214084Z  INFO edge started id="DataGenerator0:e-2"
2024-01-17T18:51:13.214109Z  INFO edge started id="DataGenerator1:e-1"
2024-01-17T18:51:13.214113Z  INFO edge started id="HashJoin0:e-2"
2024-01-17T18:51:13.214116Z  INFO edge started id="HashJoin0:e-3"
2024-01-17T18:51:13.274860Z  INFO node succeeded id="FlatFileWriter2" duration=0 received=2500 sent=0
2024-01-17T18:51:13.274890Z  INFO node succeeded id="FlatFileWriter3" duration=0 received=0 sent=0
2024-01-17T18:51:13.274898Z  INFO node succeeded id="HashJoin0" duration=0 received=5500 sent=2500
2024-01-17T18:51:13.274902Z  INFO node succeeded id="DataGenerator1" duration=0 received=0 sent=3000
2024-01-17T18:51:13.274906Z  INFO node succeeded id="DataGenerator0" duration=0 received=0 sent=2500
2024-01-17T18:51:13.274917Z  INFO phase finished number=0 duration=0

get runs num

ПараметрЗначение
ОписаниеВозвращает количество запусков заданий. Можно добавить фильтр по статусу, дате и имени файла
МетодGET
URL запроса
/api/runs/num?from=2023-12-31T21:00:00%2B00:00&to=2024-01-19T21:00:00%2B00:00&job_file=test-cases%2Fgraphs%2FflatFileReader05.grf&status=Failed
Параметры запроса
from: date-time, необязательный
to: date-time, необязательный
job_file: string, необязательный
status: string, необязательный, возможные значения: "Succeeded", "Failed", "InProgress"
Структура ответа
runs_num: integer, количество запусков заданий, подходящих под критерии установленных фильтров
Пример ответа
{
  "runs_num": 409
}

get run job content

ПараметрЗначение
ОписаниеВозвращает контент указанного задания, акутального на момент запуска
МетодGET
URL запроса
/api/runs/id/job_content
Параметры запроса
id: string
Структура ответа
content: string, контент файла
Пример ответа

"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Graph>\n    <Global>\n        <Metadata id=\"meta\">\n            <Record>\n                <Field name=\"foo\" type=\"integer\" />\n                <Field name=\"bar\" type=\"number\" />\n            </Record>\n        </Metadata>\n    </Global>\n    <Phase number=\"0\">\n        <Node id=\"datagen\" guiX=\"50\" guiY=\"200\" guiName=\"datagen\" recordsNumber=\"100\" type=\"DATA_GENERATOR\">\n            <attr name=\"generate\">\n                <![CDATA[\n                const MAX_FOO = 10;\n                const MAX_BAR = 1;\n                \n                function generate() {\n                    $out[0].foo = Math.floor(Math.random() * MAX_FOO);\n                    $out[0].bar = Math.random() * MAX_FOO;\n\n                    $out[1].foo = Math.floor(Math.random() * MAX_FOO);\n                    $out[1].bar = Math.random() * MAX_FOO;\n\n                    return ALL;\n                }\n                ]]>\n            </attr>\n        </Node>\n        <Node id=\"trash1\" guiX=\"200\" guiY=\"100\" guiName=\"trash\"  type=\"TRASH\"/>\n        <Node id=\"copy\"   guiX=\"200\" guiY=\"300\" guiName=\"copy\"   type=\"SIMPLE_COPY\"/>\n        <Node id=\"trash2\" guiX=\"400\" guiY=\"400\" guiName=\"trash2\"  type=\"TRASH\"/>\n        <Node id=\"filter\" guiX=\"400\" guiY=\"300\" guiName=\"filter\" type=\"FILTER\">\n            <attr name=\"filterExpression\">\n                <![CDATA[ $in[0].foo < 3; ]]>\n            </attr>\n        </Node>\n        <Node id=\"sort\" guiX=\"550\" guiY=\"300\" guiName=\"sort\"  type=\"FAST_SORT\" sortKey=\"foo(a);bar(d)\" sortInMemory=\"false\" />\n        <Node id=\"trash3\"    guiX=\"700\" guiY=\"300\" guiName=\"trash\" type=\"TRASH\"/>\n\n        <Edge id=\"edge1\" fromNode=\"datagen:0\" toNode=\"trash1:0\" metadata=\"meta\" /> \n        <Edge id=\"edge2\" fromNode=\"datagen:1\" toNode=\"copy:0\"   metadata=\"meta\" />\n        <Edge id=\"edge3\" fromNode=\"copy:0\"    toNode=\"filter:0\" metadata=\"meta\" /> \n        <Edge id=\"edge4\" fromNode=\"copy:1\"    toNode=\"trash2:0\" metadata=\"meta\" />\n        <Edge id=\"edge5\" fromNode=\"filter:0\"  toNode=\"sort:0\"   metadata=\"meta\" />\n        <Edge id=\"edge6\" fromNode=\"sort:0\"    toNode=\"trash3:0\" metadata=\"meta\" />\n    </Phase>\n</Graph>"

get run stats

ПараметрЗначение
ОписаниеВозвращает статистику об указанном запуске
МетодGET
URL запроса
/api/runs/id/stats
Параметры запросабез параметров
Структура ответа
id: integer {
    duration: integer,
    nodes: {
        node_name: string : {
            status: string,
            error: string,
            in_ports: [
                {
                    records: integer,
                    rps: integer,
                    max_rps: integer
                }
            ],
            out_ports: [
                {
                    records: integer,
                    rps: integer,
                    max_rps: integer
                }   
            ]
        }
    }
}
Пример ответа
{
  "10": {
    "duration": 0,
    "nodes": {
      "reader1": {
        "status": "Succeeded",
        "error": null,
        "in_ports": [],
        "out_ports": [
          {
            "records": 1,
            "rps": 0.0,
            "max_rps": 851.6240897203012
          }
        ]
      },
      "writer1": {
        "status": "Succeeded",
        "error": null,
        "in_ports": [
          {
            "records": 1,
            "rps": 0.0,
            "max_rps": 851.6240897203012
          }
        ],
        "out_ports": []
      }
    }
  },
  "20": {
    "duration": 0,
    "nodes": {
      "reader2": {
        "status": "Succeeded",
        "error": null,
        "in_ports": [],
        "out_ports": [
          {
            "records": 1,
            "rps": 0.0,
            "max_rps": 851.6240897203012
          }
        ]
      },
      "writer2": {
        "status": "Succeeded",
        "error": null,
        "in_ports": [
          {
            "records": 1,
            "rps": 0.0,
            "max_rps": 851.6240897203012
          }
        ],
        "out_ports": []
      }
    }
  },
  "30": {
    "duration": 0,
    "nodes": {
      "reader3": {
        "status": "Failed",
        "error": "the number of fields found (1) does not match the number of fields in metadata (2)",
        "in_ports": [],
        "out_ports": []
      },
      "writer3": {
        "status": "Aborted",
        "error": null,
        "in_ports": [],
        "out_ports": []
      }
    }
  }
}

Projects

get tree

ПараметрЗначение
ОписаниеВозвращает дерево проектов
МетодGET
URL запроса
/api/tree
Параметры запросабез параметров
Структура ответа
name: string,
path: string,
type: string,
children: [string]
Пример ответа
[
    {
        "name": "folder1",
        "path": "/folder1",
        "type": "project",
        "children": [
            {
                "name": "data-in",
                "path": "/folder1/data-in",
                "type": "directory",
                "children": [
                    {
                        "name": "dev.order.csv",
                        "path": "/folder1/data-in/testData/dev.order.csv",
                        "type": "file",
                        "children": []
                    }
                ],

                "name": "data-out",
                "path": "/folder1/data-out",
                "type": "directory",
                "children": [
                    {
                        "name": "testData",
                        "path": "/folder1/data-out/testData",
                        "type": "directory",
                        "children": []
                    }
                ],
                
                "name": "graph",
                "path": "/folder1/graph",
                "type": "directory",
                "children": [
                    {
                        "name": "graph.grf",
                        "path": "/folder1/graph/graph.grf",
                        "type": "file",
                        "children": []
                    }
                ]
            }
        ]
    }
]

get directory

ПараметрЗначение
ОписаниеВозвращает информацию об указанной папке
МетодGET
URL запроса
/api/directory?path="PATH"
Параметры запроса
path: string
Структура ответа
name: string,
path: string
Пример ответа
"name":"data-in",
"path":"/JobsForTests/data-in"

get project

ПараметрЗначение
ОписаниеВозвращает информацию об указанном проекте
МетодGET
URL запроса
/api/project?path="PATH"
Параметры запроса
path: string
Структура ответа
name: string,
path: string
Пример ответа
{
  "name": "test-cases",
  "path": "/test-cases"
}

get file

ПараметрЗначение
ОписаниеВозвращает информацию об выбранному файлу
МетодGET
URL запроса
/api/file?path="PATH"
Параметры запроса
path: string, путь к файлу
content: bool (необязательно, по умолчанию равен false, +"content=true" вернёт содержимое выбранного файла)
Структура ответа
name: string,
path: string,
size: integer,
modified: date-time
Пример ответа
"name":"concat.grf",
"path":"/JobsForTests/graph/others/concat.grf",
"size":1278,
"modified":"2023-04-17T12:47:39.073986214Z"

post project

ПараметрЗначение
ОписаниеСоздать проект
МетодPOST
URL запроса
/api/project?path="PATH"
Параметры запроса
path: string, путь к создаваемому проекту
template: bool, флаг создания проекта по шаблону, необязательно
Структура ответа
name: string,
path: string
Пример ответа
"name":"test2",
"path":"/test2"

post project rename

ПараметрЗначение
ОписаниеПереименовать проект
МетодPOST
URL запроса
/api/project/rename?path="PATH"&to="PROJECT"
Параметры запроса
path: string, путь к проекту, который переименовываем
to: string, новое имя проекта
Структура ответа
name: string,
path: string
Пример ответа
"name":"test44",
"path":"/test44"

post directory

ПараметрЗначение
ОписаниеСоздать директорию
МетодPOST
URL запроса
/api/directory?path="PATH"
Параметры запроса
path: string, путь к директории, которую создаём
Структура ответа
name: string,
path: string
Пример ответа
"name":"infolder",
"path":"/test-project/folder1"

post directory rename

ПараметрЗначение
ОписаниеИзменить название директории
МетодPOST
URL запроса
/api/directory/rename?path="PATH"&to="DIRECTORY"
Параметры запроса
path: string, путь к директории, которую переименовываем
to: string новое имя директории
Структура ответа
name: string,
path: string
Пример ответа
"name":" folder10",
"path":"/test22/folder10"

post file

ПараметрЗначение
ОписаниеСоздать файл
МетодPOST
URL запроса
/api/file?path="PATH"
Параметры запроса
path: string, путь к новому файлу
Структура ответа
name: string,
path: string,
size: integer,
modified: date-time
Пример ответа
"name": "kudo.grf",
"path": "/test44/tururu/lalala/kuku/oshshshs/kudo.grf",
"size": 0,
"modified": "2023-06-15T08:10:21.261541736Z"

post file rename

ПараметрЗначение
ОписаниеПереименовать файл
МетодPOST
URL запроса
/api/file/rename?path="PATH"&to="FILE"
Параметры запроса
path: string, директория файла, который переименовывается
to: string, новое имя файла
Структура ответа
name: string,
path: string,
size: integer,
modified: date-time
Пример ответа
"name": "fileNEW",
"path": "/test44/tururu/lalala/kuku/bip/fileNEW",
"size": 0,
"modified": "2023-06-14T14:04:37.625674537Z"

patch file

ПараметрЗначение
ОписаниеЗаменить контент файла
МетодPATCH
URL запроса
/api/file?path="PATH"
Параметры запроса
path: string, путь к изменяемому файлу  
sent_file: string, текст изменённого файла
Структура ответа
name: string,
path: string,
size: integer,
modified: date-time
Пример ответа
{
    "name": "dg02_out.txt",
    "path": "/test-cases/data-out/dg02_out.txt",
    "size": 13,
    "modified": "2024-01-18T08:37:47.819450853Z"
}

delete directory

ПараметрЗначение
ОписаниеУдалить директорию
МетодDELETE
URL запроса
/api/directory?path="PATH"
Параметры запроса
path: string, путь к удаляемой папке
Структура ответаничего не возвращает

delete file

ПараметрЗначение
ОписаниеУдалить файл
МетодDELETE
URL запроса
/api/file?path="PATH"
Параметры запроса
path: string, путь к удаляемому файлу
Структура ответаничего не возвращает

delete project

ПараметрЗначение
ОписаниеУдалить проект
МетодDELETE
URL запроса
/api/project?path="PATH"
Параметры запроса
path: string, путь к удаляемому проекту
Структура ответаничего не возвращает

Schedules

get schedules

ПараметрЗначение
ОписаниеПросмотреть список расписаний
МетодGET
URL запроса
/api/schedules?name_contains=test
Параметры запроса
name_contains: string, необязательно
Структура ответа
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, (необязательно)  
Пример ответа
[
  {
    "name": "test1",
    "enabled": true,
    "once": "2024-01-18T09:03:03Z",
    "active_from": null,
    "active_to": null,
    "job_file": "/JobsForTests/graph/others/copy_01.grf",
    "params": [],
    "last_run": null,
    "next_run": "2024-01-18T09:03:03Z"
  }
]

post schedules

ПараметрЗначение
ОписаниеСоздать расписание
МетодPOST
URL запроса
/api/schedules
Параметры запросабез параметров
Тело запроса
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, необязательно
Пример ответа
"last_run":null,
"next_run":"2023-06-15T11:07:21Z"

post schedules toggle

ПараметрЗначение
ОписаниеИзменить состояние расписания (вкл/выкл)
МетодPOST
URL запроса
/api/schedules/toggle?name=schedule_name
Параметры запроса
name: string
Структура ответа
enabled: bool,
next_run: date-time, необязательно
Пример ответа
"enabled":false,
"next_run":null

post schedules rename

ПараметрЗначение
ОписаниеИзменить название расписания
МетодPOST
URL запроса
/api/schedules/rename/old_name?to=new_name
Параметры запроса
to: string
Структура ответа
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,
Пример ответа
{
  "name": "new_name",
  "enabled": true,
  "once": "2024-01-24T21:10:05Z",
  "active_from": null,
  "active_to": null,
  "job_file": "/JobsForTests/graph/BH-T-281/BHT281_map2.grf",
  "params": [],
  "last_run": null
}

delete schedule

ПараметрЗначение
ОписаниеУдалить расписание
МетодDELETE
URL запроса
/api/schedules/schedule_name
Параметры запросабез параметров
Структура ответаничего не возвращает

patch schedules

ПараметрЗначение
ОписаниеИзменить атрибуты расписания
МетодPATCH
URL запроса
/api/schedules/schedule_name
Параметры запросабез параметров
Тело запроса
enabled: bool,  (не обязательно)
trigger:        (не обязательно)
         "Once": date-time или
         "Interval": integer или
         "Cron": string,
active_from: date-time, (не обязательно)
active_to: date-time,   (не обязательно)
job_file: string,       (не обязательно)
params: vec[],          (не обязательно)
Структура ответа
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,
Пример ответа
"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"

Event listeners

get event listeners

ПараметрЗначение
ОписаниеВозвращает список обработчиков событий
МетодGET
URL запроса
/api/event_listeners
Параметры запроса
name_contains: string, необязательно
Структура ответа
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
Пример ответа

"name":"stub abc",
"enabled":true,
"event":{
    "job":{
        "finished":{
            "job_file":"/proj1/alice_bob.xml"}}},
"action":{
    "command":{
        "program":"bash",
        "args":["-c","ls"]}},
"last_run":null

post event listeners

ПараметрЗначение
ОписаниеСоздает обработчик событий
МетодPOST
URL запроса
/api/event_listeners
Параметры запросабез параметров
Тело запроса
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
URL запроса
/api/event_listeners/toggle?name=listener_name
Параметры запроса
name: string
Структура ответа
enabled: bool
Пример ответа
{
  "enabled": true
}

post event listeners rename

ПараметрЗначение
ОписаниеИзменить название обработчика событий
МетодPOST
URL запроса
/api/event_listeners/rename/old_name?to=new_name
Параметры запроса
to: string
Структура ответаничего не возвращает

delete event listeners

ПараметрЗначение
ОписаниеУдалить обработчик событий
МетодDELETE
URL запроса
/api/event_listeners/listener_name
Параметры запросабез параметров
Структура ответаничего не возвращает

patch event listeners

ПараметрЗначение
ОписаниеИзменить значения атрибутов обработчика событий
МетодPATCH
URL запроса
/api/event_listeners/listener_name
Тело запроса Все поля опциональные. Но при смене типа события 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,
            ]
        } 
Структура ответа
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,
            }
        }
Пример ответа
{
    "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": []
        }
    }
}