1
0
mirror of https://github.com/ToxicCrack/PrintABrick.git synced 2025-06-23 14:30:23 -07:00
PrintABrick/src/AppBundle/Service/Loader/RebrickableLoaderService.php
2017-04-13 18:55:58 +02:00

153 lines
5.0 KiB
PHP

<?php
namespace AppBundle\Service\Loader;
use AppBundle\Entity\Rebrickable\Inventory_Part;
use AppBundle\Entity\Rebrickable\Inventory_Set;
use AppBundle\Entity\Rebrickable\Part;
use AppBundle\Entity\Rebrickable\Set;
use Doctrine\ORM\Query\Expr\Join;
//TODO Refactor + validate csv files
class RebrickableLoaderService extends BaseLoaderService
{
private $rebrickable_url;
/**
* ModelLoaderService constructor.
*/
public function __construct($rebrickable_url)
{
$this->rebrickable_url = $rebrickable_url;
}
public function loadTables()
{
$connection = $this->em->getConnection();
try {
$connection->beginTransaction();
$connection->prepare('SET foreign_key_checks = 0;')->execute();
$this->truncateTables();
$connection->prepare('SET foreign_key_checks = 1;')->execute();
$this->loadColorTable();
$this->loadCategoryTable();
$this->loadPartTable();
$this->loadThemeTable();
$this->loadSetTable();
$this->loadInventoryTable();
$this->loadInventorySetTable();
$connection->prepare('SET foreign_key_checks = 0;')->execute();
$this->loadInventoryPartTable();
$connection->prepare('SET foreign_key_checks = 1;')->execute();
$this->addMissingParts();
$connection->commit();
} catch (\Exception $e) {
$connection->rollBack();
throw $e;
}
}
private function truncateTables()
{
$query ='
TRUNCATE TABLE rebrickable_inventory_parts;
TRUNCATE TABLE rebrickable_inventory_sets;
TRUNCATE TABLE rebrickable_color;
TRUNCATE TABLE rebrickable_category;
TRUNCATE TABLE rebrickable_inventory;
TRUNCATE TABLE rebrickable_set;
TRUNCATE TABLE rebrickable_theme;
TRUNCATE TABLE rebrickable_part;
';
return $this->em->getConnection()->prepare($query)->execute();
}
private function loadCsvFile($file, $table, $columns)
{
$query = sprintf("LOAD DATA LOCAL INFILE '%s'
REPLACE INTO TABLE %s
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY '\\n'
IGNORE 1 LINES %s", addslashes($file), $table, $columns);
return $this->em->getConnection()->prepare($query)->execute();
}
private function addMissingParts() {
$connection = $this->em->getConnection();
$statement = $connection->prepare(
'SELECT DISTINCT rebrickable_inventory_parts.part_id FROM rebrickable_inventory_parts
LEFT JOIN rebrickable_part ON rebrickable_inventory_parts.part_id = rebrickable_part.id
WHERE rebrickable_part.id IS NULL');
$statement->execute();
$foreignKeys = $statement->fetchAll();
foreach ($foreignKeys as $foreignKey) {
$part = new Part();
$part->setNumber($foreignKey['part_id']);
$this->em->getRepository(Part::class)->save($part);
}
}
private function loadInventoryTable()
{
$file = $this->downloadFile($this->rebrickable_url.'inventories.csv');
return $this->loadCsvFile($file, 'rebrickable_inventory', '(`id`,`version`,`set_id`)');
}
private function loadInventoryPartTable()
{
$file = $this->downloadFile($this->rebrickable_url.'inventory_parts.csv');
return $this->loadCsvFile($file, 'rebrickable_inventory_parts', '(`inventory_id`,`part_id`,`color_id`,`quantity`, @var) SET spare = IF(@var=\'t\',1,0)');
}
private function loadInventorySetTable()
{
$file = $this->downloadFile($this->rebrickable_url.'inventory_sets.csv');
return $this->loadCsvFile($file, 'rebrickable_inventory_sets', '(`inventory_id`,`set_id`,`quantity`)');
}
private function loadSetTable()
{
$file = $this->downloadFile($this->rebrickable_url.'sets.csv');
return $this->loadCsvFile($file, 'rebrickable_set', '(`id`,`name`,`year`,`theme_id`,`num_parts`)');
}
private function loadThemeTable()
{
$file = $this->downloadFile($this->rebrickable_url.'themes.csv');
return $this->loadCsvFile($file, 'rebrickable_theme', '(`id`,`name`,@var) SET parent_id = nullif(@var,\'\')');
}
private function loadPartTable()
{
$file = $this->downloadFile($this->rebrickable_url.'parts.csv');
return $this->loadCsvFile($file, 'rebrickable_part', '(`id`,`name`,`category_id`)');
}
private function loadCategoryTable()
{
$file = $this->downloadFile($this->rebrickable_url.'part_categories.csv');
return $this->loadCsvFile($file, 'rebrickable_category', '(`id`,`name`)');
}
private function loadColorTable()
{
$file = $this->downloadFile($this->rebrickable_url.'colors.csv');
return $this->loadCsvFile($file, 'rebrickable_color', '(`id`,`name`,`rgb`, @var) SET transparent = IF(@var=\'t\',1,0)');
}
}