Приложение, предоставляющее сервис работы с данными в БД. Данный сервис, на основании входных параметров(аргументы командной строки), типа операции и входного файла – извлекает необходимые данные из БД и формирует результат обработки в выходной файл. Ошибки обрабатываются и фиксируются в выходном файле.
Используемый стек: java 8, PostgreSQL, Maven, Spring Boot
Входные параметры: тип операции, путь к входному файлу, путь к файлу результата
Формат файлов: JSON
Входные файлы для тестирования - в папке src/test
Таблицы в БД для тестирования создаются и заполняются автоматически при первом запускею Перед запуском внесите в resources/application.yml путь к базе данных, имя пользователя БД и пароль.
Сборка: mvn clean package -DskipTests
Пример запуска: java - jar json_db_service-0.0.1-SNAPSHOT.jar search searchinput.json searchoutput.json
Покупатели(имя, фамилия)
Товары(название, цена)
Покупки(покупатель, товар, дата покупки)
Операции определяются по входному параметру
Во входном файле передаётся список критериев для поиска покупателей. Результат операции - списки покупателей для каждого критерия из запроса. Порядок списков такой же как в запросе, порядок покупателей в списке — произвольный
Критерии:
- Фамилия — поиск покупателей с этой фамилией
- Название товара и число раз — поиск покупателей, купивших этот товар не менее, чем указанное число раз
- Минимальная и максимальная стоимость всех покупок — поиск покупателей, у которых общая стоимость всех покупок за всё время попадает в интервал
- Число пассивных покупателей — поиск покупателей, купивших меньше всего товаров. Возвращается не более, чем указанное число покупателей. Важно: Критерии могут повторяться, например, два раза критерий с lastName.
Пример:
INPUT
{
"criterias": [
{"lastName": "Иванов"}, //Фамилия
{"productName": "Минеральная вода", "minTimes": 5}, // Название товара и число раз
{"minExpenses": 112, "maxExpenses": 4000}, //Минимальная и максимальная стоимость всех покупок
{"badCustomers": 3} //Число пассивных покупателей
]
}
OUTPUT
{
"type": "search", // Тип результата
"results": [ // Списки покупателей
{
"criteria": {"lastName": "Иванов"}, // Критерий из запроса
"results": [ // Список покупателей
{"lastName: "Иванов", "firstName": "Антон"}, // Фамилия и имя покупателя
{"lastName: "Иванов", "firstName": "Николай"}
...
]
},
{
"criteria": {"productName": "Минеральная вода", "minTimes": 5}, // Критерий из запроса
"results": [
{"lastName": "Петров", "firstName": "Валентин"}, // Фамилия и имя покупателя
...
]
},
...
]
}
Во входном файле передаётся интервал дат сбора статистики. Результат операции - статистика по покупателям за период из двух дат, включительно, без выходных Необходимые данные для статистики на примере результата:
INPUT
{
"startDate": "2021-01-14", // Начальная дата
"endDate": "2021-01-26" // Конечная дата
}
OUTPUT
{
"type": "stat" // Тип результата
"totalDays": 9, // Общее число дней за период из двух дат, включительно, без выходных
"customers": [ // Данные по покупателям за этот период, упорядоченные по общей стоимости покупок по убыванию
{ // Данные первого покупателя
"name": "Иванов Антон", // Фамилия и имя покупателя
"purchases": [ // Список всех уникальных товаров, купленных покупателем за этот период, упорядоченных по суммарной стоимости по убыванию
{
"name": "Хлеб", // Название товара
"expenses": 540 // Суммарная стоимость всех покупок этого товара за период
},
{
"name": "Сметана",
"expenses": 517
},
{
"name": "Колбаса",
"expenses": 332
},
...
],
"totalExpenses": 4100 // Общая стоимость покупок этого покупателя за период (то есть сумма всех стоимостей покупок всех товаров)
},
{ // Данные второго покупателя
"name": "Петров Валентин",
"purchases": [
{
"name": "Сыр",
"expenses": 470
},
{
"name": "Хлеб",
"expenses": 300
},
{
"name": "Минеральная вода",
"expenses": 120
},
...
],
"totalExpenses": 3700
},
...
],
"totalExpenses": 19920, // Сумма покупок всех покупателей за период
"avgExpenses": 3455.72 // Средние затраты всех покупателей за период
}
OUTPUT
{
"type": "error", // Тип результата
"message": "Неправильный формат даты" // Описание ошибки
}
- Денежные суммы в базе хранятся в копейках для точности. Во входных и выходных файлах суммы - в рублях.
- Если приложение не может создать указанный выходной файл (в т.ч. если он уже существует),то выходной файл создается в каталоге запуска с именем output.json