1
0
mirror of https://github.com/ToxicCrack/PrintABrick.git synced 2025-05-17 12:50:08 -07:00

Change NumberTrait to use id variable

This commit is contained in:
David Hübner 2017-05-17 20:21:08 +02:00
parent 1c39cc1f81
commit 78ce9a9e64
16 changed files with 199 additions and 160 deletions

View File

@ -3,9 +3,8 @@
namespace AppBundle\Controller; namespace AppBundle\Controller;
use AppBundle\Entity\LDraw\Model; use AppBundle\Entity\LDraw\Model;
use AppBundle\Entity\Rebrickable\Part; use AppBundle\Form\Search\ModelSearchType;
use AppBundle\Entity\Rebrickable\Set; use AppBundle\Model\ModelSearch;
use AppBundle\Form\Filter\Model\ModelFilterType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller;
@ -24,27 +23,29 @@ class ModelController extends Controller
* Lists all part entities. * Lists all part entities.
* *
* @Route("/", name="model_index") * @Route("/", name="model_index")
* @Method("GET")
*/ */
public function indexAction(Request $request) 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())) { $elasticaManager = $this->get('fos_elastica.manager');
// manually bind values from the request $results = $elasticaManager->getRepository(Model::class)->search($modelSearch);
$form->submit($request->query->get($form->getName()));
// build the query from the given form object $paginator = $this->get('knp_paginator');
$this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($form, $filterBuilder); $sets = $paginator->paginate(
} $results,
$request->query->getInt('page', 1)/*page number*/,
$request->query->getInt('limit', 30)/*limit per page*/
);
$paginator = $this->get('knp_paginator'); $paginator = $this->get('knp_paginator');
$models = $paginator->paginate( $models = $paginator->paginate(
$filterBuilder->getQuery(), $results,
$request->query->getInt('page', 1)/*page number*/, $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', [ return $this->render('model/index.html.twig', [
@ -56,20 +57,20 @@ class ModelController extends Controller
/** /**
* Finds and displays a model entity. * Finds and displays a model entity.
* *
* @Route("/{number}", name="model_detail") * @Route("/{id}", name="model_detail")
* @Method("GET") * @Method("GET")
*/ */
public function detailAction($number) public function detailAction($id)
{ {
/** @var Model $model */ /** @var Model $model */
if ($model = $this->get('repository.ldraw.model')->findOneByNumber($number)) { if ($model = $this->get('repository.ldraw.model')->findOneByNumber($id)) {
try { try {
$subparts = $this->get('service.model')->getAllSubparts($model); $subparts = $this->get('service.model')->getAllSubparts($model);
$rbParts = $model != null ? $this->get('repository.rebrickable.part')->findAllByModel($model) : null; $rbParts = $model != null ? $this->get('repository.rebrickable.part')->findAllByModel($model) : null;
$sets = $model != null ? $this->get('repository.rebrickable.set')->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', [ return $this->render('model/detail.html.twig', [
'model' => $model, 'model' => $model,
@ -87,7 +88,7 @@ class ModelController extends Controller
} }
/** /**
* @Route("/{number}/zip", name="model_zip") * @Route("/{id}/zip", name="model_zip")
* @Method("GET") * @Method("GET")
*/ */
public function zipAction(Request $request, Model $model) public function zipAction(Request $request, Model $model)
@ -100,7 +101,7 @@ class ModelController extends Controller
// Create the disposition of the file // Create the disposition of the file
$disposition = $response->headers->makeDisposition( $disposition = $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT, ResponseHeaderBag::DISPOSITION_ATTACHMENT,
"model_{$model->getNumber()}_{$model->getName()}.zip" "model_{$model->getId()}_{$model->getName()}.zip"
); );
$response->headers->set('Content-Disposition', $disposition); $response->headers->set('Content-Disposition', $disposition);

View File

@ -18,7 +18,7 @@ class PartController extends Controller
/** /**
* Finds and displays a part entity. * Finds and displays a part entity.
* *
* @Route("/{number}", name="reb_part_detail") * @Route("/{id}", name="reb_part_detail")
*/ */
public function detailAction(Part $part) public function detailAction(Part $part)
{ {
@ -28,14 +28,14 @@ class PartController extends Controller
if ($part) { if ($part) {
try { try {
$apiPart = $this->get('api.manager.rebrickable')->getPart($part->getNumber()); $apiPart = $this->get('api.manager.rebrickable')->getPart($part->getId());
} catch (EmptyResponseException $e) { } catch (EmptyResponseException $e) {
$this->addFlash('warning', 'Part not found'); $this->addFlash('warning', 'Part not found');
} catch (\Exception $e) { } catch (\Exception $e) {
$this->addFlash('error', $e->getMessage()); $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', [ return $this->render('rebrickable/part/detail.html.twig', [
'part' => $part, 'part' => $part,

View File

@ -4,6 +4,7 @@ namespace AppBundle\Controller;
use AppBundle\Entity\LDraw\Model; use AppBundle\Entity\LDraw\Model;
use AppBundle\Entity\Rebrickable\Set; use AppBundle\Entity\Rebrickable\Set;
use FOS\ElasticaBundle\Repository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\JsonResponse;
@ -23,12 +24,22 @@ class SearchController extends Controller
{ {
$query = trim(strip_tags($request->get('query'))); $query = trim(strip_tags($request->get('query')));
$modelsResult = $this->get('repository.ldraw.model')->findByQuery($query); /** var FOS\ElasticaBundle\Manager\RepositoryManager */
$setsResult = $this->get('repository.rebrickable.set')->findByQuery($query); $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', [ return $this->render('search/index.html.twig', [
'sets' => $setsResult, 'sets' => $setsResult,
'models' => $modelsResult, 'models' => $modelResult,
'query' => $query,
]); ]);
} }
@ -39,25 +50,33 @@ class SearchController extends Controller
{ {
$query = trim(strip_tags($request->get('query'))); $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 = []; $models = [];
/** @var Model $model */ /** @var Model $model */
foreach ($modelsResult as $model) { foreach ($modelResult as $model) {
$models[] = [ $models[] = [
'title' => $model->getNumber().' '.$model->getName(), 'title' => $model->getId().' '.$model->getName(),
'url' => $this->generateUrl('model_detail', ['number' => $model->getNumber()]), 'url' => $this->generateUrl('model_detail', ['id' => $model->getId()]),
]; ];
} }
$setsResult = $this->get('repository.rebrickable.set')->findByQuery($query, 7);
$sets = []; $sets = [];
/** @var Set $set */ /** @var Set $set */
foreach ($setsResult as $set) { foreach ($setsResult as $set) {
$sets[] = [ $sets[] = [
'title' => $set->getNumber().' '.$set->getName(), 'title' => $set->getId().' '.$set->getName(),
'url' => $this->generateUrl('set_detail', ['number' => $set->getNumber()]), 'url' => $this->generateUrl('set_detail', ['id' => $set->getId()]),
]; ];
} }
@ -73,6 +92,11 @@ class SearchController extends Controller
'results' => $models, 'results' => $models,
], ],
], ],
// optional action below results
'action' => [
'url' => $this->generateUrl('search_results', ['query' => $query]),
'text' => 'View results',
],
]); ]);
return $response; return $response;

View File

@ -5,7 +5,10 @@ namespace AppBundle\Controller;
use AppBundle\Api\Exception\ApiException; use AppBundle\Api\Exception\ApiException;
use AppBundle\Entity\Rebrickable\Inventory_Set; use AppBundle\Entity\Rebrickable\Inventory_Set;
use AppBundle\Entity\Rebrickable\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 Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\BinaryFileResponse;
@ -23,25 +26,19 @@ class SetController extends Controller
*/ */
public function indexAction(Request $request) public function indexAction(Request $request)
{ {
$form = $this->get('form.factory')->create(SetFilterType::class); $setSearch = new SetSearch();
$filterBuilder = $this->get('repository.rebrickable.set') $form = $this->get('form.factory')->createNamedBuilder('s', SetSearchType::class, $setSearch)->getForm();
->createQueryBuilder('s') $form->handleRequest($request);
->orderBy('s.year', 'DESC');
if ($request->query->has($form->getName())) { $elasticaManager = $this->get('fos_elastica.manager');
// manually bind values from the request $results = $elasticaManager->getRepository(Set::class)->search($setSearch);
$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);
}
$paginator = $this->get('knp_paginator'); $paginator = $this->get('knp_paginator');
$sets = $paginator->paginate( $sets = $paginator->paginate(
$filterBuilder->getQuery(), $results,
$request->query->getInt('page', 1)/*page number*/, $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', [ 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) 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; $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 { try {
if (!($bricksetSet = $this->get('api.manager.brickset')->getSetByNumber($set->getNumber()))) { if (!($bricksetSet = $this->get('api.manager.brickset')->getSetByNumber($set->getId()))) {
$this->addFlash('warning', "{$set->getNumber()} not found in Brickset database"); $this->addFlash('warning', "{$set->getId()} not found in Brickset database");
} }
} catch (ApiException $e) { } catch (ApiException $e) {
$this->addFlash('error', $e->getService()); $this->addFlash('error', $e->getService());
@ -72,20 +76,22 @@ class SetController extends Controller
'set' => $set, 'set' => $set,
'brset' => $bricksetSet, 'brset' => $bricksetSet,
'partCount' => $partCount, '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) public function partsAction(Request $request, Set $set)
{ {
$inventoryPartRepository = $this->get('repository.rebrickable.inventorypart'); $inventoryPartRepository = $this->get('repository.rebrickable.inventorypart');
$regularParts = $inventoryPartRepository->findAllBySetNumber($set->getNumber(), false, true); $regularParts = $inventoryPartRepository->findAllBySetNumber($set->getId(), false, true);
$spareParts = $inventoryPartRepository->findAllBySetNumber($set->getNumber(), 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', [ $template = $this->render('set/tabs/inventory.html.twig', [
'regularParts' => $regularParts, '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) public function modelsAction(Request $request, Set $set)
{ {
@ -118,8 +124,7 @@ class SetController extends Controller
$models = $this->get('service.set')->getModels($set, false); $models = $this->get('service.set')->getModels($set, false);
$spareModels = $this->get('service.set')->getModels($set, true); $spareModels = $this->get('service.set')->getModels($set, true);
$missing = $this->get('service.set')->getParts($set, false, false); $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->getId(), true, false);
$missingSpare = $this->get('repository.rebrickable.inventorypart')->findAllBySetNumber($set->getNumber(), true, false);
} catch (\Exception $e) { } catch (\Exception $e) {
$this->addFlash('error', $e->getMessage()); $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) 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) public function setsAction(Request $request, Set $set)
{ {
$em = $this->getDoctrine()->getManager(); $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', [ $template = $this->render('set/tabs/sets.html.twig', [
'inventorySets' => $inventorySets, '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) public function zipAction(Request $request, Set $set)
{ {
$sorted = $request->query->get('sorted') == 1 ? true : false; $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); $zip = $this->get('service.zip')->createFromSet($set, $sorted);
@ -213,7 +218,7 @@ class SetController extends Controller
// Create the disposition of the file // Create the disposition of the file
$disposition = $response->headers->makeDisposition( $disposition = $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT, ResponseHeaderBag::DISPOSITION_ATTACHMENT,
"set_{$set->getNumber()}_{$set->getName()}({$sort}).zip" "set_{$set->getId()}_{$set->getName()}({$sort}).zip"
); );
$response->headers->set('Content-Disposition', $disposition); $response->headers->set('Content-Disposition', $disposition);

View File

@ -80,4 +80,15 @@ class Theme
return $this; return $this;
} }
public function getFullName() {
$theme = $this;
$name = [];
do {
$name[] = $theme->getName();
} while (($theme = $theme->getParent()) !== null);
return implode(' > ', array_reverse($name));
}
} }

View File

@ -10,24 +10,24 @@ trait NumberTrait
* @ORM\Id * @ORM\Id
* @ORM\Column(name="id", type="string", length=255, unique=true) * @ORM\Column(name="id", type="string", length=255, unique=true)
*/ */
protected $number; protected $id;
/** /**
* @return string * @return string
*/ */
public function getNumber() public function getId()
{ {
return $this->number; return $this->id;
} }
/** /**
* @param string $number * @param string $id
* *
* @return mixed * @return mixed
*/ */
public function setNumber($number) public function setId($id)
{ {
$this->number = $number; $this->id = $id;
return $this; return $this;
} }

View File

@ -18,10 +18,10 @@ class AliasRepository extends BaseRepository
*/ */
public function getOrCreate($number, $model) 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 = new Alias();
$alias->setModel($model); $alias->setModel($model);
$alias->setNumber($number); $alias->setId($number);
} }
return $alias; return $alias;

View File

@ -36,14 +36,14 @@ class ModelRepository extends BaseRepository
public function findOneByNumber($number) public function findOneByNumber($number)
{ {
$model = $this->createQueryBuilder('model') $model = $this->createQueryBuilder('model')
->where('model.number LIKE :number') ->where('model.id LIKE :number')
->setParameter('number', $number) ->setParameter('number', $number)
->getQuery()->getOneOrNullResult(); ->getQuery()->getOneOrNullResult();
if (!$model) { if (!$model) {
$model = $this->createQueryBuilder('model') $model = $this->createQueryBuilder('model')
->leftJoin(Alias::class, 'alias', JOIN::WITH, 'alias.model = model') ->leftJoin(Alias::class, 'alias', JOIN::WITH, 'alias.model = model')
->where('alias.number LIKE :number') ->where('alias.id LIKE :number')
->setParameter('number', $number) ->setParameter('number', $number)
->getQuery()->getOneOrNullResult(); ->getQuery()->getOneOrNullResult();
} }
@ -64,7 +64,7 @@ class ModelRepository extends BaseRepository
$queryBuilder $queryBuilder
->join(Part::class, 'part', JOIN::WITH, 'part.model = model') ->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') ->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = :inventory')
->setParameter('inventory', $inventory) ->setParameter('inventory', $inventory)
->addSelect('inventory_part') ->addSelect('inventory_part')
@ -79,10 +79,10 @@ class ModelRepository extends BaseRepository
$queryBuilder $queryBuilder
->join(Part::class, 'part', JOIN::WITH, 'part.model = model') ->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(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = inventory.id')
->join(Set::class, 's', Join::WITH, 'inventory.set = s.number') ->join(Set::class, 's', Join::WITH, 'inventory.set = s.id')
->where('s.number LIKE :number') ->where('s.id LIKE :number')
->setParameter('number', $number) ->setParameter('number', $number)
->distinct(true); ->distinct(true);
@ -95,48 +95,29 @@ class ModelRepository extends BaseRepository
$queryBuilder $queryBuilder
->select('related') ->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(Subpart::class, 'parent', JOIN::WITH, 'subpart.parent = parent.parent')
->join(Model::class, 'related', JOIN::WITH, 'related.number = parent.subpart') ->join(Model::class, 'related', JOIN::WITH, 'related.id = parent.subpart')
->where('model.number = :number') ->where('model.id = :number')
->setParameter('number', $number) ->setParameter('number', $number)
->andWhere('related.number != :number') ->andWhere('related.id != :number')
->distinct(true); ->distinct(true);
return $queryBuilder->getQuery()->getResult(); 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. * Create new Model entity with $number or retrieve one.
* *
* @param $number * @param $id
* *
* @return Model * @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 = new Model();
$model->setNumber($number); $model->setId($id);
} }
return $model; return $model;

View File

@ -6,6 +6,7 @@ use AppBundle\Entity\LDraw\Model;
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\Part;
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;
@ -60,9 +61,9 @@ class Inventory_PartRepository extends BaseRepository
return $queryBuilder->getQuery()->getResult(); 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') $queryBuilder = $this->createQueryBuilder('inventory_part')
->where('inventory_part.inventory = :inventory') ->where('inventory_part.inventory = :inventory')

View File

@ -26,10 +26,10 @@ class SetRepository extends BaseRepository
public function findAllByPartNumber($number) public function findAllByPartNumber($number)
{ {
$queryBuilder = $this->createQueryBuilder('s') $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(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.number LIKE :number') ->where('part.id LIKE :number')
->setParameter('number', $number) ->setParameter('number', $number)
->distinct(true); ->distinct(true);
@ -39,28 +39,45 @@ class SetRepository extends BaseRepository
public function findAllByModel(Model $model) public function findAllByModel(Model $model)
{ {
$queryBuilder = $this->createQueryBuilder('s') $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(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') ->where('part.model = :model')
->setParameter('model', $model->getNumber()) ->setParameter('model', $model->getId())
->distinct(true); ->distinct(true);
return $queryBuilder->getQuery()->getResult(); return $queryBuilder->getQuery()->getResult();
} }
public function findByQuery($query, $limit = null) public function getMinPartCount()
{ {
$queryBuilder = $this->createQueryBuilder('s') $queryBuilder = $this->createQueryBuilder('s')
->where('s.name LIKE :name') ->select('MIN(s.partCount)');
->orWhere('s.number LIKE :number')
->setParameter('name', '%'.$query.'%')
->setParameter('number', $query.'%');
if ($limit) { return $queryBuilder->getQuery()->getSingleScalarResult();
$queryBuilder->setMaxResults($limit); }
}
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();
} }
} }

View File

@ -10,11 +10,9 @@ class ThemeRepository extends BaseRepository
{ {
public function findAllSubthemes(Theme $theme) public function findAllSubthemes(Theme $theme)
{ {
$subQueryBuilder = $this->createQueryBuilder('subtheme'); $queryBuilder = $this->createQueryBuilder('theme')
// ->leftJoin(Theme::class, 'theme', Join::WITH, 'subtheme.parent = theme.id')
$queryBuilder = $this->createQueryBuilder('subtheme') ->where('theme.parent = :id')
->leftJoin(Theme::class, 'theme', Join::WITH, 'subtheme.parent = theme.id')
->where('subtheme.parent = :id')
->setParameter('id', $theme->getId()); ->setParameter('id', $theme->getId());
return $queryBuilder->getQuery()->getResult(); return $queryBuilder->getQuery()->getResult();
@ -23,7 +21,8 @@ class ThemeRepository extends BaseRepository
public function findAllMain() public function findAllMain()
{ {
$queryBuilder = $this->createQueryBuilder('theme') $queryBuilder = $this->createQueryBuilder('theme')
->where('theme.parent IS NULL'); ->where('theme.parent IS NULL')
->orderBy('theme.name', 'ASC');
return $queryBuilder->getQuery()->getResult(); return $queryBuilder->getQuery()->getResult();
} }

View File

@ -115,7 +115,7 @@ class RebrickableLoader extends BaseLoader
foreach ($foreignKeys as $foreignKey) { foreach ($foreignKeys as $foreignKey) {
$part = new Part(); $part = new Part();
$part->setNumber($foreignKey['part_id']); $part->setId($foreignKey['part_id']);
$this->em->getRepository(Part::class)->save($part); $this->em->getRepository(Part::class)->save($part);
} }
} }

View File

@ -57,7 +57,7 @@ class RelationLoader extends BaseLoader
$this->partRepository->save($part); $this->partRepository->save($part);
} }
$this->progressBar->setMessage($part->getNumber()); $this->progressBar->setMessage($part->getId());
$this->progressBar->advance(); $this->progressBar->advance();
} }
$this->progressBar->finish(); $this->progressBar->finish();
@ -72,7 +72,7 @@ class RelationLoader extends BaseLoader
*/ */
private function loadPartRelation(Part $part) private function loadPartRelation(Part $part)
{ {
$number = $part->getNumber(); $number = $part->getId();
$model = $this->modelRepository->findOneByNumber($number); $model = $this->modelRepository->findOneByNumber($number);
if (!$model) { if (!$model) {
$number = $this->relationMapper->find($this->getPrintedParentId($number), 'part_model'); $number = $this->relationMapper->find($this->getPrintedParentId($number), 'part_model');

View File

@ -24,9 +24,9 @@ class ModelService
$this->resursiveLoadModels($subpart->getSubpart(), $subpart->getCount()); $this->resursiveLoadModels($subpart->getSubpart(), $subpart->getCount());
} }
} else { } 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, 'quantity' => $q + $quantity,
'model' => $model, 'model' => $model,
]; ];

