From 38a23bedc7ffd039737c8a5c59f11f3a70178f72 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B6ren=20Henning?= <soeren.henning@email.uni-kiel.de>
Date: Wed, 24 Feb 2021 11:40:10 +0100
Subject: [PATCH] Fix serialization and workload division

---
 .../commons/workloadgeneration/KeySpace.java  |  5 +-
 .../WorkloadDefinition.java                   | 26 ++++++++---
 .../workloadgeneration/KeySpaceTest.java      |  2 +-
 .../WorkloadDefinitionTest.java               | 46 ++++++++++++++++---
 4 files changed, 64 insertions(+), 15 deletions(-)

diff --git a/benchmarks/workload-generator-commons/src/main/java/theodolite/commons/workloadgeneration/KeySpace.java b/benchmarks/workload-generator-commons/src/main/java/theodolite/commons/workloadgeneration/KeySpace.java
index 5d5d55c2d..96073c940 100644
--- a/benchmarks/workload-generator-commons/src/main/java/theodolite/commons/workloadgeneration/KeySpace.java
+++ b/benchmarks/workload-generator-commons/src/main/java/theodolite/commons/workloadgeneration/KeySpace.java
@@ -1,5 +1,6 @@
 package theodolite.commons.workloadgeneration;
 
+import java.io.Serializable;
 import java.util.Collection;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
@@ -9,7 +10,9 @@ import theodolite.commons.workloadgeneration.generators.AbstractWorkloadGenerato
  * Wrapper class for the definition of the Keys that should be used by the
  * {@link AbstractWorkloadGenerator}.
  */
