Skip to content

Repository files navigation

SimpleDAG

Проект SimpleDAG — это система для обработки данных из CSV-файлов с использованием направленного ациклического графа (DAG). Программа позволяет настраивать операции через YAML-конфигурации и выполнять их в последовательности, задаваемой пользователем с помощью графа зависимостей.

Содержание

Обзор

SimpleDAG позволяет:

  • Загружать данные из CSV-файлов.
  • Настраивать операции обработки данных через YAML-конфигурации.
  • Строить граф выполнения операций на основе пользовательской схемы.
  • Выполнять операции в правильном порядке с использованием обхода в глубину.
  • Логировать процесс выполнения и результаты.

Поддерживаемые операции:

  • Числовые: сумма (sum), среднее значение (average).
  • Строковые: конкатенация (concatinate).

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

.
├── data/                 # Директория с данными и конфигурациями
│   ├── test.csv         # Пример CSV-файла с данными
│   ├── test.yaml        # Пример YAML-конфигурации
│   └── *.yaml           # Другие конфигурационные файлы
├── docs/                # Документация
├── include/             # Заголовочные файлы
│   ├── graph.h          # Структуры и функции для работы с графами
│   ├── graphics.h       # Графические элементы (логотип, инструкции)
│   ├── operations.h     # Операции обработки данных
│   ├── parser.h         # Парсеры конфигураций и CSV
│   ├── router.h         # Маршрутизатор утилиты
│   └── utils.h          # Вспомогательные утилиты
├── libs/                # Внешние библиотеки
│   └── Tiny_Yaml/       # Парсер YAML-файлов
├── src/                 # Исходный код
│   ├── graph.cpp        # Реализация работы с графами
│   ├── operations.cpp   # Реализация операций
│   ├── parser.cpp       # Реализация парсеров
│   ├── router.cpp       # Реализация маршрутизатора
│   └── utils.cpp        # Реализация утилит
├── tests/               # Тесты
│   ├── graph/           # Тесты графов
│   ├── operations/      # Тесты операций
│   ├── parser/          # Тесты парсеров
│   └── utils/           # Тесты утилит
├── main.cpp             # Главная программа
├── Makefile             # Файл сборки
└── README.md            # Документация

Требования

  • g++ с поддержкой C++17
  • Make (утилита для сборки)
  • Git (для клонирования репозитория)
  • googletest (для запуска тестов)

Совместимые ОС: Ubuntu, Arch Linux, macOS

Сборка и запуск

1. Установка зависимостей

Ubuntu

sudo apt-get update
sudo apt-get install -y build-essential libgtest-dev

cd /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make
sudo cp lib/*.a /usr/lib

Arch Linux

sudo pacman -Syu
sudo pacman -S gtest

macOS

brew update
brew install googletest

2. Клонирование репозитория

git clone https://github.com/AlexeyL54/SimpleDAG.git
cd SimpleDAG

3. Сборка основной программы

make
./SimpleDAG.out

4. Сборка и запуск тестов

Тесты расположены в соответствующих поддиректориях tests/ и покрывают:

  • Создание и управление графами
  • Корректность операций обработки данных
  • Парсинг конфигураций и CSV-файлов
  • Вспомогательные утилиты и логирование
# Сборка всех тестов (через скрипт)
./buildTests.sh

# Или сборка отдельных тестов (только на Ubuntu, Arch Linux)
cd tests/operations && make
cd ../graph && make
cd ../parser && make
cd ../utils && make

# Запуск всех тестов (через скрипт)
./runTests.sh

# Запуск отдельных тестов
./tests/operations/test_operations.out
./tests/graph/test_graph.out
./tests/parser/test_parser.out
./tests/utils/test_utils.out

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

1. Подготовка данных

Поместите CSV-файл с данными и YAML-конфигурацию в директорию data/. В YAML-конфигурации в поле path укажите название CSV-файла, который нужно обработать.

2. Процесс работы

  1. Выбор конфигурации: Программа отобразит список доступных YAML-файлов в директории data/.
  2. Проверка конфигурации: Система проверит наличие всех указанных операций и корректность их описания.
  3. Просмотр операций: Будет отображен список доступных операций с их идентификаторами.
  4. Ввод схемы графа: Пользователь вводит последовательности операций в формате 1->2->3.
  5. Выполнение: Программа построит граф и выполнит операции в правильном порядке (топологическая сортировка).
  6. Логирование: Результаты сохраняются в файл лога с меткой времени.

3. Формат ввода схемы графа

Вводите связи между операциями (их номерами) в формате ->. Для завершения ввода введите end.

Пример:

1->2->3
1->4->5
2->4
end

Эта схема создаст граф, где:

  • Операция 1 выполняется перед 2 и 4.
  • Операция 2 выполняется перед 3 и 4.
  • Операция 4 выполняется перед 5.

Важные замечания:

  • Если ввести ветвь, не связанную с начальными операциями (например, 4->5 без указания, как добраться до 4 из других узлов), она не будет выполнена.
  • Строго соблюдайте формат ->. Неверные форматы (например, 1-2->3 или 1>2->3) приведут к тому, что некорректные ребра не будут добавлены в граф.

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

Пример YAML-конфигурации (data/test.yaml)

path: test.csv
operations:
  sum_elements_of_column_1:
    func: sum
    column: 0
  average_of_column_1:
    func: average
    column: 0
  concat_strings:
    func: concatinate
    column: 3

Описание полей конфигурации:

  • path: Путь к CSV-файлу относительно директории data/.
  • operations: Словарь операций, где:
    • Ключ: Уникальный идентификатор операции (используется для логирования).
    • func: Тип операции (sum, average, concatinate).
    • column: Номер столбца для обработки (индексация с 0).

Архитектура

Основные компоненты:

  1. Graph Module (graph.h/cpp): Управление направленным ациклическим графом операций (построение, обход, топологическая сортировка).
  2. Operations Module (operations.h/cpp): Реализация операций обработки данных.
  3. Parser Module (parser.h/cpp): Чтение и парсинг конфигураций YAML и CSV-файлов.
  4. Utils Module (utils.h/cpp): Вспомогательные функции, текстовый пользовательский интерфейс (TUI) и логирование.
  5. Graphics Module (graphics.h): Визуальные элементы интерфейса (логотип, инструкции).
  6. Router Module (router.h/cpp): Маршрутизация и управление workflow утилиты.

Поток выполнения:

  1. Загрузка и парсинг YAML-конфигурации.
  2. Чтение и загрузка данных из указанного CSV-файла.
  3. Построение графа операций на основе пользовательской схемы.
  4. Обход графа (топологическая сортировка) и последовательное выполнение операций.
  5. Сохранение результатов и процесса работы в лог-файл.

Лицензия

Основной код проекта распространяется под лицензией MIT.

Проект использует библиотеку Tiny_Yaml, которая распространяется под собственной лицензией. Подробности смотрите в файле libs/Tiny_Yaml/LICENSE.

About

A simple analog of apache airflow.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages