Цель программы: использовать sql-like синтаксис для работы с csv-файлами.
Основные операции: AND
, OR
, =
, <
, >
.
Пример запроса:
SELECT region, country, item_type, sales_channel, total_cost, total_profit FROM sales WHERE country = 'South Africa' AND item_type = 'Clothes' and sales_channel='Online' AND total_profit > 400000;
"Особенности":
- В конце запроса в обязательном порядке должна стоять
;
- Оператор
AND
имеет приоритет над операторомOR
Загрузка csv-файла
\load file.csv config.yaml
Формат yaml-файла
name: tablename # Наименование таблицы
sep: ',' # Разделитель значений
lazyQuotes: true # true, если значения заключены в двойные кавычки
fields: # Список полей в таблице
- name: lastname # Наименование поля
type: string # Тип поля: string или number
- name: firstname
type: string
- name: salary
type: number
Список загруженных таблиц
\list
Удаление таблицы
\drop tablename
Направления зависимостей между пакетами приведены ниже.
flowchart LR;
subgraph app
App
end
subgraph parser
SelectStmt
end
subgraph scanner
Token
TokenType
Scanner
end
subgraph table
LogicalOperation
CompareValueOperation
Value
Table
Formatter
subgraph operation
DummyValueOperation
OrOperation
AndOperation
end
subgraph value
NumberValue
StringValue
end
subgraph formatter
DefaultFormatter
end
end
SelectStmt-->LogicalOperation
SelectStmt-->Token
SelectStmt-->CompareValueOperation
SelectStmt-->TokenType
DummyValueOperation-. implements .->LogicalOperation
OrOperation-. implements .->LogicalOperation
AndOperation-. implements .->LogicalOperation
NumberValue-. implements .->Value
StringValue-. implements .->Value
Table-- Contains -->Value
DefaultFormatter-. implements .->Formatter
App-- use-->Table
App-- use-->Scanner
App-- use-->SelectStmt
App-- use-->LogicalOperation
- (CSVDB-1) Реализовать простейший парсер выражения
where
- (CSVDB-2) Подключить линтер и устранить его замечания
- (CSVDB-3) Настроить pre-commit хук
- (CSVDB-4) Настроить github actions
- (CSVDB-5) Описать структуру хранения данных, полученных из csv-файла
- (CSVDB-6) Описать доступные операции над данными
- (CSVDB-7) Реализовать построение плана запроса из разобранного выражения
where
- (CSVDB-8) Реализовать загрузку файла в RAM
- (CSVDB-9) Реализовать конфигурирование посредством yaml-файла
- (CSVDB-10) Реализовать секцию
from
- (CSVDB-11) Реализовать секцию
select
- (CSVDB-12) Перенести логирование в файлы
access.log
иerror.log
- (CSVDB-13) Gracefull shutdown
- (CSVDB-14) Добавить build приложения и установку golangci-lint в Makefile
- (CSVDB-15) Добавить build в pre-commit hook
- (CSVDB-16) Избавиться от глобальных переменных
- (CSVDB-17) Перенести текстовые переменные в константы
- (CSVDB-18) Передавать логгер в явном виде
- (CSVDB-19) Покрыть тестами
github.com/stepan2volkov/csvdb/internal/app/table/operation/helper.go
- (CSVDB-20) Обработка контекста в handleInput(ctx) и приложении
- (CSVDB-21) Добавить больше логов
- (CSVDB-22) Рассмотреть возможности для распараллеливания
После скачивания репозитория требуется подключить pre-commit хук, чтобы выявлять проблемы до заливки кода к репозиторий. Для этого требуется устновить фреймворк для управления хуками. Инструкцию по устновке можно найти здесь.
После этого потребуется один раз выполнить:
pre-commit install
После этого хук будет срабатывать автоматически.