1
0
mirror of https://github.com/ToxicCrack/PrintABrick.git synced 2025-05-31 19:20:13 -07:00

Create missing parts referenced by FK

This commit is contained in:
David Hübner 2017-04-13 18:55:58 +02:00
parent 254add244d
commit 438497f5ca
4 changed files with 68 additions and 21 deletions

View File

@ -24,13 +24,19 @@ class ThemeFilterType extends AbstractType
{ {
$builder->add('id', Filters\ChoiceFilterType::class, [ $builder->add('id', Filters\ChoiceFilterType::class, [
'choices' => $this->rebrickableManager->FindAllThemes(), 'choices' => $this->rebrickableManager->FindAllThemes(),
'choice_label' => function ($allChoices, $currentChoiceKey) { 'choice_label' => function ($theme, $currentChoiceKey) {
if($parent = $theme->getParent()) {
dump($currentChoiceKey); if($parentParent = $parent->getParent()) {
if($parentParentParent = $parentParent->getParent()) {
$parent = $allChoices->getParent(); return $parentParentParent->getName().' > '.$parentParent->getName().' > '.$parent->getName().' > '.$theme->getName();
}
return $parent ? $parent->getName().' > '.$allChoices->getName() : $allChoices->getName(); return $parentParent->getName().' > '.$parent->getName().' > '.$theme->getName();
} else {
return $parent->getName().' > '.$theme->getName();
}
} else {
return $theme->getName();
}
}, },
'label' => 'filter.set.theme', 'label' => 'filter.set.theme',
]); ]);

View File

@ -2,8 +2,10 @@
namespace AppBundle\Repository\Rebrickable; namespace AppBundle\Repository\Rebrickable;
use AppBundle\Entity\LDraw\Category;
use AppBundle\Entity\Rebrickable\Inventory; use AppBundle\Entity\Rebrickable\Inventory;
use AppBundle\Entity\Rebrickable\Inventory_Part; use AppBundle\Entity\Rebrickable\Inventory_Part;
use AppBundle\Entity\Rebrickable\Part;
use AppBundle\Entity\Rebrickable\Set; use AppBundle\Entity\Rebrickable\Set;
use AppBundle\Repository\BaseRepository; use AppBundle\Repository\BaseRepository;
use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\Query\Expr\Join;
@ -12,13 +14,14 @@ class Inventory_PartRepository extends BaseRepository
{ {
public function findAllRegularBySetNumber($number) public function findAllRegularBySetNumber($number)
{ {
$queryBuilder = $this->createQueryBuilder('inventory_part');
$inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number); $inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number);
$queryBuilder $queryBuilder = $this->createQueryBuilder('inventory_part')
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = :inventory') ->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = inventory')
->setParameter('inventory', $inventory->getId()) ->join(Part::class,'part',JOIN::WITH,'inventory_part.part = part.number')
->where('part.category != 17')
->andWhere('inventory.id = :inventoryId')
->setParameter('inventoryId', $inventory->getId())
->andWhere('inventory_part.spare = FALSE') ->andWhere('inventory_part.spare = FALSE')
->distinct(true); ->distinct(true);
@ -27,13 +30,14 @@ class Inventory_PartRepository extends BaseRepository
public function findAllSpareBySetNumber($number) public function findAllSpareBySetNumber($number)
{ {
$queryBuilder = $this->createQueryBuilder('inventory_part');
$inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number); $inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number);
$queryBuilder $queryBuilder = $this->createQueryBuilder('inventory_part')
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = :inventory') ->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = inventory')
->setParameter('inventory', $inventory->getId()) ->join(Part::class,'part',JOIN::WITH,'inventory_part.part = part.number')
->where('part.category != 17')
->andWhere('inventory.id = :inventoryId')
->setParameter('inventoryId', $inventory->getId())
->andWhere('inventory_part.spare = TRUE') ->andWhere('inventory_part.spare = TRUE')
->distinct(true); ->distinct(true);

View File

@ -8,11 +8,24 @@ use AppBundle\Entity\Rebrickable\Inventory_Part;
use AppBundle\Entity\Rebrickable\Inventory_Set; use AppBundle\Entity\Rebrickable\Inventory_Set;
use AppBundle\Entity\Rebrickable\Part; use AppBundle\Entity\Rebrickable\Part;
use AppBundle\Entity\Rebrickable\Set; use AppBundle\Entity\Rebrickable\Set;
use AppBundle\Entity\Rebrickable\Theme;
use AppBundle\Repository\BaseRepository; use AppBundle\Repository\BaseRepository;
use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\Query\Expr\Join;
class SetRepository extends BaseRepository class SetRepository extends BaseRepository
{ {
public function findAllByTheme(Theme $theme) {
dump($this->getEntityManager()->getRepository(Theme::class)->findAllSubthemes($theme));
$queryBuilder = $this->createQueryBuilder('s')
->join(Theme::class, 'theme',Join::WITH, 's.theme = theme')
->where('theme.id = :id')
->setParameter('id', $theme->getId());
return $queryBuilder->getQuery()->getResult();
}
public function findAllByPartNumber($number) public function findAllByPartNumber($number)
{ {
$queryBuilder = $this->createQueryBuilder('s') $queryBuilder = $this->createQueryBuilder('s')

View File

@ -2,7 +2,11 @@
namespace AppBundle\Service\Loader; 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 AppBundle\Entity\Rebrickable\Set;
use Doctrine\ORM\Query\Expr\Join;
//TODO Refactor + validate csv files //TODO Refactor + validate csv files
class RebrickableLoaderService extends BaseLoaderService class RebrickableLoaderService extends BaseLoaderService
@ -24,18 +28,22 @@ class RebrickableLoaderService extends BaseLoaderService
try { try {
$connection->beginTransaction(); $connection->beginTransaction();
$connection->prepare('SET foreign_key_checks = 0;')->execute(); $connection->prepare('SET foreign_key_checks = 0;')->execute();
$this->truncateTables(); $this->truncateTables();
$connection->prepare('SET foreign_key_checks = 1;')->execute();
$this->loadColorTable(); $this->loadColorTable();
$this->loadPartTable();
$this->loadCategoryTable(); $this->loadCategoryTable();
$this->loadPartTable();
$this->loadThemeTable(); $this->loadThemeTable();
$this->loadSetTable(); $this->loadSetTable();
$this->loadInventoryTable(); $this->loadInventoryTable();
$this->loadInventoryPartTable();
$this->loadInventorySetTable(); $this->loadInventorySetTable();
$connection->prepare('SET foreign_key_checks = 0;')->execute();
$this->loadInventoryPartTable();
$connection->prepare('SET foreign_key_checks = 1;')->execute(); $connection->prepare('SET foreign_key_checks = 1;')->execute();
$this->addMissingParts();
$connection->commit(); $connection->commit();
} catch (\Exception $e) { } catch (\Exception $e) {
$connection->rollBack(); $connection->rollBack();
@ -49,11 +57,11 @@ class RebrickableLoaderService extends BaseLoaderService
TRUNCATE TABLE rebrickable_inventory_parts; TRUNCATE TABLE rebrickable_inventory_parts;
TRUNCATE TABLE rebrickable_inventory_sets; TRUNCATE TABLE rebrickable_inventory_sets;
TRUNCATE TABLE rebrickable_color; TRUNCATE TABLE rebrickable_color;
TRUNCATE TABLE rebrickable_category;
TRUNCATE TABLE rebrickable_inventory; TRUNCATE TABLE rebrickable_inventory;
TRUNCATE TABLE rebrickable_set; TRUNCATE TABLE rebrickable_set;
TRUNCATE TABLE rebrickable_theme; TRUNCATE TABLE rebrickable_theme;
TRUNCATE TABLE rebrickable_part; TRUNCATE TABLE rebrickable_part;
TRUNCATE TABLE rebrickable_category;
'; ';
return $this->em->getConnection()->prepare($query)->execute(); return $this->em->getConnection()->prepare($query)->execute();
@ -70,6 +78,22 @@ class RebrickableLoaderService extends BaseLoaderService
return $this->em->getConnection()->prepare($query)->execute(); 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() private function loadInventoryTable()
{ {
$file = $this->downloadFile($this->rebrickable_url.'inventories.csv'); $file = $this->downloadFile($this->rebrickable_url.'inventories.csv');