Skip to content

Commit

Permalink
Fix bug in merging pebl serializations that would cause duplicated ids.
Browse files Browse the repository at this point in the history
  • Loading branch information
simonharrer committed Mar 7, 2017
1 parent c441bf0 commit 360dee8
Show file tree
Hide file tree
Showing 14 changed files with 187 additions and 52 deletions.
89 changes: 63 additions & 26 deletions loader/src/main/java/loader/PEBLMergerMain.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
import pebl.benchmark.feature.FeatureSet;
import pebl.benchmark.feature.Group;
import pebl.benchmark.feature.Language;
import pebl.benchmark.test.Test;
import pebl.builder.Aggregator;
import pebl.result.Measurement;
import pebl.result.test.TestResult;
import pebl.xsd.PEBL;

Expand Down Expand Up @@ -47,45 +49,53 @@ private static void merge(PEBL peblSource, PEBL peblTarget, Path newRelativeData
// add metric types if not yet available
System.out.println("MERGING metric types");
List<String> metricTypeIds = peblTarget.benchmark.metricTypes.stream().map(HasId::getId).collect(Collectors.toList());
peblSource.benchmark.metricTypes.stream().filter(e -> !metricTypeIds.contains(e.getId())).forEach(e -> peblTarget.benchmark.metricTypes.add(e));
peblSource.benchmark.metricTypes.stream().filter(e -> !metricTypeIds.contains(e.getId())).forEach(e -> {
System.out.println("Adding metric type " + e.getId());
peblTarget.benchmark.metricTypes.add(e);
});

// apply metrics
System.out.println("MERGING feature tree");
peblSource.benchmark.capabilities.forEach(c -> {

final Optional<Capability> capabilityOptional = peblTarget.benchmark.capabilities.stream().filter(x -> x.getId().equals(c.getId())).findFirst();
final Optional<Capability> targetCapabilityOptional = peblTarget.benchmark.capabilities.stream().filter(x -> x.getId().equals(c.getId())).findFirst();

if(!capabilityOptional.isPresent()) {
if(!targetCapabilityOptional.isPresent()) {
System.out.println("Adding capability " + c.getId());
peblTarget.benchmark.capabilities.add(c);
} else {
final Capability capability = capabilityOptional.get();
final Capability targetCapability = targetCapabilityOptional.get();
c.getLanguages().forEach(l -> {

final Optional<Language> languageOptional = capability.getLanguages().stream().filter(x -> x.getId().equals(c.getId())).findFirst();
final Optional<Language> languageOptional = targetCapability.getLanguages().stream().filter(x -> x.getId().equals(l.getId())).findFirst();
if(!languageOptional.isPresent()) {
capability.getLanguages().add(l);
System.out.println("Adding language " + l.getId());
targetCapability.getLanguages().add(l);
} else {
final Language language = languageOptional.get();
l.getGroups().forEach(g -> {

final Optional<Group> groupOptional = language.getGroups().stream().filter(x -> x.getId().equals(c.getId())).findFirst();
final Optional<Group> groupOptional = language.getGroups().stream().filter(x -> x.getId().equals(g.getId())).findFirst();
if(!groupOptional.isPresent()) {
System.out.println("Adding new group " + g.getId());
language.getGroups().add(g);
} else {
final Group group = groupOptional.get();

g.getFeatureSets().forEach(fs -> {

final Optional<FeatureSet> featureSetOptional = group.getFeatureSets().stream().filter(x -> x.getId().equals(c.getId())).findFirst();
final Optional<FeatureSet> featureSetOptional = group.getFeatureSets().stream().filter(x -> x.getId().equals(fs.getId())).findFirst();
if(!featureSetOptional.isPresent()) {
System.out.println("Adding new feature set " + fs.getId());
group.getFeatureSets().add(fs);
} else {
final FeatureSet featureSet = featureSetOptional.get();

fs.getFeatures().forEach(f -> {

final Optional<Feature> featureOptional = featureSet.getFeatures().stream().filter(x -> x.getId().equals(c.getId())).findFirst();
final Optional<Feature> featureOptional = featureSet.getFeatures().stream().filter(x -> x.getId().equals(f.getId())).findFirst();
if(!featureOptional.isPresent()) {
System.out.println("Adding new feature " + f.getId());
featureSet.getFeatures().add(f);
}
});
Expand All @@ -100,40 +110,67 @@ private static void merge(PEBL peblSource, PEBL peblTarget, Path newRelativeData

// add tests if not yet available
System.out.println("MERGING tests");
mergeTests(peblSource, peblTarget, newRelativeDataFolder);

// add engines if not yet available
System.out.println("MERGING engines");
mergeEngines(peblSource, peblTarget);

// add test results if not yet available
System.out.println("MERGING test results");
mergeTestResults(peblSource, peblTarget, newRelativeDataFolder);
}

private static void mergeTests(PEBL peblSource, PEBL peblTarget, Path newRelativeDataFolder) {
List<String> testIds = peblTarget.benchmark.tests.stream().map(HasId::getId).collect(Collectors.toList());
peblSource.benchmark.tests.stream().filter(e -> !testIds.contains(e.getId())).forEach(e -> {
final List<Path> files = e.getFiles().stream().map(newRelativeDataFolder::relativize).collect(Collectors.toList());
e.getFiles().clear();
e.getFiles().addAll(files);

e.setProcess(newRelativeDataFolder.relativize(e.getProcess()));

peblTarget.benchmark.tests.add(e);
peblTarget.benchmark.tests.add(new Test(
newRelativeDataFolder.relativize(e.getProcess()),
e.getTestCases(),
peblTarget.getFeature(e.getFeature().getId()),
files,
e.getDescription(),
e.getTestPartners(),
e.getExtensions()
));
});
}

// add engines if not yet available
System.out.println("MERGING engines");
private static void mergeEngines(PEBL peblSource, PEBL peblTarget) {
List<String> engineIds = peblTarget.result.engines.stream().map(HasId::getId).collect(Collectors.toList());
peblSource.result.engines.stream().filter(e -> !engineIds.contains(e.getId())).forEach(e -> peblTarget.result.engines.add(e));
peblSource.result.engines.stream().filter(e -> !engineIds.contains(e.getId())).forEach(e -> {
peblTarget.result.engines.add(e);
});
}

// add test results if not yet available
System.out.println("MERGING test results");
private static void mergeTestResults(PEBL peblSource, PEBL peblTarget, Path newRelativeDataFolder) {
List<String> testResultIds = peblTarget.result.testResults.stream().map(HasId::getId).collect(Collectors.toList());
peblSource.result.testResults.forEach(e -> {
final List<Path> files = e.getFiles().stream().map(newRelativeDataFolder::relativize).collect(Collectors.toList());
e.getFiles().clear();
e.getFiles().addAll(files);

final List<Path> files = e.getFiles().stream().map(newRelativeDataFolder::relativize).collect(Collectors.toList());
final List<Path> logFiles = e.getLogs().stream().map(newRelativeDataFolder::relativize).collect(Collectors.toList());
e.getLogs().clear();
e.getLogs().addAll(logFiles);
Test test = peblTarget.getTest(e.getTest().getId());
TestResult newTestResult = new TestResult(
test,
peblTarget.getEngine(e.getEngine().getId()),
e.getTool(),
logFiles,
e.getDeploymentPackage(),
files,
e.getMeasurements().stream().map(m -> new Measurement(peblTarget.getMetric(m.getMetric().getId()), m.getValue())).collect(Collectors.toList()),
e.getExtensions(),
e.getTestCaseResults()
);


final Optional<TestResult> testResultOptional = peblTarget.result.testResults.stream().filter(tr -> tr.getId().equals(e.getId())).findAny();
if(testResultOptional.isPresent()) {
final int index = peblTarget.result.testResults.indexOf(testResultOptional.get());
peblTarget.result.testResults.set(index, e);
peblTarget.result.testResults.set(index, newTestResult);
} else {
peblTarget.result.testResults.add(e);
peblTarget.result.testResults.add(newTestResult);
}
});
}
Expand Down
7 changes: 6 additions & 1 deletion pebl/src/main/java/pebl/benchmark/feature/Capability.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import pebl.MapAdapter;

@XmlAccessorType(XmlAccessType.NONE)
public class Capability implements HasId, HasName, HasExtensions {
public class Capability implements HasId, HasName, HasExtensions, HasMetrics {

@XmlElement(required = true)
private final String name;
Expand Down Expand Up @@ -119,4 +119,9 @@ public Capability addExtension(String key, String value) {

return this;
}

@Override
public String toString() {
return getId();
}
}
7 changes: 6 additions & 1 deletion pebl/src/main/java/pebl/benchmark/feature/Feature.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import pebl.MapAdapter;

@XmlAccessorType(XmlAccessType.NONE)
public class Feature implements HasId, HasName, HasExtensions {
public class Feature implements HasId, HasName, HasExtensions, HasMetrics {

@XmlInverseReference(mappedBy="features")
private final FeatureSet featureSet;
Expand Down Expand Up @@ -114,4 +114,9 @@ public Map<String, String> getExtensions() {

return this;
}

@Override
public String toString() {
return getId();
}
}
7 changes: 6 additions & 1 deletion pebl/src/main/java/pebl/benchmark/feature/FeatureSet.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import pebl.MapAdapter;

@XmlAccessorType(XmlAccessType.NONE)
public class FeatureSet implements HasId, HasName, HasExtensions {
public class FeatureSet implements HasId, HasName, HasExtensions, HasMetrics {

@XmlInverseReference(mappedBy="featureSets")
private final Group group;
Expand Down Expand Up @@ -127,4 +127,9 @@ public FeatureSet addExtension(String key, String value) {

return this;
}

@Override
public String toString() {
return getId();
}
}
12 changes: 6 additions & 6 deletions pebl/src/main/java/pebl/benchmark/feature/Group.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import pebl.MapAdapter;

@XmlAccessorType(XmlAccessType.NONE)
public class Group implements HasId, HasName, HasExtensions {
public class Group implements HasId, HasName, HasExtensions, HasMetrics {

@XmlElement(required = true)
private final String name;
Expand Down Expand Up @@ -72,11 +72,6 @@ public String getId() {
return id;
}

@Override
public String toString() {
return "Group " + getId();
}

@Override
public String getName() {
return name;
Expand Down Expand Up @@ -140,4 +135,9 @@ public Group addExtension(String key, String value) {

return this;
}

@Override
public String toString() {
return getId();
}
}
11 changes: 11 additions & 0 deletions pebl/src/main/java/pebl/benchmark/feature/HasMetrics.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package pebl.benchmark.feature;

import java.util.List;

import pebl.HasId;

public interface HasMetrics {

List<Metric> getMetrics();

}
7 changes: 6 additions & 1 deletion pebl/src/main/java/pebl/benchmark/feature/Language.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import pebl.MapAdapter;

@XmlAccessorType(XmlAccessType.NONE)
public class Language implements HasId, HasName, HasExtensions {
public class Language implements HasId, HasName, HasExtensions, HasMetrics {

@XmlInverseReference(mappedBy="languages")
private final Capability capability;
Expand Down Expand Up @@ -115,4 +115,9 @@ public Language addExtension(String key, String value) {

return this;
}

@Override
public String toString() {
return getId();
}
}
5 changes: 5 additions & 0 deletions pebl/src/main/java/pebl/benchmark/feature/Metric.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,9 @@ public String getId() {
public MetricType getMetricType() {
return metricType;
}

@Override
public String toString() {
return getId();
}
}
11 changes: 3 additions & 8 deletions pebl/src/main/java/pebl/benchmark/feature/MetricType.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,8 @@ public String getUnit() {
return unit;
}

@Override public String toString() {
final StringBuffer sb = new StringBuffer("MetricType{");
sb.append("dataType=").append(dataType);
sb.append(", id='").append(id).append('\'');
sb.append(", description='").append(description).append('\'');
sb.append(", unit='").append(unit).append('\'');
sb.append('}');
return sb.toString();
@Override
public String toString() {
return getId();
}
}
13 changes: 7 additions & 6 deletions pebl/src/main/java/pebl/benchmark/test/Test.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,12 @@
import pebl.MapAdapter;
import pebl.benchmark.feature.Feature;
import pebl.benchmark.feature.FeatureDimension;
import pebl.benchmark.feature.HasMetrics;
import pebl.benchmark.feature.Metric;
import pebl.benchmark.feature.MetricType;

@XmlAccessorType(XmlAccessType.NONE)
public class Test implements Comparable<Test>, HasName, HasId, FeatureDimension, HasExtensions {
public class Test implements Comparable<Test>, HasName, HasId, FeatureDimension, HasExtensions, HasMetrics {

@XmlIDREF
@XmlAttribute(required = true)
Expand Down Expand Up @@ -167,11 +168,6 @@ public String getProcessLanguage() {
return getLanguage().getName();
}

@Override
public String toString() {
return getName();
}

public boolean equals(Object o) {
if (o == this) {
return true;
Expand Down Expand Up @@ -256,5 +252,10 @@ public List<Metric> getMetrics() {
public void setProcess(Path process) {
this.process = process;
}

@Override
public String toString() {
return getId();
}
}

3 changes: 2 additions & 1 deletion pebl/src/main/java/pebl/result/engine/Engine.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,9 @@ public Engine(String language, String name, String version, List<String> configu
this.configuration = requireNonNull(values);
}

@Override
public String toString() {
return getNormalizedId();
return getId();
}

private String getNormalizedId() {
Expand Down
5 changes: 5 additions & 0 deletions pebl/src/main/java/pebl/result/test/TestResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -136,4 +136,9 @@ public List<TestCaseResult> getTestCaseResults() {
public String getId() {
return getEngine().getId() + HasId.SEPARATOR + getTest().getId();
}

@Override
public String toString() {
return getId();
}
}

0 comments on commit 360dee8

Please sign in to comment.