Необходимо написать консольную программу, которая по заданному клиентом запросу осуществляет поиск данных в CSV-файлах, своего рода простенький исполнитель SQL запросов.
При запуске программа должна предлагать пользователю ввести через командную строку поисковой запрос, сформированный в виде набора условий column_name OP value [AND/OR column_name OP value] …
Например, age > 40 AND status = “sick”
Критерии приемки:
- При запуске программа печатает путь до исполняемого файла и версию последнего коммита
- Программа должна корректно обрабатывать выход по сигналу SIGINT, прерывая поиск, если он запущен
- Программа должна получать настройки из текстового конфигурационного файла (например, в TOML формате) при старте
- Программа должна завершать исполнение запроса, если он занимает слишком продолжительное время (значение таймаута задается в конфигурационном файле)
- Программа должна логировать все запросы в файл access.log, логировать все ошибки (например, остановку пользователем или прерывания по таймауту, невалидные запросы пользователя) в error.log
- Код должен быть покрыт тестами (test coverage хотя бы 30%)
- Код должен быть организован согласно выбранным принципам, например можно использовать project-layout для вдохновения
- Должен быть создан конфигурационный файл для golangci-lint
- При коммите в локальный репозиторий в автоматическом режиме должно происходить следующее:
- make test - должен запускать тесты и печатать отчет о coverage
- make check - должен запускать все линтеры
- Прогграмма обрабатывает запрос, с возможностью выбора полей для вывода (выводит в "raw" формате)
- Программа обрабатывает сигнал и завершает все через контекст
- Программа считывает настройки из файла
config.yaml
по умолчанию или по адресу, указанному при запуске во флагеconfig
- Программа завершает запрос, если время превышает таймаут, указанный в конфиге
- программа логирует данные в файл, указанный в конфиге в
logfile:
, если там не указан путь до файла, то программа выводит логи вstderr
- Код покрыт тестами они могут быть запущены при помощи команды
make test
- Код "пытался быть организованным" согласно принципам
Hexagonal Architecture
- Конфигурационный файл
golangci-lint
создан - При помощи Github Actions при коммите запускаются проверки линтерами и тесты
Можно запустить используя make run
, тогда будет напечатан хеш последнего коммита, выбран стандартный файл конфигурации.
Программа предложит ввести запрос к таблице:
По умолчанию в репозитории выбрана таблица small.csv
с небольшим количеством записей
Стандартный запрос может выглядеть так:
SELECT * FROM table -- имя таблицы - любое, потому что фактическая таблица берется из конфига
WHERE club = sevilla or not pts < 33
Ограничения:
- пока не работает запрос без условия
- не нужно ставить
;
в конце - нет выбора таблице в запросе (только через конфиг)
- работают только операции сравнение
<, >, <=, >=, =
и логические операцииOR, NOT, AND
- Запросы можно вводить в любом регистре, но вся обработка происходит в нижнем, поэтому при запросе не дифференцируются значения с разным регистром
- Вывод таблицы нужно сделать в виде ... таблицы
- Не сделана обработка пустого запроса вида
SELECT * FROM table
если повезет исправить до проверки, то исправлю, но готов к снижению даже в случае исправления
-
Проверка только однословного значения
-
Самая большая проблема - высокая связность модулей, старался решить эту проблему за счет интерфесов, но, как мне кажется не очень удачно.
-
Остутсвие возможности легкого расширени из-за проблемы из предыдущего пункта
- Добавлена обработка запроса без условия
- Добавлен консольный вывод