Setest / bigimport

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Тестовое задание:

Задачи:

Вы имеете две сущности: Категория, Товар с следующими полями:

Category:
id (int)
title (string length min: 3, max 12)
eId (int|null)

Product:
id (int)
categories (связь: ManyToMany)
title (string length min: 3, max 12)
price (float range min: 0, max 200)
eId (int|null)

*eId – произвольный id из любой другой системы

Вам необходимо реализовать консольную команду, которая читает два нижеприведенных файла Json и добавляет/обновляет записи в БД:

- файл categories.json имеет не более 100 строк
- файл products.json имеет ~ 3млн. строк
- учесть валидацию данных

categories.json:
[
{"eId": 1, "title": "Category 1"},
{ "eId": 2,"title": "Category 2"},
{ "eId": 2,"title": "Category 33333333"},
... + ~ 100 rows
]

products.json
[
{"eId": 1, "title": "Product 1", "price": 101.01, "categoriesEId": [1,2]},
{"eId": 2, "title": "Product 2", "price": 199.01, "categoryEId": [2,3]},
{"eId": 3, "title": "Product 33333333", "price": 999.01, "categoryEId": [3,1]},
... + ~ 3000000 rows
]

Комментарий

В основе использовал части symfony, nette для работы с БД вместо ORM, и maxakawizard/json-collection-parser - это потоковый JSON ридер, можно было и самому наколхозить через генераторы, но не вижу смысла. Все обернуто в докер.

В постановке задачи меня смутило совпадение идентификаторов eId в категорВ основе использовал части symfony, nette для работы с БД вместо ORM, и maxakawizard/json-collection-parser - это потоковый JSON ридер, можно было и самому наколхозить через генераторы, но не вижу смысла. Все обернуто в докер.

В постановке задачи меня смутило совпадение идентификаторов eId в категории, поэтому я не стал рассчитывать на поле eId как на uid. И упростил логику без многочисленных проверок и связей. Засунул в data тестовые данные - не хорошо понимаю.

Тут много чего не хватает, к примеру инсертов с мультивставками, нормальные транзакции, кешера при импорте категорий, чтобы сократить кол-во обращений к БД, правильной валидации, логеров ошибок, метрик, да и вообще изначальных условий ( нет данных уникальности полей, странное совпадение eId, не указано существования таблицы свзей, без нее должно быть поле типа массив, либо JSON хранилище, не понятно, так не знаю как будет использоваться в дальнейшем), нет тестов, но в целом получилось близко к MVP.

При импорте если происходит контроллируемая ошибка при валидации либо на существование значения в БД, операция импорта не прерывается, а переходит к след записи. ии, поэтому я не стал рассчитывать на поле eId как на uid. И упростил логику без многочисленных проверок и связей. Засунул в data тестовые данные - не хорошо понимаю.

Тут много чего не хватает, к примеру инсертов с мультивставками, нормальные транзакции, кешера при импорте категорий, чтобы сократить кол-во обращений к БД, правильной валидации, логеров ошибок, метрик, да и вообще изначальных условий ( нет данных уникальности полей, странное совпадение eId, не указано существования таблицы свзей, без нее должно быть поле типа массив, либо JSON хранилище, не понятно, так не знаю как будет использоваться в дальнейшем), нет тестов, но в целом получилось близко к MVP.

При импорте если происходит контроллируемая ошибка при валидации либо на существование значения в БД, операция импорта не прерывается, а переходит к след записи.

Установка

composer install
cp .env_dev .env
chmod +x start.sh
chmod +x stop.sh
chmod +x stop.sh
./start.sh

Запуск с тестовыми данными

chmod +x import.sh

Запуск из докера Сначала ложим файлики в /var/www/data

cd /var/www/
php bin/console import data/categories.json data/products.json

About


Languages

Language:PHP 72.7%Language:Dockerfile 15.5%Language:Shell 11.8%