From 78ce9a9e64f63754f32ba74e17c6a479c44e07ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20H=C3=BCbner?= Date: Wed, 17 May 2017 20:21:08 +0200 Subject: [PATCH] Change NumberTrait to use id variable --- src/AppBundle/Controller/ModelController.php | 41 ++++++------ .../Controller/Rebrickable/PartController.php | 6 +- src/AppBundle/Controller/SearchController.php | 46 ++++++++++--- src/AppBundle/Controller/SetController.php | 67 ++++++++++--------- src/AppBundle/Entity/Rebrickable/Theme.php | 11 +++ src/AppBundle/Entity/Traits/NumberTrait.php | 12 ++-- .../Repository/LDraw/AliasRepository.php | 4 +- .../Repository/LDraw/ModelRepository.php | 47 ++++--------- .../Rebrickable/Inventory_PartRepository.php | 5 +- .../Repository/Rebrickable/SetRepository.php | 47 ++++++++----- .../Rebrickable/ThemeRepository.php | 11 ++- .../Service/Loader/RebrickableLoader.php | 2 +- .../Service/Loader/RelationLoader.php | 4 +- src/AppBundle/Service/ModelService.php | 4 +- src/AppBundle/Service/SetService.php | 36 +++++----- src/AppBundle/Service/ZipService.php | 16 ++--- 16 files changed, 199 insertions(+), 160 deletions(-) diff --git a/src/AppBundle/Controller/ModelController.php b/src/AppBundle/Controller/ModelController.php index 015693d..e63ce00 100644 --- a/src/AppBundle/Controller/ModelController.php +++ b/src/AppBundle/Controller/ModelController.php @@ -3,9 +3,8 @@ namespace AppBundle\Controller; use AppBundle\Entity\LDraw\Model; -use AppBundle\Entity\Rebrickable\Part; -use AppBundle\Entity\Rebrickable\Set; -use AppBundle\Form\Filter\Model\ModelFilterType; +use AppBundle\Form\Search\ModelSearchType; +use AppBundle\Model\ModelSearch; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; @@ -24,27 +23,29 @@ class ModelController extends Controller * Lists all part entities. * * @Route("/", name="model_index") - * @Method("GET") */ public function indexAction(Request $request) { - $form = $this->get('form.factory')->create(ModelFilterType::class); + $modelSearch = new ModelSearch(); - $filterBuilder = $this->get('repository.ldraw.model')->getFilteredQueryBuilder(); + $form = $this->get('form.factory')->createNamedBuilder('m', ModelSearchType::class, $modelSearch)->getForm(); + $form->handleRequest($request); - if ($request->query->has($form->getName())) { - // manually bind values from the request - $form->submit($request->query->get($form->getName())); + $elasticaManager = $this->get('fos_elastica.manager'); + $results = $elasticaManager->getRepository(Model::class)->search($modelSearch); - // build the query from the given form object - $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($form, $filterBuilder); - } + $paginator = $this->get('knp_paginator'); + $sets = $paginator->paginate( + $results, + $request->query->getInt('page', 1)/*page number*/, + $request->query->getInt('limit', 30)/*limit per page*/ + ); $paginator = $this->get('knp_paginator'); $models = $paginator->paginate( - $filterBuilder->getQuery(), + $results, $request->query->getInt('page', 1)/*page number*/, - $request->query->getInt('limit', 40)/*limit per page*/ + $request->query->getInt('limit', 30)/*limit per page*/ ); return $this->render('model/index.html.twig', [ @@ -56,20 +57,20 @@ class ModelController extends Controller /** * Finds and displays a model entity. * - * @Route("/{number}", name="model_detail") + * @Route("/{id}", name="model_detail") * @Method("GET") */ - public function detailAction($number) + public function detailAction($id) { /** @var Model $model */ - if ($model = $this->get('repository.ldraw.model')->findOneByNumber($number)) { + if ($model = $this->get('repository.ldraw.model')->findOneByNumber($id)) { try { $subparts = $this->get('service.model')->getAllSubparts($model); $rbParts = $model != null ? $this->get('repository.rebrickable.part')->findAllByModel($model) : null; $sets = $model != null ? $this->get('repository.rebrickable.set')->findAllByModel($model) : null; - $related = $this->get('repository.ldraw.model')->findAllRelatedModels($model->getNumber()); + $related = $this->get('repository.ldraw.model')->findAllRelatedModels($model->getId()); return $this->render('model/detail.html.twig', [ 'model' => $model, @@ -87,7 +88,7 @@ class ModelController extends Controller } /** - * @Route("/{number}/zip", name="model_zip") + * @Route("/{id}/zip", name="model_zip") * @Method("GET") */ public function zipAction(Request $request, Model $model) @@ -100,7 +101,7 @@ class ModelController extends Controller // Create the disposition of the file $disposition = $response->headers->makeDisposition( ResponseHeaderBag::DISPOSITION_ATTACHMENT, - "model_{$model->getNumber()}_{$model->getName()}.zip" + "model_{$model->getId()}_{$model->getName()}.zip" ); $response->headers->set('Content-Disposition', $disposition); diff --git a/src/AppBundle/Controller/Rebrickable/PartController.php b/src/AppBundle/Controller/Rebrickable/PartController.php index 35bfc86..870b481 100644 --- a/src/AppBundle/Controller/Rebrickable/PartController.php +++ b/src/AppBundle/Controller/Rebrickable/PartController.php @@ -18,7 +18,7 @@ class PartController extends Controller /** * Finds and displays a part entity. * - * @Route("/{number}", name="reb_part_detail") + * @Route("/{id}", name="reb_part_detail") */ public function detailAction(Part $part) { @@ -28,14 +28,14 @@ class PartController extends Controller if ($part) { try { - $apiPart = $this->get('api.manager.rebrickable')->getPart($part->getNumber()); + $apiPart = $this->get('api.manager.rebrickable')->getPart($part->getId()); } catch (EmptyResponseException $e) { $this->addFlash('warning', 'Part not found'); } catch (\Exception $e) { $this->addFlash('error', $e->getMessage()); } - $sets = $part != null ? $em->getRepository(Set::class)->findAllByPartNumber($part->getNumber()) : null; + $sets = $part != null ? $em->getRepository(Set::class)->findAllByPartNumber($part->getId()) : null; return $this->render('rebrickable/part/detail.html.twig', [ 'part' => $part, diff --git a/src/AppBundle/Controller/SearchController.php b/src/AppBundle/Controller/SearchController.php index f7899b9..3f6888d 100644 --- a/src/AppBundle/Controller/SearchController.php +++ b/src/AppBundle/Controller/SearchController.php @@ -4,6 +4,7 @@ namespace AppBundle\Controller; use AppBundle\Entity\LDraw\Model; use AppBundle\Entity\Rebrickable\Set; +use FOS\ElasticaBundle\Repository; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\JsonResponse; @@ -23,12 +24,22 @@ class SearchController extends Controller { $query = trim(strip_tags($request->get('query'))); - $modelsResult = $this->get('repository.ldraw.model')->findByQuery($query); - $setsResult = $this->get('repository.rebrickable.set')->findByQuery($query); + /** var FOS\ElasticaBundle\Manager\RepositoryManager */ + $repositoryManager = $this->get('fos_elastica.manager'); + + /** @var Repository $setRepository */ + $setRepository = $repositoryManager->getRepository(Set::class); + /** @var Repository $modelRepository */ + $modelRepository = $repositoryManager->getRepository(Model::class); + + // Option 1. Returns all users who have example.net in any of their mapped fields + $setsResult = $setRepository->find($query, 5000); + $modelResult = $modelRepository->find($query, 5000); return $this->render('search/index.html.twig', [ 'sets' => $setsResult, - 'models' => $modelsResult, + 'models' => $modelResult, + 'query' => $query, ]); } @@ -39,25 +50,33 @@ class SearchController extends Controller { $query = trim(strip_tags($request->get('query'))); - $modelsResult = $this->get('repository.ldraw.model')->findByQuery($query, 7); + /** var FOS\ElasticaBundle\Manager\RepositoryManager */ + $repositoryManager = $this->get('fos_elastica.manager'); + + /** @var Repository $setRepository */ + $setRepository = $repositoryManager->getRepository(Set::class); + /** @var Repository $modelRepository */ + $modelRepository = $repositoryManager->getRepository(Model::class); + + // Option 1. Returns all users who have example.net in any of their mapped fields + $setsResult = $setRepository->find($query, 5); + $modelResult = $modelRepository->find($query, 5); $models = []; /** @var Model $model */ - foreach ($modelsResult as $model) { + foreach ($modelResult as $model) { $models[] = [ - 'title' => $model->getNumber().' '.$model->getName(), - 'url' => $this->generateUrl('model_detail', ['number' => $model->getNumber()]), + 'title' => $model->getId().' '.$model->getName(), + 'url' => $this->generateUrl('model_detail', ['id' => $model->getId()]), ]; } - $setsResult = $this->get('repository.rebrickable.set')->findByQuery($query, 7); - $sets = []; /** @var Set $set */ foreach ($setsResult as $set) { $sets[] = [ - 'title' => $set->getNumber().' '.$set->getName(), - 'url' => $this->generateUrl('set_detail', ['number' => $set->getNumber()]), + 'title' => $set->getId().' '.$set->getName(), + 'url' => $this->generateUrl('set_detail', ['id' => $set->getId()]), ]; } @@ -73,6 +92,11 @@ class SearchController extends Controller 'results' => $models, ], ], + // optional action below results + 'action' => [ + 'url' => $this->generateUrl('search_results', ['query' => $query]), + 'text' => 'View results', + ], ]); return $response; diff --git a/src/AppBundle/Controller/SetController.php b/src/AppBundle/Controller/SetController.php index 98ef29c..cd8b9f7 100644 --- a/src/AppBundle/Controller/SetController.php +++ b/src/AppBundle/Controller/SetController.php @@ -5,7 +5,10 @@ namespace AppBundle\Controller; use AppBundle\Api\Exception\ApiException; use AppBundle\Entity\Rebrickable\Inventory_Set; use AppBundle\Entity\Rebrickable\Set; -use AppBundle\Form\Filter\Set\SetFilterType; +use AppBundle\Form\Search\SetSearchType; +use AppBundle\Model\SetSearch; +use AppBundle\Repository\Rebrickable\Inventory_PartRepository; +use AppBundle\Service\SetService; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\BinaryFileResponse; @@ -23,25 +26,19 @@ class SetController extends Controller */ public function indexAction(Request $request) { - $form = $this->get('form.factory')->create(SetFilterType::class); + $setSearch = new SetSearch(); - $filterBuilder = $this->get('repository.rebrickable.set') - ->createQueryBuilder('s') - ->orderBy('s.year', 'DESC'); + $form = $this->get('form.factory')->createNamedBuilder('s', SetSearchType::class, $setSearch)->getForm(); + $form->handleRequest($request); - if ($request->query->has($form->getName())) { - // manually bind values from the request - $form->submit($request->query->get($form->getName())); - - // build the query from the given form object - $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($form, $filterBuilder); - } + $elasticaManager = $this->get('fos_elastica.manager'); + $results = $elasticaManager->getRepository(Set::class)->search($setSearch); $paginator = $this->get('knp_paginator'); $sets = $paginator->paginate( - $filterBuilder->getQuery(), + $results, $request->query->getInt('page', 1)/*page number*/, - $request->query->getInt('limit', 30)/*limit per page*/ + $request->query->getInt('limit', 24)/*limit per page*/ ); return $this->render('set/index.html.twig', [ @@ -51,16 +48,23 @@ class SetController extends Controller } /** - * @Route("/{number}", name="set_detail") + * @Route("/{id}", name="set_detail") */ public function detailAction(Request $request, Set $set) { + /** @var Inventory_PartRepository $inventoryPartRepository */ + $inventoryPartRepository = $this->get('repository.rebrickable.inventoryPart'); + /** @var SetService $setService */ + $setService = $this->get('service.set'); + $bricksetSet = null; - $partCount = $this->get('repository.rebrickable.inventoryPart')->getPartCount($set->getNumber(), false); + $partCount = $inventoryPartRepository->getPartCount($set, false); + $missingCount = $inventoryPartRepository->getPartCount($set, false, false); + $uniqueMissing = $setService->getParts($set, false, false); try { - if (!($bricksetSet = $this->get('api.manager.brickset')->getSetByNumber($set->getNumber()))) { - $this->addFlash('warning', "{$set->getNumber()} not found in Brickset database"); + if (!($bricksetSet = $this->get('api.manager.brickset')->getSetByNumber($set->getId()))) { + $this->addFlash('warning', "{$set->getId()} not found in Brickset database"); } } catch (ApiException $e) { $this->addFlash('error', $e->getService()); @@ -72,20 +76,22 @@ class SetController extends Controller 'set' => $set, 'brset' => $bricksetSet, 'partCount' => $partCount, + 'missingCount' => $missingCount, + 'uniqueMissing' => $uniqueMissing, ]); } /** - * @Route("/{number}/parts", name="set_parts") + * @Route("/{id}/parts", name="set_parts") */ public function partsAction(Request $request, Set $set) { $inventoryPartRepository = $this->get('repository.rebrickable.inventorypart'); - $regularParts = $inventoryPartRepository->findAllBySetNumber($set->getNumber(), false, true); - $spareParts = $inventoryPartRepository->findAllBySetNumber($set->getNumber(), true); + $regularParts = $inventoryPartRepository->findAllBySetNumber($set->getId(), false, true); + $spareParts = $inventoryPartRepository->findAllBySetNumber($set->getId(), true); - $missing = $inventoryPartRepository->findAllBySetNumber($set->getNumber(), false, false); + $missing = $inventoryPartRepository->findAllBySetNumber($set->getId(), false, false); $template = $this->render('set/tabs/inventory.html.twig', [ 'regularParts' => $regularParts, @@ -105,7 +111,7 @@ class SetController extends Controller } /** - * @Route("/{number}/models", name="set_models") + * @Route("/{id}/models", name="set_models") */ public function modelsAction(Request $request, Set $set) { @@ -118,8 +124,7 @@ class SetController extends Controller $models = $this->get('service.set')->getModels($set, false); $spareModels = $this->get('service.set')->getModels($set, true); $missing = $this->get('service.set')->getParts($set, false, false); -// $missing = $this->get('repository.rebrickable.inventorypart')->findAllBySetNumber($set->getNumber(), false, false); - $missingSpare = $this->get('repository.rebrickable.inventorypart')->findAllBySetNumber($set->getNumber(), true, false); + $missingSpare = $this->get('repository.rebrickable.inventorypart')->findAllBySetNumber($set->getId(), true, false); } catch (\Exception $e) { $this->addFlash('error', $e->getMessage()); } @@ -144,7 +149,7 @@ class SetController extends Controller } /** - * @Route("/{number}/colors", name="set_colors") + * @Route("/{id}/colors", name="set_colors") */ public function colorsAction(Request $request, Set $set) { @@ -173,13 +178,13 @@ class SetController extends Controller } /** - * @Route("/{number}/sets", name="set_sets") + * @Route("/{id}/sets", name="set_sets") */ public function setsAction(Request $request, Set $set) { $em = $this->getDoctrine()->getManager(); - $inventorySets = $em->getRepository(Inventory_Set::class)->findAllBySetNumber($set->getNumber()); + $inventorySets = $em->getRepository(Inventory_Set::class)->findAllBySetNumber($set->getId()); $template = $this->render('set/tabs/sets.html.twig', [ 'inventorySets' => $inventorySets, @@ -197,13 +202,13 @@ class SetController extends Controller } /** - * @Route("/{number}/zip", name="set_zip") + * @Route("/{id}/zip", name="set_zip") */ public function zipAction(Request $request, Set $set) { $sorted = $request->query->get('sorted') == 1 ? true : false; - $sort = $sorted ? 'sorted' : 'unsorted'; + $sort = $sorted ? 'Multi-Color' : 'Uni-Color'; $zip = $this->get('service.zip')->createFromSet($set, $sorted); @@ -213,7 +218,7 @@ class SetController extends Controller // Create the disposition of the file $disposition = $response->headers->makeDisposition( ResponseHeaderBag::DISPOSITION_ATTACHMENT, - "set_{$set->getNumber()}_{$set->getName()}({$sort}).zip" + "set_{$set->getId()}_{$set->getName()}({$sort}).zip" ); $response->headers->set('Content-Disposition', $disposition); diff --git a/src/AppBundle/Entity/Rebrickable/Theme.php b/src/AppBundle/Entity/Rebrickable/Theme.php index 65ad53c..8b95fa5 100644 --- a/src/AppBundle/Entity/Rebrickable/Theme.php +++ b/src/AppBundle/Entity/Rebrickable/Theme.php @@ -80,4 +80,15 @@ class Theme return $this; } + + public function getFullName() { + $theme = $this; + $name = []; + + do { + $name[] = $theme->getName(); + } while (($theme = $theme->getParent()) !== null); + + return implode(' > ', array_reverse($name)); + } } diff --git a/src/AppBundle/Entity/Traits/NumberTrait.php b/src/AppBundle/Entity/Traits/NumberTrait.php index 340aa63..6f8556e 100644 --- a/src/AppBundle/Entity/Traits/NumberTrait.php +++ b/src/AppBundle/Entity/Traits/NumberTrait.php @@ -10,24 +10,24 @@ trait NumberTrait * @ORM\Id * @ORM\Column(name="id", type="string", length=255, unique=true) */ - protected $number; + protected $id; /** * @return string */ - public function getNumber() + public function getId() { - return $this->number; + return $this->id; } /** - * @param string $number + * @param string $id * * @return mixed */ - public function setNumber($number) + public function setId($id) { - $this->number = $number; + $this->id = $id; return $this; } diff --git a/src/AppBundle/Repository/LDraw/AliasRepository.php b/src/AppBundle/Repository/LDraw/AliasRepository.php index 3af7989..a22e009 100644 --- a/src/AppBundle/Repository/LDraw/AliasRepository.php +++ b/src/AppBundle/Repository/LDraw/AliasRepository.php @@ -18,10 +18,10 @@ class AliasRepository extends BaseRepository */ public function getOrCreate($number, $model) { - if (($alias = $this->findOneBy(['number' => $number, 'model' => $model])) == null) { + if (($alias = $this->findOneBy(['id' => $number, 'model' => $model])) == null) { $alias = new Alias(); $alias->setModel($model); - $alias->setNumber($number); + $alias->setId($number); } return $alias; diff --git a/src/AppBundle/Repository/LDraw/ModelRepository.php b/src/AppBundle/Repository/LDraw/ModelRepository.php index e36e69f..648f499 100644 --- a/src/AppBundle/Repository/LDraw/ModelRepository.php +++ b/src/AppBundle/Repository/LDraw/ModelRepository.php @@ -36,14 +36,14 @@ class ModelRepository extends BaseRepository public function findOneByNumber($number) { $model = $this->createQueryBuilder('model') - ->where('model.number LIKE :number') + ->where('model.id LIKE :number') ->setParameter('number', $number) ->getQuery()->getOneOrNullResult(); if (!$model) { $model = $this->createQueryBuilder('model') ->leftJoin(Alias::class, 'alias', JOIN::WITH, 'alias.model = model') - ->where('alias.number LIKE :number') + ->where('alias.id LIKE :number') ->setParameter('number', $number) ->getQuery()->getOneOrNullResult(); } @@ -64,7 +64,7 @@ class ModelRepository extends BaseRepository $queryBuilder ->join(Part::class, 'part', JOIN::WITH, 'part.model = model') - ->join(Inventory_Part::class, 'inventory_part', JOIN::WITH, 'part.number = inventory_part.part') + ->join(Inventory_Part::class, 'inventory_part', JOIN::WITH, 'part.id = inventory_part.part') ->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = :inventory') ->setParameter('inventory', $inventory) ->addSelect('inventory_part') @@ -79,10 +79,10 @@ class ModelRepository extends BaseRepository $queryBuilder ->join(Part::class, 'part', JOIN::WITH, 'part.model = model') - ->join(Inventory_Part::class, 'inventory_part', JOIN::WITH, 'part.number = inventory_part.part') + ->join(Inventory_Part::class, 'inventory_part', JOIN::WITH, 'part.id = inventory_part.part') ->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = inventory.id') - ->join(Set::class, 's', Join::WITH, 'inventory.set = s.number') - ->where('s.number LIKE :number') + ->join(Set::class, 's', Join::WITH, 'inventory.set = s.id') + ->where('s.id LIKE :number') ->setParameter('number', $number) ->distinct(true); @@ -95,48 +95,29 @@ class ModelRepository extends BaseRepository $queryBuilder ->select('related') - ->join(Subpart::class, 'subpart', JOIN::WITH, 'model.number = subpart.subpart') + ->join(Subpart::class, 'subpart', JOIN::WITH, 'model.id = subpart.subpart') ->join(Subpart::class, 'parent', JOIN::WITH, 'subpart.parent = parent.parent') - ->join(Model::class, 'related', JOIN::WITH, 'related.number = parent.subpart') - ->where('model.number = :number') + ->join(Model::class, 'related', JOIN::WITH, 'related.id = parent.subpart') + ->where('model.id = :number') ->setParameter('number', $number) - ->andWhere('related.number != :number') + ->andWhere('related.id != :number') ->distinct(true); return $queryBuilder->getQuery()->getResult(); } - public function findByQuery($query, $limit = null) - { - $queryBuilder = $this->createQueryBuilder('model'); - - $queryBuilder->where( - $queryBuilder->expr()->orX( - $queryBuilder->expr()->like('model.number', ':number'), - $queryBuilder->expr()->like('model.name', ':name') - )) - ->setParameter('name', '%'.$query.'%') - ->setParameter('number', $query.'%'); - - if ($limit) { - $queryBuilder->setMaxResults($limit); - } - - return $queryBuilder->getQuery()->getResult(); - } - /** * Create new Model entity with $number or retrieve one. * - * @param $number + * @param $id * * @return Model */ - public function getOrCreate($number) + public function getOrCreate($id) { - if (($model = $this->findOneBy(['number' => $number])) == null) { + if (($model = $this->findOneBy(['id' => $id])) == null) { $model = new Model(); - $model->setNumber($number); + $model->setId($id); } return $model; diff --git a/src/AppBundle/Repository/Rebrickable/Inventory_PartRepository.php b/src/AppBundle/Repository/Rebrickable/Inventory_PartRepository.php index d121c06..2fa4199 100644 --- a/src/AppBundle/Repository/Rebrickable/Inventory_PartRepository.php +++ b/src/AppBundle/Repository/Rebrickable/Inventory_PartRepository.php @@ -6,6 +6,7 @@ use AppBundle\Entity\LDraw\Model; use AppBundle\Entity\Rebrickable\Inventory; use AppBundle\Entity\Rebrickable\Inventory_Part; use AppBundle\Entity\Rebrickable\Part; +use AppBundle\Entity\Rebrickable\Set; use AppBundle\Repository\BaseRepository; use Doctrine\ORM\Query\Expr\Join; @@ -60,9 +61,9 @@ class Inventory_PartRepository extends BaseRepository return $queryBuilder->getQuery()->getResult(); } - public function getPartCount($number, $spare = null, $model = null) + public function getPartCount(Set $set, $spare = null, $model = null) { - $inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number); + $inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($set->getId()); $queryBuilder = $this->createQueryBuilder('inventory_part') ->where('inventory_part.inventory = :inventory') diff --git a/src/AppBundle/Repository/Rebrickable/SetRepository.php b/src/AppBundle/Repository/Rebrickable/SetRepository.php index b42c035..710533a 100644 --- a/src/AppBundle/Repository/Rebrickable/SetRepository.php +++ b/src/AppBundle/Repository/Rebrickable/SetRepository.php @@ -26,10 +26,10 @@ class SetRepository extends BaseRepository public function findAllByPartNumber($number) { $queryBuilder = $this->createQueryBuilder('s') - ->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory.set = s.number') + ->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory.set = s.id') ->join(Inventory_Part::class, 'inventory_part', JOIN::WITH, 'inventory.id = inventory_part.inventory') - ->join(Part::class, 'part', Join::WITH, 'inventory_part.part = part.number') - ->where('part.number LIKE :number') + ->join(Part::class, 'part', Join::WITH, 'inventory_part.part = part.id') + ->where('part.id LIKE :number') ->setParameter('number', $number) ->distinct(true); @@ -39,28 +39,45 @@ class SetRepository extends BaseRepository public function findAllByModel(Model $model) { $queryBuilder = $this->createQueryBuilder('s') - ->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory.set = s.number') + ->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory.set = s.id') ->join(Inventory_Part::class, 'inventory_part', JOIN::WITH, 'inventory.id = inventory_part.inventory') - ->join(Part::class, 'part', Join::WITH, 'inventory_part.part = part.number') + ->join(Part::class, 'part', Join::WITH, 'inventory_part.part = part.id') ->where('part.model = :model') - ->setParameter('model', $model->getNumber()) + ->setParameter('model', $model->getId()) ->distinct(true); return $queryBuilder->getQuery()->getResult(); } - public function findByQuery($query, $limit = null) + public function getMinPartCount() { $queryBuilder = $this->createQueryBuilder('s') - ->where('s.name LIKE :name') - ->orWhere('s.number LIKE :number') - ->setParameter('name', '%'.$query.'%') - ->setParameter('number', $query.'%'); + ->select('MIN(s.partCount)'); - if ($limit) { - $queryBuilder->setMaxResults($limit); - } + return $queryBuilder->getQuery()->getSingleScalarResult(); + } - return $queryBuilder->getQuery()->getResult(); + public function getMaxPartCount() + { + $queryBuilder = $this->createQueryBuilder('s') + ->select('MAX(s.partCount)'); + + return $queryBuilder->getQuery()->getSingleScalarResult(); + } + + public function getMinYear() + { + $queryBuilder = $this->createQueryBuilder('s') + ->select('MIN(s.year)'); + + return $queryBuilder->getQuery()->getSingleScalarResult(); + } + + public function getMaxYear() + { + $queryBuilder = $this->createQueryBuilder('s') + ->select('MAX(s.year)'); + + return $queryBuilder->getQuery()->getSingleScalarResult(); } } diff --git a/src/AppBundle/Repository/Rebrickable/ThemeRepository.php b/src/AppBundle/Repository/Rebrickable/ThemeRepository.php index cddfdf1..e2672ce 100644 --- a/src/AppBundle/Repository/Rebrickable/ThemeRepository.php +++ b/src/AppBundle/Repository/Rebrickable/ThemeRepository.php @@ -10,11 +10,9 @@ class ThemeRepository extends BaseRepository { public function findAllSubthemes(Theme $theme) { - $subQueryBuilder = $this->createQueryBuilder('subtheme'); - - $queryBuilder = $this->createQueryBuilder('subtheme') - ->leftJoin(Theme::class, 'theme', Join::WITH, 'subtheme.parent = theme.id') - ->where('subtheme.parent = :id') + $queryBuilder = $this->createQueryBuilder('theme') +// ->leftJoin(Theme::class, 'theme', Join::WITH, 'subtheme.parent = theme.id') + ->where('theme.parent = :id') ->setParameter('id', $theme->getId()); return $queryBuilder->getQuery()->getResult(); @@ -23,7 +21,8 @@ class ThemeRepository extends BaseRepository public function findAllMain() { $queryBuilder = $this->createQueryBuilder('theme') - ->where('theme.parent IS NULL'); + ->where('theme.parent IS NULL') + ->orderBy('theme.name', 'ASC'); return $queryBuilder->getQuery()->getResult(); } diff --git a/src/AppBundle/Service/Loader/RebrickableLoader.php b/src/AppBundle/Service/Loader/RebrickableLoader.php index 04fffda..2b1934c 100644 --- a/src/AppBundle/Service/Loader/RebrickableLoader.php +++ b/src/AppBundle/Service/Loader/RebrickableLoader.php @@ -115,7 +115,7 @@ class RebrickableLoader extends BaseLoader foreach ($foreignKeys as $foreignKey) { $part = new Part(); - $part->setNumber($foreignKey['part_id']); + $part->setId($foreignKey['part_id']); $this->em->getRepository(Part::class)->save($part); } } diff --git a/src/AppBundle/Service/Loader/RelationLoader.php b/src/AppBundle/Service/Loader/RelationLoader.php index 146a627..87fc393 100644 --- a/src/AppBundle/Service/Loader/RelationLoader.php +++ b/src/AppBundle/Service/Loader/RelationLoader.php @@ -57,7 +57,7 @@ class RelationLoader extends BaseLoader $this->partRepository->save($part); } - $this->progressBar->setMessage($part->getNumber()); + $this->progressBar->setMessage($part->getId()); $this->progressBar->advance(); } $this->progressBar->finish(); @@ -72,7 +72,7 @@ class RelationLoader extends BaseLoader */ private function loadPartRelation(Part $part) { - $number = $part->getNumber(); + $number = $part->getId(); $model = $this->modelRepository->findOneByNumber($number); if (!$model) { $number = $this->relationMapper->find($this->getPrintedParentId($number), 'part_model'); diff --git a/src/AppBundle/Service/ModelService.php b/src/AppBundle/Service/ModelService.php index ecd6a75..6599a2d 100644 --- a/src/AppBundle/Service/ModelService.php +++ b/src/AppBundle/Service/ModelService.php @@ -24,9 +24,9 @@ class ModelService $this->resursiveLoadModels($subpart->getSubpart(), $subpart->getCount()); } } else { - $q = isset($this->models[$model->getNumber()]['quantity']) ? $this->models[$model->getNumber()]['quantity'] : 0; + $q = isset($this->models[$model->getId()]['quantity']) ? $this->models[$model->getId()]['quantity'] : 0; - $this->models[$model->getNumber()] = [ + $this->models[$model->getId()] = [ 'quantity' => $q + $quantity, 'model' => $model, ]; diff --git a/src/AppBundle/Service/SetService.php b/src/AppBundle/Service/SetService.php index 6d95efb..119462a 100644 --- a/src/AppBundle/Service/SetService.php +++ b/src/AppBundle/Service/SetService.php @@ -41,15 +41,15 @@ class SetService { $models = []; - $inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getNumber(), $spare, true); + $inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getId(), $spare, true); /** @var Inventory_Part $inventoryPart */ foreach ($inventoryParts as $inventoryPart) { if ($model = $inventoryPart->getPart()->getModel()) { - if (isset($models[$model->getNumber()])) { - $models[$model->getNumber()]['quantity'] += $inventoryPart->getQuantity(); + if (isset($models[$model->getId()])) { + $models[$model->getId()]['quantity'] += $inventoryPart->getQuantity(); } else { - $models[$model->getNumber()] = [ + $models[$model->getId()] = [ 'model' => $model, 'quantity' => $inventoryPart->getQuantity(), ]; @@ -85,21 +85,21 @@ class SetService { $models = []; - $inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getNumber(), $spare, true); + $inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getId(), $spare, true); /** @var Inventory_Part $inventoryPart */ foreach ($inventoryParts as $inventoryPart) { if ($model = $inventoryPart->getPart()->getModel()) { $color = $inventoryPart->getColor(); - if (!isset($models[$model->getNumber()]['model'])) { - $models[$model->getNumber()]['model'] = $model; + if (!isset($models[$model->getId()]['model'])) { + $models[$model->getId()]['model'] = $model; } - if (isset($models[$model->getNumber()]['colors'][$color->getId()])) { - $models[$model->getNumber()]['colors'][$color->getId()]['quantity'] += $inventoryPart->getQuantity(); + if (isset($models[$model->getId()]['colors'][$color->getId()])) { + $models[$model->getId()]['colors'][$color->getId()]['quantity'] += $inventoryPart->getQuantity(); } else { - $models[$model->getNumber()]['colors'][$color->getId()] = [ + $models[$model->getId()]['colors'][$color->getId()] = [ 'color' => $color, 'quantity' => $inventoryPart->getQuantity(), ]; @@ -135,7 +135,7 @@ class SetService { $colors = []; - $inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getNumber(), $spare, true); + $inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getId(), $spare, true); /** @var Inventory_Part $inventoryPart */ foreach ($inventoryParts as $inventoryPart) { @@ -149,10 +149,10 @@ class SetService $colors[$color->getId()]['quantity'] += $inventoryPart->getQuantity(); - if (isset($colors[$color->getId()]['models'][$model->getNumber()])) { - $colors[$color->getId()]['models'][$model->getNumber()]['quantity'] += $inventoryPart->getQuantity(); + if (isset($colors[$color->getId()]['models'][$model->getId()])) { + $colors[$color->getId()]['models'][$model->getId()]['quantity'] += $inventoryPart->getQuantity(); } else { - $colors[$color->getId()]['models'][$model->getNumber()] = [ + $colors[$color->getId()]['models'][$model->getId()] = [ 'model' => $model, 'quantity' => $inventoryPart->getQuantity(), ]; @@ -173,14 +173,14 @@ class SetService { $parts = []; - $inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getNumber(), $spare, $model); + $inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getId(), $spare, $model); /** @var Inventory_Part $inventoryPart */ foreach ($inventoryParts as $inventoryPart) { - if (isset($parts[$inventoryPart->getPart()->getNumber()])) { - $parts[$inventoryPart->getPart()->getNumber()]['quantity'] += $inventoryPart->getQuantity(); + if (isset($parts[$inventoryPart->getPart()->getId()])) { + $parts[$inventoryPart->getPart()->getId()]['quantity'] += $inventoryPart->getQuantity(); } else { - $parts[$inventoryPart->getPart()->getNumber()] = [ + $parts[$inventoryPart->getPart()->getId()] = [ 'part' => $inventoryPart->getPart(), 'quantity' => $inventoryPart->getQuantity(), ]; diff --git a/src/AppBundle/Service/ZipService.php b/src/AppBundle/Service/ZipService.php index 6a8fc32..d4bca8e 100644 --- a/src/AppBundle/Service/ZipService.php +++ b/src/AppBundle/Service/ZipService.php @@ -47,8 +47,8 @@ class ZipService public function createFromSet(Set $set, $sorted = false) { - $sort = $sorted ? 'sorted' : 'unsorted'; - $this->zipName = "set_{$set->getNumber()}_{$set->getName()}({$sort})"; + $sort = $sorted ? 'Multi-Color' : 'Uni-Color'; + $this->zipName = "set_{$set->getId()}_{$set->getName()}({$sort})"; $zipPath = tempnam(sys_get_temp_dir(), 'printabrick'); $this->archive = $this->createZip($zipPath); @@ -67,18 +67,18 @@ class ZipService public function createFromModel(Model $model, $subparts = false) { - $this->zipName = "model_{$model->getNumber()}"; + $this->zipName = "model_{$model->getId()}"; $zipPath = tempnam(sys_get_temp_dir(), 'printabrick'); $this->archive = $this->createZip($zipPath); - $filename = "{$this->zipName}/{$model->getNumber()}.stl"; + $filename = "{$this->zipName}/{$model->getId()}.stl"; $this->addModel($filename, $model); if ($subparts) { foreach ($this->modelService->getAllSubparts($model) as $subpart) { $submodel = $subpart['model']; - $filename = "{$this->zipName}/submodels/{$submodel->getNumber()}_({$subpart['quantity']}x).stl"; + $filename = "{$this->zipName}/submodels/{$submodel->getId()}_({$subpart['quantity']}x).stl"; $this->addModel($filename, $submodel); } @@ -107,7 +107,7 @@ class ZipService $model = $modelArray['model']; $quantity = $modelArray['quantity']; - $filename = "{$this->zipName}/{$color->getName()}/{$model->getNumber()}_({$quantity}x).stl"; + $filename = "{$this->zipName}/{$color->getName()}/{$model->getId()}_({$quantity}x).stl"; $this->addModel($filename, $model); } @@ -137,7 +137,7 @@ class ZipService private function addModel($path, $model) { $this->archive->addFromString($path, $this->mediaFilesystem->read($model->getPath())); - $this->models[$model->getNumber()] = $model; + $this->models[$model->getId()] = $model; } private function addLicense() @@ -149,7 +149,7 @@ class ZipService $text .= sprintf('Attribution:'."\n"."\n"); foreach ($this->models as $model) { - $text .= sprintf('%s - "%s" by %s'."\n", $model->getNumber(), $model->getName(), $model->getAuthor()->getName()); + $text .= sprintf('%s - "%s" by %s'."\n", $model->getId(), $model->getName(), $model->getAuthor()->getName()); } $this->archive->addFromString("{$this->zipName}/LICENSE.txt", $text);