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 5d5d55c2db9ef74a2143beed944f9eed043c4dd1..96073c94047bcab11df84bfc8ac82a2f4d8e3774 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 0bc1d81d2d2186e355c62002bd6704741c8f62a4..4060cca414ae0a938f2605216f8657f1a06c3488 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 bbd8c297d53ba229463e30acd81e7cf1a12ffe99..20c094ddcc7ff110a25aaffa494766e89d4d2475 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 6dd2232be6bbcb618ee46c3e14465f64d1cd0d75..9a5dbf2d20e9e33b5902e5f352dc8a4023478cdf 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()); + } + }