]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5403 Migrations that convert technical debt from hours to minutes are too slow
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Thu, 19 Jun 2014 14:30:50 +0000 (16:30 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Thu, 19 Jun 2014 15:04:59 +0000 (17:04 +0200)
sonar-server/src/main/java/org/sonar/server/db/migrations/v43/ConvertIssueDebtToMinutesMigration.java
sonar-server/src/main/java/org/sonar/server/db/migrations/v43/DevelopmentCostMeasuresMigration.java
sonar-server/src/main/java/org/sonar/server/db/migrations/v43/IssueChangelogMigration.java
sonar-server/src/main/java/org/sonar/server/db/migrations/v43/TechnicalDebtMeasuresMigration.java
sonar-server/src/main/java/org/sonar/server/db/migrations/v43/WorkDurationConvertor.java
sonar-server/src/test/java/org/sonar/server/db/migrations/v43/IssueChangelogMigrationTest.java
sonar-server/src/test/java/org/sonar/server/db/migrations/v43/WorkDurationConvertorTest.java

index 7739ea4691096811b1422b1bb9336cf0dbae6ece..6bb5b0f12e3db3900db47dd94a57892ae7546436 100644 (file)
@@ -56,6 +56,8 @@ public class ConvertIssueDebtToMinutesMigration implements DatabaseMigration {
 
   @Override
   public void execute() {
+    workDurationConvertor.init();
+
     new MassUpdater(db).execute(
       new MassUpdater.InputLoader<Row>() {
         @Override
index 0bb8d3cb7cff3d5ea2d342c8415f905fa394e7a6..6f629ee260a213b789fc895853fc468094b0bb9d 100644 (file)
@@ -48,6 +48,8 @@ public class DevelopmentCostMeasuresMigration implements DatabaseMigration {
 
   @Override
   public void execute() {
+    workDurationConvertor.init();
+
     new MassUpdater(db).execute(
       new MassUpdater.InputLoader<Row>() {
         @Override
index ee2dff668a9aa7b1a875b5d884861cb67b57177d..ad2b816aec14d804530b8dfab1230e4da3128437 100644 (file)
@@ -47,18 +47,20 @@ public class IssueChangelogMigration implements DatabaseMigration {
   private final Database db;
 
   public IssueChangelogMigration(Database database, PropertiesDao propertiesDao) {
-    this(database, propertiesDao, System2.INSTANCE);
+    this(database, new WorkDurationConvertor(propertiesDao), System2.INSTANCE);
   }
 
   @VisibleForTesting
-  IssueChangelogMigration(Database database, PropertiesDao propertiesDao, System2 system2) {
+  IssueChangelogMigration(Database database, WorkDurationConvertor convertor, System2 system2) {
     this.db = database;
-    this.workDurationConvertor = new WorkDurationConvertor(propertiesDao);
+    this.workDurationConvertor = convertor;
     this.system2 = system2;
   }
 
   @Override
   public void execute() {
+    workDurationConvertor.init();
+
     new MassUpdater(db).execute(
       new MassUpdater.InputLoader<Row>() {
         @Override
index 85fe5a192b1b15e4446615b705884dee6ce8d7a0..9dd4ab82a4b84bd737ceec3db8aa4d30aa9a71ff 100644 (file)
@@ -61,6 +61,8 @@ public class TechnicalDebtMeasuresMigration implements DatabaseMigration {
 
   @Override
   public void execute() {
+    workDurationConvertor.init();
+
     new MassUpdater(db).execute(
       new MassUpdater.InputLoader<Row>() {
         @Override
index b31ec9e26146becf28bed4d223c58117eefdcd08..bcdab54e5cb569303f749d298f48d340e2316c65 100644 (file)
@@ -29,6 +29,8 @@ class WorkDurationConvertor {
 
   static final String HOURS_IN_DAY_PROPERTY = "sonar.technicalDebt.hoursInDay";
 
+  private Integer hoursInDay;
+
   private final PropertiesDao propertiesDao;
 
   WorkDurationConvertor(PropertiesDao propertiesDao) {
@@ -36,7 +38,7 @@ class WorkDurationConvertor {
   }
 
   long createFromLong(long durationInLong) {
-    int hoursInDay = hoursInDay();
+    checkHoursInDay();
 
     long durationInMinutes = 0L;
 
@@ -62,17 +64,23 @@ class WorkDurationConvertor {
   }
 
   long createFromDays(double days) {
-    return ((Double) (days * hoursInDay() * ONE_HOUR)).longValue();
+    checkHoursInDay();
+
+    return ((Double) (days * hoursInDay * ONE_HOUR)).longValue();
   }
 
-  private int hoursInDay() {
+  void init() {
     PropertyDto propertyDto = propertiesDao.selectGlobalProperty(HOURS_IN_DAY_PROPERTY);
     String value = propertyDto != null ? propertyDto.getValue() : "8";
-    int hoursInDay = Integer.valueOf(value);
+    hoursInDay = Integer.valueOf(value);
     if (hoursInDay < 0) {
       throw new IllegalArgumentException(String.format("Bad value of %s: %d", HOURS_IN_DAY_PROPERTY, hoursInDay));
     }
-    return hoursInDay;
   }
 
+  private void checkHoursInDay(){
+    if (hoursInDay == null) {
+      throw new IllegalStateException("init() has not been called");
+    }
+  }
 }
index 9808acbc3ee3e8a1c0949d0949d9df2d3d3379a3..f55925542b6da7216824c5e4aff193bc1a62cea5 100644 (file)
@@ -54,7 +54,9 @@ public class IssueChangelogMigrationTest {
     when(system2.now()).thenReturn(DateUtils.parseDateTime("2014-02-19T19:10:03+0100").getTime());
     when(propertiesDao.selectGlobalProperty(WorkDurationConvertor.HOURS_IN_DAY_PROPERTY)).thenReturn(new PropertyDto().setValue("8"));
 
-    migration = new IssueChangelogMigration(db.database(), propertiesDao, system2);
+    WorkDurationConvertor convertor = new WorkDurationConvertor(propertiesDao);
+    convertor.init();
+    migration = new IssueChangelogMigration(db.database(), convertor, system2);
   }
 
   @Test
index eb64d80f1f95ea7ebf391ccd66291ed411b7bb6e..843bfa0a344c4ee152cc96a10de2be231d0fa346 100644 (file)
@@ -42,6 +42,7 @@ public class WorkDurationConvertorTest {
 
   @Test
   public void convert_from_long() throws Exception {
+    convertor.init();
     when(propertiesDao.selectGlobalProperty(WorkDurationConvertor.HOURS_IN_DAY_PROPERTY)).thenReturn(new PropertyDto().setValue(Integer.toString(HOURS_IN_DAY)));
 
     assertThat(convertor.createFromLong(1)).isEqualTo(ONE_MINUTE);
@@ -52,14 +53,16 @@ public class WorkDurationConvertorTest {
 
   @Test
   public void convert_from_long_use_default_value_for_hours_in_day_when_no_property() throws Exception {
+    convertor.init();
     assertThat(convertor.createFromLong(1)).isEqualTo(ONE_MINUTE);
   }
 
   @Test
   public void fail_convert_from_long_on_bad_hours_in_day_property() throws Exception {
+    when(propertiesDao.selectGlobalProperty(WorkDurationConvertor.HOURS_IN_DAY_PROPERTY)).thenReturn(new PropertyDto().setValue("-2"));
+    WorkDurationConvertor workDurationConvertor = new WorkDurationConvertor(propertiesDao);
     try {
-      when(propertiesDao.selectGlobalProperty(WorkDurationConvertor.HOURS_IN_DAY_PROPERTY)).thenReturn(new PropertyDto().setValue("-2"));
-      convertor.createFromLong(1);
+      workDurationConvertor.init();
       fail();
     } catch (Exception e) {
       assertThat(e).isInstanceOf(IllegalArgumentException.class);
@@ -68,6 +71,7 @@ public class WorkDurationConvertorTest {
 
   @Test
   public void convert_from_days() throws Exception {
+    convertor.init();
     when(propertiesDao.selectGlobalProperty(WorkDurationConvertor.HOURS_IN_DAY_PROPERTY)).thenReturn(new PropertyDto().setValue(Integer.toString(HOURS_IN_DAY)));
 
     assertThat(convertor.createFromDays(1.0)).isEqualTo(ONE_DAY_IN_MINUTES);
@@ -77,4 +81,23 @@ public class WorkDurationConvertorTest {
     assertThat(convertor.createFromDays(0.01)).isEqualTo(4L);
   }
 
+  @Test
+  public void fail_it_init_has_not_been_called() throws Exception {
+    when(propertiesDao.selectGlobalProperty(WorkDurationConvertor.HOURS_IN_DAY_PROPERTY)).thenReturn(new PropertyDto().setValue(Integer.toString(HOURS_IN_DAY)));
+
+    try {
+      assertThat(convertor.createFromLong(1L));
+      fail();
+    } catch (Exception e) {
+      assertThat(e).isInstanceOf(IllegalStateException.class);
+    }
+
+    try {
+      assertThat(convertor.createFromDays(1.0));
+      fail();
+    } catch (Exception e) {
+      assertThat(e).isInstanceOf(IllegalStateException.class);
+    }
+  }
+
 }