From 6cc632dba8154c7b47455ccd6b4e06a06ca38aa3 Mon Sep 17 00:00:00 2001 From: Mikolaj Izdebski Date: May 14 2017 13:13:17 +0000 Subject: [models] Time percentage needs to be float, not integer --- diff --git a/alembic/versions/e5a813259652_fix_type_of_time_percentage_column_in_.py b/alembic/versions/e5a813259652_fix_type_of_time_percentage_column_in_.py new file mode 100644 index 0000000..29e1b3f --- /dev/null +++ b/alembic/versions/e5a813259652_fix_type_of_time_percentage_column_in_.py @@ -0,0 +1,56 @@ +""" +Fix type of time_percentage column in resource_consumption_stats table + +Create Date: 2017-05-14 14:59:47.221235 + +""" + +# revision identifiers, used by Alembic. +revision = 'e5a813259652' +down_revision = '62baf8e175d0' + +from alembic import op + + +def upgrade(): + op.execute(""" + +DROP TABLE resource_consumption_stats; + +CREATE TABLE resource_consumption_stats ( + name character varying NOT NULL, + arch character varying NOT NULL, + "time" interval NOT NULL, + time_percentage double precision NOT NULL, + PRIMARY KEY (name, arch, "time", time_percentage) +); + +INSERT INTO resource_consumption_stats (SELECT package.name, koji_task.arch, sum(koji_task.finished - koji_task.started) AS time, CAST(EXTRACT(EPOCH FROM sum(koji_task.finished - koji_task.started)) / (SELECT EXTRACT(EPOCH FROM sum(koji_task.finished - koji_task.started)) AS anon_1 + FROM koji_task) AS FLOAT) AS time_percentage + FROM package JOIN build ON package.id = build.package_id JOIN koji_task ON build.id = koji_task.build_id GROUP BY package.name, koji_task.arch); + +CREATE INDEX ix_resource_consumption_stats_total_time ON resource_consumption_stats ("time"); + +""") + + +def downgrade(): + op.execute(""" + +DROP TABLE resource_consumption_stats; + +CREATE TABLE resource_consumption_stats ( + name character varying NOT NULL, + arch character varying NOT NULL, + "time" interval NOT NULL, + time_percentage integer NOT NULL, + PRIMARY KEY (name, arch, "time", time_percentage) +); + +INSERT INTO resource_consumption_stats (SELECT package.name, koji_task.arch, sum(koji_task.finished - koji_task.started) AS time, EXTRACT(EPOCH FROM sum(koji_task.finished - koji_task.started)) / (SELECT EXTRACT(EPOCH FROM sum(koji_task.finished - koji_task.started)) AS anon_1 + FROM koji_task) AS time_percentage + FROM package JOIN build ON package.id = build.package_id JOIN koji_task ON build.id = koji_task.build_id GROUP BY package.name, koji_task.arch); + +CREATE INDEX ix_resource_consumption_stats_total_time ON resource_consumption_stats ("time"); + + """) diff --git a/koschei/models.py b/koschei/models.py index 8202853..3dd7cd9 100644 --- a/koschei/models.py +++ b/koschei/models.py @@ -27,7 +27,7 @@ from sqlalchemy import ( CheckConstraint, UniqueConstraint, Enum, ) from sqlalchemy.sql.expression import ( - func, select, join, false, true, extract, case, null, + func, select, join, false, true, extract, case, null, cast, ) from sqlalchemy.orm import (relationship, column_property, configure_mappers, deferred, composite) @@ -699,16 +699,16 @@ class ScalarStats(MaterializedView): class ResourceConsumptionStats(MaterializedView): view = ( - select([ + select(( Package.name, KojiTask.arch, func.sum(KojiTask.finished - KojiTask.started).label('time'), - ( + cast(( extract('EPOCH', func.sum(KojiTask.finished - KojiTask.started)) / select([extract('EPOCH', func.sum(KojiTask.finished - KojiTask.started))]) .select_from(KojiTask) - ).label('time_percentage'), - ]) + ), Float).label('time_percentage'), + )) .select_from(join(join(Package, Build, Package.id == Build.package_id), KojiTask)) .group_by(Package.name, KojiTask.arch) ) diff --git a/test/model_test.py b/test/model_test.py index cc2a3b4..1bf7910 100644 --- a/test/model_test.py +++ b/test/model_test.py @@ -249,15 +249,19 @@ class StatsTest(DBTest): self.assertEqual('junit', stats[0].name) self.assertEqual('noarch', stats[0].arch) self.assertEqual(timedelta(0, 42 - 24), stats[0].time) + self.assertAlmostEqual(0.0099, stats[0].time_percentage, 4) self.assertEqual('xpp3', stats[1].name) self.assertEqual('x86_64', stats[1].arch) self.assertEqual(timedelta(0, 333), stats[1].time) + self.assertAlmostEqual(0.1825, stats[1].time_percentage, 4) self.assertEqual('rnv', stats[2].name) self.assertEqual('aarch64', stats[2].arch) self.assertEqual(timedelta(0, 666 - 125), stats[2].time) + self.assertAlmostEqual(0.2964, stats[2].time_percentage, 4) self.assertEqual('rnv', stats[3].name) self.assertEqual('x86_64', stats[3].arch) self.assertEqual(timedelta(0, 333 + 100 + 500), stats[3].time) + self.assertAlmostEqual(0.5112, stats[3].time_percentage, 4) def test_package_counts(self): self.db.refresh_materialized_view(ScalarStats)