mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-04 19:33:52 +00:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
d5e479687d
366 files changed
+10142
-6519
No files matched your search
@@ -7,6 +7,6 @@ Bundle-Vendor: SAP
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
|
||||
Bundle-ActivationPolicy: lazy
|
||||
Bundle-ClassPath: .
|
||||
Export-Package: com.sap.sailing.datamining.shared,
|
||||
com.sap.sailing.datamining.shared.impl
|
||||
Require-Bundle: com.sap.sse.datamining.shared;bundle-version="1.0.0"
|
||||
Require-Bundle: com.sap.sse.datamining.shared;bundle-version="1.0.0",
|
||||
com.sap.sailing.domain.common;bundle-version="1.0.0"
|
||||
Export-Package: com.sap.sailing.datamining.shared
|
||||
-7
@@ -1,7 +0,0 @@
|
||||
package com.sap.sailing.datamining.shared;
|
||||
|
||||
public enum DataTypes {
|
||||
|
||||
GPSFix, TrackedLegOfCompetitor
|
||||
|
||||
}
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
package com.sap.sailing.datamining.shared;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
public enum DimensionIdentifier {
|
||||
RegattaName, BoatClassName, CourseAreaName, FleetName, RaceName, LegType, LegNumber, Nationality, CompetitorName, SailID, WindStrength, Year;
|
||||
|
||||
public static class OrdinalComparator implements Comparator<DimensionIdentifier> {
|
||||
private static final List<DimensionIdentifier> dimensions = Arrays.asList(DimensionIdentifier.values());
|
||||
|
||||
@Override
|
||||
public int compare(DimensionIdentifier dimension1, DimensionIdentifier dimension2) {
|
||||
Integer ordinal1 = dimensions.indexOf(dimension1);
|
||||
Integer ordinal2 = dimensions.indexOf(dimension2);
|
||||
return ordinal1.compareTo(ordinal2);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
-26
@@ -1,26 +0,0 @@
|
||||
package com.sap.sailing.datamining.shared;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.sap.sse.datamining.shared.components.AggregatorType;
|
||||
import com.sap.sse.datamining.shared.components.GrouperType;
|
||||
|
||||
public interface QueryDefinition extends Serializable {
|
||||
|
||||
public String getLocaleInfoName();
|
||||
|
||||
public GrouperType getGrouperType();
|
||||
|
||||
public StatisticType getStatisticType();
|
||||
|
||||
public AggregatorType getAggregatorType();
|
||||
|
||||
public DataTypes getDataType();
|
||||
|
||||
public List<DimensionIdentifier> getDimensionsToGroupBy();
|
||||
|
||||
public Map<DimensionIdentifier, Iterable<?>> getSelection();
|
||||
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
package com.sap.sailing.datamining.shared;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import com.sap.sailing.domain.common.LegType;
|
||||
import com.sap.sse.datamining.shared.impl.GenericGroupKey;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public final class SailingDataMiningSerializationDummy implements Serializable {
|
||||
private static final long serialVersionUID = 2L;
|
||||
|
||||
private LegType legType;
|
||||
|
||||
private SailingDataMiningSerializationDummy() { }
|
||||
|
||||
}
|
||||
-56
@@ -1,56 +0,0 @@
|
||||
package com.sap.sailing.datamining.shared;
|
||||
|
||||
import com.sap.sse.datamining.shared.Message;
|
||||
import com.sap.sse.datamining.shared.Unit;
|
||||
import com.sap.sse.datamining.shared.components.ElementType;
|
||||
|
||||
public enum StatisticType {
|
||||
|
||||
Speed(ElementType.Double, Unit.Knots, 2),
|
||||
Distance(ElementType.Double, Unit.Meters, 2);
|
||||
|
||||
private final ElementType valueType;
|
||||
private final Unit unit;
|
||||
private final int valueDecimals;
|
||||
|
||||
private StatisticType(ElementType valueType, Unit unit, int valueDecimals) {
|
||||
this.valueType = valueType;
|
||||
this.unit = unit;
|
||||
this.valueDecimals = valueDecimals;
|
||||
}
|
||||
|
||||
public ElementType getValueType() {
|
||||
return valueType;
|
||||
}
|
||||
|
||||
public Message getSignifierMessage() {
|
||||
switch (this) {
|
||||
case Distance:
|
||||
return Message.Distance;
|
||||
case Speed:
|
||||
return Message.Speed;
|
||||
}
|
||||
throw new IllegalArgumentException("No message available for the statistic type '" + this + "'");
|
||||
}
|
||||
|
||||
public Unit getUnit() {
|
||||
return unit;
|
||||
}
|
||||
|
||||
public Message getUnitMessage() {
|
||||
switch (unit) {
|
||||
case Knots:
|
||||
return Message.Knots;
|
||||
case Meters:
|
||||
return Message.Meters;
|
||||
case None:
|
||||
return null;
|
||||
}
|
||||
throw new IllegalArgumentException("No message available for the unit '" + unit + "'");
|
||||
}
|
||||
|
||||
public int getValueDecimals() {
|
||||
return valueDecimals;
|
||||
}
|
||||
|
||||
}
|
||||
-89
@@ -1,89 +0,0 @@
|
||||
package com.sap.sailing.datamining.shared.impl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.sap.sailing.datamining.shared.DataTypes;
|
||||
import com.sap.sailing.datamining.shared.DimensionIdentifier;
|
||||
import com.sap.sailing.datamining.shared.QueryDefinition;
|
||||
import com.sap.sailing.datamining.shared.StatisticType;
|
||||
import com.sap.sse.datamining.shared.components.AggregatorType;
|
||||
import com.sap.sse.datamining.shared.components.GrouperType;
|
||||
|
||||
public class SimpleQueryDefinition implements QueryDefinition {
|
||||
private static final long serialVersionUID = 8408302866342877839L;
|
||||
|
||||
private String localeInfoName;
|
||||
|
||||
private GrouperType grouperType;
|
||||
private StatisticType statisticType;
|
||||
private AggregatorType aggregatorType;
|
||||
private DataTypes dataType;
|
||||
|
||||
private List<DimensionIdentifier> dimensionsToGroupBy;
|
||||
private Map<DimensionIdentifier, Iterable<?>> selectionMappedByDimension;
|
||||
|
||||
/**
|
||||
* Constructor for the GWT-Serialization. Don't use this!
|
||||
*/
|
||||
@Deprecated
|
||||
SimpleQueryDefinition() { }
|
||||
|
||||
public SimpleQueryDefinition(String localeInfoName, GrouperType grouperType, StatisticType statisticType, AggregatorType aggregatorType, DataTypes dataType) {
|
||||
this.localeInfoName = localeInfoName;
|
||||
this.grouperType = grouperType;
|
||||
this.statisticType = statisticType;
|
||||
this.aggregatorType = aggregatorType;
|
||||
this.dataType = dataType;
|
||||
|
||||
dimensionsToGroupBy = new ArrayList<DimensionIdentifier>();
|
||||
selectionMappedByDimension = new HashMap<DimensionIdentifier, Iterable<?>>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLocaleInfoName() {
|
||||
return localeInfoName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GrouperType getGrouperType() {
|
||||
return grouperType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StatisticType getStatisticType() {
|
||||
return statisticType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AggregatorType getAggregatorType() {
|
||||
return aggregatorType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataTypes getDataType() {
|
||||
return dataType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<DimensionIdentifier> getDimensionsToGroupBy() {
|
||||
return dimensionsToGroupBy;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<DimensionIdentifier, Iterable<?>> getSelection() {
|
||||
return selectionMappedByDimension;
|
||||
}
|
||||
|
||||
public void appendDimensionToGroupBy(DimensionIdentifier dimension) {
|
||||
dimensionsToGroupBy.add(dimension);
|
||||
}
|
||||
|
||||
public void setSelectionFor(DimensionIdentifier dimension, Collection<?> selection) {
|
||||
selectionMappedByDimension.put(dimension, selection);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -4,5 +4,6 @@
|
||||
<classpathentry kind="con" path="com.google.gwt.eclipse.core.GWT_CONTAINER"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="resources"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
@@ -1,4 +1,5 @@
|
||||
source.. = src/
|
||||
source.. = src/,\
|
||||
resources/
|
||||
output.. = bin/
|
||||
bin.includes = META-INF/,\
|
||||
.
|
||||
BIN
Binary file not shown.
+1419
File diff suppressed because it is too large.
Load diff
BIN
Binary file not shown.
+1419
File diff suppressed because it is too large.
Load diff
BIN
Binary file not shown.
+1547
File diff suppressed because it is too large.
Load diff
+9
-13
@@ -22,10 +22,9 @@ import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sse.datamining.AdditionalResultDataBuilder;
|
||||
import com.sap.sse.datamining.components.FilterCriteria;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
|
||||
public class TestLeaderboardGroupFilteringRetrievalProcessor {
|
||||
public class TestLeaderboardGroupRetrievalProcessor {
|
||||
|
||||
private RacingEventService service;
|
||||
private Processor<RacingEventService> retriever;
|
||||
@@ -36,13 +35,17 @@ public class TestLeaderboardGroupFilteringRetrievalProcessor {
|
||||
public void initializeComponents() {
|
||||
service = mock(RacingEventService.class);
|
||||
stub(service.getLeaderboardGroups()).toReturn(getGroupsInService());
|
||||
|
||||
|
||||
retrievedGroups = new HashSet<>();
|
||||
Processor<LeaderboardGroup> receiver = new Processor<LeaderboardGroup>() {
|
||||
@Override
|
||||
public void onElement(LeaderboardGroup element) {
|
||||
public void processElement(LeaderboardGroup element) {
|
||||
retrievedGroups.add(element);
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable failure) {
|
||||
}
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
}
|
||||
@Override
|
||||
@@ -54,14 +57,7 @@ public class TestLeaderboardGroupFilteringRetrievalProcessor {
|
||||
}
|
||||
};
|
||||
|
||||
FilterCriteria<LeaderboardGroup> criteria = new FilterCriteria<LeaderboardGroup>() {
|
||||
@Override
|
||||
public boolean matches(LeaderboardGroup element) {
|
||||
String name = element.getName();
|
||||
return name == "LG1" || name == "LG2" || name == "LG3";
|
||||
}
|
||||
};
|
||||
retriever = new LeaderboardGroupFilteringRetrievalProcessor(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(receiver), criteria);
|
||||
retriever = new LeaderboardGroupRetrievalProcessor(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(receiver));
|
||||
}
|
||||
|
||||
private Map<String, LeaderboardGroup> getGroupsInService() {
|
||||
@@ -77,7 +73,7 @@ public class TestLeaderboardGroupFilteringRetrievalProcessor {
|
||||
@Ignore
|
||||
@Test
|
||||
public void testFilteringRetrieval() throws InterruptedException {
|
||||
retriever.onElement(service);
|
||||
retriever.processElement(service);
|
||||
retriever.finish();
|
||||
|
||||
Collection<LeaderboardGroup> expectedGroups = getExpectedRetrievedGroups();
|
||||
+103
@@ -0,0 +1,103 @@
|
||||
package com.sap.sailing.datamining.impl.functions;
|
||||
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
|
||||
import com.sap.sailing.datamining.impl.data.SailingDataMiningClassesWithFunctionsService;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.Moving;
|
||||
import com.sap.sailing.domain.base.Nationality;
|
||||
import com.sap.sailing.domain.base.Team;
|
||||
import com.sap.sailing.domain.common.Speed;
|
||||
import com.sap.sse.common.Named;
|
||||
import com.sap.sse.datamining.factories.FunctionFactory;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.functions.FunctionRegistry;
|
||||
import com.sap.sse.datamining.impl.functions.SimpleFunctionRegistry;
|
||||
|
||||
public class TestSailingFunctionsRegistration {
|
||||
|
||||
private static FunctionRegistry functionRegistry;
|
||||
|
||||
@BeforeClass
|
||||
public static void setUpFunctionRegistryAndProvider() {
|
||||
SailingDataMiningClassesWithFunctionsService classesWithFunctionsService = new SailingDataMiningClassesWithFunctionsService();
|
||||
|
||||
functionRegistry = new SimpleFunctionRegistry();
|
||||
functionRegistry.registerAllWithInternalFunctionPolicy(classesWithFunctionsService.getInternalClassesWithMarkedMethods());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testImportantRegisteredDimensions() throws NoSuchMethodException, SecurityException {
|
||||
Collection<Function<?>> expectedDimensions = createExpectedImportantRegisteredDimensions();
|
||||
Collection<Function<?>> providedDimensions = functionRegistry.getDimensions();
|
||||
for (Function<?> dimension : expectedDimensions) {
|
||||
assertThat("The expected dimension '" + dimension + "' wasn't provided.",
|
||||
providedDimensions.contains(dimension), is(true));
|
||||
}
|
||||
}
|
||||
|
||||
private Collection<Function<?>> createExpectedImportantRegisteredDimensions() throws NoSuchMethodException, SecurityException {
|
||||
Collection<Function<?>> expectedDimensions = new HashSet<>();
|
||||
|
||||
Method getRegattaMethod = HasTrackedRaceContext.class.getMethod("getRegatta", new Class<?>[0]);
|
||||
Function<?> getRegatta = FunctionFactory.createMethodWrappingFunction(getRegattaMethod);
|
||||
Method getNameMethod = Named.class.getMethod("getName", new Class<?>[0]);
|
||||
Function<?> getName = FunctionFactory.createMethodWrappingFunction(getNameMethod);
|
||||
expectedDimensions.add(FunctionFactory.createCompoundFunction(Arrays.asList(getRegatta, getName)));
|
||||
|
||||
Method getYearMethod = HasTrackedRaceContext.class.getMethod("getYear", new Class<?>[0]);
|
||||
expectedDimensions.add(FunctionFactory.createMethodWrappingFunction(getYearMethod));
|
||||
|
||||
Method getCompetitorMethod = HasTrackedLegOfCompetitorContext.class.getMethod("getCompetitor", new Class<?>[0]);
|
||||
Function<?> getCompetitor = FunctionFactory.createMethodWrappingFunction(getCompetitorMethod);
|
||||
Method getTeamMethod = Competitor.class.getMethod("getTeam", new Class<?>[0]);
|
||||
Function<?> getTeam = FunctionFactory.createMethodWrappingFunction(getTeamMethod);
|
||||
Method getNationalityMethod = Team.class.getMethod("getNationality", new Class<?>[0]);
|
||||
Function<?> getNationality = FunctionFactory.createMethodWrappingFunction(getNationalityMethod);
|
||||
Method getAcronymMethod = Nationality.class.getMethod("getThreeLetterIOCAcronym", new Class<?>[0]);
|
||||
Function<?> getAcronym = FunctionFactory.createMethodWrappingFunction(getAcronymMethod);
|
||||
expectedDimensions.add(FunctionFactory.createCompoundFunction(Arrays.asList(getCompetitor, getTeam, getNationality, getAcronym)));
|
||||
|
||||
return expectedDimensions;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testImportantRegisteredStatistics() throws NoSuchMethodException, SecurityException {
|
||||
Collection<Function<?>> expectedStatistics = createExpectedImportantRegisteredStatistics();
|
||||
Collection<Function<?>> providedStatistics = functionRegistry.getStatistics();
|
||||
for (Function<?> statistic : expectedStatistics) {
|
||||
assertThat("The expected statistic '" + statistic + "' wasn't provided.",
|
||||
providedStatistics.contains(statistic), is(true));
|
||||
}
|
||||
}
|
||||
|
||||
private Collection<Function<?>> createExpectedImportantRegisteredStatistics() throws NoSuchMethodException, SecurityException {
|
||||
Collection<Function<?>> expectedStatistics = new HashSet<>();
|
||||
|
||||
Method getDistanceTraveledMethod = HasTrackedLegOfCompetitorContext.class.getMethod("getDistanceTraveled", new Class<?>[0]);
|
||||
expectedStatistics.add(FunctionFactory.createMethodWrappingFunction(getDistanceTraveledMethod));
|
||||
|
||||
Method getGPSFixMethod = HasGPSFixContext.class.getMethod("getGPSFix", new Class<?>[0]);
|
||||
Function<?> getGPSFix = FunctionFactory.createMethodWrappingFunction(getGPSFixMethod);
|
||||
Method getSpeedMethod = Moving.class.getMethod("getSpeed", new Class<?>[0]);
|
||||
Function<?> getSpeed = FunctionFactory.createMethodWrappingFunction(getSpeedMethod);
|
||||
Method getKnotsMethod = Speed.class.getMethod("getKnots", new Class<?>[0]);
|
||||
Function<?> getKnots = FunctionFactory.createMethodWrappingFunction(getKnotsMethod);
|
||||
expectedStatistics.add(FunctionFactory.createCompoundFunction(Arrays.asList(getGPSFix, getSpeed, getKnots)));
|
||||
|
||||
return expectedStatistics;
|
||||
}
|
||||
|
||||
}
|
||||
-35
@@ -1,35 +0,0 @@
|
||||
package com.sap.sailing.datamining.test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sailing.datamining.Clusters;
|
||||
import com.sap.sse.datamining.data.deprecated.ClusterOfComparable;
|
||||
import com.sap.sse.datamining.impl.data.deprecated.ClusterOfComparableImpl;
|
||||
|
||||
public class TestClusters {
|
||||
|
||||
@Test
|
||||
public void testClusterOfComparable() {
|
||||
ClusterOfComparable<Integer> cluster = new ClusterOfComparableImpl<Integer>("Test", 3, 1);
|
||||
|
||||
assertTrue(cluster.isInRange(1));
|
||||
assertTrue(cluster.isInRange(2));
|
||||
assertTrue(cluster.isInRange(3));
|
||||
|
||||
assertFalse(cluster.isInRange(null));
|
||||
assertFalse(cluster.isInRange(0));
|
||||
assertFalse(cluster.isInRange(4));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWindStrengthClusters() {
|
||||
assertNull(Clusters.WindStrength.getClusterFor(15, Clusters.WindStrength.StandardClusters));
|
||||
assertEquals(Clusters.WindStrength.VeryLight, Clusters.WindStrength.getClusterFor(1, Clusters.WindStrength.StandardClusters));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -17,4 +17,5 @@ Require-Bundle: com.sap.sailing.domain;bundle-version="1.0.0",
|
||||
com.sap.sse.datamining.shared;bundle-version="1.0.0",
|
||||
com.sap.sse.common
|
||||
Bundle-ClassPath: .
|
||||
Bundle-Activator: com.sap.sailing.datamining.impl.Activator
|
||||
Bundle-Activator: com.sap.sailing.datamining.Activator
|
||||
Bundle-ActivationPolicy: lazy
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.sap.sailing.datamining;
|
||||
|
||||
import org.osgi.framework.BundleActivator;
|
||||
import org.osgi.framework.BundleContext;
|
||||
import org.osgi.framework.ServiceRegistration;
|
||||
|
||||
import com.sap.sailing.datamining.impl.data.SailingDataMiningClassesWithFunctionsService;
|
||||
import com.sap.sse.datamining.ClassesWithFunctionsService;
|
||||
|
||||
public class Activator implements BundleActivator {
|
||||
|
||||
public static final String dataRetrieverGroupName = "Sailing";
|
||||
|
||||
private static BundleContext context;
|
||||
|
||||
private ServiceRegistration<ClassesWithFunctionsService> classesWithFunctionsServiceRegistration;
|
||||
|
||||
@Override
|
||||
public void start(BundleContext context) throws Exception {
|
||||
Activator.context = context;
|
||||
registerClassesWithFunctionsService();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop(BundleContext context) throws Exception {
|
||||
unregisterClassesWithFunctionsService();
|
||||
}
|
||||
|
||||
private void unregisterClassesWithFunctionsService() {
|
||||
context.ungetService(classesWithFunctionsServiceRegistration.getReference());
|
||||
}
|
||||
|
||||
private void registerClassesWithFunctionsService() {
|
||||
classesWithFunctionsServiceRegistration = context.registerService(ClassesWithFunctionsService.class,
|
||||
new SailingDataMiningClassesWithFunctionsService(), null);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
package com.sap.sailing.datamining;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
import com.sap.sailing.datamining.impl.WindStrengthClusterImpl;
|
||||
|
||||
public class Clusters {
|
||||
|
||||
private Clusters() { }
|
||||
|
||||
public static class WindStrength {
|
||||
|
||||
public static WindStrengthCluster VeryLight = new WindStrengthClusterImpl("Very Light", 0.0, 2.5);
|
||||
public static WindStrengthCluster Light = new WindStrengthClusterImpl("Very Light", 2.5, 5.0);
|
||||
public static WindStrengthCluster Medium = new WindStrengthClusterImpl("Very Light", 5.0, 7.5);
|
||||
public static WindStrengthCluster Strong = new WindStrengthClusterImpl("Very Light", 7.5, 10.0);
|
||||
public static WindStrengthCluster VeryStrong = new WindStrengthClusterImpl("Very Light", 10.0, 12.0);
|
||||
public static Collection<WindStrengthCluster> StandardClusters = Arrays.asList(VeryLight, Light, Medium, Strong, VeryStrong);
|
||||
|
||||
private WindStrength() { }
|
||||
|
||||
public static WindStrengthCluster getClusterFor(double windStrengthInBeafort, Collection<WindStrengthCluster> clusters) {
|
||||
List<WindStrengthCluster> sortedClusters = new ArrayList<WindStrengthCluster>(clusters);
|
||||
Collections.sort(sortedClusters, new Comparator<WindStrengthCluster>() {
|
||||
@Override
|
||||
public int compare(WindStrengthCluster cluster1, WindStrengthCluster cluster2) {
|
||||
return cluster1.getUpperRange().compareTo(cluster2.getUpperRange());
|
||||
}
|
||||
});
|
||||
|
||||
for (WindStrengthCluster cluster : sortedClusters) {
|
||||
if (cluster.isInRange(windStrengthInBeafort)) {
|
||||
return cluster;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
-7
@@ -1,7 +0,0 @@
|
||||
package com.sap.sailing.datamining;
|
||||
|
||||
import com.sap.sse.datamining.data.deprecated.ClusterOfComparable;
|
||||
|
||||
public interface WindStrengthCluster extends ClusterOfComparable<Double> {
|
||||
|
||||
}
|
||||
-52
@@ -1,52 +0,0 @@
|
||||
package com.sap.sailing.datamining.data;
|
||||
|
||||
import com.sap.sailing.datamining.WindStrengthCluster;
|
||||
import com.sap.sailing.domain.common.LegType;
|
||||
import com.sap.sailing.domain.tracking.GPSFixMoving;
|
||||
import com.sap.sse.datamining.shared.annotations.Dimension;
|
||||
|
||||
public interface GPSFixWithContext extends GPSFixMoving {
|
||||
|
||||
@Dimension(messageKey="regatta")
|
||||
public String getRegattaName();
|
||||
|
||||
@Dimension(messageKey="race")
|
||||
public String getRaceName();
|
||||
|
||||
@Dimension(messageKey="legNumber")
|
||||
public int getLegNumber();
|
||||
|
||||
@Dimension(messageKey="course")
|
||||
public String getCourseAreaName();
|
||||
|
||||
@Dimension(messageKey="fleet")
|
||||
public String getFleetName();
|
||||
|
||||
@Dimension(messageKey="boatClass")
|
||||
public String getBoatClassName();
|
||||
|
||||
/**
|
||||
* The year of the start of the race.
|
||||
*/
|
||||
@Dimension(messageKey="year")
|
||||
public Integer getYear();
|
||||
|
||||
/**
|
||||
* The leg type of the leg, which contains this gps fix. Can be <code>null</code> if there's no wind in the race.
|
||||
*/
|
||||
@Dimension(messageKey="legType")
|
||||
public LegType getLegType();
|
||||
|
||||
@Dimension(messageKey="competitor")
|
||||
public String getCompetitorName();
|
||||
|
||||
@Dimension(messageKey="sailID")
|
||||
public String getCompetitorSailID();
|
||||
|
||||
@Dimension(messageKey="nationality")
|
||||
public String getCompetitorNationality();
|
||||
|
||||
@Dimension(messageKey="windStrength")
|
||||
public WindStrengthCluster getWindStrength();
|
||||
|
||||
}
|
||||
+6
@@ -1,5 +1,11 @@
|
||||
package com.sap.sailing.datamining.data;
|
||||
|
||||
import com.sap.sailing.domain.tracking.GPSFixMoving;
|
||||
import com.sap.sse.datamining.shared.annotations.Connector;
|
||||
|
||||
public interface HasGPSFixContext extends HasTrackedLegOfCompetitorContext {
|
||||
|
||||
@Connector
|
||||
public GPSFixMoving getGPSFix();
|
||||
|
||||
}
|
||||
-9
@@ -1,9 +0,0 @@
|
||||
package com.sap.sailing.datamining.data;
|
||||
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
|
||||
public interface HasLeaderboardContext extends HasLeaderboardGroupContext {
|
||||
|
||||
public Leaderboard getLeaderboard();
|
||||
|
||||
}
|
||||
-9
@@ -1,9 +0,0 @@
|
||||
package com.sap.sailing.datamining.data;
|
||||
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
|
||||
public interface HasLeaderboardGroupContext {
|
||||
|
||||
public LeaderboardGroup getLeaderboardGroup();
|
||||
|
||||
}
|
||||
+4
@@ -2,11 +2,15 @@ package com.sap.sailing.datamining.data;
|
||||
|
||||
import com.sap.sailing.domain.common.LegType;
|
||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||
import com.sap.sse.datamining.shared.annotations.Dimension;
|
||||
|
||||
public interface HasTrackedLegContext extends HasTrackedRaceContext {
|
||||
|
||||
public TrackedLeg getTrackedLeg();
|
||||
|
||||
@Dimension(messageKey="LegType", ordinal=5)
|
||||
public LegType getLegType();
|
||||
@Dimension(messageKey="LegNumber", ordinal=6)
|
||||
public int getLegNumber();
|
||||
|
||||
}
|
||||
+10
@@ -1,9 +1,19 @@
|
||||
package com.sap.sailing.datamining.data;
|
||||
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
import com.sap.sse.datamining.shared.Unit;
|
||||
import com.sap.sse.datamining.shared.annotations.Connector;
|
||||
import com.sap.sse.datamining.shared.annotations.Statistic;
|
||||
|
||||
public interface HasTrackedLegOfCompetitorContext extends HasTrackedLegContext {
|
||||
|
||||
public TrackedLegOfCompetitor getTrackedLegOfCompetitor();
|
||||
|
||||
@Connector(messageKey="Competitor")
|
||||
public Competitor getCompetitor();
|
||||
|
||||
@Statistic(messageKey="DistanceTraveled", resultUnit=Unit.Meters, resultDecimals=0, ordinal=0)
|
||||
public Double getDistanceTraveled();
|
||||
|
||||
}
|
||||
+24
-4
@@ -1,14 +1,34 @@
|
||||
package com.sap.sailing.datamining.data;
|
||||
|
||||
import com.sap.sailing.domain.base.BoatClass;
|
||||
import com.sap.sailing.domain.base.CourseArea;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.base.RaceDefinition;
|
||||
import com.sap.sailing.domain.base.Regatta;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sse.datamining.shared.annotations.Connector;
|
||||
import com.sap.sse.datamining.shared.annotations.Dimension;
|
||||
|
||||
public interface HasTrackedRaceContext extends HasLeaderboardContext {
|
||||
|
||||
public CourseArea getCourseArea();
|
||||
public Fleet getFleet();
|
||||
public interface HasTrackedRaceContext {
|
||||
|
||||
public TrackedRace getTrackedRace();
|
||||
|
||||
@Connector(messageKey="Regatta", ordinal=0)
|
||||
public Regatta getRegatta();
|
||||
|
||||
@Connector(messageKey="CourseArea", ordinal=2)
|
||||
public CourseArea getCourseArea();
|
||||
|
||||
@Connector(messageKey="BoatClass", ordinal=1)
|
||||
public BoatClass getBoatClass();
|
||||
|
||||
@Connector(messageKey="Fleet", ordinal=3)
|
||||
public Fleet getFleet();
|
||||
|
||||
@Connector(messageKey="Race", ordinal=4)
|
||||
public RaceDefinition getRace();
|
||||
|
||||
@Dimension(messageKey="Year", ordinal=10)
|
||||
public Integer getYear();
|
||||
|
||||
}
|
||||
-54
@@ -1,54 +0,0 @@
|
||||
package com.sap.sailing.datamining.data;
|
||||
|
||||
import com.sap.sailing.datamining.WindStrengthCluster;
|
||||
import com.sap.sailing.domain.common.Distance;
|
||||
import com.sap.sailing.domain.common.LegType;
|
||||
import com.sap.sse.datamining.shared.Unit;
|
||||
import com.sap.sse.datamining.shared.annotations.Dimension;
|
||||
import com.sap.sse.datamining.shared.annotations.SideEffectFreeValue;
|
||||
|
||||
public interface TrackedLegOfCompetitorWithContext {
|
||||
|
||||
@Dimension(messageKey="regatta")
|
||||
public String getRegattaName();
|
||||
|
||||
@Dimension(messageKey="race")
|
||||
public String getRaceName();
|
||||
|
||||
@Dimension(messageKey="legNumber")
|
||||
public int getLegNumber();
|
||||
|
||||
@Dimension(messageKey="course")
|
||||
public String getCourseAreaName();
|
||||
|
||||
@Dimension(messageKey="fleet")
|
||||
public String getFleetName();
|
||||
|
||||
@Dimension(messageKey="boatClass")
|
||||
public String getBoatClassName();
|
||||
|
||||
/**
|
||||
* The year of the start of the race.
|
||||
*/
|
||||
@Dimension(messageKey="year")
|
||||
public Integer getYear();
|
||||
|
||||
@Dimension(messageKey="legType")
|
||||
public LegType getLegType();
|
||||
|
||||
@Dimension(messageKey="competitor")
|
||||
public String getCompetitorName();
|
||||
|
||||
@Dimension(messageKey="sailID")
|
||||
public String getCompetitorSailID();
|
||||
|
||||
@Dimension(messageKey="nationality")
|
||||
public String getCompetitorNationality();
|
||||
|
||||
@Dimension(messageKey="windStrength")
|
||||
public WindStrengthCluster getWindStrength();
|
||||
|
||||
@SideEffectFreeValue(messageKey="distanceTraveled", resultUnit=Unit.Meters)
|
||||
public Distance getDistanceTraveled();
|
||||
|
||||
}
|
||||
-10
@@ -1,10 +0,0 @@
|
||||
package com.sap.sailing.datamining.dimensions;
|
||||
|
||||
import com.sap.sailing.datamining.shared.DimensionIdentifier;
|
||||
import com.sap.sse.datamining.data.deprecated.Dimension;
|
||||
|
||||
public interface DimensionManager<DataType> {
|
||||
|
||||
public Dimension<DataType, ?> getDimensionFor(DimensionIdentifier sharedDimension);
|
||||
|
||||
}
|
||||
-26
@@ -1,26 +0,0 @@
|
||||
package com.sap.sailing.datamining.dimensions;
|
||||
|
||||
import com.sap.sailing.datamining.data.GPSFixWithContext;
|
||||
import com.sap.sailing.datamining.data.TrackedLegOfCompetitorWithContext;
|
||||
import com.sap.sailing.datamining.shared.DataTypes;
|
||||
|
||||
public final class DimensionManagerProvider {
|
||||
|
||||
private DimensionManagerProvider() { }
|
||||
|
||||
private static final DimensionManager<GPSFixWithContext> GPSFixDimensionManager = new GPSFixDimensionManager();
|
||||
private static final DimensionManager<TrackedLegOfCompetitorWithContext> TrackedLegOfCompetitorDimensionManager = new TrackedLegOfCompetitorDimensionManager();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <DataType> DimensionManager<DataType> getDimensionManagerFor(DataTypes dataType) {
|
||||
switch (dataType) {
|
||||
case GPSFix:
|
||||
return (DimensionManager<DataType>) GPSFixDimensionManager;
|
||||
case TrackedLegOfCompetitor:
|
||||
return (DimensionManager<DataType>) TrackedLegOfCompetitorDimensionManager;
|
||||
}
|
||||
throw new IllegalArgumentException("Not yet implemented for the given data type: "
|
||||
+ dataType.toString());
|
||||
}
|
||||
|
||||
}
|
||||
-133
@@ -1,133 +0,0 @@
|
||||
package com.sap.sailing.datamining.dimensions;
|
||||
|
||||
import com.sap.sailing.datamining.data.GPSFixWithContext;
|
||||
import com.sap.sailing.datamining.shared.DimensionIdentifier;
|
||||
import com.sap.sailing.domain.common.LegType;
|
||||
import com.sap.sse.datamining.data.deprecated.Dimension;
|
||||
import com.sap.sse.datamining.impl.data.deprecated.AbstractDimension;
|
||||
|
||||
public final class GPSFixDimensionManager implements DimensionManager<GPSFixWithContext> {
|
||||
|
||||
public GPSFixDimensionManager() { }
|
||||
|
||||
/**
|
||||
* @return The dimension for the given dimension type. Throws an exception, if the used <code>ValueType</code> doesn't match the <code>ValueType</code> of the returning dimension.
|
||||
*/
|
||||
@Override
|
||||
public Dimension<GPSFixWithContext, ?> getDimensionFor(DimensionIdentifier dimension) {
|
||||
switch (dimension) {
|
||||
case BoatClassName:
|
||||
return BoatClassNameDimension;
|
||||
case CompetitorName:
|
||||
return CompetitorNameDimension;
|
||||
case CourseAreaName:
|
||||
return CourseAreaNameDimension;
|
||||
case FleetName:
|
||||
return FleetNameDimension;
|
||||
case LegNumber:
|
||||
return LegNumberDimension;
|
||||
case LegType:
|
||||
return LegTypeDimension;
|
||||
case Nationality:
|
||||
return NationalityDimension;
|
||||
case RaceName:
|
||||
return RaceNameDimension;
|
||||
case RegattaName:
|
||||
return RegattaNameDimension;
|
||||
case SailID:
|
||||
return SailIDDimension;
|
||||
case WindStrength:
|
||||
return WindStrengthDimension;
|
||||
case Year:
|
||||
return YearDimension;
|
||||
}
|
||||
throw new IllegalArgumentException("Not yet implemented for the given dimension: "
|
||||
+ dimension.toString());
|
||||
}
|
||||
|
||||
public final static Dimension<GPSFixWithContext, String> RegattaNameDimension = new AbstractDimension<GPSFixWithContext, String>("Regatta") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(GPSFixWithContext data) {
|
||||
return data.getRegattaName();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<GPSFixWithContext, String> RaceNameDimension = new AbstractDimension<GPSFixWithContext, String>("Race") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(GPSFixWithContext data) {
|
||||
return data.getRaceName();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<GPSFixWithContext, Integer> LegNumberDimension = new AbstractDimension<GPSFixWithContext, Integer>("Leg Number") {
|
||||
@Override
|
||||
public Integer getDimensionValueFrom(GPSFixWithContext data) {
|
||||
return data.getLegNumber();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<GPSFixWithContext, String> CourseAreaNameDimension = new AbstractDimension<GPSFixWithContext, String>("Course Area") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(GPSFixWithContext data) {
|
||||
return data.getCourseAreaName();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<GPSFixWithContext, String> FleetNameDimension = new AbstractDimension<GPSFixWithContext, String>("Fleet") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(GPSFixWithContext data) {
|
||||
return data.getFleetName();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<GPSFixWithContext, String> BoatClassNameDimension = new AbstractDimension<GPSFixWithContext, String>("Boat Class") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(GPSFixWithContext data) {
|
||||
return data.getBoatClassName();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<GPSFixWithContext, Integer> YearDimension = new AbstractDimension<GPSFixWithContext, Integer>("Year") {
|
||||
@Override
|
||||
public Integer getDimensionValueFrom(GPSFixWithContext data) {
|
||||
return data.getYear();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<GPSFixWithContext, LegType> LegTypeDimension = new AbstractDimension<GPSFixWithContext, LegType>("Leg Type") {
|
||||
@Override
|
||||
public LegType getDimensionValueFrom(GPSFixWithContext data) {
|
||||
return data.getLegType();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<GPSFixWithContext, String> CompetitorNameDimension = new AbstractDimension<GPSFixWithContext, String>("Competitor") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(GPSFixWithContext data) {
|
||||
return data.getCompetitorName();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<GPSFixWithContext, String> SailIDDimension = new AbstractDimension<GPSFixWithContext, String>("Sail ID") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(GPSFixWithContext data) {
|
||||
return data.getCompetitorSailID();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<GPSFixWithContext, String> NationalityDimension = new AbstractDimension<GPSFixWithContext, String>("Nationality") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(GPSFixWithContext data) {
|
||||
return data.getCompetitorNationality();
|
||||
}
|
||||
};
|
||||
|
||||
//TODO after new clusters
|
||||
public final static Dimension<GPSFixWithContext, String> WindStrengthDimension = new AbstractDimension<GPSFixWithContext, String>("Wind Strength") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(GPSFixWithContext data) {
|
||||
return data.getWindStrength().getName();
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
-132
@@ -1,132 +0,0 @@
|
||||
package com.sap.sailing.datamining.dimensions;
|
||||
|
||||
import com.sap.sailing.datamining.data.TrackedLegOfCompetitorWithContext;
|
||||
import com.sap.sailing.datamining.shared.DimensionIdentifier;
|
||||
import com.sap.sailing.domain.common.LegType;
|
||||
import com.sap.sse.datamining.data.deprecated.Dimension;
|
||||
import com.sap.sse.datamining.impl.data.deprecated.AbstractDimension;
|
||||
|
||||
public final class TrackedLegOfCompetitorDimensionManager implements DimensionManager<TrackedLegOfCompetitorWithContext> {
|
||||
|
||||
public TrackedLegOfCompetitorDimensionManager() { }
|
||||
|
||||
/**
|
||||
* @return The dimension for the given dimension type. Throws an exception, if the used <code>ValueType</code> doesn't match the <code>ValueType</code> of the returning dimension.
|
||||
*/
|
||||
public Dimension<TrackedLegOfCompetitorWithContext, ?> getDimensionFor(DimensionIdentifier dimension) {
|
||||
switch (dimension) {
|
||||
case BoatClassName:
|
||||
return BoatClassNameDimension;
|
||||
case CompetitorName:
|
||||
return CompetitorNameDimension;
|
||||
case CourseAreaName:
|
||||
return CourseAreaNameDimension;
|
||||
case FleetName:
|
||||
return FleetNameDimension;
|
||||
case LegNumber:
|
||||
return LegNumberDimension;
|
||||
case LegType:
|
||||
return LegTypeDimension;
|
||||
case Nationality:
|
||||
return NationalityDimension;
|
||||
case RaceName:
|
||||
return RaceNameDimension;
|
||||
case RegattaName:
|
||||
return RegattaNameDimension;
|
||||
case SailID:
|
||||
return SailIDDimension;
|
||||
case WindStrength:
|
||||
return WindStrengthDimension;
|
||||
case Year:
|
||||
return YearDimension;
|
||||
}
|
||||
throw new IllegalArgumentException("Not yet implemented for the given dimension: "
|
||||
+ dimension.toString());
|
||||
}
|
||||
|
||||
public final static Dimension<TrackedLegOfCompetitorWithContext, String> RegattaNameDimension = new AbstractDimension<TrackedLegOfCompetitorWithContext, String>("Regatta") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) {
|
||||
return data.getRegattaName();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<TrackedLegOfCompetitorWithContext, String> RaceNameDimension = new AbstractDimension<TrackedLegOfCompetitorWithContext, String>("Race") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) {
|
||||
return data.getRaceName();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<TrackedLegOfCompetitorWithContext, Integer> LegNumberDimension = new AbstractDimension<TrackedLegOfCompetitorWithContext, Integer>("Leg Number") {
|
||||
@Override
|
||||
public Integer getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) {
|
||||
return data.getLegNumber();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<TrackedLegOfCompetitorWithContext, String> CourseAreaNameDimension = new AbstractDimension<TrackedLegOfCompetitorWithContext, String>("Course Area") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) {
|
||||
return data.getCourseAreaName();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<TrackedLegOfCompetitorWithContext, String> FleetNameDimension = new AbstractDimension<TrackedLegOfCompetitorWithContext, String>("Fleet") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) {
|
||||
return data.getFleetName();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<TrackedLegOfCompetitorWithContext, String> BoatClassNameDimension = new AbstractDimension<TrackedLegOfCompetitorWithContext, String>("Boat Class") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) {
|
||||
return data.getBoatClassName();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<TrackedLegOfCompetitorWithContext, Integer> YearDimension = new AbstractDimension<TrackedLegOfCompetitorWithContext, Integer>("Year") {
|
||||
@Override
|
||||
public Integer getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) {
|
||||
return data.getYear();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<TrackedLegOfCompetitorWithContext, LegType> LegTypeDimension = new AbstractDimension<TrackedLegOfCompetitorWithContext, LegType>("Leg Type") {
|
||||
@Override
|
||||
public LegType getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) {
|
||||
return data.getLegType();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<TrackedLegOfCompetitorWithContext, String> CompetitorNameDimension = new AbstractDimension<TrackedLegOfCompetitorWithContext, String>("Competitor") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) {
|
||||
return data.getCompetitorName();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<TrackedLegOfCompetitorWithContext, String> SailIDDimension = new AbstractDimension<TrackedLegOfCompetitorWithContext, String>("Sail ID") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) {
|
||||
return data.getCompetitorSailID();
|
||||
}
|
||||
};
|
||||
|
||||
public final static Dimension<TrackedLegOfCompetitorWithContext, String> NationalityDimension = new AbstractDimension<TrackedLegOfCompetitorWithContext, String>("Nationality") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) {
|
||||
return data.getCompetitorNationality();
|
||||
}
|
||||
};
|
||||
|
||||
//TODO after new clusters
|
||||
public final static Dimension<TrackedLegOfCompetitorWithContext, String> WindStrengthDimension = new AbstractDimension<TrackedLegOfCompetitorWithContext, String>("Wind Strength") {
|
||||
@Override
|
||||
public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) {
|
||||
return data.getWindStrength().getName();
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
-57
@@ -1,57 +0,0 @@
|
||||
package com.sap.sailing.datamining.factories;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import com.sap.sailing.datamining.shared.QueryDefinition;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sse.datamining.Query;
|
||||
import com.sap.sse.datamining.components.ParallelAggregator;
|
||||
import com.sap.sse.datamining.components.ParallelDataRetriever;
|
||||
import com.sap.sse.datamining.components.ParallelExtractor;
|
||||
import com.sap.sse.datamining.components.ParallelFilter;
|
||||
import com.sap.sse.datamining.components.ParallelGrouper;
|
||||
import com.sap.sse.datamining.factories.AggregatorFactory;
|
||||
import com.sap.sse.datamining.i18n.DataMiningStringMessages;
|
||||
import com.sap.sse.datamining.impl.DataMiningActivator;
|
||||
import com.sap.sse.datamining.impl.deprecated.QueryImpl;
|
||||
import com.sap.sse.datamining.workers.FiltrationWorker;
|
||||
import com.sap.sse.datamining.workers.WorkerBuilder;
|
||||
|
||||
public final class DataMiningFactory {
|
||||
|
||||
private DataMiningFactory() {
|
||||
}
|
||||
|
||||
public static <DataType, AggregatedType extends Number> Query<AggregatedType> createQuery(
|
||||
QueryDefinition queryDefinition, RacingEventService racingService) {
|
||||
Locale locale = DataMiningStringMessages.Util.getLocaleFrom(queryDefinition.getLocaleInfoName());
|
||||
|
||||
ParallelDataRetriever<DataType> retriever = DataRetrieverFactory.createDataRetriever(
|
||||
queryDefinition.getDataType(), racingService, DataMiningActivator.getExecutor());
|
||||
|
||||
ParallelFilter<DataType> filter = createFilter(queryDefinition);
|
||||
|
||||
ParallelGrouper<DataType> grouper = GrouperFactory.createGrouper(queryDefinition,
|
||||
DataMiningActivator.getExecutor());
|
||||
ParallelExtractor<DataType, AggregatedType> extractor = ExtractorFactory.createExtractor(
|
||||
DataMiningActivator.getStringMessages(), locale, queryDefinition.getStatisticType(),
|
||||
DataMiningActivator.getExecutor());
|
||||
ParallelAggregator<AggregatedType, AggregatedType> aggregator = AggregatorFactory.createAggregator(
|
||||
DataMiningActivator.getStringMessages(), locale, queryDefinition.getStatisticType().getValueType(),
|
||||
queryDefinition.getAggregatorType(), DataMiningActivator.getExecutor());
|
||||
|
||||
return new QueryImpl<DataType, AggregatedType, AggregatedType>(DataMiningActivator.getStringMessages(), locale,
|
||||
retriever, filter, grouper, extractor, aggregator);
|
||||
}
|
||||
|
||||
private static <DataType> ParallelFilter<DataType> createFilter(QueryDefinition queryDefinition) {
|
||||
if (queryDefinition.getSelection().isEmpty()) {
|
||||
return FilterFactory.createNonFilteringFilter();
|
||||
}
|
||||
|
||||
WorkerBuilder<FiltrationWorker<DataType>> workerBuilder = FilterFactory.createDimensionFilterBuilder(
|
||||
queryDefinition.getDataType(), queryDefinition.getSelection());
|
||||
return FilterFactory.createParallelFilter(workerBuilder, DataMiningActivator.getExecutor());
|
||||
}
|
||||
|
||||
}
|
||||
-28
@@ -1,28 +0,0 @@
|
||||
package com.sap.sailing.datamining.factories;
|
||||
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
|
||||
import com.sap.sailing.datamining.impl.components.GroupDividingParallelDataRetriever;
|
||||
import com.sap.sailing.datamining.impl.workers.builders.DataRetrieverWorkerBuilder;
|
||||
import com.sap.sailing.datamining.shared.DataTypes;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sse.datamining.components.ParallelDataRetriever;
|
||||
import com.sap.sse.datamining.workers.DataRetrievalWorker;
|
||||
import com.sap.sse.datamining.workers.WorkerBuilder;
|
||||
|
||||
public final class DataRetrieverFactory {
|
||||
|
||||
private DataRetrieverFactory() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a retriever for the given data type. Throws an exception, if the used <code>DataType</code> doesn't match
|
||||
* the <code>DataType</code> of the returning retriever.
|
||||
*/
|
||||
public static <DataType> ParallelDataRetriever<DataType> createDataRetriever(DataTypes dataType, RacingEventService racingService, ThreadPoolExecutor executor) {
|
||||
WorkerBuilder<DataRetrievalWorker<LeaderboardGroup, DataType>> workerBuilder = new DataRetrieverWorkerBuilder<DataType>(dataType);
|
||||
return new GroupDividingParallelDataRetriever<DataType>(racingService, workerBuilder, executor);
|
||||
}
|
||||
|
||||
}
|
||||
-29
@@ -1,29 +0,0 @@
|
||||
package com.sap.sailing.datamining.factories;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
|
||||
import com.sap.sailing.datamining.impl.workers.builders.ExtractionWorkerBuilder;
|
||||
import com.sap.sailing.datamining.shared.StatisticType;
|
||||
import com.sap.sse.datamining.components.ParallelExtractor;
|
||||
import com.sap.sse.datamining.i18n.DataMiningStringMessages;
|
||||
import com.sap.sse.datamining.impl.components.deprecated.GroupDividingParallelExtractor;
|
||||
import com.sap.sse.datamining.shared.Message;
|
||||
import com.sap.sse.datamining.shared.Unit;
|
||||
import com.sap.sse.datamining.workers.ExtractionWorker;
|
||||
import com.sap.sse.datamining.workers.WorkerBuilder;
|
||||
|
||||
public final class ExtractorFactory {
|
||||
|
||||
private ExtractorFactory() { }
|
||||
|
||||
public static <DataType, ExtractedType extends Number> ParallelExtractor<DataType, ExtractedType> createExtractor(DataMiningStringMessages stringMessages, Locale locale,
|
||||
StatisticType statisticType, ThreadPoolExecutor executor) {
|
||||
WorkerBuilder<ExtractionWorker<DataType, ExtractedType>> workerBuilder = new ExtractionWorkerBuilder<DataType, ExtractedType>(statisticType);
|
||||
String signifier = statisticType.getUnit() == Unit.None ? stringMessages.get(locale, statisticType.getSignifierMessage()) :
|
||||
stringMessages.get(locale, Message.SignifierInUnit, statisticType.getSignifierMessage(), statisticType.getUnitMessage());
|
||||
return new GroupDividingParallelExtractor<DataType, ExtractedType>(signifier, statisticType.getUnit(), statisticType.getValueDecimals(),
|
||||
workerBuilder, executor);
|
||||
}
|
||||
|
||||
}
|
||||
-64
@@ -1,64 +0,0 @@
|
||||
package com.sap.sailing.datamining.factories;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
|
||||
import com.sap.sailing.datamining.dimensions.DimensionManager;
|
||||
import com.sap.sailing.datamining.dimensions.DimensionManagerProvider;
|
||||
import com.sap.sailing.datamining.shared.DataTypes;
|
||||
import com.sap.sailing.datamining.shared.DimensionIdentifier;
|
||||
import com.sap.sse.datamining.components.FilterCriteria;
|
||||
import com.sap.sse.datamining.components.ParallelFilter;
|
||||
import com.sap.sse.datamining.data.deprecated.Dimension;
|
||||
import com.sap.sse.datamining.impl.components.deprecated.NonFilteringFilter;
|
||||
import com.sap.sse.datamining.impl.components.deprecated.PartitioningParallelFilter;
|
||||
import com.sap.sse.datamining.impl.criterias.AndCompoundFilterCriteria;
|
||||
import com.sap.sse.datamining.impl.criterias.CompoundFilterCriteria;
|
||||
import com.sap.sse.datamining.impl.criterias.deprecated.DimensionValuesFilterCriteria;
|
||||
import com.sap.sse.datamining.impl.workers.builders.FilterByCriteriaBuilder;
|
||||
import com.sap.sse.datamining.workers.FiltrationWorker;
|
||||
import com.sap.sse.datamining.workers.WorkerBuilder;
|
||||
|
||||
public final class FilterFactory {
|
||||
|
||||
private FilterFactory() { }
|
||||
|
||||
public static <DataType> ParallelFilter<DataType> createParallelFilter(WorkerBuilder<FiltrationWorker<DataType>> workerBuilder, ThreadPoolExecutor executor) {
|
||||
return new PartitioningParallelFilter<DataType>(workerBuilder, executor);
|
||||
}
|
||||
|
||||
public static <DataType> WorkerBuilder<FiltrationWorker<DataType>> createDimensionFilterBuilder(DataTypes dataType, Map<DimensionIdentifier, Iterable<?>> selection) {
|
||||
FilterCriteria<DataType> criteria = createAndCompoundDimensionFilterCritera(dataType, selection);
|
||||
WorkerBuilder<FiltrationWorker<DataType>> builder = new FilterByCriteriaBuilder<DataType>(criteria);
|
||||
return builder;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return A filter that filters nothing. So the returning collection is the same as the given one.
|
||||
*/
|
||||
public static <DataType> ParallelFilter<DataType> createNonFilteringFilter() {
|
||||
return new NonFilteringFilter<DataType>();
|
||||
}
|
||||
|
||||
private static <DataType> FilterCriteria<DataType> createAndCompoundDimensionFilterCritera(DataTypes dataType, Map<DimensionIdentifier, Iterable<?>> selection) {
|
||||
DimensionManager<DataType> dimensionManager = DimensionManagerProvider.getDimensionManagerFor(dataType);
|
||||
CompoundFilterCriteria<DataType> compoundCriteria = new AndCompoundFilterCriteria<DataType>();
|
||||
|
||||
for (Entry<DimensionIdentifier, Iterable<?>> entry : selection.entrySet()) {
|
||||
Dimension<DataType, ?> dimension = dimensionManager.getDimensionFor(entry.getKey());
|
||||
if (dimension != null) {
|
||||
FilterCriteria<DataType> criteria = createDimensionFilterCriteria(dimension, entry.getValue());
|
||||
compoundCriteria.addCriteria(criteria);
|
||||
}
|
||||
}
|
||||
return compoundCriteria;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private static <DataType, ValueType> FilterCriteria<DataType> createDimensionFilterCriteria(Dimension<DataType, ValueType> dimension, Iterable<?> values) {
|
||||
return new DimensionValuesFilterCriteria<DataType, ValueType>(dimension, (Collection<ValueType>) values);
|
||||
}
|
||||
|
||||
}
|
||||
-49
@@ -1,49 +0,0 @@
|
||||
package com.sap.sailing.datamining.factories;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
|
||||
import com.sap.sailing.datamining.dimensions.DimensionManager;
|
||||
import com.sap.sailing.datamining.dimensions.DimensionManagerProvider;
|
||||
import com.sap.sailing.datamining.shared.DataTypes;
|
||||
import com.sap.sailing.datamining.shared.DimensionIdentifier;
|
||||
import com.sap.sailing.datamining.shared.QueryDefinition;
|
||||
import com.sap.sse.datamining.components.ParallelGrouper;
|
||||
import com.sap.sse.datamining.data.deprecated.Dimension;
|
||||
import com.sap.sse.datamining.impl.components.deprecated.PartitioningParallelGrouper;
|
||||
import com.sap.sse.datamining.impl.workers.builders.MultiDimensionalGroupingWorkerBuilder;
|
||||
import com.sap.sse.datamining.workers.GroupingWorker;
|
||||
import com.sap.sse.datamining.workers.WorkerBuilder;
|
||||
|
||||
public final class GrouperFactory {
|
||||
|
||||
private GrouperFactory() { }
|
||||
|
||||
public static <DataType> ParallelGrouper<DataType> createGrouper(QueryDefinition queryDefinition, ThreadPoolExecutor executor) {
|
||||
WorkerBuilder<GroupingWorker<DataType>> workerBuilder = createGroupingWorkerBuilder(queryDefinition);
|
||||
return new PartitioningParallelGrouper<DataType>(workerBuilder, executor);
|
||||
}
|
||||
|
||||
private static <DataType> WorkerBuilder<GroupingWorker<DataType>> createGroupingWorkerBuilder(QueryDefinition queryDefinition) {
|
||||
switch (queryDefinition.getGrouperType()) {
|
||||
case Dimensions:
|
||||
return createMultiDimensionalGroupingWorkerBuilder(queryDefinition.getDataType(), queryDefinition.getDimensionsToGroupBy());
|
||||
}
|
||||
throw new IllegalArgumentException("Not yet implemented for the given grouper type: "
|
||||
+ queryDefinition.getGrouperType().toString());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private static <DataType, ValueType> WorkerBuilder<GroupingWorker<DataType>> createMultiDimensionalGroupingWorkerBuilder(DataTypes dataType, List<DimensionIdentifier> dimensionsToGroupBy) {
|
||||
DimensionManager<DataType> dimensionManager = DimensionManagerProvider.getDimensionManagerFor(dataType);
|
||||
Collection<Dimension<DataType, ValueType>> dimensions = new LinkedHashSet<Dimension<DataType, ValueType>>();
|
||||
for (DimensionIdentifier sharedDimension : dimensionsToGroupBy) {
|
||||
Dimension<DataType, ValueType> dimension = (Dimension<DataType, ValueType>) dimensionManager.getDimensionFor(sharedDimension);
|
||||
dimensions.add(dimension);
|
||||
}
|
||||
return new MultiDimensionalGroupingWorkerBuilder<DataType, ValueType>(dimensions);
|
||||
}
|
||||
|
||||
}
|
||||
+127
@@ -0,0 +1,127 @@
|
||||
package com.sap.sailing.datamining.factories;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
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.server.RacingEventService;
|
||||
import com.sap.sse.datamining.Query;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.factories.ProcessorFactory;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.functions.FunctionProvider;
|
||||
import com.sap.sse.datamining.i18n.DataMiningStringMessages;
|
||||
import com.sap.sse.datamining.impl.DataMiningActivator;
|
||||
import com.sap.sse.datamining.impl.ProcessorQuery;
|
||||
import com.sap.sse.datamining.impl.components.GroupedDataEntry;
|
||||
import com.sap.sse.datamining.shared.QueryDefinition;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
|
||||
public final class SailingDataMiningFactory {
|
||||
|
||||
private SailingDataMiningFactory() {
|
||||
}
|
||||
|
||||
public static <ElementType> Query<Double> createQuery(RacingEventService dataSource, final QueryDefinition queryDefinition, final FunctionProvider functionProvider) {
|
||||
return new ProcessorQuery<Double, RacingEventService>(DataMiningActivator.getExecutor(), dataSource,
|
||||
DataMiningActivator.getStringMessages(), DataMiningStringMessages.Util.getLocaleFor(queryDefinition.getLocaleInfoName())) {
|
||||
|
||||
@Override
|
||||
protected Processor<RacingEventService> createFirstProcessor() {
|
||||
Processor<GroupedDataEntry<Double>> aggregationProcessor = ProcessorFactory.createAggregationProcessor(/*query*/ this, queryDefinition.getAggregatorType());
|
||||
|
||||
@SuppressWarnings("unchecked") // TODO Clean, after the deprecated components have been removed
|
||||
Function<Double> extractionFunction = (Function<Double>) functionProvider.getFunctionForDTO(queryDefinition.getStatisticToCalculate());
|
||||
Processor<GroupedDataEntry<ElementType>> extractionProcessor = ProcessorFactory.createExtractionProcessor(aggregationProcessor, extractionFunction);
|
||||
|
||||
List<Function<?>> dimensionsToGroupBy = convertDTOsToFunctions(queryDefinition.getDimensionsToGroupBy(), functionProvider);
|
||||
Processor<ElementType> groupingProcessor = ProcessorFactory.createGroupingProcessor(extractionProcessor, dimensionsToGroupBy);
|
||||
|
||||
SailingDataRetrievalLevels dataRetrievalLevel = calculateDataRetrievalLevel(extractionFunction);
|
||||
Processor<RacingEventService> firstRetrievalProcessor = SailingDataRetrieverFactory.createRetrievalProcessorChain(dataRetrievalLevel, groupingProcessor, queryDefinition.getFilterSelection(), functionProvider);
|
||||
return firstRetrievalProcessor;
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Query<Set<Object>> createDimensionValuesQuery(RacingEventService dataSource, final Collection<FunctionDTO> dimensionDTOs, final FunctionProvider functionProvider) {
|
||||
return new ProcessorQuery<Set<Object>, RacingEventService>(DataMiningActivator.getExecutor(), dataSource) {
|
||||
@Override
|
||||
protected Processor<RacingEventService> createFirstProcessor() {
|
||||
Processor<GroupedDataEntry<Object>> valueCollector = ProcessorFactory.createGroupedDataCollectingAsSetProcessor(/*query*/ this);
|
||||
|
||||
Collection<Function<?>> dimensions = convertDTOsToFunctions(dimensionDTOs, functionProvider);
|
||||
Map<SailingDataRetrievalLevels, Collection<Function<?>>> dimensionsMappedByRetrievalLevel = mapFunctionsByRetrievalLevel(dimensions);
|
||||
SailingDataRetrievalLevels deepestRetrievalLevel = getDeepestRetrievalLevel(dimensionsMappedByRetrievalLevel.keySet());
|
||||
|
||||
Processor<?> retrievalProcessor = null;
|
||||
for (int i = deepestRetrievalLevel.ordinal(); i >= 0; i--) {
|
||||
SailingDataRetrievalLevels retrievalLevel = SailingDataRetrievalLevels.values()[i];
|
||||
|
||||
Collection<Function<?>> dimensionsForRetrievalLevel = dimensionsMappedByRetrievalLevel.containsKey(retrievalLevel) ? dimensionsMappedByRetrievalLevel.get(retrievalLevel) : new ArrayList<Function<?>>();
|
||||
Collection<Processor<?>> retrievalResultReceivers = ProcessorFactory.createGroupingExtractorsForDimensions(valueCollector, dimensionsForRetrievalLevel);
|
||||
if (retrievalProcessor != null) {
|
||||
retrievalResultReceivers.add(retrievalProcessor);
|
||||
}
|
||||
|
||||
retrievalProcessor = SailingDataRetrieverFactory.createRetrievalProcessorWithoutFilter(retrievalLevel, retrievalResultReceivers);
|
||||
}
|
||||
|
||||
// A retrieval processor created this way results always in a Processor<RacingEventService>
|
||||
return (Processor<RacingEventService>) retrievalProcessor;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private static List<Function<?>> convertDTOsToFunctions(Collection<FunctionDTO> functionDTOs, FunctionProvider functionProvider) {
|
||||
List<Function<?>> dimensionsToGroupBy = new ArrayList<>();
|
||||
for (FunctionDTO functionDTO : functionDTOs) {
|
||||
dimensionsToGroupBy.add(functionProvider.getFunctionForDTO(functionDTO));
|
||||
}
|
||||
return dimensionsToGroupBy;
|
||||
}
|
||||
|
||||
private static Map<SailingDataRetrievalLevels, Collection<Function<?>>> mapFunctionsByRetrievalLevel(Collection<Function<?>> functions) {
|
||||
Map<SailingDataRetrievalLevels, Collection<Function<?>>> mappedFunctions = new HashMap<>();
|
||||
for (Function<?> function : functions) {
|
||||
SailingDataRetrievalLevels retrievalLevel = calculateDataRetrievalLevel(function);
|
||||
if (!mappedFunctions.containsKey(retrievalLevel)) {
|
||||
mappedFunctions.put(retrievalLevel, new HashSet<Function<?>>());
|
||||
}
|
||||
mappedFunctions.get(retrievalLevel).add(function);
|
||||
}
|
||||
return mappedFunctions;
|
||||
}
|
||||
|
||||
private static SailingDataRetrievalLevels calculateDataRetrievalLevel(Function<?> function) {
|
||||
if (function.getDeclaringType().equals(HasTrackedRaceContext.class)) {
|
||||
return SailingDataRetrievalLevels.TrackedRace;
|
||||
}
|
||||
if (function.getDeclaringType().equals(HasTrackedLegContext.class)) {
|
||||
return SailingDataRetrievalLevels.TrackedLeg;
|
||||
}
|
||||
if (function.getDeclaringType().equals(HasTrackedLegOfCompetitorContext.class)) {
|
||||
return SailingDataRetrievalLevels.TrackedLegOfCompetitor;
|
||||
}
|
||||
if (function.getDeclaringType().equals(HasGPSFixContext.class)) {
|
||||
return SailingDataRetrievalLevels.GPSFix;
|
||||
}
|
||||
return SailingDataRetrievalLevels.GPSFix;
|
||||
}
|
||||
|
||||
private static SailingDataRetrievalLevels getDeepestRetrievalLevel(Collection<SailingDataRetrievalLevels> retrievalLevels) {
|
||||
return Collections.max(retrievalLevels);
|
||||
}
|
||||
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
package com.sap.sailing.datamining.factories;
|
||||
|
||||
public enum SailingDataRetrievalLevels {
|
||||
|
||||
LeaderboardGroup, RegattaLeaderboard, TrackedRace, TrackedLeg, TrackedLegOfCompetitor, GPSFix
|
||||
|
||||
}
|
||||
+141
@@ -0,0 +1,141 @@
|
||||
package com.sap.sailing.datamining.factories;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
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.GPSFixRetrievalProcessor;
|
||||
import com.sap.sailing.datamining.impl.components.LeaderboardGroupRetrievalProcessor;
|
||||
import com.sap.sailing.datamining.impl.components.RegattaLeaderboardFilteringRetrievalProcessor;
|
||||
import com.sap.sailing.datamining.impl.components.TrackedLegFilteringRetrievalProcessor;
|
||||
import com.sap.sailing.datamining.impl.components.TrackedLegOfCompetitorFilteringRetrievalProcessor;
|
||||
import com.sap.sailing.datamining.impl.components.TrackedRaceFilteringRetrievalProcessor;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
import com.sap.sse.datamining.functions.FunctionProvider;
|
||||
import com.sap.sse.datamining.impl.DataMiningActivator;
|
||||
import com.sap.sse.datamining.impl.criterias.AndCompoundFilterCriterion;
|
||||
import com.sap.sse.datamining.impl.criterias.CompoundFilterCriterion;
|
||||
import com.sap.sse.datamining.impl.criterias.NonFilteringFilterCriterion;
|
||||
import com.sap.sse.datamining.impl.criterias.NullaryFunctionValuesFilterCriterion;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
|
||||
public final class SailingDataRetrieverFactory {
|
||||
|
||||
private SailingDataRetrieverFactory() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the processor chain for the data retrieval and returns the first processor of the chain.
|
||||
* @param groupingProcessor The result receiver after the retrieval
|
||||
* @param filterSelection The filter functions and values for the filtration
|
||||
* @param functionProvider
|
||||
* @return The first processor of the retrieval chain.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <ElementType> Processor<RacingEventService> createRetrievalProcessorChain(SailingDataRetrievalLevels dataRetrievalLevel, Processor<ElementType> groupingProcessor, Map<FunctionDTO, Iterable<? extends Serializable>> filterSelection, FunctionProvider functionProvider) {
|
||||
Processor<?> resultReceiver = groupingProcessor;
|
||||
for (int i = dataRetrievalLevel.ordinal(); i >= 0; i--) {
|
||||
resultReceiver = createDataRetrieverFor(SailingDataRetrievalLevels.values()[i], resultReceiver, filterSelection, functionProvider);
|
||||
}
|
||||
return (Processor<RacingEventService>) resultReceiver;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
/* The way this method is used should guarantee, that the result receiver matches the new processor
|
||||
*/
|
||||
private static Processor<?> createDataRetrieverFor(SailingDataRetrievalLevels dataRetrievalLevel,
|
||||
Processor<?> resultReceiver, Map<FunctionDTO, Iterable<? extends Serializable>> filterSelection, FunctionProvider functionProvider) {
|
||||
ThreadPoolExecutor executor = DataMiningActivator.getExecutor();
|
||||
|
||||
switch (dataRetrievalLevel) {
|
||||
case GPSFix:
|
||||
Processor<HasGPSFixContext> gpsFixSpecificResultReceiver = (Processor<HasGPSFixContext>) resultReceiver;
|
||||
return new GPSFixRetrievalProcessor(executor, Arrays.asList(gpsFixSpecificResultReceiver));
|
||||
case LeaderboardGroup:
|
||||
Processor<LeaderboardGroup> leaderboardGroupSpecificResultReceiver = (Processor<LeaderboardGroup>) resultReceiver;
|
||||
return new LeaderboardGroupRetrievalProcessor(executor, Arrays.asList(leaderboardGroupSpecificResultReceiver));
|
||||
case RegattaLeaderboard:
|
||||
Processor<RegattaLeaderboard> regattaLeaderboardSpecificResultReceiver = (Processor<RegattaLeaderboard>) resultReceiver;
|
||||
return new RegattaLeaderboardFilteringRetrievalProcessor(executor, Arrays.asList(regattaLeaderboardSpecificResultReceiver), getFilterCriteriaForBaseDataType(RegattaLeaderboard.class, filterSelection, functionProvider));
|
||||
case TrackedLeg:
|
||||
Processor<HasTrackedLegContext> trackedLegSpecificResultReceiver = (Processor<HasTrackedLegContext>) resultReceiver;
|
||||
return new TrackedLegFilteringRetrievalProcessor(executor, Arrays.asList(trackedLegSpecificResultReceiver), getFilterCriteriaForBaseDataType(HasTrackedLegContext.class, filterSelection, functionProvider));
|
||||
case TrackedLegOfCompetitor:
|
||||
Processor<HasTrackedLegOfCompetitorContext> trackedLegOfCompetitorSpecificResultReceiver = (Processor<HasTrackedLegOfCompetitorContext>) resultReceiver;
|
||||
return new TrackedLegOfCompetitorFilteringRetrievalProcessor(executor, Arrays.asList(trackedLegOfCompetitorSpecificResultReceiver), getFilterCriteriaForBaseDataType(HasTrackedLegOfCompetitorContext.class, filterSelection, functionProvider));
|
||||
case TrackedRace:
|
||||
Processor<HasTrackedRaceContext> trackedRaceSpecificResultReceiver = (Processor<HasTrackedRaceContext>) resultReceiver;
|
||||
return new TrackedRaceFilteringRetrievalProcessor(executor, Arrays.asList(trackedRaceSpecificResultReceiver), getFilterCriteriaForBaseDataType(HasTrackedRaceContext.class, filterSelection, functionProvider));
|
||||
}
|
||||
throw new IllegalArgumentException("No data retriever implemented for the given data retrieval level '"
|
||||
+ dataRetrievalLevel + "'");
|
||||
}
|
||||
|
||||
private static <BaseDataType> FilterCriterion<BaseDataType> getFilterCriteriaForBaseDataType(Class<BaseDataType> baseDataType,
|
||||
Map<FunctionDTO, Iterable<? extends Serializable>> filterSelection, FunctionProvider functionProvider) {
|
||||
CompoundFilterCriterion<BaseDataType> criteria = null;
|
||||
for (Entry<FunctionDTO, Iterable<? extends Serializable>> filterSelectionEntry : filterSelection.entrySet()) {
|
||||
Function<?> function = functionProvider.getFunctionForDTO(filterSelectionEntry.getKey());
|
||||
if (baseDataType.equals(function.getDeclaringType())) {
|
||||
if (criteria == null) {
|
||||
criteria = new AndCompoundFilterCriterion<>();
|
||||
}
|
||||
|
||||
Collection<Object> filterValues = new ArrayList<>();
|
||||
for (Object filterValue : filterSelectionEntry.getValue()) {
|
||||
filterValues.add(filterValue);
|
||||
}
|
||||
criteria.addCriteria(new NullaryFunctionValuesFilterCriterion<BaseDataType>(function, filterValues));
|
||||
}
|
||||
}
|
||||
return criteria != null ? criteria : new NonFilteringFilterCriterion<BaseDataType>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a retrieval processor without filter for the given retrieval level and result receivers.<br>
|
||||
* The input type of the result receivers has to match the result type of the created retrieval processor for the given retrievel level or a {@link ClassCastException} can be thrown.
|
||||
* For example, if the retrieval Level is {@link SailingDataRetrievalLevels#TrackedRace} the input must be {@link HasTrackedRaceContext}.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Processor<?> createRetrievalProcessorWithoutFilter(SailingDataRetrievalLevels retrievalLevel,
|
||||
Collection<Processor<?>> retrievalResultReceivers) throws ClassCastException {
|
||||
ThreadPoolExecutor executor = DataMiningActivator.getExecutor();
|
||||
|
||||
switch (retrievalLevel) {
|
||||
case GPSFix:
|
||||
Collection<Processor<HasGPSFixContext>> gpsFixSpecificResultReceivers = (Collection<Processor<HasGPSFixContext>>)(Collection<?>) retrievalResultReceivers;
|
||||
return new GPSFixRetrievalProcessor(executor, gpsFixSpecificResultReceivers);
|
||||
case LeaderboardGroup:
|
||||
Collection<Processor<LeaderboardGroup>> leaderboardGroupSpecificResultReceivers = (Collection<Processor<LeaderboardGroup>>)(Collection<?>) retrievalResultReceivers;
|
||||
return new LeaderboardGroupRetrievalProcessor(executor, leaderboardGroupSpecificResultReceivers);
|
||||
case RegattaLeaderboard:
|
||||
Collection<Processor<RegattaLeaderboard>> regattaLeaderboardSpecificResultReceivers = (Collection<Processor<RegattaLeaderboard>>)(Collection<?>) retrievalResultReceivers;
|
||||
return new RegattaLeaderboardFilteringRetrievalProcessor(executor, regattaLeaderboardSpecificResultReceivers, new NonFilteringFilterCriterion<RegattaLeaderboard>());
|
||||
case TrackedLeg:
|
||||
Collection<Processor<HasTrackedLegContext>> trackedLegSpecificResultReceivers = (Collection<Processor<HasTrackedLegContext>>)(Collection<?>) retrievalResultReceivers;
|
||||
return new TrackedLegFilteringRetrievalProcessor(executor, trackedLegSpecificResultReceivers, new NonFilteringFilterCriterion<HasTrackedLegContext>());
|
||||
case TrackedLegOfCompetitor:
|
||||
Collection<Processor<HasTrackedLegOfCompetitorContext>> trackedLegOfCompetitorSpecificResultReceivers = (Collection<Processor<HasTrackedLegOfCompetitorContext>>)(Collection<?>) retrievalResultReceivers;
|
||||
return new TrackedLegOfCompetitorFilteringRetrievalProcessor(executor, trackedLegOfCompetitorSpecificResultReceivers, new NonFilteringFilterCriterion<HasTrackedLegOfCompetitorContext>());
|
||||
case TrackedRace:
|
||||
Collection<Processor<HasTrackedRaceContext>> trackedRaceSpecificResultReceivers = (Collection<Processor<HasTrackedRaceContext>>)(Collection<?>) retrievalResultReceivers;
|
||||
return new TrackedRaceFilteringRetrievalProcessor(executor, trackedRaceSpecificResultReceivers, new NonFilteringFilterCriterion<HasTrackedRaceContext>());
|
||||
}
|
||||
throw new IllegalArgumentException("No data retriever implemented for the given data retrieval level '"
|
||||
+ retrievalLevel + "'");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl;
|
||||
|
||||
import org.osgi.framework.BundleActivator;
|
||||
import org.osgi.framework.BundleContext;
|
||||
import org.osgi.framework.ServiceRegistration;
|
||||
|
||||
import com.sap.sailing.datamining.impl.data.DataMiningClassesWithFunctionsService;
|
||||
import com.sap.sse.datamining.functions.ClassesWithFunctionsService;
|
||||
|
||||
public class Activator implements BundleActivator {
|
||||
|
||||
private static BundleContext context;
|
||||
|
||||
private ServiceRegistration<ClassesWithFunctionsService> classesWithFunctionsServiceReference;
|
||||
|
||||
@Override
|
||||
public void start(BundleContext context) throws Exception {
|
||||
Activator.context = context;
|
||||
registerClassesWithFunctionsService();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop(BundleContext context) throws Exception {
|
||||
unregisterClassesWithFunctionsService();
|
||||
}
|
||||
|
||||
private void unregisterClassesWithFunctionsService() {
|
||||
context.ungetService(classesWithFunctionsServiceReference.getReference());
|
||||
}
|
||||
|
||||
private void registerClassesWithFunctionsService() {
|
||||
classesWithFunctionsServiceReference = context.registerService(ClassesWithFunctionsService.class,
|
||||
new DataMiningClassesWithFunctionsService(), null);
|
||||
}
|
||||
|
||||
}
|
||||
-13
@@ -1,13 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl;
|
||||
|
||||
|
||||
import com.sap.sailing.datamining.WindStrengthCluster;
|
||||
import com.sap.sse.datamining.impl.data.deprecated.ClusterOfComparableImpl;
|
||||
|
||||
public class WindStrengthClusterImpl extends ClusterOfComparableImpl<Double> implements WindStrengthCluster {
|
||||
|
||||
public WindStrengthClusterImpl(String name, Double lowerRangeInBeaufort, Double upperRangeInBeaufort) {
|
||||
super(name, upperRangeInBeaufort, lowerRangeInBeaufort);
|
||||
}
|
||||
|
||||
}
|
||||
-82
@@ -1,82 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.components;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.impl.data.HasTrackedLegContextImpl;
|
||||
import com.sap.sailing.datamining.impl.data.HasTrackedLegOfCompetitorContextImpl;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.CourseArea;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.base.Leg;
|
||||
import com.sap.sailing.domain.base.RaceColumn;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.datamining.impl.workers.retrievers.AbstractRetrievalWorker;
|
||||
import com.sap.sse.datamining.workers.DataRetrievalWorker;
|
||||
|
||||
public abstract class AbstractLeaderboardGroupDataRetrievalWorker<DataType>
|
||||
extends AbstractRetrievalWorker<Collection<DataType>>
|
||||
implements DataRetrievalWorker<LeaderboardGroup, DataType> {
|
||||
|
||||
private LeaderboardGroup group;
|
||||
|
||||
@Override
|
||||
public void setSource(LeaderboardGroup source) {
|
||||
this.group = source;
|
||||
}
|
||||
|
||||
protected LeaderboardGroup getGroup() {
|
||||
return group;
|
||||
}
|
||||
|
||||
private static Collection<Util.Pair<TrackedLeg, HasTrackedLegContext>> retrieveDataTillTrackedLeg(LeaderboardGroup group) {
|
||||
Collection<Util.Pair<TrackedLeg, HasTrackedLegContext>> data = new ArrayList<Util.Pair<TrackedLeg, HasTrackedLegContext>>();
|
||||
for (Leaderboard leaderboard : group.getLeaderboards()) {
|
||||
CourseArea courseArea = leaderboard.getDefaultCourseArea();
|
||||
for (RaceColumn raceColumn : leaderboard.getRaceColumns()) {
|
||||
for (Fleet fleet : raceColumn.getFleets()) {
|
||||
TrackedRace trackedRace = raceColumn.getTrackedRace(fleet);
|
||||
if (trackedRace != null) {
|
||||
int legNumber = 1;
|
||||
for (Leg leg : trackedRace.getRace().getCourse().getLegs()) {
|
||||
TrackedLeg trackedLeg = trackedRace.getTrackedLeg(leg);
|
||||
if (trackedLeg != null) {
|
||||
HasTrackedLegContext dataContext = new HasTrackedLegContextImpl(group, leaderboard,
|
||||
courseArea, fleet, trackedRace, trackedLeg, legNumber);
|
||||
data.add(new Util.Pair<TrackedLeg, HasTrackedLegContext>(trackedLeg, dataContext));
|
||||
legNumber++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
protected static Collection<Util.Pair<TrackedLegOfCompetitor, HasTrackedLegOfCompetitorContext>> retrieveDataTillTrackedLegOfCompetitor(
|
||||
LeaderboardGroup group) {
|
||||
Collection<Util.Pair<TrackedLegOfCompetitor, HasTrackedLegOfCompetitorContext>> data = new ArrayList<Util.Pair<TrackedLegOfCompetitor, HasTrackedLegOfCompetitorContext>>();
|
||||
Collection<Util.Pair<TrackedLeg, HasTrackedLegContext>> baseData = retrieveDataTillTrackedLeg(group);
|
||||
for (Util.Pair<TrackedLeg, HasTrackedLegContext> baseDataEntry : baseData) {
|
||||
TrackedLeg trackedLeg = baseDataEntry.getA();
|
||||
HasTrackedLegContext trackedLegContext = baseDataEntry.getB();
|
||||
for (Competitor competitor : trackedLegContext.getTrackedRace().getRace().getCompetitors()) {
|
||||
TrackedLegOfCompetitor trackedLegOfCompetitor = trackedLeg.getTrackedLeg(competitor);
|
||||
HasTrackedLegOfCompetitorContext dataContext = new HasTrackedLegOfCompetitorContextImpl(trackedLegContext,
|
||||
competitor);
|
||||
data.add(new Util.Pair<TrackedLegOfCompetitor, HasTrackedLegOfCompetitorContext>(trackedLegOfCompetitor,
|
||||
dataContext));
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
package com.sap.sailing.datamining.impl.components;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import com.sap.sailing.datamining.Activator;
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.impl.data.GPSFixWithContext;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleRetrievalProcessor;
|
||||
import com.sap.sse.datamining.shared.annotations.DataRetriever;
|
||||
|
||||
@DataRetriever(dataType=HasGPSFixContext.class,
|
||||
groupName=Activator.dataRetrieverGroupName,
|
||||
level=5)
|
||||
public class GPSFixRetrievalProcessor extends AbstractSimpleRetrievalProcessor<HasTrackedLegOfCompetitorContext, HasGPSFixContext> {
|
||||
|
||||
public GPSFixRetrievalProcessor(ExecutorService executor, Collection<Processor<HasGPSFixContext>> resultReceivers) {
|
||||
super(executor, resultReceivers);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<HasGPSFixContext> retrieveData(HasTrackedLegOfCompetitorContext element) {
|
||||
Collection<HasGPSFixContext> gpsFixesWithContext = new ArrayList<>();
|
||||
GPSFixTrack<Competitor, GPSFixMoving> competitorTrack = element.getTrackedRace().getTrack(element.getCompetitor());
|
||||
competitorTrack.lockForRead();
|
||||
try {
|
||||
TrackedLegOfCompetitor trackedLegOfCompetitor = element.getTrackedLegOfCompetitor();
|
||||
if (trackedLegOfCompetitor.getStartTime() != null && trackedLegOfCompetitor.getFinishTime() != null) {
|
||||
for (GPSFixMoving gpsFix : competitorTrack.getFixes(trackedLegOfCompetitor.getStartTime(), true, trackedLegOfCompetitor.getFinishTime(), true)) {
|
||||
HasGPSFixContext gpsFixWithContext = new GPSFixWithContext(element, gpsFix);
|
||||
gpsFixesWithContext.add(gpsFixWithContext);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
competitorTrack.unlockAfterRead();
|
||||
}
|
||||
return gpsFixesWithContext;
|
||||
}
|
||||
|
||||
}
|
||||
-54
@@ -1,54 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.components;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sse.datamining.components.ParallelDataRetriever;
|
||||
import com.sap.sse.datamining.impl.components.deprecated.AbstractParallelComponent;
|
||||
import com.sap.sse.datamining.workers.DataRetrievalWorker;
|
||||
import com.sap.sse.datamining.workers.WorkerBuilder;
|
||||
|
||||
/**
|
||||
* Retrieves elements of type <code>DataType</code> from all {@link LeaderboardGroup}s known to the
|
||||
* {@link RacingEventSErvice} passed to this object's constructor. See also
|
||||
* {@link RacingEventService#getLeaderboardGroups()}.
|
||||
*
|
||||
* @param <DataType>
|
||||
*/
|
||||
public class GroupDividingParallelDataRetriever<DataType> extends AbstractParallelComponent<Void, Collection<DataType>>
|
||||
implements ParallelDataRetriever<DataType> {
|
||||
|
||||
private RacingEventService racingService;
|
||||
private WorkerBuilder<DataRetrievalWorker<LeaderboardGroup, DataType>> workerBuilder;
|
||||
|
||||
public GroupDividingParallelDataRetriever(RacingEventService racingService, WorkerBuilder<DataRetrievalWorker<LeaderboardGroup, DataType>> workerBuilder, ThreadPoolExecutor executor) {
|
||||
super(executor);
|
||||
this.racingService = racingService;
|
||||
this.workerBuilder = workerBuilder;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setUpWorkersFor(Void v) {
|
||||
for (LeaderboardGroup group : racingService.getLeaderboardGroups().values()) {
|
||||
DataRetrievalWorker<LeaderboardGroup, DataType> worker = workerBuilder.build();
|
||||
worker.setReceiver(this);
|
||||
worker.setSource(group);
|
||||
addWorker(worker);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Collection<DataType> finalizeData() {
|
||||
Collection<DataType> data = new ArrayList<DataType>();
|
||||
for (Collection<DataType> results : getResults()) {
|
||||
data.addAll(results);
|
||||
}
|
||||
return Collections.unmodifiableCollection(new CopyOnWriteArrayList<DataType>(data));
|
||||
}
|
||||
|
||||
}
|
||||
-25
@@ -1,25 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.components;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sse.datamining.components.FilterCriteria;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractFilteringRetrievalProcessor;
|
||||
|
||||
public class LeaderboardGroupFilteringRetrievalProcessor extends
|
||||
AbstractFilteringRetrievalProcessor<RacingEventService, LeaderboardGroup> {
|
||||
|
||||
public LeaderboardGroupFilteringRetrievalProcessor(ExecutorService executor,
|
||||
Collection<Processor<LeaderboardGroup>> resultReceivers, FilterCriteria<LeaderboardGroup> criteria) {
|
||||
super(executor, resultReceivers, criteria);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<LeaderboardGroup> retrieveData(RacingEventService element) {
|
||||
return element.getLeaderboardGroups().values();
|
||||
}
|
||||
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
package com.sap.sailing.datamining.impl.components;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import com.sap.sailing.datamining.Activator;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleRetrievalProcessor;
|
||||
import com.sap.sse.datamining.shared.annotations.DataRetriever;
|
||||
|
||||
@DataRetriever(dataType=LeaderboardGroup.class,
|
||||
groupName=Activator.dataRetrieverGroupName,
|
||||
level=0)
|
||||
public class LeaderboardGroupRetrievalProcessor extends
|
||||
AbstractSimpleRetrievalProcessor<RacingEventService, LeaderboardGroup> {
|
||||
|
||||
public LeaderboardGroupRetrievalProcessor(ExecutorService executor,
|
||||
Collection<Processor<LeaderboardGroup>> resultReceivers) {
|
||||
super(executor, resultReceivers);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<LeaderboardGroup> retrieveData(RacingEventService element) {
|
||||
return element.getLeaderboardGroups().values();
|
||||
}
|
||||
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
package com.sap.sailing.datamining.impl.components;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import com.sap.sailing.datamining.Activator;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleFilteringRetrievalProcessor;
|
||||
import com.sap.sse.datamining.shared.annotations.DataRetriever;
|
||||
|
||||
@DataRetriever(dataType=RegattaLeaderboard.class,
|
||||
groupName=Activator.dataRetrieverGroupName,
|
||||
level=1)
|
||||
public class RegattaLeaderboardFilteringRetrievalProcessor extends
|
||||
AbstractSimpleFilteringRetrievalProcessor<LeaderboardGroup, RegattaLeaderboard> {
|
||||
|
||||
public RegattaLeaderboardFilteringRetrievalProcessor(ExecutorService executor,
|
||||
Collection<Processor<RegattaLeaderboard>> resultReceivers, FilterCriterion<RegattaLeaderboard> criteria) {
|
||||
super(executor, resultReceivers, criteria);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<RegattaLeaderboard> retrieveData(LeaderboardGroup element) {
|
||||
Collection<RegattaLeaderboard> regattaLeaderboards = new ArrayList<>();
|
||||
for (Leaderboard leaderboard : element.getLeaderboards()) {
|
||||
if (leaderboard instanceof RegattaLeaderboard) {
|
||||
regattaLeaderboards.add((RegattaLeaderboard) leaderboard);
|
||||
}
|
||||
}
|
||||
return regattaLeaderboards;
|
||||
}
|
||||
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
package com.sap.sailing.datamining.impl.components;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import com.sap.sailing.datamining.Activator;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
|
||||
import com.sap.sailing.datamining.impl.data.TrackedLegWithContext;
|
||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleFilteringRetrievalProcessor;
|
||||
import com.sap.sse.datamining.shared.annotations.DataRetriever;
|
||||
|
||||
@DataRetriever(dataType=HasTrackedLegContext.class,
|
||||
groupName=Activator.dataRetrieverGroupName,
|
||||
level=3)
|
||||
public class TrackedLegFilteringRetrievalProcessor extends
|
||||
AbstractSimpleFilteringRetrievalProcessor<HasTrackedRaceContext, HasTrackedLegContext> {
|
||||
|
||||
public TrackedLegFilteringRetrievalProcessor(ExecutorService executor,
|
||||
Collection<Processor<HasTrackedLegContext>> resultReceivers, FilterCriterion<HasTrackedLegContext> criteria) {
|
||||
super(executor, resultReceivers, criteria);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<HasTrackedLegContext> retrieveData(HasTrackedRaceContext element) {
|
||||
Collection<HasTrackedLegContext> trackedLegsWithContext = new ArrayList<>();
|
||||
int legNumber = 1;
|
||||
for (TrackedLeg trackedLeg : element.getTrackedRace().getTrackedLegs()) {
|
||||
HasTrackedLegContext trackedLegWithContext = new TrackedLegWithContext(element, trackedLeg, legNumber);
|
||||
trackedLegsWithContext.add(trackedLegWithContext);
|
||||
legNumber++;
|
||||
}
|
||||
return trackedLegsWithContext;
|
||||
}
|
||||
|
||||
}
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
package com.sap.sailing.datamining.impl.components;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import com.sap.sailing.datamining.Activator;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.impl.data.TrackedLegOfCompetitorWithContext;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleFilteringRetrievalProcessor;
|
||||
import com.sap.sse.datamining.shared.annotations.DataRetriever;
|
||||
|
||||
@DataRetriever(dataType=HasTrackedLegOfCompetitorContext.class,
|
||||
groupName=Activator.dataRetrieverGroupName,
|
||||
level=4)
|
||||
public class TrackedLegOfCompetitorFilteringRetrievalProcessor extends
|
||||
AbstractSimpleFilteringRetrievalProcessor<HasTrackedLegContext, HasTrackedLegOfCompetitorContext> {
|
||||
|
||||
public TrackedLegOfCompetitorFilteringRetrievalProcessor(ExecutorService executor,
|
||||
Collection<Processor<HasTrackedLegOfCompetitorContext>> resultReceivers,
|
||||
FilterCriterion<HasTrackedLegOfCompetitorContext> criteria) {
|
||||
super(executor, resultReceivers, criteria);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<HasTrackedLegOfCompetitorContext> retrieveData(HasTrackedLegContext element) {
|
||||
Collection<HasTrackedLegOfCompetitorContext> trackedLegOfCompetitorsWithContext = new ArrayList<>();
|
||||
for (Competitor competitor : element.getRace().getCompetitors()) {
|
||||
HasTrackedLegOfCompetitorContext trackedLegOfCompetitorWithContext = new TrackedLegOfCompetitorWithContext(element, element.getTrackedLeg().getTrackedLeg(competitor));
|
||||
trackedLegOfCompetitorsWithContext.add(trackedLegOfCompetitorWithContext);
|
||||
}
|
||||
return trackedLegOfCompetitorsWithContext;
|
||||
}
|
||||
|
||||
}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
package com.sap.sailing.datamining.impl.components;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
|
||||
import com.sap.sailing.datamining.impl.data.TrackedRaceWithContext;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.base.RaceColumn;
|
||||
import com.sap.sailing.domain.base.Regatta;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sse.datamining.components.FilterCriterion;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.impl.components.AbstractSimpleFilteringRetrievalProcessor;
|
||||
import com.sap.sse.datamining.shared.annotations.DataRetriever;
|
||||
|
||||
@DataRetriever(dataType=HasTrackedRaceContext.class,
|
||||
groupName="Sailing",
|
||||
level=2)
|
||||
public class TrackedRaceFilteringRetrievalProcessor extends
|
||||
AbstractSimpleFilteringRetrievalProcessor<Leaderboard, HasTrackedRaceContext> {
|
||||
|
||||
public TrackedRaceFilteringRetrievalProcessor(ExecutorService executor,
|
||||
Collection<Processor<HasTrackedRaceContext>> resultReceivers, FilterCriterion<HasTrackedRaceContext> criteria) {
|
||||
super(executor, resultReceivers, criteria);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<HasTrackedRaceContext> retrieveData(Leaderboard element) {
|
||||
Collection<HasTrackedRaceContext> trackedRacesWithContext = new ArrayList<>();
|
||||
for (RaceColumn raceColumn : element.getRaceColumns()) {
|
||||
for (Fleet fleet : raceColumn.getFleets()) {
|
||||
TrackedRace trackedRace = raceColumn.getTrackedRace(fleet);
|
||||
if (trackedRace != null) {
|
||||
Regatta regatta = trackedRace.getTrackedRegatta().getRegatta();
|
||||
HasTrackedRaceContext trackedRaceWithContext = new TrackedRaceWithContext(regatta, fleet, trackedRace);
|
||||
trackedRacesWithContext.add(trackedRaceWithContext);
|
||||
}
|
||||
}
|
||||
}
|
||||
return trackedRacesWithContext;
|
||||
}
|
||||
|
||||
}
|
||||
-35
@@ -1,35 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
|
||||
import com.sap.sailing.datamining.data.GPSFixWithContext;
|
||||
import com.sap.sailing.datamining.data.TrackedLegOfCompetitorWithContext;
|
||||
import com.sap.sse.datamining.functions.ClassesWithFunctionsService;
|
||||
|
||||
public class DataMiningClassesWithFunctionsService implements ClassesWithFunctionsService {
|
||||
|
||||
@Override
|
||||
public boolean hasInternalClassesWithMarkedMethods() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Class<?>> getInternalClassesWithMarkedMethods() {
|
||||
Collection<Class<?>> internalClasses = new HashSet<>();
|
||||
internalClasses.add(GPSFixWithContext.class);
|
||||
internalClasses.add(TrackedLegOfCompetitorWithContext.class);
|
||||
return internalClasses;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasExternalLibraryClasses() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Class<?>> getExternalLibraryClasses() {
|
||||
return new HashSet<>();
|
||||
}
|
||||
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.base.Regatta;
|
||||
import com.sap.sailing.domain.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
|
||||
public class GPSFixWithContext extends TrackedLegOfCompetitorWithContext implements HasGPSFixContext {
|
||||
|
||||
private final GPSFixMoving gpsFix;
|
||||
|
||||
public GPSFixWithContext(HasTrackedLegOfCompetitorContext legContext, GPSFixMoving gpsFix) {
|
||||
this(legContext.getRegatta(), legContext.getFleet(), legContext.getTrackedRace(),
|
||||
legContext.getTrackedLeg(), legContext.getLegNumber(), legContext.getTrackedLegOfCompetitor(), gpsFix);
|
||||
}
|
||||
|
||||
public GPSFixWithContext(Regatta regatta, Fleet fleet, TrackedRace trackedRace,
|
||||
TrackedLeg trackedLeg, int legNumber, TrackedLegOfCompetitor trackedLegOfCompetitor, GPSFixMoving gpsFix) {
|
||||
super(regatta, fleet, trackedRace, trackedLeg, legNumber, trackedLegOfCompetitor);
|
||||
this.gpsFix = gpsFix;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GPSFixMoving getGPSFix() {
|
||||
return gpsFix;
|
||||
}
|
||||
|
||||
}
|
||||
-26
@@ -1,26 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.CourseArea;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
|
||||
public class HasGPSFixContextImpl extends HasTrackedLegOfCompetitorContextImpl implements HasGPSFixContext {
|
||||
|
||||
public HasGPSFixContextImpl(LeaderboardGroup leaderboardGroup, Leaderboard leaderboard, CourseArea courseArea,
|
||||
Fleet fleet, TrackedRace trackedRace, TrackedLeg trackedLeg, int legNumber, Competitor competitor) {
|
||||
super(leaderboardGroup, leaderboard, courseArea, fleet, trackedRace, trackedLeg, legNumber, competitor);
|
||||
}
|
||||
|
||||
public HasGPSFixContextImpl(HasTrackedLegOfCompetitorContext baseContext) {
|
||||
this(baseContext.getLeaderboardGroup(), baseContext.getLeaderboard(), baseContext.getCourseArea(), baseContext.getFleet(),
|
||||
baseContext.getTrackedRace(), baseContext.getTrackedLeg(), baseContext.getLegNumber(),
|
||||
baseContext.getCompetitor());
|
||||
}
|
||||
|
||||
}
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasLeaderboardContext;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
|
||||
public class HasLeaderboardContextImpl extends HasLeaderboardGroupContextImpl implements HasLeaderboardContext {
|
||||
|
||||
private final Leaderboard leaderboard;
|
||||
|
||||
public HasLeaderboardContextImpl(LeaderboardGroup leaderboardGroup, Leaderboard leaderboard) {
|
||||
super(leaderboardGroup);
|
||||
this.leaderboard = leaderboard;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Leaderboard getLeaderboard() {
|
||||
return leaderboard;
|
||||
}
|
||||
|
||||
}
|
||||
-19
@@ -1,19 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasLeaderboardGroupContext;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
|
||||
public class HasLeaderboardGroupContextImpl implements HasLeaderboardGroupContext {
|
||||
|
||||
private final LeaderboardGroup leaderboardGroup;
|
||||
|
||||
public HasLeaderboardGroupContextImpl(LeaderboardGroup leaderboardGroup) {
|
||||
this.leaderboardGroup = leaderboardGroup;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LeaderboardGroup getLeaderboardGroup() {
|
||||
return leaderboardGroup;
|
||||
}
|
||||
|
||||
}
|
||||
-34
@@ -1,34 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.CourseArea;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
|
||||
public class HasTrackedLegOfCompetitorContextImpl extends HasTrackedLegContextImpl implements HasTrackedLegOfCompetitorContext {
|
||||
|
||||
private final Competitor competitor;
|
||||
|
||||
public HasTrackedLegOfCompetitorContextImpl(LeaderboardGroup leaderboardGroup, Leaderboard leaderboard,
|
||||
CourseArea courseArea, Fleet fleet, TrackedRace trackedRace, TrackedLeg trackedLeg, int legNumber, Competitor competitor) {
|
||||
super(leaderboardGroup, leaderboard, courseArea, fleet, trackedRace, trackedLeg, legNumber);
|
||||
this.competitor = competitor;
|
||||
}
|
||||
|
||||
public HasTrackedLegOfCompetitorContextImpl(HasTrackedLegContext trackedLegContext, Competitor competitor) {
|
||||
this(trackedLegContext.getLeaderboardGroup(), trackedLegContext.getLeaderboard(), trackedLegContext.getCourseArea(),
|
||||
trackedLegContext.getFleet(), trackedLegContext.getTrackedRace(), trackedLegContext.getTrackedLeg(), trackedLegContext.getLegNumber(),
|
||||
competitor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Competitor getCompetitor() {
|
||||
return competitor;
|
||||
}
|
||||
|
||||
}
|
||||
-69
@@ -1,69 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import java.util.Calendar;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasLeaderboardContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
|
||||
import com.sap.sailing.domain.base.CourseArea;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
|
||||
public class HasTrackedRaceContextImpl extends HasLeaderboardContextImpl implements HasTrackedRaceContext {
|
||||
|
||||
private final CourseArea courseArea;
|
||||
private final Fleet fleet;
|
||||
private final TrackedRace trackedRace;
|
||||
private Integer year;
|
||||
private boolean yearHasBeenInitialized;
|
||||
|
||||
public HasTrackedRaceContextImpl(HasLeaderboardContext leaderboardContext, CourseArea courseArea, Fleet fleet,
|
||||
TrackedRace trackedRace) {
|
||||
this(leaderboardContext.getLeaderboardGroup(), leaderboardContext.getLeaderboard(), courseArea, fleet, trackedRace);
|
||||
}
|
||||
|
||||
public HasTrackedRaceContextImpl(LeaderboardGroup leaderboardGroup, Leaderboard leaderboard, CourseArea courseArea,
|
||||
Fleet fleet, TrackedRace trackedRace) {
|
||||
super(leaderboardGroup, leaderboard);
|
||||
this.courseArea = courseArea;
|
||||
this.fleet = fleet;
|
||||
this.trackedRace = trackedRace;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CourseArea getCourseArea() {
|
||||
return courseArea;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Fleet getFleet() {
|
||||
return fleet;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TrackedRace getTrackedRace() {
|
||||
return trackedRace;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getYear() {
|
||||
if (!yearHasBeenInitialized) {
|
||||
initializeYear();
|
||||
}
|
||||
return year;
|
||||
}
|
||||
|
||||
private void initializeYear() {
|
||||
TimePoint time = getTrackedRace().getStartOfRace() != null ? getTrackedRace().getStartOfRace() : getTrackedRace().getStartOfTracking();
|
||||
if (time == null) {
|
||||
year = 0;
|
||||
}
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
calendar.setTime(time.asDate());
|
||||
year = calendar.get(Calendar.YEAR);
|
||||
yearHasBeenInitialized = true;
|
||||
}
|
||||
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
import com.sap.sse.datamining.ClassesWithFunctionsService;
|
||||
|
||||
public class SailingDataMiningClassesWithFunctionsService implements ClassesWithFunctionsService {
|
||||
|
||||
@Override
|
||||
public Set<Class<?>> getInternalClassesWithMarkedMethods() {
|
||||
Set<Class<?>> internalClasses = new HashSet<>();
|
||||
/*
|
||||
* This also contains the marked methods of
|
||||
* HasTrackedRaceContext,
|
||||
* HasTrackedLegContext and
|
||||
* HasTrackedLegOfCompetitorContext,
|
||||
* because these are the super types of HasGPSFixContext.
|
||||
*/
|
||||
internalClasses.add(HasGPSFixContext.class);
|
||||
return internalClasses;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Class<?>> getExternalLibraryClasses() {
|
||||
return new HashSet<>();
|
||||
}
|
||||
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.base.Regatta;
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
|
||||
public class TrackedLegOfCompetitorWithContext extends TrackedLegWithContext implements HasTrackedLegOfCompetitorContext {
|
||||
|
||||
private final TrackedLegOfCompetitor trackedLegOfCompetitor;
|
||||
private final Competitor competitor;
|
||||
|
||||
public TrackedLegOfCompetitorWithContext(HasTrackedLegContext trackedLegContext, TrackedLegOfCompetitor trackedLegOfCompetitor) {
|
||||
this(trackedLegContext.getRegatta(), trackedLegContext.getFleet(),
|
||||
trackedLegContext.getTrackedRace(), trackedLegContext.getTrackedLeg(),
|
||||
trackedLegContext.getLegNumber(), trackedLegOfCompetitor);
|
||||
}
|
||||
|
||||
public TrackedLegOfCompetitorWithContext(Regatta regatta, Fleet fleet, TrackedRace trackedRace,
|
||||
TrackedLeg trackedLeg, int legNumber, TrackedLegOfCompetitor trackedLegOfCompetitor) {
|
||||
super(regatta, fleet, trackedRace, trackedLeg, legNumber);
|
||||
this.trackedLegOfCompetitor = trackedLegOfCompetitor;
|
||||
this.competitor = trackedLegOfCompetitor.getCompetitor();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TrackedLegOfCompetitor getTrackedLegOfCompetitor() {
|
||||
return trackedLegOfCompetitor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Competitor getCompetitor() {
|
||||
return competitor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getDistanceTraveled() {
|
||||
TimePoint timePoint = getTrackedRace().getEndOfTracking();
|
||||
return getTrackedLegOfCompetitor().getDistanceTraveled(timePoint).getMeters();
|
||||
}
|
||||
|
||||
}
|
||||
+7
-11
@@ -2,34 +2,30 @@ package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
|
||||
import com.sap.sailing.domain.base.CourseArea;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.base.Regatta;
|
||||
import com.sap.sailing.domain.common.LegType;
|
||||
import com.sap.sailing.domain.common.NoWindException;
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
|
||||
public class HasTrackedLegContextImpl extends HasTrackedRaceContextImpl implements HasTrackedLegContext {
|
||||
public class TrackedLegWithContext extends TrackedRaceWithContext implements HasTrackedLegContext {
|
||||
|
||||
private final TrackedLeg trackedLeg;
|
||||
private final int legNumber;
|
||||
private LegType legType;
|
||||
private boolean legTypeHasBeenInitialized;
|
||||
|
||||
public HasTrackedLegContextImpl(HasTrackedRaceContext trackedRaceContext, TrackedLeg trackedLeg, int legNumber) {
|
||||
this(trackedRaceContext.getLeaderboardGroup(), trackedRaceContext.getLeaderboard(), trackedRaceContext
|
||||
.getCourseArea(), trackedRaceContext.getFleet(), trackedRaceContext.getTrackedRace(), trackedLeg,
|
||||
legNumber);
|
||||
public TrackedLegWithContext(HasTrackedRaceContext trackedRaceContext, TrackedLeg trackedLeg, int legNumber) {
|
||||
this(trackedRaceContext.getRegatta(), trackedRaceContext.getFleet(),
|
||||
trackedRaceContext.getTrackedRace(), trackedLeg, legNumber);
|
||||
}
|
||||
|
||||
public HasTrackedLegContextImpl(LeaderboardGroup leaderboardGroup, Leaderboard leaderboard, CourseArea courseArea, Fleet fleet,
|
||||
TrackedRace trackedRace, TrackedLeg trackedLeg, int legNumber) {
|
||||
super(leaderboardGroup, leaderboard, courseArea, fleet, trackedRace);
|
||||
public TrackedLegWithContext(Regatta regatta, Fleet fleet, TrackedRace trackedRace, TrackedLeg trackedLeg, int legNumber) {
|
||||
super(regatta, fleet, trackedRace);
|
||||
this.trackedLeg = trackedLeg;
|
||||
this.legNumber = legNumber;
|
||||
}
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import java.util.Calendar;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
|
||||
import com.sap.sailing.domain.base.BoatClass;
|
||||
import com.sap.sailing.domain.base.CourseArea;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.base.RaceDefinition;
|
||||
import com.sap.sailing.domain.base.Regatta;
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
|
||||
public class TrackedRaceWithContext implements HasTrackedRaceContext {
|
||||
|
||||
private final Regatta regatta;
|
||||
private final Fleet fleet;
|
||||
private final TrackedRace trackedRace;
|
||||
private Integer year;
|
||||
private boolean yearHasBeenInitialized;
|
||||
|
||||
public TrackedRaceWithContext(Regatta regatta, Fleet fleet, TrackedRace trackedRace) {
|
||||
this.regatta = regatta;
|
||||
this.fleet = fleet;
|
||||
this.trackedRace = trackedRace;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Regatta getRegatta() {
|
||||
return regatta;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CourseArea getCourseArea() {
|
||||
return getRegatta().getDefaultCourseArea();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BoatClass getBoatClass() {
|
||||
return getRegatta().getBoatClass();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TrackedRace getTrackedRace() {
|
||||
return trackedRace;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Fleet getFleet() {
|
||||
return fleet;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RaceDefinition getRace() {
|
||||
return getTrackedRace().getRace();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getYear() {
|
||||
if (!yearHasBeenInitialized) {
|
||||
year = calculateYear();
|
||||
yearHasBeenInitialized = true;
|
||||
}
|
||||
return year;
|
||||
}
|
||||
|
||||
private Integer calculateYear() {
|
||||
TimePoint startOfRace = getTrackedRace().getStartOfRace();
|
||||
TimePoint time = startOfRace != null ? startOfRace : getTrackedRace().getStartOfTracking();
|
||||
if (time == null) {
|
||||
year = 0;
|
||||
}
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
calendar.setTime(time.asDate());
|
||||
return calendar.get(Calendar.YEAR);
|
||||
}
|
||||
|
||||
}
|
||||
-48
@@ -1,48 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.gps_fix;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import com.sap.sailing.datamining.data.GPSFixWithContext;
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.impl.components.AbstractLeaderboardGroupDataRetrievalWorker;
|
||||
import com.sap.sailing.datamining.impl.data.HasGPSFixContextImpl;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
import com.sap.sse.common.Util;
|
||||
|
||||
public class GPSFixLeaderboardGroupDataRetrievalWorker extends AbstractLeaderboardGroupDataRetrievalWorker<GPSFixWithContext> {
|
||||
|
||||
@Override
|
||||
public Collection<GPSFixWithContext> doWork() {
|
||||
Collection<GPSFixWithContext> data = new ArrayList<GPSFixWithContext>();
|
||||
Collection<Util.Pair<TrackedLegOfCompetitor, HasTrackedLegOfCompetitorContext>> baseData = retrieveDataTillTrackedLegOfCompetitor(getGroup());
|
||||
for (Util.Pair<TrackedLegOfCompetitor, HasTrackedLegOfCompetitorContext> baseDataEntry : baseData) {
|
||||
HasGPSFixContext context = new HasGPSFixContextImpl(baseDataEntry.getB());
|
||||
data.addAll(retrieveDataFor(context));
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
private Collection<GPSFixWithContext> retrieveDataFor(HasGPSFixContext context) {
|
||||
List<GPSFixWithContext> data = new ArrayList<GPSFixWithContext>();
|
||||
TrackedLegOfCompetitor trackedLegOfCompetitor = context.getTrackedLeg().getTrackedLeg(context.getCompetitor());
|
||||
GPSFixTrack<Competitor, GPSFixMoving> competitorTrack = context.getTrackedRace().getTrack(context.getCompetitor());
|
||||
competitorTrack.lockForRead();
|
||||
try {
|
||||
if (trackedLegOfCompetitor.getStartTime() != null && trackedLegOfCompetitor.getFinishTime() != null) {
|
||||
for (GPSFixMoving gpsFix : competitorTrack.getFixes(trackedLegOfCompetitor.getStartTime(), true, trackedLegOfCompetitor.getFinishTime(), true)) {
|
||||
data.add(new GPSFixWithContextImpl(gpsFix, context));
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
competitorTrack.unlockAfterRead();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
-118
@@ -1,118 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.gps_fix;
|
||||
|
||||
import com.sap.sailing.datamining.Clusters.WindStrength;
|
||||
import com.sap.sailing.datamining.WindStrengthCluster;
|
||||
import com.sap.sailing.datamining.data.GPSFixWithContext;
|
||||
import com.sap.sailing.datamining.data.HasGPSFixContext;
|
||||
import com.sap.sailing.domain.common.LegType;
|
||||
import com.sap.sailing.domain.common.Position;
|
||||
import com.sap.sailing.domain.common.SpeedWithBearing;
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.common.impl.DegreePosition;
|
||||
import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl;
|
||||
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sailing.domain.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.tracking.Wind;
|
||||
import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl;
|
||||
|
||||
public class GPSFixWithContextImpl extends GPSFixMovingImpl implements GPSFixWithContext {
|
||||
private static final long serialVersionUID = -5551381302809417831L;
|
||||
|
||||
private HasGPSFixContext context;
|
||||
private Wind wind;
|
||||
|
||||
private boolean windHasBeenInitialized;
|
||||
|
||||
public GPSFixWithContextImpl(GPSFixMoving gpsFix, HasGPSFixContext context) {
|
||||
super(copyPosition(gpsFix), copyTimePoint(gpsFix), copySpeed(gpsFix));
|
||||
this.context = context;
|
||||
|
||||
windHasBeenInitialized= false;
|
||||
}
|
||||
|
||||
private static SpeedWithBearing copySpeed(GPSFixMoving gpsFix) {
|
||||
return new KnotSpeedWithBearingImpl(gpsFix.getSpeed().getKnots(), gpsFix.getSpeed().getBearing());
|
||||
}
|
||||
|
||||
private static TimePoint copyTimePoint(GPSFixMoving gpsFix) {
|
||||
return new MillisecondsTimePoint(gpsFix.getTimePoint().asMillis());
|
||||
}
|
||||
|
||||
private static Position copyPosition(GPSFixMoving gpsFix) {
|
||||
return new DegreePosition(gpsFix.getPosition().getLatDeg(), gpsFix.getPosition().getLngDeg());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRegattaName() {
|
||||
return context.getTrackedRace().getTrackedRegatta().getRegatta().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRaceName() {
|
||||
return context.getTrackedRace().getRace().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLegNumber() {
|
||||
return context.getLegNumber();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCourseAreaName() {
|
||||
return context.getCourseArea().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFleetName() {
|
||||
return context.getFleet().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getBoatClassName() {
|
||||
return context.getCompetitor().getBoat().getBoatClass().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getYear() {
|
||||
return context.getYear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public LegType getLegType() {
|
||||
return context.getLegType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCompetitorName() {
|
||||
return context.getCompetitor().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCompetitorSailID() {
|
||||
return context.getCompetitor().getBoat().getSailID();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCompetitorNationality() {
|
||||
return context.getCompetitor().getTeam().getNationality().getThreeLetterIOCAcronym();
|
||||
}
|
||||
|
||||
@Override
|
||||
public WindStrengthCluster getWindStrength() {
|
||||
if (getWind() == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return WindStrength.getClusterFor(getWind().getBeaufort(), WindStrength.StandardClusters);
|
||||
}
|
||||
|
||||
public Wind getWind() {
|
||||
if (!windHasBeenInitialized) {
|
||||
wind = context.getTrackedRace().getWind(getPosition(), getTimePoint());
|
||||
windHasBeenInitialized = true;
|
||||
}
|
||||
|
||||
return wind;
|
||||
}
|
||||
|
||||
}
|
||||
-15
@@ -1,15 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.tracked_leg_of_competitor;
|
||||
|
||||
import com.sap.sailing.datamining.data.TrackedLegOfCompetitorWithContext;
|
||||
import com.sap.sailing.domain.common.Distance;
|
||||
import com.sap.sse.datamining.impl.workers.extractors.AbstractExtractionWorker;
|
||||
|
||||
public class DistanceTraveledExtractionWorker extends AbstractExtractionWorker<TrackedLegOfCompetitorWithContext, Double> {
|
||||
|
||||
@Override
|
||||
public Double extract(TrackedLegOfCompetitorWithContext dataEntry) {
|
||||
Distance distanceTraveled = dataEntry.getDistanceTraveled();
|
||||
return distanceTraveled != null ? distanceTraveled.getMeters() : 0;
|
||||
}
|
||||
|
||||
}
|
||||
-24
@@ -1,24 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.tracked_leg_of_competitor;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.data.TrackedLegOfCompetitorWithContext;
|
||||
import com.sap.sailing.datamining.impl.components.AbstractLeaderboardGroupDataRetrievalWorker;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
import com.sap.sse.common.Util;
|
||||
|
||||
public class TrackedLegOfCompetitorLeaderboardGroupDataRetrievalWorker extends AbstractLeaderboardGroupDataRetrievalWorker<TrackedLegOfCompetitorWithContext> {
|
||||
|
||||
@Override
|
||||
public Collection<TrackedLegOfCompetitorWithContext> doWork() {
|
||||
Collection<TrackedLegOfCompetitorWithContext> data = new ArrayList<TrackedLegOfCompetitorWithContext>();
|
||||
Collection<Util.Pair<TrackedLegOfCompetitor, HasTrackedLegOfCompetitorContext>> baseData = retrieveDataTillTrackedLegOfCompetitor(getGroup());
|
||||
for (Util.Pair<TrackedLegOfCompetitor, HasTrackedLegOfCompetitorContext> baseDataEntry : baseData) {
|
||||
data.add(new TrackedLegOfCompetitorWithContextImpl(baseDataEntry.getA(), baseDataEntry.getB()));
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
-88
@@ -1,88 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.tracked_leg_of_competitor;
|
||||
|
||||
import com.sap.sailing.datamining.WindStrengthCluster;
|
||||
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.data.TrackedLegOfCompetitorWithContext;
|
||||
import com.sap.sailing.domain.common.Distance;
|
||||
import com.sap.sailing.domain.common.LegType;
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
|
||||
public class TrackedLegOfCompetitorWithContextImpl implements TrackedLegOfCompetitorWithContext {
|
||||
|
||||
private TrackedLegOfCompetitor trackedLegOfCompetitor;
|
||||
private HasTrackedLegOfCompetitorContext context;
|
||||
|
||||
public TrackedLegOfCompetitorWithContextImpl(TrackedLegOfCompetitor trackedLegOfCompetitor, HasTrackedLegOfCompetitorContext context) {
|
||||
this.trackedLegOfCompetitor = trackedLegOfCompetitor;
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRegattaName() {
|
||||
return context.getTrackedRace().getTrackedRegatta().getRegatta().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRaceName() {
|
||||
return context.getTrackedRace().getRace().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLegNumber() {
|
||||
return context.getLegNumber();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCourseAreaName() {
|
||||
return context.getCourseArea().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFleetName() {
|
||||
return context.getFleet().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getBoatClassName() {
|
||||
return context.getCompetitor().getBoat().getBoatClass().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getYear() {
|
||||
return context.getYear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public LegType getLegType() {
|
||||
return context.getLegType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCompetitorName() {
|
||||
return context.getCompetitor().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCompetitorSailID() {
|
||||
return context.getCompetitor().getBoat().getSailID();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCompetitorNationality() {
|
||||
return context.getCompetitor().getTeam().getNationality().getThreeLetterIOCAcronym();
|
||||
}
|
||||
|
||||
@Override
|
||||
public WindStrengthCluster getWindStrength() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Distance getDistanceTraveled() {
|
||||
TimePoint finishTime = trackedLegOfCompetitor.getFinishTime();
|
||||
return finishTime != null ? trackedLegOfCompetitor.getDistanceTraveled(finishTime) : null;
|
||||
}
|
||||
|
||||
}
|
||||
-13
@@ -1,13 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.workers;
|
||||
|
||||
import com.sap.sailing.domain.base.Moving;
|
||||
import com.sap.sse.datamining.impl.workers.extractors.AbstractExtractionWorker;
|
||||
|
||||
public class SpeedInKnotsExtractionWorker extends AbstractExtractionWorker<Moving, Double> {
|
||||
|
||||
@Override
|
||||
public Double extract(Moving dataEntry) {
|
||||
return dataEntry.getSpeed().getKnots();
|
||||
}
|
||||
|
||||
}
|
||||
-30
@@ -1,30 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.workers.builders;
|
||||
|
||||
import com.sap.sailing.datamining.impl.gps_fix.GPSFixLeaderboardGroupDataRetrievalWorker;
|
||||
import com.sap.sailing.datamining.impl.tracked_leg_of_competitor.TrackedLegOfCompetitorLeaderboardGroupDataRetrievalWorker;
|
||||
import com.sap.sailing.datamining.shared.DataTypes;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sse.datamining.workers.DataRetrievalWorker;
|
||||
import com.sap.sse.datamining.workers.WorkerBuilder;
|
||||
|
||||
public class DataRetrieverWorkerBuilder<DataType> implements WorkerBuilder<DataRetrievalWorker<LeaderboardGroup, DataType>> {
|
||||
|
||||
private final DataTypes dataType;
|
||||
|
||||
public DataRetrieverWorkerBuilder(DataTypes dataType) {
|
||||
this.dataType = dataType;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public DataRetrievalWorker<LeaderboardGroup, DataType> build() {
|
||||
switch (dataType) {
|
||||
case GPSFix:
|
||||
return (DataRetrievalWorker<LeaderboardGroup, DataType>) new GPSFixLeaderboardGroupDataRetrievalWorker();
|
||||
case TrackedLegOfCompetitor:
|
||||
return (DataRetrievalWorker<LeaderboardGroup, DataType>) new TrackedLegOfCompetitorLeaderboardGroupDataRetrievalWorker();
|
||||
}
|
||||
throw new IllegalArgumentException("Not yet implemented for the given data type: " + dataType.toString());
|
||||
}
|
||||
|
||||
}
|
||||
-30
@@ -1,30 +0,0 @@
|
||||
package com.sap.sailing.datamining.impl.workers.builders;
|
||||
|
||||
import com.sap.sailing.datamining.impl.tracked_leg_of_competitor.DistanceTraveledExtractionWorker;
|
||||
import com.sap.sailing.datamining.impl.workers.SpeedInKnotsExtractionWorker;
|
||||
import com.sap.sailing.datamining.shared.StatisticType;
|
||||
import com.sap.sse.datamining.workers.ExtractionWorker;
|
||||
import com.sap.sse.datamining.workers.WorkerBuilder;
|
||||
|
||||
public class ExtractionWorkerBuilder<DataType, ExtractedType> implements WorkerBuilder<ExtractionWorker<DataType, ExtractedType>> {
|
||||
|
||||
private StatisticType statisticType;
|
||||
|
||||
public ExtractionWorkerBuilder(StatisticType statisticType) {
|
||||
this.statisticType = statisticType;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public ExtractionWorker<DataType, ExtractedType> build() {
|
||||
switch (statisticType) {
|
||||
case Speed:
|
||||
return (ExtractionWorker<DataType, ExtractedType>) new SpeedInKnotsExtractionWorker();
|
||||
case Distance:
|
||||
return (ExtractionWorker<DataType, ExtractedType>) new DistanceTraveledExtractionWorker();
|
||||
}
|
||||
throw new IllegalArgumentException("Not yet implemented for the given statistic type: "
|
||||
+ statisticType.toString());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -21,4 +21,5 @@ Export-Package: com.sap.sailing.domain.common,
|
||||
com.sap.sailing.domain.common.scalablevalue,
|
||||
com.sap.sailing.domain.common.scalablevalue.impl,
|
||||
com.sap.sailing.domain.common.trackfiles
|
||||
Require-Bundle: com.sap.sse.common
|
||||
Require-Bundle: com.sap.sse.datamining.shared,
|
||||
com.sap.sse.common
|
||||
@@ -2,6 +2,9 @@ package com.sap.sailing.domain.common;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import com.sap.sse.datamining.shared.Unit;
|
||||
import com.sap.sse.datamining.shared.annotations.Statistic;
|
||||
|
||||
/**
|
||||
* A speed, convertable in various units of measure. Can be negative.
|
||||
*
|
||||
@@ -48,6 +51,7 @@ public interface Speed extends Comparable<Speed>, Serializable {
|
||||
}
|
||||
};
|
||||
|
||||
@Statistic(messageKey="InKnots", resultDecimals=2, resultUnit=Unit.Knots)
|
||||
double getKnots();
|
||||
|
||||
double getMetersPerSecond();
|
||||
|
||||
@@ -6,6 +6,7 @@ Bundle-Version: 1.0.0.qualifier
|
||||
Bundle-Vendor: SAP
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
|
||||
Require-Bundle: com.sap.sailing.domain.common;bundle-version="1.0.0",
|
||||
com.sap.sse.datamining.shared;bundle-version="1.0.0",
|
||||
com.sap.sse.common
|
||||
Export-Package: com.sap.sailing.domain.base,
|
||||
com.sap.sailing.domain.base.configuration,
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
package com.sap.sailing.domain.base;
|
||||
|
||||
import com.sap.sse.common.Named;
|
||||
import com.sap.sse.datamining.shared.annotations.Dimension;
|
||||
|
||||
public interface Boat extends Named {
|
||||
BoatClass getBoatClass();
|
||||
|
||||
@Dimension(messageKey="SailID")
|
||||
String getSailID();
|
||||
}
|
||||
+3
@@ -2,11 +2,14 @@ package com.sap.sailing.domain.base;
|
||||
|
||||
import com.sap.sailing.domain.common.Color;
|
||||
import com.sap.sailing.domain.common.WithID;
|
||||
import com.sap.sse.datamining.shared.annotations.Connector;
|
||||
import com.sap.sse.common.Named;
|
||||
|
||||
public interface Competitor extends Named, WithID, IsManagedBySharedDomainFactory {
|
||||
@Connector(messageKey="Team", ordinal=8)
|
||||
Team getTeam();
|
||||
|
||||
@Connector(messageKey="Boat", ordinal=9)
|
||||
Boat getBoat();
|
||||
|
||||
Color getColor();
|
||||
|
||||
+2
@@ -2,8 +2,10 @@ package com.sap.sailing.domain.base;
|
||||
|
||||
import com.sap.sailing.domain.common.CountryCode;
|
||||
import com.sap.sse.common.Named;
|
||||
import com.sap.sse.datamining.shared.annotations.Dimension;
|
||||
|
||||
public interface Nationality extends Named, WithImage, IsManagedBySharedDomainFactory {
|
||||
@Dimension(messageKey="NationalityAcronym")
|
||||
String getThreeLetterIOCAcronym();
|
||||
|
||||
CountryCode getCountryCode();
|
||||
|
||||
+3
@@ -1,5 +1,8 @@
|
||||
package com.sap.sailing.domain.base;
|
||||
|
||||
import com.sap.sse.datamining.shared.annotations.Connector;
|
||||
|
||||
public interface WithNationality {
|
||||
@Connector(ordinal=7)
|
||||
Nationality getNationality();
|
||||
}
|
||||
+1
-1
@@ -60,7 +60,7 @@ public class CompetitorImpl implements DynamicCompetitor {
|
||||
public Serializable getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public DynamicTeam getTeam() {
|
||||
return team;
|
||||
|
||||
@@ -32,4 +32,5 @@ Require-Bundle: com.googlecode.java-diff-utils;bundle-version="1.3.0",
|
||||
com.sap.sailing.domain.common,
|
||||
org.json.simple;bundle-version="1.1.0",
|
||||
com.sap.sailing.geocoding,
|
||||
com.sap.sse.datamining.shared;bundle-version="1.0.0",
|
||||
com.sap.sse.common
|
||||
@@ -1,7 +1,9 @@
|
||||
package com.sap.sailing.domain.base;
|
||||
|
||||
import com.sap.sailing.domain.common.SpeedWithBearing;
|
||||
import com.sap.sse.datamining.shared.annotations.Connector;
|
||||
|
||||
public interface Moving {
|
||||
@Connector(messageKey="Speed")
|
||||
SpeedWithBearing getSpeed();
|
||||
}
|
||||
@@ -219,7 +219,3 @@ input.magnifier {
|
||||
-ms-border-radius: 0px 3px 3px 0px;
|
||||
border-radius: 0px 3px 3px 0px;
|
||||
}
|
||||
|
||||
.dataTypeLabel {
|
||||
font-weight: bold;
|
||||
}
|
||||
@@ -11,8 +11,9 @@
|
||||
<link href='images/sap-sailing-app-icon.png' rel='apple-touch-icon'>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="images/sap.ico" />
|
||||
|
||||
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
|
||||
<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>
|
||||
<script type="text/javascript" src="highcharts/js/highcharts.js"></script>
|
||||
<script type="text/javascript" src="highcharts/js/highcharts-more.js"></script>
|
||||
|
||||
<!-- Optionally, add a highcharts theme file -->
|
||||
<script type="text/javascript" src="highcharts/js/themes/grid.js"></script>
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<listEntry value="com.sap.sailing.gwt.ui.VideoPopup"/>
|
||||
<listEntry value="com.sap.sailing.gwt.ui.Simulator"/>
|
||||
</listAttribute>
|
||||
<stringAttribute key="com.google.gwt.eclipse.core.URL" value="/gwt/Home.html"/>
|
||||
<stringAttribute key="com.google.gwt.eclipse.core.URL" value="/gwt/AdminConsole.html"/>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||
<listEntry value="/com.sap.sailing.gwt.ui"/>
|
||||
</listAttribute>
|
||||
@@ -53,7 +53,7 @@
|
||||
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-war "${project_loc:com.sap.sailing.gwt.ui}" -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -logLevel INFO -codeServerPort 9997 -startupUrl /gwt/Home.html com.sap.sailing.gwt.ui.Search -startupUrl /gwt/Home.html com.sap.sailing.gwt.Home -startupUrl /gwt/AdminConsole.html com.sap.sailing.gwt.ui.AdminConsole -startupUrl /gwt/LeaderboardEditing.html com.sap.sailing.gwt.ui.LeaderboardEditing -startupUrl /gwt/UserManagement.html com.sap.sailing.gwt.ui.UserManagement -startupUrl /gwt/Leaderboard.html com.sap.sailing.gwt.ui.Leaderboard -startupUrl /gwt/Spectator.html com.sap.sailing.gwt.ui.Spectator -startupUrl /gwt/RaceBoard.html com.sap.sailing.gwt.ui.RaceBoard -startupUrl /gwt/TvView.html com.sap.sailing.gwt.ui.TvView -startupUrl /gwt/PolarSheets.html com.sap.sailing.gwt.ui.PolarSheets -startupUrl /gwt/RegattaOverview.html com.sap.sailing.gwt.ui.RegattaOverview -startupUrl /gwt/DataMining.html com.sap.sailing.gwt.ui.DataMining -startupUrl /gwt/Simulator.html com.sap.sailing.gwt.ui.Simulator com.sap.sailing.gwt.ui.VideoPopup"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-war "${project_loc:com.sap.sailing.gwt.ui}" -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -logLevel INFO -codeServerPort 9997 -startupUrl /gwt/AdminConsole.html com.sap.sailing.gwt.ui.AdminConsole -startupUrl /gwt/LeaderboardEditing.html com.sap.sailing.gwt.ui.LeaderboardEditing -startupUrl /gwt/UserManagement.html com.sap.sailing.gwt.ui.UserManagement -startupUrl /gwt/Leaderboard.html com.sap.sailing.gwt.ui.Leaderboard -startupUrl /gwt/Spectator.html com.sap.sailing.gwt.ui.Spectator -startupUrl /gwt/RaceBoard.html com.sap.sailing.gwt.ui.RaceBoard -startupUrl /gwt/TvView.html com.sap.sailing.gwt.ui.TvView -startupUrl /gwt/PolarSheets.html com.sap.sailing.gwt.ui.PolarSheets -startupUrl /gwt/RegattaOverview.html com.sap.sailing.gwt.ui.RegattaOverview -startupUrl /gwt/DataMining.html com.sap.sailing.gwt.ui.DataMining -startupUrl /gwt/Simulator.html com.sap.sailing.gwt.ui.Simulator com.sap.sailing.gwt.ui.VideoPopup"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.gwt.ui"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx2048m -XX:MaxPermSize=512m"/>
|
||||
</launchConfiguration>
|
||||
+1
-1
@@ -165,7 +165,7 @@ public class LeaderboardActivity extends AbstractActivity implements ErrorReport
|
||||
raceColumnSelectionStrategy, showAddedScores, showOverallColumnWithNumberOfRacesSailedPerCompetitor);
|
||||
|
||||
} else {
|
||||
final List<DetailType> overallDetails = Collections.emptyList();
|
||||
final List<DetailType> overallDetails = Collections.singletonList(DetailType.REGATTA_RANK);
|
||||
result = LeaderboardSettingsFactory.getInstance().createNewDefaultSettings(null, null,
|
||||
/* overallDetails */ overallDetails, null,
|
||||
/* autoExpandFirstRace */false, refreshIntervalMillis, numberOfLastRacesToShow,
|
||||
|
||||
+4
-4
@@ -813,7 +813,7 @@ public interface StringMessages extends Messages {
|
||||
String lastFinished();
|
||||
String run();
|
||||
String times();
|
||||
String numberOfGPSFixes();
|
||||
String dataAmount();
|
||||
String averageCleanedServerTime();
|
||||
String averageCleanedOverallTime();
|
||||
String dataMiningBenchmarkResults();
|
||||
@@ -838,7 +838,7 @@ public interface StringMessages extends Messages {
|
||||
String selectSheet();
|
||||
String groupBy();
|
||||
String statisticToCalculate();
|
||||
String queryResultsChartSubtitle(int retrievedDataAmount, int filteredDataAmount, double calculationTime);
|
||||
String queryResultsChartSubtitle(int retrievedDataAmount, double calculationTime);
|
||||
String noQuerySelected();
|
||||
String runAutomatically();
|
||||
String noStatisticSelectedError();
|
||||
@@ -971,9 +971,8 @@ public interface StringMessages extends Messages {
|
||||
String rerunQueryAfterRefreshTooltip();
|
||||
String queryDefinitionProvider();
|
||||
String statisticProvider();
|
||||
String toCalculateThe();
|
||||
String calculateThe();
|
||||
String groupingProvider();
|
||||
String use();
|
||||
String releaseNotes();
|
||||
String hasSplitFleetContiguousScoring();
|
||||
String eventOverview();
|
||||
@@ -1042,6 +1041,7 @@ public interface StringMessages extends Messages {
|
||||
String imageURLs();
|
||||
String videoURLs();
|
||||
String sponsorImageURLs();
|
||||
String invalidSelection();
|
||||
String advancePassId();
|
||||
String pleaseSelectAScoringResult();
|
||||
String eventOfficialWebsiteURL();
|
||||
|
||||
+7
-7
@@ -802,7 +802,7 @@ done=Done
|
||||
lastFinished=Last finished
|
||||
run=Run
|
||||
times=times
|
||||
numberOfGPSFixes=Number of GPS-Fixes
|
||||
dataAmount=Data amount
|
||||
averageCleanedServerTime=\u2205 Cleaned Server Time
|
||||
averageCleanedOverallTime=\u2205 Cleaned Overall Time
|
||||
dataMiningBenchmarkResults=Data Mining Benchmark Results
|
||||
@@ -827,7 +827,7 @@ cleanedOverallTime=Cleaned Overall Time
|
||||
dataMiningResult=Data Mining Result
|
||||
groupBy=Group by
|
||||
statisticToCalculate=Calculate statistic
|
||||
queryResultsChartSubtitle=Worked through {1}/{0} data entries in {2} seconds
|
||||
queryResultsChartSubtitle=Worked through {0} data entries in {1} seconds
|
||||
noQuerySelected=No query selected
|
||||
runAutomatically=Run automatically
|
||||
windImport_Upload=Upload
|
||||
@@ -954,8 +954,7 @@ runAutomaticallyTooltip=Run the query automatically, after you changed e.g. the
|
||||
rerunQueryAfterRefreshTooltip=Reruns the query after the tables have been refreshed.
|
||||
queryDefinitionProvider=Query Definition Provider
|
||||
statisticProvider=Statistic Provider
|
||||
toCalculateThe=to calculate the
|
||||
use=Use
|
||||
calculateThe=Calculate the
|
||||
groupingProvider=Grouping Provider
|
||||
releaseNotes=News and Release History
|
||||
hasSplitFleetContiguousScoring=Split fleets scored contiguously
|
||||
@@ -1023,6 +1022,7 @@ pleaseSelectASeriesFirst=Please select a series first.
|
||||
imageURLs=Image URLs
|
||||
videoURLs=Video URLs
|
||||
sponsorImageURLs=Sponsor Image URLs
|
||||
invalidSelection=The current selection isn''t valid.
|
||||
advancePassId=Advance Pass ID
|
||||
pleaseSelectAScoringResult=Please select a scoring result...
|
||||
eventOfficialWebsiteURL=Official Website URL
|
||||
@@ -1064,6 +1064,6 @@ windChart=Wind Chart
|
||||
showVideoPopup=Show Video
|
||||
hideVideoPopup=Hide Video
|
||||
manageMedia=Manage Media
|
||||
manageMediaTooltip=Configure audio and video clips, synchronize times
|
||||
showAll=Show all
|
||||
raceVisibilityColumn=Visibility
|
||||
manageMediaTooltip=Configure audio and video clips, synchronize times
|
||||
showAll=Show all
|
||||
raceVisibilityColumn=Visibility
|
||||
+4
-4
@@ -798,7 +798,7 @@ done=Fertig
|
||||
lastFinished=Zuletzt fertig
|
||||
run=Ausführen
|
||||
times=mal
|
||||
numberOfGPSFixes=Anzahl der GPS-Fixes
|
||||
dataAmount=Anzahl der Daten
|
||||
averageCleanedServerTime=\u2205 Bereinigte Server-Zeit
|
||||
averageCleanedOverallTime=\u2205 Bereinigte Gesamt-Zeit
|
||||
dataMiningBenchmarkResults=Data Mining Benchmark Ergebnisse
|
||||
@@ -823,7 +823,7 @@ cleanedOverallTime=Bereinigte Gesamt-Zeit
|
||||
dataMiningResult=Data Mining Ergebnis
|
||||
groupBy=Gruppieren nach
|
||||
statisticToCalculate=Berechne Kennzahl
|
||||
queryResultsChartSubtitle=Es wurden {1}/{0} Datensätze in {2} Sekunden verarbeitet
|
||||
queryResultsChartSubtitle=Es wurden {0} Datensätze in {1} Sekunden verarbeitet
|
||||
noQuerySelected=Keine Abfrage ausgewählt
|
||||
runAutomatically=Automatisch ausführen
|
||||
windImport_Upload=Abschicken
|
||||
@@ -950,8 +950,7 @@ runAutomaticallyTooltip=Führe die Anfrage automatisch durch, wenn zum Beispiel
|
||||
rerunQueryAfterRefreshTooltip=Wiederholt die Anfrage nachdem die Tabellen aktualisiert wurden.
|
||||
queryDefinitionProvider=Anfragen-Definitions-Versorger
|
||||
statisticProvider=Statistik-Versorger
|
||||
toCalculateThe=zur Berechnung von
|
||||
use=Verwende
|
||||
calculateThe=Berechne die
|
||||
groupingProvider=Gruppierungs-Versorger
|
||||
releaseNotes=Neuigkeiten und Änderungshistorie
|
||||
hasSplitFleetContiguousScoring=Gruppen durchgängig bepunkten
|
||||
@@ -1017,6 +1016,7 @@ pleaseSelectASeriesFirst=Bitte zuerst eine Serie auswählen.
|
||||
imageURLs=Bilder-URLs
|
||||
videoURLs=Video-URLs
|
||||
sponsorImageURLs=Sponsorenlogo-URLs
|
||||
invalidSelection=Die aktuelle Selektion ist nicht gültig.
|
||||
advancePassId=Pass ID erhöhen
|
||||
pleaseSelectAScoringResult=Bitte ein Ergebnis auswählen...
|
||||
eventOfficialWebsiteURL=URL der offiziellen Veranstaltungs-Website
|
||||
|
||||
+3
-4
@@ -795,7 +795,7 @@ done=Готово
|
||||
lastFinished=Последняя завершенная
|
||||
run=Начать
|
||||
times=раз
|
||||
numberOfGPSFixes=Количество точек фиксации GPS
|
||||
dataAmount=Data amount
|
||||
averageCleanedServerTime=\u2205 Чистое время на сервере
|
||||
averageCleanedOverallTime=\u2205 Чистое итоговое время
|
||||
dataMiningBenchmarkResults=Результаты сравнительного теста сбора данных
|
||||
@@ -820,7 +820,7 @@ cleanedOverallTime=Чистое итоговое время
|
||||
dataMiningResult=Результат сбора данных
|
||||
groupBy=Группировать по
|
||||
statisticToCalculate=Рассчитать статистику
|
||||
queryResultsChartSubtitle=Обработанные {1}/{0} элементы данных через {2} секунд
|
||||
queryResultsChartSubtitle=Обработанные {0} элементы данных через {1} секунд
|
||||
noQuerySelected=Запросы не выбраны
|
||||
runAutomatically=Запустить автоматически
|
||||
windImport_Upload=Загрузить
|
||||
@@ -947,8 +947,7 @@ runAutomaticallyTooltip=Запустить запрос автоматическ
|
||||
rerunQueryAfterRefreshTooltip=Повторно запускает запрос после обновления таблиц.
|
||||
queryDefinitionProvider=Поставщик определения запроса
|
||||
statisticProvider=Поставщик статистических данных
|
||||
toCalculateThe=для расчета
|
||||
use=Использовать
|
||||
calculateThe=Calculate the
|
||||
groupingProvider=Поставщик группировки
|
||||
releaseNotes=Новости и история выпусков
|
||||
hasSplitFleetContiguousScoring=Разделить флоты, имеющие близкие количества очков
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
package com.sap.sailing.gwt.ui.client.shared.components;
|
||||
|
||||
import com.google.gwt.text.shared.AbstractRenderer;
|
||||
|
||||
public abstract class AbstractObjectRenderer<T> extends AbstractRenderer<T> {
|
||||
|
||||
@Override
|
||||
public String render(T object) {
|
||||
if (object == null) {
|
||||
return "";
|
||||
}
|
||||
return convertObjectToString(object);
|
||||
}
|
||||
|
||||
protected abstract String convertObjectToString(T nonNullObject);
|
||||
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
package com.sap.sailing.gwt.ui.client.shared.components;
|
||||
|
||||
/**
|
||||
* Simple renderer, that uses the objects toString method to render.
|
||||
*/
|
||||
public class SimpleObjectRenderer<T> extends AbstractObjectRenderer<T> {
|
||||
|
||||
@Override
|
||||
protected String convertObjectToString(T object) {
|
||||
return object.toString();
|
||||
}
|
||||
|
||||
}
|
||||
-32
@@ -1,32 +0,0 @@
|
||||
package com.sap.sailing.gwt.ui.client.shared.components;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import com.google.gwt.text.shared.Renderer;
|
||||
import com.google.gwt.user.client.ui.ValueListBox;
|
||||
|
||||
/**
|
||||
* A simple implementation of {@link ValueListBox}, that uses the <code>toString()</code>-Method to render it's content.
|
||||
*
|
||||
* @author Lennart
|
||||
* @see Renderer
|
||||
*/
|
||||
public class SimpleValueListBox<T> extends ValueListBox<T> {
|
||||
|
||||
public SimpleValueListBox() {
|
||||
super(new Renderer<T>() {
|
||||
@Override
|
||||
public String render(T object) {
|
||||
if (object == null) {
|
||||
return "";
|
||||
}
|
||||
return object.toString();
|
||||
}
|
||||
@Override
|
||||
public void render(T object, Appendable appendable) throws IOException {
|
||||
appendable.append(render(object));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.sap.sailing.gwt.ui.datamining.client;
|
||||
package com.sap.sailing.gwt.ui.datamining;
|
||||
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
|
||||
+113
@@ -0,0 +1,113 @@
|
||||
package com.sap.sailing.gwt.ui.datamining;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.dom.client.Style.Unit;
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.ClickHandler;
|
||||
import com.google.gwt.user.client.rpc.ServiceDefTarget;
|
||||
import com.google.gwt.user.client.ui.AbstractImagePrototype;
|
||||
import com.google.gwt.user.client.ui.Anchor;
|
||||
import com.google.gwt.user.client.ui.DockLayoutPanel;
|
||||
import com.google.gwt.user.client.ui.FlowPanel;
|
||||
import com.google.gwt.user.client.ui.HorizontalPanel;
|
||||
import com.google.gwt.user.client.ui.Label;
|
||||
import com.google.gwt.user.client.ui.RootLayoutPanel;
|
||||
import com.google.gwt.user.client.ui.SplitLayoutPanel;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.ui.client.AbstractEntryPoint;
|
||||
import com.sap.sailing.gwt.ui.client.GlobalNavigationPanel;
|
||||
import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel;
|
||||
import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants;
|
||||
import com.sap.sailing.gwt.ui.client.SailingService;
|
||||
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
|
||||
import com.sap.sailing.gwt.ui.client.shared.components.Component;
|
||||
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialog;
|
||||
import com.sap.sailing.gwt.ui.datamining.execution.SimpleQueryRunner;
|
||||
import com.sap.sailing.gwt.ui.datamining.presentation.BenchmarkResultsPanel;
|
||||
import com.sap.sailing.gwt.ui.datamining.presentation.ResultsChart;
|
||||
import com.sap.sailing.gwt.ui.datamining.selection.QueryDefinitionProviderWithControls;
|
||||
import com.sap.sailing.gwt.ui.datamining.settings.QueryRunnerSettings;
|
||||
import com.sap.sailing.gwt.ui.datamining.settings.RefreshingSelectionTablesSettings;
|
||||
import com.sap.sse.gwt.client.EntryPointHelper;
|
||||
import com.sap.sse.gwt.shared.GwtHttpRequestUtils;
|
||||
|
||||
public class DataMiningEntryPoint extends AbstractEntryPoint {
|
||||
private final SailingServiceAsync sailingService = GWT.create(SailingService.class);
|
||||
|
||||
private static DataMiningResources resources = GWT.create(DataMiningResources.class);
|
||||
|
||||
private final DataMiningServiceAsync dataMiningService = GWT.create(DataMiningService.class);
|
||||
|
||||
@Override
|
||||
protected void doOnModuleLoad() {
|
||||
super.doOnModuleLoad();
|
||||
|
||||
EntryPointHelper.registerASyncService((ServiceDefTarget) sailingService, RemoteServiceMappingConstants.sailingServiceRemotePath);
|
||||
EntryPointHelper.registerASyncService((ServiceDefTarget) dataMiningService, RemoteServiceMappingConstants.dataMiningServiceRemotePath);
|
||||
|
||||
RootLayoutPanel rootPanel = RootLayoutPanel.get();
|
||||
SplitLayoutPanel splitPanel = new SplitLayoutPanel();
|
||||
rootPanel.add(splitPanel);
|
||||
|
||||
DockLayoutPanel dockPanel = new DockLayoutPanel(Unit.PX);
|
||||
dockPanel.addNorth(createLogoAndTitlePanel(), 68);
|
||||
QueryDefinitionProviderWithControls queryDefinitionProviderWithControls = new QueryDefinitionProviderWithControls(stringMessages, sailingService, dataMiningService, this);
|
||||
queryDefinitionProviderWithControls.getEntryWidget().addStyleName("dataMiningPanel");
|
||||
dockPanel.add(queryDefinitionProviderWithControls.getEntryWidget());
|
||||
|
||||
ResultsPresenter<Number> resultsPresenter = new ResultsChart(stringMessages);
|
||||
if (GwtHttpRequestUtils.getBooleanParameter("benchmark", false)) {
|
||||
BenchmarkResultsPanel benchmarkResultsPanel = new BenchmarkResultsPanel(stringMessages, dataMiningService, this, queryDefinitionProviderWithControls);
|
||||
splitPanel.addSouth(benchmarkResultsPanel, 500);
|
||||
} else {
|
||||
splitPanel.addSouth(resultsPresenter.getWidget(), 400);
|
||||
}
|
||||
|
||||
splitPanel.add(dockPanel);
|
||||
|
||||
QueryRunner queryRunner = new SimpleQueryRunner(stringMessages, dataMiningService, this, queryDefinitionProviderWithControls, resultsPresenter);
|
||||
queryDefinitionProviderWithControls.addControl(queryRunner.getEntryWidget());
|
||||
queryDefinitionProviderWithControls.addControl(createSettingsControlWidget(queryRunner, queryDefinitionProviderWithControls));
|
||||
}
|
||||
|
||||
private LogoAndTitlePanel createLogoAndTitlePanel() {
|
||||
LogoAndTitlePanel logoAndTitlePanel = new LogoAndTitlePanel(stringMessages.dataMining(), stringMessages, this);
|
||||
logoAndTitlePanel.addStyleName("LogoAndTitlePanel");
|
||||
FlowPanel globalNavigationPanel = new GlobalNavigationPanel(stringMessages, true, null, null, /* event */ null, null);
|
||||
logoAndTitlePanel.add(globalNavigationPanel);
|
||||
return logoAndTitlePanel;
|
||||
}
|
||||
|
||||
private Widget createSettingsControlWidget(final QueryRunner queryRunner, final QueryDefinitionProvider queryDefinitionProvider) {
|
||||
HorizontalPanel panel = new HorizontalPanel();
|
||||
panel.setSpacing(5);
|
||||
|
||||
Label runnerSettingsLabel = new Label(queryRunner.getLocalizedShortName() + ":");
|
||||
panel.add(runnerSettingsLabel);
|
||||
Anchor runnerSettingsAnchor = new Anchor(AbstractImagePrototype.create(resources.settingsIcon()).getSafeHtml());
|
||||
runnerSettingsAnchor.setTitle(stringMessages.settings());
|
||||
runnerSettingsAnchor.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
new SettingsDialog<QueryRunnerSettings>(queryRunner, stringMessages).show();
|
||||
}
|
||||
});
|
||||
panel.add(runnerSettingsAnchor);
|
||||
|
||||
Label selectionTablesSettingsLabel = new Label(queryDefinitionProvider.getSelectionProvider().getLocalizedShortName() + ":");
|
||||
panel.add(selectionTablesSettingsLabel);
|
||||
Anchor selectionTablesSettingsAnchor = new Anchor(AbstractImagePrototype.create(resources.settingsIcon()).getSafeHtml());
|
||||
selectionTablesSettingsAnchor.setTitle(stringMessages.settings());
|
||||
selectionTablesSettingsAnchor.addClickHandler(new ClickHandler() {
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
new SettingsDialog<RefreshingSelectionTablesSettings>((Component<RefreshingSelectionTablesSettings>) queryDefinitionProvider.getSelectionProvider(), stringMessages).show();
|
||||
}
|
||||
});
|
||||
panel.add(selectionTablesSettingsAnchor);
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.sap.sailing.gwt.ui.datamining.client;
|
||||
package com.sap.sailing.gwt.ui.datamining;
|
||||
|
||||
import com.google.gwt.resources.client.ClientBundle;
|
||||
import com.google.gwt.resources.client.ImageResource;
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
package com.sap.sailing.gwt.ui.datamining;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.gwt.user.client.rpc.RemoteService;
|
||||
import com.sap.sailing.datamining.shared.SailingDataMiningSerializationDummy;
|
||||
import com.sap.sse.datamining.shared.QueryDefinition;
|
||||
import com.sap.sse.datamining.shared.QueryResult;
|
||||
import com.sap.sse.datamining.shared.SSEDataMiningSerializationDummy;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
|
||||
public interface DataMiningService extends RemoteService {
|
||||
|
||||
Collection<FunctionDTO> getAllStatistics(String localeInfoName);
|
||||
|
||||
Collection<FunctionDTO> getDimensionsFor(FunctionDTO statisticToCalculate, String localeInfoName);
|
||||
|
||||
QueryResult<Set<Object>> getDimensionValuesFor(Collection<FunctionDTO> dimensions) throws Exception;
|
||||
|
||||
<ResultType extends Number> QueryResult<ResultType> runQuery(QueryDefinition queryDefinition) throws Exception;
|
||||
|
||||
SSEDataMiningSerializationDummy pseudoMethodSoThatSomeSSEDataMiningClassesAreAddedToTheGWTSerializationPolicy();
|
||||
|
||||
SailingDataMiningSerializationDummy pseudoMethodSoThatSomeSailingDataMiningClassesAreAddedToTheGWTSerializationPolicy();
|
||||
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
package com.sap.sailing.gwt.ui.datamining;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.sap.sailing.datamining.shared.SailingDataMiningSerializationDummy;
|
||||
import com.sap.sse.datamining.shared.QueryDefinition;
|
||||
import com.sap.sse.datamining.shared.QueryResult;
|
||||
import com.sap.sse.datamining.shared.SSEDataMiningSerializationDummy;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.GenericGroupKey;
|
||||
|
||||
public interface DataMiningServiceAsync {
|
||||
|
||||
void getAllStatistics(String localeInfoName, AsyncCallback<Collection<FunctionDTO>> callback);
|
||||
|
||||
void getDimensionsFor(FunctionDTO statisticToCalculate, String localeInfoName, AsyncCallback<Collection<FunctionDTO>> callback);
|
||||
|
||||
void getDimensionValuesFor(Collection<FunctionDTO> dimensions, AsyncCallback<QueryResult<Set<Object>>> callback);
|
||||
|
||||
<ResultType extends Number> void runQuery(QueryDefinition queryDefinition, AsyncCallback<QueryResult<ResultType>> callback);
|
||||
|
||||
/**
|
||||
* This method does nothing, but is needed to ensure, that some classes for the data mining
|
||||
* (like {@link GenericGroupKey}) is added to the GWT serialization policy.<br />
|
||||
* This is necessary, because the type is somehow hidden from GWT. For Further information
|
||||
* look at bug 1503.<br />
|
||||
*/
|
||||
void pseudoMethodSoThatSomeSSEDataMiningClassesAreAddedToTheGWTSerializationPolicy(AsyncCallback<SSEDataMiningSerializationDummy> asyncCallback);
|
||||
|
||||
/**
|
||||
* This method does nothing, but is needed to ensure, that some classes for the data mining
|
||||
* (like {@link GenericGroupKey}) is added to the GWT serialization policy.<br />
|
||||
* This is necessary, because the type is somehow hidden from GWT. For Further information
|
||||
* look at bug 1503.<br />
|
||||
*/
|
||||
void pseudoMethodSoThatSomeSailingDataMiningClassesAreAddedToTheGWTSerializationPolicy(AsyncCallback<SailingDataMiningSerializationDummy> asyncCallback);
|
||||
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.sap.sailing.gwt.ui.datamining.client;
|
||||
package com.sap.sailing.gwt.ui.datamining;
|
||||
|
||||
public interface GroupingChangedListener {
|
||||
|
||||
+4
-4
@@ -1,17 +1,17 @@
|
||||
package com.sap.sailing.gwt.ui.datamining.client;
|
||||
package com.sap.sailing.gwt.ui.datamining;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import com.sap.sailing.datamining.shared.DimensionIdentifier;
|
||||
import com.sap.sailing.datamining.shared.QueryDefinition;
|
||||
import com.sap.sailing.gwt.ui.client.shared.components.Component;
|
||||
import com.sap.sse.datamining.shared.QueryDefinition;
|
||||
import com.sap.sse.datamining.shared.components.GrouperType;
|
||||
import com.sap.sse.datamining.shared.dto.FunctionDTO;
|
||||
|
||||
public interface GroupingProvider extends Component<Object> {
|
||||
|
||||
public GrouperType getGrouperType();
|
||||
|
||||
public Collection<DimensionIdentifier> getDimensionsToGroupBy();
|
||||
public Collection<FunctionDTO> getDimensionsToGroupBy();
|
||||
public String getCustomGrouperScriptText();
|
||||
|
||||
public void applyQueryDefinition(QueryDefinition queryDefinition);
|
||||
Loaded 100 of 366 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user