Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PopularCategories #14

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 76 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,37 +1,105 @@
# Тестовое задание для отбора на Летнюю ИТ-школу КРОК по разработке
## Тестовое задание для отбора на Летнюю ИТ-школу КРОК по разработке

## Условие задания
### Условие задания
Один развивающийся и перспективный маркетплейс активно растет в настоящее время. Текущая команда разработки вовсю занята тем, что развивает ядро системы. Помимо этого, перед CTO маркетплейса стоит задача — разработать подсистему аналитики, которая на основе накопленных данных формировала бы разнообразные отчеты и статистику.

Вы — компания подрядчик, с которой маркетплейс заключил рамочный договор на выполнение работ по разработке этой подсистемы. В рамках первого этапа вы условились провести работы по прототипированию и определению целевого технологического стека и общих подходов к разработке.

На одном из совещаний с Заказчиком вы определили задачу, на которой будете выполнять работы по прототипированию. В качестве такой задачи была выбрана разработка отчета о наиболее популярных категориях товаров, продаваемых во время подготовки новогодних подарков покупателями.

Аналитики со стороны маркетплейса предоставили небольшой срез массива данных (файл format.json) о совершенных покупках пользователей за 4-й квартал 2023 года, на примере которого вы смогли бы ознакомиться с форматом входных данных. Каждая запись данного среза содержит следующую информацию:

- Дата и время оформления заказа;
- Корзина.

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

- Идентификатор товара;
- Наименование товара;
- Категория.

В свою очередь сведения о категории представлены в следующем виде:

- Идентификатор категории;
- Наименование категории.

Необходимо разработать отчет, определяющий категории товаров, наиболее популярные перед Новым годом. Если популярных категорий товаров больше, чем одна, отчет должен показывать их все. Предновогодним периодом будем считать срок с 1 по 31 декабря.

Требования к реализации:
### Требования к реализации:

1. Реализация должна содержать, как минимум, одну процедуру (функцию/метод), отвечающую за формирование отчета, и должна быть описана в readme.md в соответствии с чек-листом;
2. В качестве входных данных программа использует json-файл (input.json), соответствующий структуре, описанной в условиях задания;
3. Процедура (функция/метод) формирования отчета должна возвращать строку в формате json следующего формата:
- {«categories»: [«Бытовая техника»]}
- {«categories»: [«Бытовая техника», «Косметика»]}

{«categories»: [«Бытовая техника»]}
{«categories»: [«Бытовая техника», «Косметика»]}

4. Найденная в соответствии с условием задачи категория должна выводиться в изначальном наименовании, приведенном в файле с входными данными. Если таких категорий несколько, то на вывод они все подаются в алфавитном порядке.

## Автор решения
### Автор решения
Платонов Даниил \
почта: platonov.danik@bk.ru \
tg: p_danik

### Описание реализации

Проект `PopularCategories` представляет собой программу для анализа данных о покупках пользователей в маркетплейсе. Основная цель программы - определить наиболее популярные категории товаров, продаваемых перед Новым годом.

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

- **Главный класс: `PopularCategories`**
- Основной класс программы, содержащий точку входа `main` и методы для чтения данных из JSON-файла, подсчета количества категорий, нахождения самых популярных категорий и генерации отчета.

- **Классы моделей: `OrderData`, `ItemData`, `CategoryData`**
- Классы, представляющие структуру данных о заказах, товарах и категориях в маркетплейсе. Они используются для десериализации JSON-данных в Java-объекты.

#### Основные методы

- `readDataFromJson(String fileName, Type type)`
- Метод для чтения данных из JSON-файла и их десериализации в указанный тип объекта.

- `countCategories(List<OrderData> orders)`
- Метод для подсчета количества каждой категории товаров в списке заказов, сделанных в декабре.

- `findPopularCategories(Map<String, Integer> categoryCounts)`
- Метод для определения наиболее популярных категорий на основе количества каждой категории.

- `generateReport(List<String> popularCategories)`
- Метод для генерации JSON-отчета на основе списка популярных категорий.

