<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Numbered replay support and unclean-stop closure metadata.
*/
final class Version20260302120000 extends AbstractMigration
{
public function getDescription() : string
{
return 'Add source period/item dedupe metadata and unclean-stop closure fields.';
}
public function up(Schema $schema) : void
{
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
$this->addSql('ALTER TABLE data_samples ADD ingest_mode VARCHAR(16) DEFAULT NULL');
$this->addSql('ALTER TABLE data_samples ADD source_period INT DEFAULT NULL');
$this->addSql('ALTER TABLE data_samples ADD source_item INT DEFAULT NULL');
$this->addSql('ALTER TABLE data_samples ADD sample_seq INT DEFAULT NULL');
$this->addSql('COMMENT ON COLUMN data_samples.ingest_mode IS \'Ingest mode: live or replay.\'');
$this->addSql('COMMENT ON COLUMN data_samples.source_period IS \'Source period from device.\'');
$this->addSql('COMMENT ON COLUMN data_samples.source_item IS \'Source item from device.\'');
$this->addSql('COMMENT ON COLUMN data_samples.sample_seq IS \'Optional sample sequence from device.\'');
$this->addSql('CREATE INDEX IDX_7D990186_SRC_PERIOD ON data_samples (source_period)');
$this->addSql('CREATE INDEX IDX_7D990186_SRC_ITEM ON data_samples (source_item)');
$this->addSql('CREATE UNIQUE INDEX UNIQ_DS_DEV_PERIOD_ITEM ON data_samples (device_id, source_period, source_item) WHERE source_period IS NOT NULL AND source_item IS NOT NULL');
$this->addSql('ALTER TABLE measurements ADD source_period INT DEFAULT NULL');
$this->addSql('ALTER TABLE measurements ADD last_sample_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL');
$this->addSql('ALTER TABLE measurements ADD end_reason VARCHAR(32) DEFAULT NULL');
$this->addSql('COMMENT ON COLUMN measurements.source_period IS \'Source period from device.\'');
$this->addSql('COMMENT ON COLUMN measurements.last_sample_at IS \'Last sample timestamp received for this measurement.\'');
$this->addSql('COMMENT ON COLUMN measurements.end_reason IS \'End reason: NORMAL_STOP or UNCLEAN_STOP.\'');
$this->addSql('CREATE INDEX IDX_71920F21_SRC_PERIOD ON measurements (source_period)');
$this->addSql('CREATE INDEX IDX_71920F21_LAST_SAMPLE_AT ON measurements (last_sample_at)');
$this->addSql('CREATE UNIQUE INDEX UNIQ_M_DEV_PERIOD ON measurements (device_id, source_period) WHERE source_period IS NOT NULL');
}
public function down(Schema $schema) : void
{
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');
$this->addSql('DROP INDEX IF EXISTS UNIQ_M_DEV_PERIOD');
$this->addSql('DROP INDEX IF EXISTS IDX_71920F21_LAST_SAMPLE_AT');
$this->addSql('DROP INDEX IF EXISTS IDX_71920F21_SRC_PERIOD');
$this->addSql('ALTER TABLE measurements DROP source_period');
$this->addSql('ALTER TABLE measurements DROP last_sample_at');
$this->addSql('ALTER TABLE measurements DROP end_reason');
$this->addSql('DROP INDEX IF EXISTS UNIQ_DS_DEV_PERIOD_ITEM');
$this->addSql('DROP INDEX IF EXISTS IDX_7D990186_SRC_PERIOD');
$this->addSql('DROP INDEX IF EXISTS IDX_7D990186_SRC_ITEM');
$this->addSql('ALTER TABLE data_samples DROP ingest_mode');
$this->addSql('ALTER TABLE data_samples DROP source_period');
$this->addSql('ALTER TABLE data_samples DROP source_item');
$this->addSql('ALTER TABLE data_samples DROP sample_seq');
}
}