-public class KeySpace {
+public class KeySpace implements Serializable {
+
+  private static final long serialVersionUID = 7343135392720315515L; // NOPMD
 
   private final String prefix;
   private final int min;
diff --git a/benchmarks/workload-generator-commons/src/main/java/theodolite/commons/workloadgeneration/WorkloadDefinition.java b/benchmarks/workload-generator-commons/src/main/java/theodolite/commons/workloadgeneration/WorkloadDefinition.java
index 0bc1d81d2..4060cca41 100644
--- a/benchmarks/workload-generator-commons/src/main/java/theodolite/commons/workloadgeneration/WorkloadDefinition.java
+++ b/benchmarks/workload-generator-commons/src/main/java/theodolite/commons/workloadgeneration/WorkloadDefinition.java
@@ -1,11 +1,14 @@
 package theodolite.commons.workloadgeneration;
 
+import java.io.Serializable;
 import java.time.Duration;
 import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
-public class WorkloadDefinition {
+public class WorkloadDefinition implements Serializable {
+
+  private static final long serialVersionUID = -8337364281221817001L; // NOPMD
 
   private final KeySpace keySpace;
   private final Duration period;
@@ -31,12 +34,21 @@ public class WorkloadDefinition {
   }
 
   public Set<WorkloadDefinition> divide(final int parts) {
-    final int size = (this.keySpace.getCount() + parts - 1) / parts; // = ceil(count/parts)
-    return IntStream.range(0, parts)
-        .mapToObj(part -> new KeySpace(
-            this.keySpace.getPrefix(),
-            this.keySpace.getMin() + part * size,
-            Math.min(this.keySpace.getMin() + (part + 1) * size - 1, this.keySpace.getMax())))
+    final int effParts = Math.min(parts, this.keySpace.getCount());
+    final int minSize = this.keySpace.getCount() / effParts;
+    final int largerParts = this.keySpace.getCount() % effParts;
+    return IntStream.range(0, effParts)
+        .mapToObj(part -> {
+          final int thisSize = part < largerParts ? minSize + 1 : minSize;
+          final int largePartsBefore = Math.min(largerParts, part);
+          final int smallPartsBefore = part - largePartsBefore;
+          final int start = largePartsBefore * (minSize + 1) + smallPartsBefore * minSize;
+          final int end = start + thisSize - 1;
+          return new KeySpace(
+              this.keySpace.getPrefix(),
+              start,
+              end);
+        })
         .map(keySpace -> new WorkloadDefinition(
             keySpace,
             this.period))
diff --git a/benchmarks/workload-generator-commons/src/test/java/theodolite/commons/workloadgeneration/KeySpaceTest.java b/benchmarks/workload-generator-commons/src/test/java/theodolite/commons/workloadgeneration/KeySpaceTest.java
index bbd8c297d..20c094ddc 100644
--- a/benchmarks/workload-generator-commons/src/test/java/theodolite/commons/workloadgeneration/KeySpaceTest.java
+++ b/benchmarks/workload-generator-commons/src/test/java/theodolite/commons/workloadgeneration/KeySpaceTest.java
@@ -1,4 +1,4 @@
-package theodolite.commons.workloadgeneration.dimensions;
+package theodolite.commons.workloadgeneration;
 
 import org.junit.Assert;
 import org.junit.Test;
diff --git a/benchmarks/workload-generator-commons/src/test/java/theodolite/commons/workloadgeneration/WorkloadDefinitionTest.java b/benchmarks/workload-generator-commons/src/test/java/theodolite/commons/workloadgeneration/WorkloadDefinitionTest.java
index 6dd2232be..9a5dbf2d2 100644
--- a/benchmarks/workload-generator-commons/src/test/java/theodolite/commons/workloadgeneration/WorkloadDefinitionTest.java
+++ b/benchmarks/workload-generator-commons/src/test/java/theodolite/commons/workloadgeneration/WorkloadDefinitionTest.java
@@ -1,4 +1,4 @@
-package theodolite.commons.workloadgeneration.misc;
+package theodolite.commons.workloadgeneration;
 
 import java.time.Duration;
 import java.util.Comparator;
@@ -7,10 +7,8 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import org.junit.Assert;
 import org.junit.Test;
-import theodolite.commons.workloadgeneration.KeySpace;
-import theodolite.commons.workloadgeneration.WorkloadDefinition;
 
-public class WorkloadDefinition2Test {
+public class WorkloadDefinitionTest {
 
   @Test
   public void testDivideByOneAmount() {
@@ -54,10 +52,46 @@ public class WorkloadDefinition2Test {
     Assert.assertEquals(33, subworkload1.getKeySpace().getMax());
     final WorkloadDefinition subworkload2 = orderedSubworkloads.get(1);
     Assert.assertEquals(34, subworkload2.getKeySpace().getMin());
-    Assert.assertEquals(67, subworkload2.getKeySpace().getMax());
+    Assert.assertEquals(66, subworkload2.getKeySpace().getMax());
     final WorkloadDefinition subworkload3 = orderedSubworkloads.get(2);
-    Assert.assertEquals(68, subworkload3.getKeySpace().getMin());
+    Assert.assertEquals(67, subworkload3.getKeySpace().getMin());
     Assert.assertEquals(99, subworkload3.getKeySpace().getMax());
   }
 
+  @Test
+  public void testDivideMany() {
+    final KeySpace keySpace = new KeySpace("prefix", 10);
+    final WorkloadDefinition workload = new WorkloadDefinition(keySpace, Duration.ofSeconds(1));
+    final Set<WorkloadDefinition> subworkloads = workload.divide(7);
+    Assert.assertEquals(7, subworkloads.size());
+    for (final WorkloadDefinition subworkload : subworkloads) {
+      Assert.assertEquals("prefix", subworkload.getKeySpace().getPrefix());
+      Assert.assertEquals(Duration.ofSeconds(1), subworkload.getPeriod());
+    }
+    final List<WorkloadDefinition> orderedSubworkloads = subworkloads.stream()
+        .sorted(Comparator.comparingInt(l -> l.getKeySpace().getMin()))
+        .collect(Collectors.toList());
+    final WorkloadDefinition subworkload1 = orderedSubworkloads.get(0);
+    Assert.assertEquals(0, subworkload1.getKeySpace().getMin());
+    Assert.assertEquals(1, subworkload1.getKeySpace().getMax());
+    final WorkloadDefinition subworkload2 = orderedSubworkloads.get(1);
+    Assert.assertEquals(2, subworkload2.getKeySpace().getMin());
+    Assert.assertEquals(3, subworkload2.getKeySpace().getMax());
+    final WorkloadDefinition subworkload3 = orderedSubworkloads.get(2);
+    Assert.assertEquals(4, subworkload3.getKeySpace().getMin());
+    Assert.assertEquals(5, subworkload3.getKeySpace().getMax());
+    final WorkloadDefinition subworkload4 = orderedSubworkloads.get(3);
+    Assert.assertEquals(6, subworkload4.getKeySpace().getMin());
+    Assert.assertEquals(6, subworkload4.getKeySpace().getMax());
+    final WorkloadDefinition subworkload5 = orderedSubworkloads.get(4);
+    Assert.assertEquals(7, subworkload5.getKeySpace().getMin());
+    Assert.assertEquals(7, subworkload5.getKeySpace().getMax());
+    final WorkloadDefinition subworkload6 = orderedSubworkloads.get(5);
+    Assert.assertEquals(8, subworkload6.getKeySpace().getMin());
+    Assert.assertEquals(8, subworkload6.getKeySpace().getMax());
+    final WorkloadDefinition subworkload7 = orderedSubworkloads.get(6);
+    Assert.assertEquals(9, subworkload7.getKeySpace().getMin());
+    Assert.assertEquals(9, subworkload7.getKeySpace().getMax());
+  }
+
 }
-- 
GitLab