#### Используемые библиотеки

- **Gson**
- Используется для десериализации JSON-данных в Java-объекты и сериализации Java-объектов в JSON-формат.

- **SLF4J (Simple Logging Facade for Java)**
- Используется для логирования информации о выполнении программы.


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

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

1. **Сборка проекта**
- Сборка проекта выполняется с помощью Apache Maven. Для очистки исходных и скомпилированных файлов, а также компиляции исходного кода, используйте следующие команды:

```bash
mvn clean compile
```
- После успешной компиляции исходного кода вы можете продолжить сборку проекта и упаковку его в jar-файл с зависимостями.

2. **Упаковка проекта в jar-файл**
- Для упаковки проекта в jar-файл вместе с зависимостями, используйте следующую команду:

```bash
mvn package assembly:single
```
- Эта команда соберет проект, упакует его в jar-файл и включит в него все необходимые зависимости.

## Описание реализации
3. **Запуск приложения**
- После успешной сборки проекта перейдите в каталог `target`. Для запуска приложения используйте следующую команду:

## Инструкция по сборке и запуску решения
```bash
java -jar MarketAnalytic-1.0-SNAPSHOT-jar-with-dependencies.jar
```
- Эта команда запустит приложение, и оно начнет анализировать данные и генерировать отчет.
66 changes: 66 additions & 0 deletions application.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
2024-04-29 03:47:00.753 [main] INFO org.example.PopularCategories - Starting...
2024-04-29 03:47:00.809 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 03:47:00.812 [main] INFO org.example.PopularCategories - Finding popular categories...
2024-04-29 03:47:00.817 [main] INFO org.example.PopularCategories - Generating report...
2024-04-29 03:47:12.218 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 03:47:12.244 [main] INFO org.example.PopularCategories - Finding popular categories...
2024-04-29 03:47:12.250 [main] INFO org.example.PopularCategories - Generating report...
2024-04-29 03:47:39.694 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 03:47:39.714 [main] INFO org.example.PopularCategories - Finding popular categories...
2024-04-29 03:47:39.721 [main] INFO org.example.PopularCategories - Generating report...
2024-04-29 05:02:05.715 [main] INFO org.example.PopularCategories - Starting...
2024-04-29 05:02:05.752 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 05:02:05.755 [main] INFO org.example.PopularCategories - Finding popular categories...
2024-04-29 05:02:05.759 [main] INFO org.example.PopularCategories - Generating report...
2024-04-29 06:53:57.024 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 06:53:57.053 [main] INFO org.example.PopularCategories - Finding popular categories...
2024-04-29 06:53:57.064 [main] INFO org.example.PopularCategories - Generating report...
2024-04-29 06:55:08.704 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 06:55:08.734 [main] INFO org.example.PopularCategories - Finding popular categories...
2024-04-29 06:55:08.744 [main] INFO org.example.PopularCategories - Generating report...
2024-04-29 06:55:19.750 [main] INFO org.example.PopularCategories - Starting...
2024-04-29 06:55:19.810 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 06:55:50.206 [main] INFO org.example.PopularCategories - Starting...
2024-04-29 06:55:50.256 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 06:55:50.259 [main] INFO org.example.PopularCategories - Finding popular categories...
2024-04-29 06:55:50.265 [main] INFO org.example.PopularCategories - Generating report...
2024-04-29 06:55:50.271 [main] INFO org.example.PopularCategories - {"categories":["бытовая техника"]}
2024-04-29 06:56:18.454 [main] INFO org.example.PopularCategories - Starting...
2024-04-29 06:56:18.496 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 06:56:18.499 [main] INFO org.example.PopularCategories - Finding popular categories...
2024-04-29 06:56:18.504 [main] INFO org.example.PopularCategories - Generating report...
2024-04-29 06:57:23.567 [main] INFO org.example.PopularCategories - Starting...
2024-04-29 06:57:23.621 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 06:58:08.561 [main] INFO org.example.PopularCategories - Starting...
2024-04-29 06:58:08.617 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 06:59:30.540 [main] INFO org.example.PopularCategories - Starting...
2024-04-29 06:59:30.595 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 06:59:30.598 [main] INFO org.example.PopularCategories - Finding popular categories...
2024-04-29 06:59:30.605 [main] INFO org.example.PopularCategories - Generating report...
2024-04-29 06:59:30.611 [main] INFO org.example.PopularCategories - {"categories":["бытовая техника"]}
2024-04-29 07:00:05.158 [main] INFO org.example.PopularCategories - Starting...
2024-04-29 07:00:05.214 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 07:00:05.217 [main] INFO org.example.PopularCategories - Finding popular categories...
2024-04-29 07:00:05.223 [main] INFO org.example.PopularCategories - Generating report...
2024-04-29 07:00:05.229 [main] INFO org.example.PopularCategories - {"categories":["бытовая техника"]}
2024-04-29 07:00:25.770 [main] INFO org.example.PopularCategories - Starting...
2024-04-29 07:00:25.822 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 07:00:25.825 [main] INFO org.example.PopularCategories - Finding popular categories...
2024-04-29 07:00:25.831 [main] INFO org.example.PopularCategories - Generating report...
2024-04-29 07:00:25.836 [main] INFO org.example.PopularCategories - {"categories":["бытовая техника"]}
2024-04-29 07:01:12.539 [main] INFO org.example.PopularCategories - Starting...
2024-04-29 07:01:12.596 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 07:02:45.747 [main] INFO org.example.PopularCategories - Starting...
2024-04-29 07:02:45.803 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 07:02:45.806 [main] INFO org.example.PopularCategories - Finding popular categories...
2024-04-29 07:02:45.813 [main] INFO org.example.PopularCategories - Generating report...
2024-04-29 07:02:45.818 [main] INFO org.example.PopularCategories - {"categories":["бытовая техника"]}
2024-04-29 07:02:54.619 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 07:02:54.641 [main] INFO org.example.PopularCategories - Finding popular categories...
2024-04-29 07:02:54.649 [main] INFO org.example.PopularCategories - Generating report...
2024-04-29 07:03:00.897 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 07:03:00.916 [main] INFO org.example.PopularCategories - Finding popular categories...
2024-04-29 07:03:00.924 [main] INFO org.example.PopularCategories - Generating report...
2024-04-29 07:04:40.028 [main] INFO org.example.PopularCategories - Counting categories...
2024-04-29 07:04:40.056 [main] INFO org.example.PopularCategories - Finding popular categories...
2024-04-29 07:04:40.064 [main] INFO org.example.PopularCategories - Generating report...
63 changes: 63 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>MarketAnalytic</artifactId>
<version>1.0-SNAPSHOT</version>

