Result types other than Number are now possible

This commit is contained in:
Lennart Hensler
2015-08-19 14:32:03 +02:00
parent 0c73781023
commit e4501fbfd6
7 changed files with 79 additions and 12 deletions
@@ -1,5 +1,6 @@
package com.sap.sailing.datamining.shared;
import com.sap.sailing.datamining.shared.dto.DistanceDTO;
import com.sap.sailing.domain.common.LegType;
import com.sap.sse.datamining.shared.SerializationDummy;
@@ -8,6 +9,7 @@ public final class SailingDataMiningSerializationDummy implements SerializationD
private static final long serialVersionUID = 2L;
private LegType legType;
private DistanceDTO distance;
private SailingDataMiningSerializationDummy() { }
@@ -1,7 +1,10 @@
package com.sap.sailing.datamining.shared.dto;
public class DistanceDTO {
import java.io.Serializable;
public class DistanceDTO implements Serializable {
private static final long serialVersionUID = -4949861628112888523L;
private double geographicalMiles;
private double seaMiles;
private double nauticalMiles;
@@ -19,7 +22,7 @@ public class DistanceDTO {
}
public DistanceDTO(double geographicalMiles, double seaMiles, double nauticalMiles, double meters,
double kilometers, double centralAngleDegree, double centralAngleRadian) {
double kilometers, double centralAngleDegree, double centralAngleRadian) {
this.geographicalMiles = geographicalMiles;
this.seaMiles = seaMiles;
this.nauticalMiles = nauticalMiles;
@@ -14,6 +14,7 @@ import com.sap.sailing.datamining.data.HasTrackedLegContext;
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
import com.sap.sailing.datamining.impl.components.aggregators.ParallelBoolSumAggregationProcessor;
import com.sap.sailing.datamining.impl.components.aggregators.ParallelDistanceSumAggregationProcessor;
import com.sap.sailing.domain.common.Speed;
import com.sap.sse.datamining.DataMiningBundleService;
import com.sap.sse.datamining.DataSourceProvider;
@@ -99,6 +100,7 @@ public class Activator extends AbstractDataMiningActivator implements DataMining
public Iterable<AggregationProcessorDefinition<?, ?>> getAggregationProcessorDefinitions() {
HashSet<AggregationProcessorDefinition<?, ?>> aggregators = new HashSet<>();
aggregators.add(ParallelBoolSumAggregationProcessor.getDefinition());
aggregators.add(ParallelDistanceSumAggregationProcessor.getDefinition());
return aggregators;
}
@@ -1,5 +1,6 @@
package com.sap.sailing.datamining.data;
import com.sap.sailing.datamining.shared.dto.DistanceDTO;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.Speed;
import com.sap.sse.datamining.shared.annotations.Connector;
@@ -14,8 +15,8 @@ public interface HasRaceOfCompetitorContext {
@Connector(messageKey="Competitor")
public Competitor getCompetitor();
@Statistic(messageKey="DistanceAtStart", resultUnit=Unit.Meters, resultDecimals=0, ordinal=0)
public double getDistanceToStartLineAtStart();
@Statistic(messageKey="DistanceAtStart", resultUnit=Unit.None, resultDecimals=2, ordinal=0)
public DistanceDTO getDistanceToStartLineAtStart();
@Statistic(messageKey="DistanceToStarboardSideAtStart", resultDecimals=2, ordinal=1)
public Double getNormalizedDistanceToStarboardSideAtStart();
@@ -0,0 +1,59 @@
package com.sap.sailing.datamining.impl.components.aggregators;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import com.sap.sailing.datamining.shared.dto.DistanceDTO;
import com.sap.sse.datamining.components.AggregationProcessorDefinition;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.GroupedDataEntry;
import com.sap.sse.datamining.impl.components.SimpleAggregationProcessorDefinition;
import com.sap.sse.datamining.impl.components.aggregators.AbstractParallelGroupedDataAggregationProcessor;
import com.sap.sse.datamining.shared.GroupKey;
public class ParallelDistanceSumAggregationProcessor extends
AbstractParallelGroupedDataAggregationProcessor<DistanceDTO, DistanceDTO> {
private static final AggregationProcessorDefinition<DistanceDTO, DistanceDTO> DEFINITION =
new SimpleAggregationProcessorDefinition<>(DistanceDTO.class, DistanceDTO.class, "Sum", ParallelDistanceSumAggregationProcessor.class);
public static AggregationProcessorDefinition<DistanceDTO, DistanceDTO> getDefinition() {
return DEFINITION;
}
private final Map<GroupKey, DistanceDTO> results;
public ParallelDistanceSumAggregationProcessor(ExecutorService executor, Collection<Processor<Map<GroupKey, DistanceDTO>, ?>> resultReceivers) {
super(executor, resultReceivers, "Sum");
results = new HashMap<>();
}
@Override
protected void handleElement(GroupedDataEntry<DistanceDTO> element) {
GroupKey key = element.getKey();
if (!results.containsKey(key)) {
results.put(key, element.getDataEntry());
} else {
results.put(key, add(results.get(key), element.getDataEntry()));
}
}
private DistanceDTO add(DistanceDTO distance1, DistanceDTO distance2) {
double geographicalMiles = distance1.getGeographicalMiles() + distance2.getGeographicalMiles();
double seaMiles = distance1.getSeaMiles() + distance2.getSeaMiles();
double nauticalMiles = distance1.getNauticalMiles() + distance2.getNauticalMiles();
double meters = distance1.getMeters() + distance2.getMeters();
double kilometers = distance1.getKilometers() + distance2.getKilometers();
double centralAngleDegree = distance1.getCentralAngleDegree() + distance2.getCentralAngleDegree();
double centralAngleRadian = distance1.getCentralAngleRadian() + distance2.getCentralAngleRadian();
return new DistanceDTO(geographicalMiles, seaMiles, nauticalMiles, meters, kilometers, centralAngleDegree, centralAngleRadian);
}
@Override
protected Map<GroupKey, DistanceDTO> getResult() {
return results;
}
}
@@ -4,9 +4,11 @@ import java.util.concurrent.TimeUnit;
import com.sap.sailing.datamining.data.HasRaceOfCompetitorContext;
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
import com.sap.sailing.datamining.shared.dto.DistanceDTO;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.ManeuverType;
import com.sap.sailing.domain.common.Speed;
import com.sap.sailing.domain.tracking.Maneuver;
@@ -39,8 +41,12 @@ public class RaceOfCompetitorWithContext implements HasRaceOfCompetitorContext {
}
@Override
public double getDistanceToStartLineAtStart() {
return getTrackedRace().getDistanceToStartLine(getCompetitor(), 0).getMeters();
public DistanceDTO getDistanceToStartLineAtStart() {
Distance distance = getTrackedRace().getDistanceToStartLine(getCompetitor(), 0);
return new DistanceDTO(distance.getGeographicalMiles(), distance.getSeaMiles(),
distance.getNauticalMiles(), distance.getMeters(),
distance.getKilometers(), distance.getCentralAngleDeg(),
distance.getCentralAngleRad());
}
@Override
@@ -44,7 +44,6 @@ public class AggregationProcessorDefinitionDTO implements Serializable, Comparab
final int prime = 31;
int result = 1;
result = prime * result + ((aggregatedTypeName == null) ? 0 : aggregatedTypeName.hashCode());
result = prime * result + ((displayName == null) ? 0 : displayName.hashCode());
result = prime * result + ((extractedTypeName == null) ? 0 : extractedTypeName.hashCode());
return result;
}
@@ -63,11 +62,6 @@ public class AggregationProcessorDefinitionDTO implements Serializable, Comparab
return false;
} else if (!aggregatedTypeName.equals(other.aggregatedTypeName))
return false;
if (displayName == null) {
if (other.displayName != null)
return false;
} else if (!displayName.equals(other.displayName))
return false;
if (extractedTypeName == null) {
if (other.extractedTypeName != null)
return false;