Add progressbar and console progress output to update command

This commit is contained in:
Kacper Donat 2020-01-03 20:47:30 +01:00
parent 3f92318cdd
commit eed36786ec
7 changed files with 149 additions and 183 deletions

View File

@ -25,6 +25,6 @@ class UpdateCommand extends Command
protected function execute(InputInterface $input, OutputInterface $output)
{
$this->updater->update();
$this->updater->update($output);
}
}

View File

@ -2,8 +2,24 @@
namespace App\Event;
use Symfony\Component\EventDispatcher\Event;
use App\Service\DataUpdater;
use Symfony\Component\Console\Output\NullOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Contracts\EventDispatcher\Event;
class DataUpdateEvent extends Event
{
const NAME = DataUpdater::UPDATE_EVENT;
private $output;
public function __construct(?OutputInterface $output = null)
{
$this->output = $output ?? new NullOutput();
}
public function getOutput(): OutputInterface
{
return $this->output;
}
}

View File

@ -1,148 +0,0 @@
<?php declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20190611163333 extends AbstractMigration
{
public function up(Schema $schema) : void
{
// this up() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'sqlite', 'Migration can only be executed safely on \'sqlite\'.');
$this->addSql('DROP INDEX IDX_B95616B6A53A8AA');
$this->addSql('CREATE TEMPORARY TABLE __temp__stop AS SELECT id, provider_id, name, description, variant, latitude, longitude, on_demand FROM stop');
$this->addSql('DROP TABLE stop');
$this->addSql('CREATE TABLE stop (id VARCHAR(255) NOT NULL COLLATE BINARY, provider_id VARCHAR(255) DEFAULT NULL COLLATE BINARY, name VARCHAR(255) NOT NULL COLLATE BINARY, description VARCHAR(255) DEFAULT NULL COLLATE BINARY, variant VARCHAR(255) DEFAULT NULL COLLATE BINARY, latitude DOUBLE PRECISION DEFAULT NULL, longitude DOUBLE PRECISION DEFAULT NULL, on_demand BOOLEAN NOT NULL, PRIMARY KEY(id), CONSTRAINT FK_B95616B6A53A8AA FOREIGN KEY (provider_id) REFERENCES provider (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
$this->addSql('INSERT INTO stop (id, provider_id, name, description, variant, latitude, longitude, on_demand) SELECT id, provider_id, name, description, variant, latitude, longitude, on_demand FROM __temp__stop');
$this->addSql('DROP TABLE __temp__stop');
$this->addSql('CREATE INDEX IDX_B95616B6A53A8AA ON stop (provider_id)');
$this->addSql('DROP INDEX IDX_D6E3F8A64D7B7542');
$this->addSql('DROP INDEX IDX_D6E3F8A6A53A8AA');
$this->addSql('CREATE TEMPORARY TABLE __temp__track AS SELECT id, line_id, provider_id, variant, description FROM track');
$this->addSql('DROP TABLE track');
$this->addSql('CREATE TABLE track (id VARCHAR(255) NOT NULL COLLATE BINARY, line_id VARCHAR(255) DEFAULT NULL COLLATE BINARY, provider_id VARCHAR(255) DEFAULT NULL COLLATE BINARY, variant VARCHAR(16) DEFAULT NULL COLLATE BINARY, description VARCHAR(256) DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id), CONSTRAINT FK_D6E3F8A64D7B7542 FOREIGN KEY (line_id) REFERENCES line (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_D6E3F8A6A53A8AA FOREIGN KEY (provider_id) REFERENCES provider (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
$this->addSql('INSERT INTO track (id, line_id, provider_id, variant, description) SELECT id, line_id, provider_id, variant, description FROM __temp__track');
$this->addSql('DROP TABLE __temp__track');
$this->addSql('CREATE INDEX IDX_D6E3F8A64D7B7542 ON track (line_id)');
$this->addSql('CREATE INDEX IDX_D6E3F8A6A53A8AA ON track (provider_id)');
$this->addSql('DROP INDEX IDX_24003EB35ED23C43');
$this->addSql('DROP INDEX IDX_24003EB33902063D');
$this->addSql('CREATE TEMPORARY TABLE __temp__track_stop AS SELECT stop_id, track_id, sequence FROM track_stop');
$this->addSql('DROP TABLE track_stop');
$this->addSql('CREATE TABLE track_stop (stop_id VARCHAR(255) NOT NULL COLLATE BINARY, track_id VARCHAR(255) NOT NULL COLLATE BINARY, sequence INTEGER NOT NULL, PRIMARY KEY(stop_id, track_id, sequence), CONSTRAINT FK_24003EB33902063D FOREIGN KEY (stop_id) REFERENCES stop (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_24003EB35ED23C43 FOREIGN KEY (track_id) REFERENCES track (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
$this->addSql('INSERT INTO track_stop (stop_id, track_id, sequence) SELECT stop_id, track_id, sequence FROM __temp__track_stop');
$this->addSql('DROP TABLE __temp__track_stop');
$this->addSql('CREATE INDEX IDX_24003EB35ED23C43 ON track_stop (track_id)');
$this->addSql('CREATE INDEX IDX_24003EB33902063D ON track_stop (stop_id)');
$this->addSql('DROP INDEX IDX_7656F53B584598A3');
$this->addSql('DROP INDEX IDX_7656F53B5ED23C43');
$this->addSql('DROP INDEX IDX_7656F53BA53A8AA');
$this->addSql('CREATE TEMPORARY TABLE __temp__trip AS SELECT id, operator_id, track_id, provider_id, variant, note FROM trip');
$this->addSql('DROP TABLE trip');
$this->addSql('CREATE TABLE trip (id VARCHAR(255) NOT NULL COLLATE BINARY, operator_id VARCHAR(255) DEFAULT NULL COLLATE BINARY, track_id VARCHAR(255) DEFAULT NULL COLLATE BINARY, provider_id VARCHAR(255) DEFAULT NULL COLLATE BINARY, variant VARCHAR(255) DEFAULT NULL COLLATE BINARY, note VARCHAR(255) DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id), CONSTRAINT FK_7656F53B584598A3 FOREIGN KEY (operator_id) REFERENCES operator (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_7656F53B5ED23C43 FOREIGN KEY (track_id) REFERENCES track (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_7656F53BA53A8AA FOREIGN KEY (provider_id) REFERENCES provider (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
$this->addSql('INSERT INTO trip (id, operator_id, track_id, provider_id, variant, note) SELECT id, operator_id, track_id, provider_id, variant, note FROM __temp__trip');
$this->addSql('DROP TABLE __temp__trip');
$this->addSql('CREATE INDEX IDX_7656F53B584598A3 ON trip (operator_id)');
$this->addSql('CREATE INDEX IDX_7656F53B5ED23C43 ON trip (track_id)');
$this->addSql('CREATE INDEX IDX_7656F53BA53A8AA ON trip (provider_id)');
$this->addSql('DROP INDEX IDX_D7A6A781A53A8AA');
$this->addSql('CREATE TEMPORARY TABLE __temp__operator AS SELECT id, provider_id, name, email, url, phone FROM operator');
$this->addSql('DROP TABLE operator');
$this->addSql('CREATE TABLE operator (id VARCHAR(255) NOT NULL COLLATE BINARY, provider_id VARCHAR(255) DEFAULT NULL COLLATE BINARY, name VARCHAR(255) NOT NULL COLLATE BINARY, email VARCHAR(255) DEFAULT NULL COLLATE BINARY, url VARCHAR(255) DEFAULT NULL COLLATE BINARY, phone VARCHAR(255) DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id), CONSTRAINT FK_D7A6A781A53A8AA FOREIGN KEY (provider_id) REFERENCES provider (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
$this->addSql('INSERT INTO operator (id, provider_id, name, email, url, phone) SELECT id, provider_id, name, email, url, phone FROM __temp__operator');
$this->addSql('DROP TABLE __temp__operator');
$this->addSql('CREATE INDEX IDX_D7A6A781A53A8AA ON operator (provider_id)');
$this->addSql('DROP INDEX IDX_926E85DD3902063D');
$this->addSql('DROP INDEX IDX_926E85DDA5BC2E0E');
$this->addSql('CREATE TEMPORARY TABLE __temp__trip_stop AS SELECT stop_id, trip_id, sequence, arrival, departure FROM trip_stop');
$this->addSql('DROP TABLE trip_stop');
$this->addSql('CREATE TABLE trip_stop (stop_id VARCHAR(255) NOT NULL COLLATE BINARY, trip_id VARCHAR(255) NOT NULL COLLATE BINARY, sequence INTEGER NOT NULL, arrival DATETIME NOT NULL, departure DATETIME NOT NULL, PRIMARY KEY(stop_id, trip_id, sequence), CONSTRAINT FK_926E85DD3902063D FOREIGN KEY (stop_id) REFERENCES stop (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_926E85DDA5BC2E0E FOREIGN KEY (trip_id) REFERENCES trip (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
$this->addSql('INSERT INTO trip_stop (stop_id, trip_id, sequence, arrival, departure) SELECT stop_id, trip_id, sequence, arrival, departure FROM __temp__trip_stop');
$this->addSql('DROP TABLE __temp__trip_stop');
$this->addSql('CREATE INDEX IDX_926E85DD3902063D ON trip_stop (stop_id)');
$this->addSql('CREATE INDEX IDX_926E85DDA5BC2E0E ON trip_stop (trip_id)');
$this->addSql('DROP INDEX IDX_D114B4F6584598A3');
$this->addSql('DROP INDEX IDX_D114B4F6A53A8AA');
$this->addSql('CREATE TEMPORARY TABLE __temp__line AS SELECT id, operator_id, provider_id, symbol, type, fast, night FROM line');
$this->addSql('DROP TABLE line');
$this->addSql('CREATE TABLE line (id VARCHAR(255) NOT NULL COLLATE BINARY, operator_id VARCHAR(255) DEFAULT NULL COLLATE BINARY, provider_id VARCHAR(255) DEFAULT NULL COLLATE BINARY, symbol VARCHAR(16) NOT NULL COLLATE BINARY, type VARCHAR(20) NOT NULL COLLATE BINARY, fast BOOLEAN NOT NULL, night BOOLEAN NOT NULL, PRIMARY KEY(id), CONSTRAINT FK_D114B4F6584598A3 FOREIGN KEY (operator_id) REFERENCES operator (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_D114B4F6A53A8AA FOREIGN KEY (provider_id) REFERENCES provider (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
$this->addSql('INSERT INTO line (id, operator_id, provider_id, symbol, type, fast, night) SELECT id, operator_id, provider_id, symbol, type, fast, night FROM __temp__line');
$this->addSql('DROP TABLE __temp__line');
$this->addSql('CREATE INDEX IDX_D114B4F6584598A3 ON line (operator_id)');
$this->addSql('CREATE INDEX IDX_D114B4F6A53A8AA ON line (provider_id)');
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'sqlite', 'Migration can only be executed safely on \'sqlite\'.');
$this->addSql('DROP INDEX IDX_D114B4F6584598A3');
$this->addSql('DROP INDEX IDX_D114B4F6A53A8AA');
$this->addSql('CREATE TEMPORARY TABLE __temp__line AS SELECT id, operator_id, provider_id, symbol, type, fast, night FROM line');
$this->addSql('DROP TABLE line');
$this->addSql('CREATE TABLE line (id VARCHAR(255) NOT NULL, operator_id VARCHAR(255) DEFAULT NULL, provider_id VARCHAR(255) DEFAULT NULL, symbol VARCHAR(16) NOT NULL, type VARCHAR(20) NOT NULL, fast BOOLEAN NOT NULL, night BOOLEAN NOT NULL, PRIMARY KEY(id))');
$this->addSql('INSERT INTO line (id, operator_id, provider_id, symbol, type, fast, night) SELECT id, operator_id, provider_id, symbol, type, fast, night FROM __temp__line');
$this->addSql('DROP TABLE __temp__line');
$this->addSql('CREATE INDEX IDX_D114B4F6584598A3 ON line (operator_id)');
$this->addSql('CREATE INDEX IDX_D114B4F6A53A8AA ON line (provider_id)');
$this->addSql('DROP INDEX IDX_D7A6A781A53A8AA');
$this->addSql('CREATE TEMPORARY TABLE __temp__operator AS SELECT id, provider_id, name, email, url, phone FROM operator');
$this->addSql('DROP TABLE operator');
$this->addSql('CREATE TABLE operator (id VARCHAR(255) NOT NULL, provider_id VARCHAR(255) DEFAULT NULL, name VARCHAR(255) NOT NULL, email VARCHAR(255) DEFAULT NULL, url VARCHAR(255) DEFAULT NULL, phone VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))');
$this->addSql('INSERT INTO operator (id, provider_id, name, email, url, phone) SELECT id, provider_id, name, email, url, phone FROM __temp__operator');
$this->addSql('DROP TABLE __temp__operator');
$this->addSql('CREATE INDEX IDX_D7A6A781A53A8AA ON operator (provider_id)');
$this->addSql('DROP INDEX IDX_B95616B6A53A8AA');
$this->addSql('CREATE TEMPORARY TABLE __temp__stop AS SELECT id, provider_id, name, description, variant, latitude, longitude, on_demand FROM stop');
$this->addSql('DROP TABLE stop');
$this->addSql('CREATE TABLE stop (id VARCHAR(255) NOT NULL, provider_id VARCHAR(255) DEFAULT NULL, name VARCHAR(255) NOT NULL, description VARCHAR(255) DEFAULT NULL, variant VARCHAR(255) DEFAULT NULL, latitude DOUBLE PRECISION DEFAULT NULL, longitude DOUBLE PRECISION DEFAULT NULL, on_demand BOOLEAN NOT NULL, PRIMARY KEY(id))');
$this->addSql('INSERT INTO stop (id, provider_id, name, description, variant, latitude, longitude, on_demand) SELECT id, provider_id, name, description, variant, latitude, longitude, on_demand FROM __temp__stop');
$this->addSql('DROP TABLE __temp__stop');
$this->addSql('CREATE INDEX IDX_B95616B6A53A8AA ON stop (provider_id)');
$this->addSql('DROP INDEX IDX_D6E3F8A64D7B7542');
$this->addSql('DROP INDEX IDX_D6E3F8A6A53A8AA');
$this->addSql('CREATE TEMPORARY TABLE __temp__track AS SELECT id, line_id, provider_id, variant, description FROM track');
$this->addSql('DROP TABLE track');
$this->addSql('CREATE TABLE track (id VARCHAR(255) NOT NULL, line_id VARCHAR(255) DEFAULT NULL, provider_id VARCHAR(255) DEFAULT NULL, variant VARCHAR(16) DEFAULT NULL, description VARCHAR(256) DEFAULT NULL, PRIMARY KEY(id))');
$this->addSql('INSERT INTO track (id, line_id, provider_id, variant, description) SELECT id, line_id, provider_id, variant, description FROM __temp__track');
$this->addSql('DROP TABLE __temp__track');
$this->addSql('CREATE INDEX IDX_D6E3F8A64D7B7542 ON track (line_id)');
$this->addSql('CREATE INDEX IDX_D6E3F8A6A53A8AA ON track (provider_id)');
$this->addSql('DROP INDEX IDX_24003EB33902063D');
$this->addSql('DROP INDEX IDX_24003EB35ED23C43');
$this->addSql('CREATE TEMPORARY TABLE __temp__track_stop AS SELECT sequence, stop_id, track_id FROM track_stop');
$this->addSql('DROP TABLE track_stop');
$this->addSql('CREATE TABLE track_stop (sequence INTEGER NOT NULL, stop_id VARCHAR(255) NOT NULL, track_id VARCHAR(255) NOT NULL, PRIMARY KEY(stop_id, track_id, sequence))');
$this->addSql('INSERT INTO track_stop (sequence, stop_id, track_id) SELECT sequence, stop_id, track_id FROM __temp__track_stop');
$this->addSql('DROP TABLE __temp__track_stop');
$this->addSql('CREATE INDEX IDX_24003EB33902063D ON track_stop (stop_id)');
$this->addSql('CREATE INDEX IDX_24003EB35ED23C43 ON track_stop (track_id)');
$this->addSql('DROP INDEX IDX_7656F53B584598A3');
$this->addSql('DROP INDEX IDX_7656F53B5ED23C43');
$this->addSql('DROP INDEX IDX_7656F53BA53A8AA');
$this->addSql('CREATE TEMPORARY TABLE __temp__trip AS SELECT id, operator_id, track_id, provider_id, variant, note FROM trip');
$this->addSql('DROP TABLE trip');
$this->addSql('CREATE TABLE trip (id VARCHAR(255) NOT NULL, operator_id VARCHAR(255) DEFAULT NULL, track_id VARCHAR(255) DEFAULT NULL, provider_id VARCHAR(255) DEFAULT NULL, variant VARCHAR(255) DEFAULT NULL, note VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))');
$this->addSql('INSERT INTO trip (id, operator_id, track_id, provider_id, variant, note) SELECT id, operator_id, track_id, provider_id, variant, note FROM __temp__trip');
$this->addSql('DROP TABLE __temp__trip');
$this->addSql('CREATE INDEX IDX_7656F53B584598A3 ON trip (operator_id)');
$this->addSql('CREATE INDEX IDX_7656F53B5ED23C43 ON trip (track_id)');
$this->addSql('CREATE INDEX IDX_7656F53BA53A8AA ON trip (provider_id)');
$this->addSql('DROP INDEX IDX_926E85DD3902063D');
$this->addSql('DROP INDEX IDX_926E85DDA5BC2E0E');
$this->addSql('CREATE TEMPORARY TABLE __temp__trip_stop AS SELECT sequence, stop_id, trip_id, arrival, departure FROM trip_stop');
$this->addSql('DROP TABLE trip_stop');
$this->addSql('CREATE TABLE trip_stop (sequence INTEGER NOT NULL, stop_id VARCHAR(255) NOT NULL, trip_id VARCHAR(255) NOT NULL, arrival DATETIME NOT NULL, departure DATETIME NOT NULL, PRIMARY KEY(stop_id, trip_id, sequence))');
$this->addSql('INSERT INTO trip_stop (sequence, stop_id, trip_id, arrival, departure) SELECT sequence, stop_id, trip_id, arrival, departure FROM __temp__trip_stop');
$this->addSql('DROP TABLE __temp__trip_stop');
$this->addSql('CREATE INDEX IDX_926E85DD3902063D ON trip_stop (stop_id)');
$this->addSql('CREATE INDEX IDX_926E85DDA5BC2E0E ON trip_stop (trip_id)');
}
}

View File

@ -0,0 +1,63 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20200103170517 extends AbstractMigration
{
public function getDescription() : string
{
return '';
}
public function up(Schema $schema) : void
{
// this up() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'sqlite', 'Migration can only be executed safely on \'sqlite\'.');
$this->addSql('DROP INDEX IDX_926E85DDA5BC2E0E');
$this->addSql('DROP INDEX IDX_926E85DD3902063D');
$this->addSql('CREATE TEMPORARY TABLE __temp__trip_stop AS SELECT stop_id, trip_id, sequence, arrival, departure FROM trip_stop');
$this->addSql('DROP TABLE trip_stop');
$this->addSql('CREATE TABLE trip_stop (stop_id VARCHAR(255) NOT NULL COLLATE BINARY, trip_id VARCHAR(255) NOT NULL COLLATE BINARY, sequence INTEGER NOT NULL, arrival DATETIME NOT NULL, departure DATETIME NOT NULL, PRIMARY KEY(stop_id, trip_id, sequence))');
$this->addSql('INSERT INTO trip_stop (stop_id, trip_id, sequence, arrival, departure) SELECT stop_id, trip_id, sequence, arrival, departure FROM __temp__trip_stop');
$this->addSql('DROP TABLE __temp__trip_stop');
$this->addSql('DROP INDEX IDX_7656F53BA53A8AA');
$this->addSql('DROP INDEX IDX_7656F53B5ED23C43');
$this->addSql('DROP INDEX IDX_7656F53B584598A3');
$this->addSql('CREATE TEMPORARY TABLE __temp__trip AS SELECT id, operator_id, track_id, provider_id, variant, note FROM trip');
$this->addSql('DROP TABLE trip');
$this->addSql('CREATE TABLE trip (id VARCHAR(255) NOT NULL COLLATE BINARY, operator_id VARCHAR(255) DEFAULT NULL COLLATE BINARY, track_id VARCHAR(255) DEFAULT NULL COLLATE BINARY, provider_id VARCHAR(255) DEFAULT NULL COLLATE BINARY, variant VARCHAR(255) DEFAULT NULL COLLATE BINARY, note VARCHAR(255) DEFAULT NULL COLLATE BINARY, PRIMARY KEY(id))');
$this->addSql('INSERT INTO trip (id, operator_id, track_id, provider_id, variant, note) SELECT id, operator_id, track_id, provider_id, variant, note FROM __temp__trip');
$this->addSql('DROP TABLE __temp__trip');
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'sqlite', 'Migration can only be executed safely on \'sqlite\'.');
$this->addSql('CREATE TEMPORARY TABLE __temp__trip AS SELECT id, variant, note, operator_id, track_id, provider_id FROM trip');
$this->addSql('DROP TABLE trip');
$this->addSql('CREATE TABLE trip (id VARCHAR(255) NOT NULL, variant VARCHAR(255) DEFAULT NULL, note VARCHAR(255) DEFAULT NULL, operator_id VARCHAR(255) DEFAULT NULL, track_id VARCHAR(255) DEFAULT NULL, provider_id VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))');
$this->addSql('INSERT INTO trip (id, variant, note, operator_id, track_id, provider_id) SELECT id, variant, note, operator_id, track_id, provider_id FROM __temp__trip');
$this->addSql('DROP TABLE __temp__trip');
$this->addSql('CREATE INDEX IDX_7656F53BA53A8AA ON trip (provider_id)');
$this->addSql('CREATE INDEX IDX_7656F53B5ED23C43 ON trip (track_id)');
$this->addSql('CREATE INDEX IDX_7656F53B584598A3 ON trip (operator_id)');
$this->addSql('CREATE TEMPORARY TABLE __temp__trip_stop AS SELECT sequence, stop_id, trip_id, arrival, departure FROM trip_stop');
$this->addSql('DROP TABLE trip_stop');
$this->addSql('CREATE TABLE trip_stop (sequence INTEGER NOT NULL, stop_id VARCHAR(255) NOT NULL, trip_id VARCHAR(255) NOT NULL, arrival DATETIME NOT NULL, departure DATETIME NOT NULL, PRIMARY KEY(stop_id, trip_id, sequence))');
$this->addSql('INSERT INTO trip_stop (sequence, stop_id, trip_id, arrival, departure) SELECT sequence, stop_id, trip_id, arrival, departure FROM __temp__trip_stop');
$this->addSql('DROP TABLE __temp__trip_stop');
$this->addSql('CREATE INDEX IDX_926E85DDA5BC2E0E ON trip_stop (trip_id)');
$this->addSql('CREATE INDEX IDX_926E85DD3902063D ON trip_stop (stop_id)');
}
}

View File

@ -21,7 +21,10 @@ trait FillTrait
}
}
public static function createFromArray(array $vars = [], ...$args)
/**
* @return static
*/
public static function createFromArray(array $vars = [], ...$args): self
{
$reflection = new \ReflectionClass(static::class);
$constructor = $reflection->getConstructor();

View File

@ -10,15 +10,20 @@ use App\Entity\StopInTrack;
use App\Entity\TrackEntity;
use App\Entity\TripEntity;
use App\Entity\TripStopEntity;
use App\Event\DataUpdateEvent;
use App\Model\Line as LineModel;
use App\Service\DataUpdater;
use App\Service\IdUtils;
use Carbon\Carbon;
use Doctrine\ORM\EntityManagerInterface;
use function Kadet\Functional\partial;
use Symfony\Component\Console\Helper\ProgressBar;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\ConsoleSectionOutput;
use Symfony\Component\Console\Output\NullOutput;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Tightenco\Collect\Support\Collection;
use function Kadet\Functional\ref;
class ZtmGdanskDataUpdateSubscriber implements EventSubscriberInterface
{
@ -55,7 +60,7 @@ class ZtmGdanskDataUpdateSubscriber implements EventSubscriberInterface
$this->provider = $provider;
}
public function update()
public function update(DataUpdateEvent $event)
{
$provider = ProviderEntity::createFromArray([
'name' => $this->provider->getName(),
@ -65,20 +70,23 @@ class ZtmGdanskDataUpdateSubscriber implements EventSubscriberInterface
$this->em->persist($provider);
$save = [$this->em, 'persist'];
$save = ref([$this->em, 'persist']);
$this->getOperators($provider)->each($save);
$this->getStops($provider)->each($save);
$this->getTracks($provider)->each($save);
$this->getLines($provider)->each($save)->each(partial([$this, 'getSchedule'], $provider, $save));
$this->getOperators($provider, $event)->each($save);
$this->getStops($provider, $event)->each($save);
$this->getTracks($provider, $event)->each($save);
$lines = $this->getLines($provider, $event)->each($save);
$this->updateSchedule($provider, $lines, $event);
}
private function getOperators(ProviderEntity $provider)
private function getOperators(ProviderEntity $provider, DataUpdateEvent $event)
{
$this->logger->info('Obtaining operators from ZTM Gdańsk');
$output = $event->getOutput();
$output->write('Obtaining operators from ZTM Gdańsk...');
$operators = file_get_contents(self::OPERATORS_URL);
$operators = json_decode($operators, true)['agency'];
$output->writeln(sprintf('done (%d)', count($operators)));
$this->logger->info(sprintf('Saving %s operators from ZTM Gdańsk', count($operators)));
@ -91,12 +99,13 @@ class ZtmGdanskDataUpdateSubscriber implements EventSubscriberInterface
});
}
private function getLines(ProviderEntity $provider)
private function getLines(ProviderEntity $provider, DataUpdateEvent $event)
{
$this->logger->info('Obtaining lines from ZTM Gdańsk');
$output = $event->getOutput();
$output->write('Obtaining lines from ZTM Gdańsk... ');
$lines = file_get_contents(self::LINES_URL);
$lines = json_decode($lines, true)[date('Y-m-d')]['routes'];
$output->writeln(sprintf('done (%d)', count($lines)));
$this->logger->info(sprintf('Saving %s lines from ZTM Gdańsk', count($lines)));
@ -124,15 +133,16 @@ class ZtmGdanskDataUpdateSubscriber implements EventSubscriberInterface
});
}
private function getStops(ProviderEntity $provider)
private function getStops(ProviderEntity $provider, DataUpdateEvent $event)
{
$this->logger->info('Obtaining stops from ZTM Gdańsk');
$output = $event->getOutput();
$output->write('Obtaining stops from ZTM Gdańsk... ');
$stops = file_get_contents(self::STOPS_URL);
$stops = json_decode($stops, true)[date('Y-m-d')]['stops'];
$output->writeln(sprintf('done (%d)', count($stops)));
$this->logger->info(sprintf('Saving %d stops from ZTM Gdańsk', count($stops)));
$this->logger->debug(sprintf("Saving %d stops tracks from ZTM Gdańsk.", count($stops)));
return collect($stops)->map(function ($stop) use ($provider) {
return StopEntity::createFromArray([
'id' => $this->ids->generate($provider, $stop['stopId']),
@ -146,26 +156,28 @@ class ZtmGdanskDataUpdateSubscriber implements EventSubscriberInterface
});
}
public function getTracks(ProviderEntity $provider)
public function getTracks(ProviderEntity $provider, DataUpdateEvent $event)
{
ini_set('memory_limit','2G');
ini_set('memory_limit', '2G');
$this->logger->info('Obtaining tracks from ZTM Gdańsk');
$output = $event->getOutput();
$output->write('Obtaining tracks from ZTM Gdańsk... ');
$tracks = file_get_contents(self::TRACKS_URL);
$tracks = json_decode($tracks, true)[date('Y-m-d')]['trips'];
$output->writeln(sprintf('done (%d)', count($tracks)));
$this->logger->debug(sprintf("Got %d tracks from ZTM Gdańsk.", count($tracks)));
$this->logger->info('Obtaining stops associations from ZTM Gdańsk');
$output->write('Obtaining stops associations... ');
$stops = file_get_contents(self::STOPS_IN_TRACKS_URL);
$stops = json_decode($stops, true)[date('Y-m-d')]['stopsInTrip'];
$output->writeln(sprintf('done (%d)', count($stops)));
$this->logger->debug(sprintf("Got %d stops in all tracks from ZTM Gdańsk.", count($stops)));
$stops = collect($stops)->groupBy(function ($stop) {
return sprintf("R%sT%s", $stop['routeId'], $stop['tripId']);
});
$this->logger->info(sprintf('Saving %d tracks from ZTM Gdańsk', count($stops)));
return collect($tracks)->map(function ($track) use ($provider, $stops) {
$entity = TrackEntity::createFromArray([
'id' => $this->ids->generate($provider, $track['id']),
@ -194,10 +206,8 @@ class ZtmGdanskDataUpdateSubscriber implements EventSubscriberInterface
});
}
public function getSchedule(ProviderEntity $provider, callable $save, LineEntity $line)
public function saveScheduleForLine(ProviderEntity $provider, LineEntity $line)
{
$this->logger->info(sprintf('Obtaining schedule for line %s from ZTM Gdańsk', $line->getId()));
$url = sprintf("%s?%s", self::SCHEDULE_URL, http_build_query([
'date' => date('Y-m-d'),
'routeId' => $this->ids->of($line),
@ -253,7 +263,9 @@ class ZtmGdanskDataUpdateSubscriber implements EventSubscriberInterface
$entity->setStops($stops);
return $entity;
})->each($save);
})->each(ref([$this->em, 'persist']));
$this->logger->debug(sprintf('Got schedule for line %s from ZTM Gdańsk', $line->getId()));
$this->em->flush();
$this->em->clear();
@ -265,4 +277,24 @@ class ZtmGdanskDataUpdateSubscriber implements EventSubscriberInterface
DataUpdater::UPDATE_EVENT => 'update',
];
}
private function updateSchedule(ProviderEntity $provider, Collection $lines, DataUpdateEvent $event)
{
$event->getOutput()->writeln(sprintf("Obtaining schedule for %d lines...", count($lines)));
$progress = new ProgressBar($event->getOutput(), $lines->count());
$progress->setFormat('%current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s%, line %line%');
$progress->start();
/** @var LineEntity $line */
foreach ($lines as $line) {
$progress->setMessage($line->getSymbol(), 'line');
$progress->display();
$this->saveScheduleForLine($provider, $line);
$progress->advance();
}
$progress->finish();
$progress->
$event->getOutput()->writeln("done");
}
}

View File

@ -5,8 +5,8 @@ namespace App\Service;
use App\Event\DataUpdateEvent;
use Doctrine\DBAL\Schema\Table;
use Doctrine\ORM\EntityManagerInterface;
use function Sodium\add;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
class DataUpdater
{
@ -29,7 +29,7 @@ class DataUpdater
$this->em = $em;
}
public function update()
public function update(OutputInterface $output = null)
{
$connection = $this->em->getConnection();
$connection->getConfiguration()->setSQLLogger(null);
@ -45,7 +45,7 @@ class DataUpdater
return $schema->getName() === 'migration_versions';
})->each([$schema, 'dropAndCreateTable']);
$this->dispatcher->dispatch(self::UPDATE_EVENT, new DataUpdateEvent());
$this->dispatcher->dispatch(new DataUpdateEvent($output), DataUpdateEvent::NAME);
unlink($backup);
} catch (\Throwable $exception) {
$connection->close();