<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>org.example.PopularCategories</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>

<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.9.0</version>
</dependency>

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.10.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.12</version>
</dependency>

<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.14</version>
</dependency>
</dependencies>


<properties>
<maven.compiler.source>19</maven.compiler.source>
<maven.compiler.target>19</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

</project>
14 changes: 14 additions & 0 deletions src/main/java/org/example/CategoryData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.example;

public class CategoryData {

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}
33 changes: 33 additions & 0 deletions src/main/java/org/example/ItemData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.example;

public class ItemData {

private String id;
private String name;
private CategoryData category;

public String getId() {
return id;
}

public String getName() {
return name;
}

public CategoryData getCategory() {
return category;
}

public void setId(String id) {
this.id = id;
}

public void setName(String name) {
this.name = name;
}

public void setCategory(CategoryData category) {
this.category = category;
}
}

25 changes: 25 additions & 0 deletions src/main/java/org/example/OrderData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.example;

import java.util.List;

public class OrderData {

private String ordered_at;
private List<ItemData> items;

public String getOrderedAt() {
return ordered_at;
}

public void setOrderedAt(String ordered_at) {
this.ordered_at = ordered_at;
}

public List<ItemData> getItems() {
return items;
}

public void setItems(List<ItemData> items) {
this.items = items;
}
}
Loading