Add destination field in stops
This commit is contained in:
parent
cb6c3a3950
commit
f3fc6cb071
@ -44,7 +44,7 @@ class TrackEntity implements Entity, Fillable
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Stops in track
|
* Stops in track
|
||||||
* @var Collection
|
* @var StopInTrack[]|Collection
|
||||||
* @ORM\OneToMany(targetEntity=StopInTrack::class, fetch="LAZY", mappedBy="track", cascade={"persist"})
|
* @ORM\OneToMany(targetEntity=StopInTrack::class, fetch="LAZY", mappedBy="track", cascade={"persist"})
|
||||||
* @ORM\OrderBy({"order": "ASC"})
|
* @ORM\OrderBy({"order": "ASC"})
|
||||||
*/
|
*/
|
||||||
@ -104,4 +104,9 @@ class TrackEntity implements Entity, Fillable
|
|||||||
{
|
{
|
||||||
$this->stopsInTrack = new ArrayCollection($stopsInTrack);
|
$this->stopsInTrack = new ArrayCollection($stopsInTrack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getFinal(): StopInTrack
|
||||||
|
{
|
||||||
|
return $this->getStopsInTrack()->last();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,9 @@
|
|||||||
namespace App\Model;
|
namespace App\Model;
|
||||||
|
|
||||||
use JMS\Serializer\Annotation as Serializer;
|
use JMS\Serializer\Annotation as Serializer;
|
||||||
|
use Nelmio\ApiDocBundle\Annotation\Model;
|
||||||
use Swagger\Annotations as SWG;
|
use Swagger\Annotations as SWG;
|
||||||
|
use Tightenco\Collect\Support\Collection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Stop
|
* Class Stop
|
||||||
@ -66,6 +68,17 @@ class Stop implements Referable, Fillable
|
|||||||
*/
|
*/
|
||||||
private $group;
|
private $group;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collection of possible destination stops.
|
||||||
|
*
|
||||||
|
* @Serializer\Groups({"WithDestinations"})
|
||||||
|
* @Serializer\Type("Collection")
|
||||||
|
* @SWG\Property(type="array", @SWG\Items(ref=@Model(type=Stop::class, groups={"Default"})))
|
||||||
|
*
|
||||||
|
* @var Collection<Stop>
|
||||||
|
*/
|
||||||
|
private $destinations;
|
||||||
|
|
||||||
public function getName(): string
|
public function getName(): string
|
||||||
{
|
{
|
||||||
return $this->name;
|
return $this->name;
|
||||||
@ -125,4 +138,14 @@ class Stop implements Referable, Fillable
|
|||||||
{
|
{
|
||||||
$this->group = $group;
|
$this->group = $group;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getDestinations(): Collection
|
||||||
|
{
|
||||||
|
return $this->destinations;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDestinations(Collection $destinations): void
|
||||||
|
{
|
||||||
|
$this->destinations = $destinations;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ class StopGroup
|
|||||||
* @var Collection|Stop[]
|
* @var Collection|Stop[]
|
||||||
* @SWG\Property(
|
* @SWG\Property(
|
||||||
* type="array",
|
* type="array",
|
||||||
* @SWG\Items(ref=@Model(type=Stop::class))
|
* @SWG\Items(ref=@Model(type=Stop::class, groups={"Default", "WithDestinations"}))
|
||||||
* )
|
* )
|
||||||
*/
|
*/
|
||||||
private $stops;
|
private $stops;
|
||||||
|
@ -3,10 +3,14 @@
|
|||||||
namespace App\Provider\Database;
|
namespace App\Provider\Database;
|
||||||
|
|
||||||
use App\Entity\StopEntity;
|
use App\Entity\StopEntity;
|
||||||
|
use App\Entity\StopInTrack;
|
||||||
|
use App\Entity\TrackEntity;
|
||||||
use App\Model\Stop;
|
use App\Model\Stop;
|
||||||
|
use App\Model\Track;
|
||||||
use App\Provider\StopRepository;
|
use App\Provider\StopRepository;
|
||||||
use Tightenco\Collect\Support\Collection;
|
use Tightenco\Collect\Support\Collection;
|
||||||
use Kadet\Functional as f;
|
use Kadet\Functional as f;
|
||||||
|
use Kadet\Functional\Transforms as t;
|
||||||
|
|
||||||
class GenericStopRepository extends DatabaseRepository implements StopRepository
|
class GenericStopRepository extends DatabaseRepository implements StopRepository
|
||||||
{
|
{
|
||||||
@ -41,6 +45,33 @@ class GenericStopRepository extends DatabaseRepository implements StopRepository
|
|||||||
->where('s.name LIKE :name')
|
->where('s.name LIKE :name')
|
||||||
->getQuery();
|
->getQuery();
|
||||||
|
|
||||||
return collect($query->execute([':name' => "%$name%"]))->map(f\ref([$this, 'convert']));
|
$stops = collect($query->execute([':name' => "%$name%"]));
|
||||||
|
|
||||||
|
$destinations = collect($this->em->createQueryBuilder()
|
||||||
|
->select('t', 'ts', 'ts2', 's')
|
||||||
|
->from(TrackEntity::class, 't')
|
||||||
|
->join('t.stopsInTrack', 'ts')
|
||||||
|
->join('t.stopsInTrack', 'ts2')
|
||||||
|
->join('ts2.stop', 's')
|
||||||
|
->where('ts.stop IN (:stops)')
|
||||||
|
->getQuery()
|
||||||
|
->execute(['stops' => $stops->map(t\property('id'))->all()]))
|
||||||
|
->reduce(function ($grouped, TrackEntity $track) {
|
||||||
|
foreach ($track->getStopsInTrack()->map(t\property('stop'))->map(t\property('id')) as $stop) {
|
||||||
|
$grouped[$stop] = ($grouped[$stop] ?? collect())->add($track);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $grouped;
|
||||||
|
}, collect())
|
||||||
|
->map(function (Collection $tracks) {
|
||||||
|
return $tracks->map(function (TrackEntity $track) {
|
||||||
|
return $this->convert($track->getFinal()->getStop());
|
||||||
|
})->unique()->values();
|
||||||
|
})
|
||||||
|
;
|
||||||
|
|
||||||
|
return collect($stops)->map(f\ref([$this, 'convert']))->each(function (Stop $stop) use ($destinations) {
|
||||||
|
$stop->setDestinations($destinations[$this->id->generate($this->provider, $stop->getId())]);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -71,6 +71,8 @@ final class SerializerContextFactory
|
|||||||
foreach ($groups as $group) {
|
foreach ($groups as $group) {
|
||||||
if (array_key_exists($group, $annotation->map)) {
|
if (array_key_exists($group, $annotation->map)) {
|
||||||
$result[] = $annotation->map[$group];
|
$result[] = $annotation->map[$group];
|
||||||
|
} else {
|
||||||
|
$result[] = $groups;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user