Skip to content

Latest commit

 

History

History
149 lines (131 loc) · 7.45 KB

README.md

File metadata and controls

149 lines (131 loc) · 7.45 KB

JSON DB SERVICE

Инструкция по сборке/запуску

Общее описание

Приложение, предоставляющее сервис работы с данными в БД. Данный сервис, на основании входных параметров(аргументы командной строки), типа операции и входного файла – извлекает необходимые данные из БД и формирует результат обработки в выходной файл. Ошибки обрабатываются и фиксируются в выходном файле.

Используемый стек: 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

Структура данных

Покупатели(имя, фамилия)
Товары(название, цена)
Покупки(покупатель, товар, дата покупки)

Типы и Описание операций

Операции определяются по входному параметру

Поиск покупателей по критериям (search)

Во входном файле передаётся список критериев для поиска покупателей. Результат операции - списки покупателей для каждого критерия из запроса. Порядок списков такой же как в запросе, порядок покупателей в списке — произвольный

Критерии:

  1. Фамилия — поиск покупателей с этой фамилией
  2. Название товара и число раз — поиск покупателей, купивших этот товар не менее, чем указанное число раз
  3. Минимальная и максимальная стоимость всех покупок — поиск покупателей, у которых общая стоимость всех покупок за всё время попадает в интервал
  4. Число пассивных покупателей — поиск покупателей, купивших меньше всего товаров. Возвращается не более, чем указанное число покупателей. Важно: Критерии могут повторяться, например, два раза критерий с 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": "Валентин"}, // Фамилия и имя покупателя
...
]
},
...
]
}

Статистика за период (stat)

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

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