Radically cleaned the server side data mining projects

This commit is contained in:
Lennart Hensler committed 2014-06-05 11:33:07 +02:00
1 parent c9fae07ada
commit 225cacad6e
92 files changed
+18 -2962

No files matched your search

@@ -7,8 +7,7 @@ Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Import-Package: com.sap.sailing.server,
org.osgi.framework;version="1.7.0"
Export-Package: com.sap.sailing.datamining,
com.sap.sailing.datamining.data,
Export-Package: com.sap.sailing.datamining.data,
com.sap.sailing.datamining.factories
Require-Bundle: com.sap.sailing.domain;bundle-version="1.0.0",
com.sap.sailing.domain.common,
@@ -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;
}
}
}
@@ -1,7 +0,0 @@
package com.sap.sailing.datamining;
import com.sap.sse.datamining.data.deprecated.ClusterOfComparable;
public interface WindStrengthCluster extends ClusterOfComparable<Double> {
}
@@ -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);
}
@@ -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());
}
}
@@ -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();
}
};
}
@@ -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();
}
};
}
@@ -2,7 +2,6 @@ package com.sap.sailing.datamining.factories;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import com.sap.sailing.datamining.data.HasGPSFixContext;
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
@@ -10,25 +9,13 @@ import com.sap.sailing.datamining.impl.DeprecatedToFunctionConverter;
import com.sap.sailing.datamining.impl.QueryDefinitionConverter;
import com.sap.sailing.datamining.shared.QueryDefinition;
import com.sap.sailing.datamining.shared.QueryDefinitionDeprecated;
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.components.Processor;
import com.sap.sse.datamining.factories.AggregatorFactory;
import com.sap.sse.datamining.factories.ProcessorFactory;
import com.sap.sse.datamining.functions.Function;
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.impl.deprecated.QueryImpl;
import com.sap.sse.datamining.shared.dto.FunctionDTO;
import com.sap.sse.datamining.workers.FiltrationWorker;
import com.sap.sse.datamining.workers.WorkerBuilder;
public final class DataMiningFactory {
@@ -84,37 +71,4 @@ public final class DataMiningFactory {
return SailingDataRetrievalLevels.GPSFix;
}
@Deprecated
public static <DataType, AggregatedType extends Number> Query<AggregatedType> createQuery(
QueryDefinitionDeprecated 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(QueryDefinitionDeprecated queryDefinition) {
if (queryDefinition.getSelection().isEmpty()) {
return FilterFactory.createNonFilteringFilter();
}
WorkerBuilder<FiltrationWorker<DataType>> workerBuilder = FilterFactory.createDimensionFilterBuilder(
queryDefinition.getDataType(), queryDefinition.getSelection());
return FilterFactory.createParallelFilter(workerBuilder, DataMiningActivator.getExecutor());
}
}
@@ -16,14 +16,9 @@ import com.sap.sailing.datamining.impl.components.LeaderboardGroupRetrievalProce
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.deprecated.GroupDividingParallelDataRetriever;
import com.sap.sailing.datamining.impl.workers.builders.deprecated.DataRetrieverWorkerBuilder;
import com.sap.sailing.datamining.shared.DataTypes;
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.FilterCriteria;
import com.sap.sse.datamining.components.ParallelDataRetriever;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.functions.Function;
import com.sap.sse.datamining.impl.DataMiningActivator;
@@ -32,8 +27,6 @@ import com.sap.sse.datamining.impl.criterias.CompoundFilterCriteria;
import com.sap.sse.datamining.impl.criterias.NonFilteringFilterCriteria;
import com.sap.sse.datamining.impl.criterias.NullaryFunctionValuesFilterCriteria;
import com.sap.sse.datamining.shared.dto.FunctionDTO;
import com.sap.sse.datamining.workers.DataRetrievalWorker;
import com.sap.sse.datamining.workers.WorkerBuilder;
public final class DataRetrieverFactory {
@@ -103,13 +96,4 @@ public final class DataRetrieverFactory {
return criteria != null ? criteria : new NonFilteringFilterCriteria<BaseDataType>();
}
/**
* 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);
}
}
@@ -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.deprecated.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);
}
}
@@ -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);
}
}
@@ -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.QueryDefinitionDeprecated;
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(QueryDefinitionDeprecated queryDefinition, ThreadPoolExecutor executor) {
WorkerBuilder<GroupingWorker<DataType>> workerBuilder = createGroupingWorkerBuilder(queryDefinition);
return new PartitioningParallelGrouper<DataType>(workerBuilder, executor);
}
private static <DataType> WorkerBuilder<GroupingWorker<DataType>> createGroupingWorkerBuilder(QueryDefinitionDeprecated 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);
}
}
@@ -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);
}
}
@@ -1,82 +0,0 @@
package com.sap.sailing.datamining.impl.components.deprecated;
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.TrackedLegWithContext;
import com.sap.sailing.datamining.impl.data.TrackedLegOfCompetitorWithContext;
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.common.impl.Util.Pair;
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.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<Pair<TrackedLeg, HasTrackedLegContext>> retrieveDataTillTrackedLeg(LeaderboardGroup group) {
Collection<Pair<TrackedLeg, HasTrackedLegContext>> data = new ArrayList<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 TrackedLegWithContext(group, leaderboard,
courseArea, fleet, trackedRace, trackedLeg, legNumber);
data.add(new Pair<TrackedLeg, HasTrackedLegContext>(trackedLeg, dataContext));
legNumber++;
}
}
}
}
}
}
return data;
}
protected static Collection<Pair<TrackedLegOfCompetitor, HasTrackedLegOfCompetitorContext>> retrieveDataTillTrackedLegOfCompetitor(
LeaderboardGroup group) {
Collection<Pair<TrackedLegOfCompetitor, HasTrackedLegOfCompetitorContext>> data = new ArrayList<Pair<TrackedLegOfCompetitor, HasTrackedLegOfCompetitorContext>>();
Collection<Pair<TrackedLeg, HasTrackedLegContext>> baseData = retrieveDataTillTrackedLeg(group);
for (Pair<TrackedLeg, HasTrackedLegContext> baseDataEntry : baseData) {
TrackedLeg trackedLeg = baseDataEntry.getA();
HasTrackedLegContext trackedLegContext = baseDataEntry.getB();
for (Competitor competitor : trackedLegContext.getRace().getCompetitors()) {
TrackedLegOfCompetitor trackedLegOfCompetitor = trackedLeg.getTrackedLeg(competitor);
HasTrackedLegOfCompetitorContext dataContext = new TrackedLegOfCompetitorWithContext(trackedLegContext,
competitor);
data.add(new Pair<TrackedLegOfCompetitor, HasTrackedLegOfCompetitorContext>(trackedLegOfCompetitor,
dataContext));
}
}
return data;
}
}
@@ -1,48 +0,0 @@
package com.sap.sailing.datamining.impl.components.deprecated;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.sap.sailing.datamining.data.HasGPSFixContext;
import com.sap.sailing.datamining.data.GPSFixWithContext;
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
import com.sap.sailing.datamining.impl.data.GPSFixWithContext;
import com.sap.sailing.datamining.impl.gps_fix.GPSFixWithContextImpl;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
public class GPSFixLeaderboardGroupDataRetrievalWorker extends AbstractLeaderboardGroupDataRetrievalWorker<GPSFixWithContext> {
@Override
public Collection<GPSFixWithContext> doWork() {
Collection<GPSFixWithContext> data = new ArrayList<GPSFixWithContext>();
Collection<Pair<TrackedLegOfCompetitor, HasTrackedLegOfCompetitorContext>> baseData = retrieveDataTillTrackedLegOfCompetitor(getGroup());
for (Pair<TrackedLegOfCompetitor, HasTrackedLegOfCompetitorContext> baseDataEntry : baseData) {
HasGPSFixContext context = new GPSFixWithContext(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;
}
}
@@ -1,54 +0,0 @@
package com.sap.sailing.datamining.impl.components.deprecated;
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));
}
}
@@ -1,13 +0,0 @@
package com.sap.sailing.datamining.impl.components.deprecated;
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();
}
}
@@ -1,24 +0,0 @@
package com.sap.sailing.datamining.impl.components.deprecated;
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.tracked_leg_of_competitor.TrackedLegOfCompetitorWithContextImpl;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
public class TrackedLegOfCompetitorLeaderboardGroupDataRetrievalWorker extends AbstractLeaderboardGroupDataRetrievalWorker<TrackedLegOfCompetitorWithContext> {
@Override
public Collection<TrackedLegOfCompetitorWithContext> doWork() {
Collection<TrackedLegOfCompetitorWithContext> data = new ArrayList<TrackedLegOfCompetitorWithContext>();
Collection<Pair<TrackedLegOfCompetitor, HasTrackedLegOfCompetitorContext>> baseData = retrieveDataTillTrackedLegOfCompetitor(getGroup());
for (Pair<TrackedLegOfCompetitor, HasTrackedLegOfCompetitorContext> baseDataEntry : baseData) {
data.add(new TrackedLegOfCompetitorWithContextImpl(baseDataEntry.getA(), baseDataEntry.getB()));
}
return data;
}
}
@@ -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.HasGPSFixContext;
import com.sap.sailing.datamining.data.GPSFixWithContext;
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.getRegatta().getName();
}
@Override
public String getRaceName() {
return context.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.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;
}
}
@@ -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;
}
}
@@ -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.getRegatta().getName();
}
@Override
public String getRaceName() {
return context.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;
}
}
@@ -1,30 +0,0 @@
package com.sap.sailing.datamining.impl.workers.builders.deprecated;
import com.sap.sailing.datamining.impl.components.deprecated.GPSFixLeaderboardGroupDataRetrievalWorker;
import com.sap.sailing.datamining.impl.components.deprecated.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());
}
}
@@ -1,30 +0,0 @@
package com.sap.sailing.datamining.impl.workers.builders.deprecated;
import com.sap.sailing.datamining.impl.components.deprecated.SpeedInKnotsExtractionWorker;
import com.sap.sailing.datamining.impl.tracked_leg_of_competitor.DistanceTraveledExtractionWorker;
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());
}
}