View File

@ -41,15 +41,15 @@ class SetService
{ {
$models = []; $models = [];
$inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getNumber(), $spare, true); $inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getId(), $spare, true);
/** @var Inventory_Part $inventoryPart */ /** @var Inventory_Part $inventoryPart */
foreach ($inventoryParts as $inventoryPart) { foreach ($inventoryParts as $inventoryPart) {
if ($model = $inventoryPart->getPart()->getModel()) { if ($model = $inventoryPart->getPart()->getModel()) {
if (isset($models[$model->getNumber()])) { if (isset($models[$model->getId()])) {
$models[$model->getNumber()]['quantity'] += $inventoryPart->getQuantity(); $models[$model->getId()]['quantity'] += $inventoryPart->getQuantity();
} else { } else {
$models[$model->getNumber()] = [ $models[$model->getId()] = [
'model' => $model, 'model' => $model,
'quantity' => $inventoryPart->getQuantity(), 'quantity' => $inventoryPart->getQuantity(),
]; ];
@ -85,21 +85,21 @@ class SetService
{ {
$models = []; $models = [];
$inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getNumber(), $spare, true); $inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getId(), $spare, true);
/** @var Inventory_Part $inventoryPart */ /** @var Inventory_Part $inventoryPart */
foreach ($inventoryParts as $inventoryPart) { foreach ($inventoryParts as $inventoryPart) {
if ($model = $inventoryPart->getPart()->getModel()) { if ($model = $inventoryPart->getPart()->getModel()) {
$color = $inventoryPart->getColor(); $color = $inventoryPart->getColor();
if (!isset($models[$model->getNumber()]['model'])) { if (!isset($models[$model->getId()]['model'])) {
$models[$model->getNumber()]['model'] = $model; $models[$model->getId()]['model'] = $model;
} }
if (isset($models[$model->getNumber()]['colors'][$color->getId()])) { if (isset($models[$model->getId()]['colors'][$color->getId()])) {
$models[$model->getNumber()]['colors'][$color->getId()]['quantity'] += $inventoryPart->getQuantity(); $models[$model->getId()]['colors'][$color->getId()]['quantity'] += $inventoryPart->getQuantity();
} else { } else {
$models[$model->getNumber()]['colors'][$color->getId()] = [ $models[$model->getId()]['colors'][$color->getId()] = [
'color' => $color, 'color' => $color,
'quantity' => $inventoryPart->getQuantity(), 'quantity' => $inventoryPart->getQuantity(),
]; ];
@ -135,7 +135,7 @@ class SetService
{ {
$colors = []; $colors = [];
$inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getNumber(), $spare, true); $inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getId(), $spare, true);
/** @var Inventory_Part $inventoryPart */ /** @var Inventory_Part $inventoryPart */
foreach ($inventoryParts as $inventoryPart) { foreach ($inventoryParts as $inventoryPart) {
@ -149,10 +149,10 @@ class SetService
$colors[$color->getId()]['quantity'] += $inventoryPart->getQuantity(); $colors[$color->getId()]['quantity'] += $inventoryPart->getQuantity();
if (isset($colors[$color->getId()]['models'][$model->getNumber()])) { if (isset($colors[$color->getId()]['models'][$model->getId()])) {
$colors[$color->getId()]['models'][$model->getNumber()]['quantity'] += $inventoryPart->getQuantity(); $colors[$color->getId()]['models'][$model->getId()]['quantity'] += $inventoryPart->getQuantity();
} else { } else {
$colors[$color->getId()]['models'][$model->getNumber()] = [ $colors[$color->getId()]['models'][$model->getId()] = [
'model' => $model, 'model' => $model,
'quantity' => $inventoryPart->getQuantity(), 'quantity' => $inventoryPart->getQuantity(),
]; ];
@ -173,14 +173,14 @@ class SetService
{ {
$parts = []; $parts = [];
$inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getNumber(), $spare, $model); $inventoryParts = $this->inventoryPartRepository->findAllBySetNumber($set->getId(), $spare, $model);
/** @var Inventory_Part $inventoryPart */ /** @var Inventory_Part $inventoryPart */
foreach ($inventoryParts as $inventoryPart) { foreach ($inventoryParts as $inventoryPart) {
if (isset($parts[$inventoryPart->getPart()->getNumber()])) { if (isset($parts[$inventoryPart->getPart()->getId()])) {
$parts[$inventoryPart->getPart()->getNumber()]['quantity'] += $inventoryPart->getQuantity(); $parts[$inventoryPart->getPart()->getId()]['quantity'] += $inventoryPart->getQuantity();
} else { } else {
$parts[$inventoryPart->getPart()->getNumber()] = [ $parts[$inventoryPart->getPart()->getId()] = [
'part' => $inventoryPart->getPart(), 'part' => $inventoryPart->getPart(),
'quantity' => $inventoryPart->getQuantity(), 'quantity' => $inventoryPart->getQuantity(),
]; ];

View File

@ -47,8 +47,8 @@ class ZipService
public function createFromSet(Set $set, $sorted = false) public function createFromSet(Set $set, $sorted = false)
{ {
$sort = $sorted ? 'sorted' : 'unsorted'; $sort = $sorted ? 'Multi-Color' : 'Uni-Color';
$this->zipName = "set_{$set->getNumber()}_{$set->getName()}({$sort})"; $this->zipName = "set_{$set->getId()}_{$set->getName()}({$sort})";
$zipPath = tempnam(sys_get_temp_dir(), 'printabrick'); $zipPath = tempnam(sys_get_temp_dir(), 'printabrick');
$this->archive = $this->createZip($zipPath); $this->archive = $this->createZip($zipPath);
@ -67,18 +67,18 @@ class ZipService
public function createFromModel(Model $model, $subparts = false) public function createFromModel(Model $model, $subparts = false)
{ {
$this->zipName = "model_{$model->getNumber()}"; $this->zipName = "model_{$model->getId()}";
$zipPath = tempnam(sys_get_temp_dir(), 'printabrick'); $zipPath = tempnam(sys_get_temp_dir(), 'printabrick');
$this->archive = $this->createZip($zipPath); $this->archive = $this->createZip($zipPath);
$filename = "{$this->zipName}/{$model->getNumber()}.stl"; $filename = "{$this->zipName}/{$model->getId()}.stl";
$this->addModel($filename, $model); $this->addModel($filename, $model);
if ($subparts) { if ($subparts) {
foreach ($this->modelService->getAllSubparts($model) as $subpart) { foreach ($this->modelService->getAllSubparts($model) as $subpart) {
$submodel = $subpart['model']; $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); $this->addModel($filename, $submodel);
} }
@ -107,7 +107,7 @@ class ZipService
$model = $modelArray['model']; $model = $modelArray['model'];
$quantity = $modelArray['quantity']; $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); $this->addModel($filename, $model);
} }
@ -137,7 +137,7 @@ class ZipService
private function addModel($path, $model) private function addModel($path, $model)
{ {
$this->archive->addFromString($path, $this->mediaFilesystem->read($model->getPath())); $this->archive->addFromString($path, $this->mediaFilesystem->read($model->getPath()));
$this->models[$model->getNumber()] = $model; $this->models[$model->getId()] = $model;
} }
private function addLicense() private function addLicense()
@ -149,7 +149,7 @@ class ZipService
$text .= sprintf('Attribution:'."\n"."\n"); $text .= sprintf('Attribution:'."\n"."\n");
foreach ($this->models as $model) { 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); $this->archive->addFromString("{$this->zipName}/LICENSE.txt", $text);