diff --git a/java/com.sap.sailing.datamining.test/src/com/sap/sailing/datamining/test/TestExtractors.java b/java/com.sap.sailing.datamining.test/src/com/sap/sailing/datamining/test/TestExtractors.java index ccffd4e479f..b96a1aa89c0 100644 --- a/java/com.sap.sailing.datamining.test/src/com/sap/sailing/datamining/test/TestExtractors.java +++ b/java/com.sap.sailing.datamining.test/src/com/sap/sailing/datamining/test/TestExtractors.java @@ -1,37 +1,59 @@ package com.sap.sailing.datamining.test; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; import java.util.Arrays; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import org.junit.Test; -import com.sap.sailing.datamining.Extractor; -import com.sap.sailing.datamining.impl.AbstractExtractor; -import com.sap.sailing.datamining.shared.Unit; +import com.sap.sailing.datamining.ExtractionWorker; +import com.sap.sailing.datamining.WorkReceiver; +import com.sap.sailing.datamining.impl.AbstractExtractionWorker; +import com.sap.sailing.datamining.shared.GenericGroupKey; +import com.sap.sailing.datamining.shared.GroupKey; public class TestExtractors { @Test public void testAbstractExtractor() { - Collection data = Arrays.asList("Fu", "Bar", "Blub"); - Extractor lengthExtractor = new LengthExtractor(); - Collection expectedExtractedData = Arrays.asList(2, 3, 4); - assertEquals(expectedExtractedData, lengthExtractor.extract(data)); + ExtractionWorker lengthExtractor = new LengthExtractor(); + DataReceiver receiver = new DataReceiver(); + lengthExtractor.setReceiver(receiver); + + Collection dataEntries = Arrays.asList("Fu", "Bar", "Blub"); + Map> data = new HashMap>(); + data.put(new GenericGroupKey(100), dataEntries); + lengthExtractor.setDataToExtractFrom(data); + + + Collection expectedExtractedDataEntries = Arrays.asList(2, 3, 4); + Map> expectedExtractedData = new HashMap>(); + expectedExtractedData.put(new GenericGroupKey(100), expectedExtractedDataEntries); + lengthExtractor.run(); + assertEquals(expectedExtractedData, receiver.result); } - private class LengthExtractor extends AbstractExtractor { + private class LengthExtractor extends AbstractExtractionWorker { - public LengthExtractor() { - super("", Unit.None, 0); - } + @Override + public Integer extract(String dataEntry) { + return dataEntry.length(); + } - @Override - public Integer extract(String dataEntry) { - return dataEntry.length(); - } - + } + + private class DataReceiver implements WorkReceiver>> { + + public Map> result; + + @Override + public void receiveWork(Map> result) { + this.result = result; + } + } } diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/DataMiningFactory.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/DataMiningFactory.java index a3f91db99bc..e5c20de1325 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/DataMiningFactory.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/DataMiningFactory.java @@ -25,7 +25,7 @@ public final class DataMiningFactory { ParallelFilter filter = createFilter(queryDefinition); ParallelGrouper grouper = GrouperFactory.createGrouper(queryDefinition, executor); - Extractor extractor = ExtractorFactory.createExtractor(queryDefinition.getStatisticType()); + ParallelExtractor extractor = ExtractorFactory.createExtractor(queryDefinition.getStatisticType(), executor); Aggregator aggregator = AggregatorFactory.createAggregator(queryDefinition.getStatisticType(), queryDefinition.getAggregatorType()); return new QueryImpl(retriever, filter, grouper, extractor, aggregator); diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/ExtractionWorker.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/ExtractionWorker.java new file mode 100644 index 00000000000..b44e9070f1b --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/ExtractionWorker.java @@ -0,0 +1,12 @@ +package com.sap.sailing.datamining; + +import java.util.Collection; +import java.util.Map; + +import com.sap.sailing.datamining.shared.GroupKey; + +public interface ExtractionWorker extends ComponentWorker>> { + + public void setDataToExtractFrom(Map> data); + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Extractor.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Extractor.java deleted file mode 100644 index 9a64e48d2cf..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Extractor.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.sap.sailing.datamining; - -import java.util.Collection; - -import com.sap.sailing.datamining.shared.Unit; - -public interface Extractor { - - public String getSignifier(); - - public Unit getUnit(); - - public int getValueDecimals(); - - public Collection extract(Collection dataEntry); - - public ExtractedType extract(DataType dataEntry); - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/ParallelExtractor.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/ParallelExtractor.java new file mode 100644 index 00000000000..fabe27a86c6 --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/ParallelExtractor.java @@ -0,0 +1,19 @@ +package com.sap.sailing.datamining; + +import java.util.Collection; +import java.util.Map; + +import com.sap.sailing.datamining.impl.ParallelComponent; +import com.sap.sailing.datamining.shared.GroupKey; +import com.sap.sailing.datamining.shared.Unit; + +public interface ParallelExtractor extends ParallelComponent>, + Map>> { + + public Unit getUnit(); + + public int getValueDecimals(); + + public String getSignifier(); + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/SimpleParallelGrouper.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/PartitioningParallelGrouper.java similarity index 82% rename from java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/SimpleParallelGrouper.java rename to java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/PartitioningParallelGrouper.java index ae897823731..af62fcbcde2 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/SimpleParallelGrouper.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/PartitioningParallelGrouper.java @@ -12,12 +12,12 @@ import java.util.concurrent.ThreadPoolExecutor; import com.sap.sailing.datamining.impl.AbstractParallelComponent; import com.sap.sailing.datamining.shared.GroupKey; -public class SimpleParallelGrouper extends AbstractParallelComponent, Map>> - implements ParallelGrouper { +public class PartitioningParallelGrouper extends AbstractParallelComponent, Map>> + implements ParallelGrouper { private WorkerBuilder> workerBuilder; - public SimpleParallelGrouper(WorkerBuilder> workerBuilder, ThreadPoolExecutor executor) { + public PartitioningParallelGrouper(WorkerBuilder> workerBuilder, ThreadPoolExecutor executor) { super(executor); this.workerBuilder = workerBuilder; } diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/builders/ExtractionWorkerBuilder.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/builders/ExtractionWorkerBuilder.java new file mode 100644 index 00000000000..8e5059ff9c1 --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/builders/ExtractionWorkerBuilder.java @@ -0,0 +1,30 @@ +package com.sap.sailing.datamining.builders; + +import com.sap.sailing.datamining.ExtractionWorker; +import com.sap.sailing.datamining.WorkerBuilder; +import com.sap.sailing.datamining.impl.SpeedInKnotsExtractor; +import com.sap.sailing.datamining.impl.trackedLegOfCompetitor.DistanceTraveledExtractor; +import com.sap.sailing.datamining.shared.Components.StatisticType; + +public class ExtractionWorkerBuilder implements WorkerBuilder> { + + private StatisticType statisticType; + + public ExtractionWorkerBuilder(StatisticType statisticType) { + this.statisticType = statisticType; + } + + @Override + @SuppressWarnings("unchecked") + public ExtractionWorker build() { + switch (statisticType) { + case Speed: + return (ExtractionWorker) new SpeedInKnotsExtractor(); + case Distance_TrackedLegOfCompetitor: + return (ExtractionWorker) new DistanceTraveledExtractor(); + } + throw new IllegalArgumentException("Not yet implemented for the given statistic type: " + + statisticType.toString()); + } + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/DataRetrieverFactory.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/DataRetrieverFactory.java index 32dc2a1185d..de7fac2d90c 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/DataRetrieverFactory.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/DataRetrieverFactory.java @@ -6,7 +6,7 @@ import com.sap.sailing.datamining.ParallelDataRetriever; import com.sap.sailing.datamining.DataRetrievalWorker; import com.sap.sailing.datamining.WorkerBuilder; import com.sap.sailing.datamining.builders.DataRetrieverWorkerBuilder; -import com.sap.sailing.datamining.impl.SimpleParallelDataRetriever; +import com.sap.sailing.datamining.impl.GroupDividingParallelDataRetriever; import com.sap.sailing.datamining.shared.DataTypes; public final class DataRetrieverFactory { @@ -21,7 +21,7 @@ public final class DataRetrieverFactory { */ public static ParallelDataRetriever createDataRetriever(DataTypes dataType, ThreadPoolExecutor executor) { WorkerBuilder> workerBuilder = new DataRetrieverWorkerBuilder(dataType); - return new SimpleParallelDataRetriever(workerBuilder, executor); + return new GroupDividingParallelDataRetriever(workerBuilder, executor); } } diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/ExtractorFactory.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/ExtractorFactory.java index f9c44e08476..4614751443b 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/ExtractorFactory.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/ExtractorFactory.java @@ -1,36 +1,22 @@ package com.sap.sailing.datamining.factories; -import com.sap.sailing.datamining.Extractor; -import com.sap.sailing.datamining.impl.DataAmountExtractor; -import com.sap.sailing.datamining.impl.SpeedInKnotsExtractor; -import com.sap.sailing.datamining.impl.trackedLegOfCompetitor.DistanceTraveledExtractor; +import java.util.concurrent.ThreadPoolExecutor; + +import com.sap.sailing.datamining.ExtractionWorker; +import com.sap.sailing.datamining.ParallelExtractor; +import com.sap.sailing.datamining.WorkerBuilder; +import com.sap.sailing.datamining.builders.ExtractionWorkerBuilder; +import com.sap.sailing.datamining.impl.GroupDividingParallelExtractor; import com.sap.sailing.datamining.shared.Components.StatisticType; -import com.sap.sailing.domain.base.Moving; public final class ExtractorFactory { private ExtractorFactory() { } - @SuppressWarnings("unchecked") - public static Extractor createExtractor(StatisticType statisticType) { - switch (statisticType) { - case DataAmount: - return (Extractor) createDataAmountExtractor(); - case Speed: - return (Extractor) createSpeedExtractor(); - case Distance_TrackedLegOfCompetitor: - return (Extractor) new DistanceTraveledExtractor(); - } - throw new IllegalArgumentException("Not yet implemented for the given statistic type: " - + statisticType.toString()); - } - - public static Extractor createSpeedExtractor() { - return new SpeedInKnotsExtractor(); - } - - public static Extractor createDataAmountExtractor() { - return new DataAmountExtractor(); + public static ParallelExtractor createExtractor(StatisticType statisticType, ThreadPoolExecutor executor) { + WorkerBuilder> workerBuilder = new ExtractionWorkerBuilder(statisticType); + return new GroupDividingParallelExtractor(statisticType.getSignifier(), statisticType.getUnit(), statisticType.getValueDecimals(), + workerBuilder, executor); } } diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/FilterFactory.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/FilterFactory.java index e28c0dcc743..6a51e5a106a 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/FilterFactory.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/FilterFactory.java @@ -14,7 +14,7 @@ import com.sap.sailing.datamining.builders.FilterByCriteriaBuilder; import com.sap.sailing.datamining.data.impl.NoFilter; import com.sap.sailing.datamining.dimensions.DimensionManager; import com.sap.sailing.datamining.dimensions.DimensionManagerProvider; -import com.sap.sailing.datamining.impl.SimpleParallelFilter; +import com.sap.sailing.datamining.impl.PartitioningParallelFilter; import com.sap.sailing.datamining.impl.criterias.AndCompoundFilterCriteria; import com.sap.sailing.datamining.impl.criterias.CompoundFilterCriteria; import com.sap.sailing.datamining.impl.criterias.DimensionValuesFilterCriteria; @@ -26,7 +26,7 @@ public final class FilterFactory { private FilterFactory() { } public static ParallelFilter createParallelFilter(WorkerBuilder> workerBuilder, ThreadPoolExecutor executor) { - return new SimpleParallelFilter(workerBuilder, executor); + return new PartitioningParallelFilter(workerBuilder, executor); } public static WorkerBuilder> createDimensionFilterBuilder(DataTypes dataType, Map> selection) { diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/GrouperFactory.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/GrouperFactory.java index b2a686f8574..141e0907a55 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/GrouperFactory.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/GrouperFactory.java @@ -9,7 +9,7 @@ import com.sap.sailing.datamining.BaseBindingProvider; import com.sap.sailing.datamining.Dimension; import com.sap.sailing.datamining.GroupingWorker; import com.sap.sailing.datamining.ParallelGrouper; -import com.sap.sailing.datamining.SimpleParallelGrouper; +import com.sap.sailing.datamining.PartitioningParallelGrouper; import com.sap.sailing.datamining.WorkerBuilder; import com.sap.sailing.datamining.builders.DynamicGrouperBuilder; import com.sap.sailing.datamining.builders.GroupByDimensionBuilder; @@ -26,7 +26,7 @@ public final class GrouperFactory { public static ParallelGrouper createGrouper(QueryDefinition queryDefinition, ThreadPoolExecutor executor) { WorkerBuilder> workerBuilder = createGroupingWorkerBuilder(queryDefinition); - return new SimpleParallelGrouper(workerBuilder, executor); + return new PartitioningParallelGrouper(workerBuilder, executor); } private static WorkerBuilder> createGroupingWorkerBuilder(QueryDefinition queryDefinition) { diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/AbstractExtractionWorker.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/AbstractExtractionWorker.java new file mode 100644 index 00000000000..e9cfaca10bc --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/AbstractExtractionWorker.java @@ -0,0 +1,43 @@ +package com.sap.sailing.datamining.impl; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import com.sap.sailing.datamining.ExtractionWorker; +import com.sap.sailing.datamining.shared.GroupKey; + +public abstract class AbstractExtractionWorker extends AbstractComponentWorker>> + implements ExtractionWorker { + + private Map> data; + + @Override + public void setDataToExtractFrom(Map> data) { + this.data = data; + } + + @Override + protected Map> doWork() { + Map> extractedData = new HashMap>(); + for (Entry> dataEntry : data.entrySet()) { + GroupKey key = dataEntry.getKey(); + if (!extractedData.containsKey(key)) { + extractedData.put(key, new ArrayList()); + }; + + for (DataType dateElement : dataEntry.getValue()) { + ExtractedType extractedDataElement = extract(dateElement); + if (extractedDataElement != null) { + extractedData.get(key).add(extractedDataElement); + } + } + } + return extractedData; + } + + protected abstract ExtractedType extract(DataType dataEntry); + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/AbstractExtractor.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/AbstractExtractor.java deleted file mode 100644 index 93b7ad8b840..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/AbstractExtractor.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.sap.sailing.datamining.impl; - -import java.util.ArrayList; -import java.util.Collection; - -import com.sap.sailing.datamining.Extractor; -import com.sap.sailing.datamining.shared.Unit; - -public abstract class AbstractExtractor implements Extractor { - - private String signifier; - private Unit unit; - private int valueDecimals; - - public AbstractExtractor(String signifier, Unit unit, int valueDecimals) { - this.signifier = signifier; - this.unit = unit; - this.valueDecimals = valueDecimals; - } - - @Override - public String getSignifier() { - return signifier; - } - - @Override - public Unit getUnit() { - return unit; - } - - @Override - public int getValueDecimals() { - return valueDecimals; - } - - @Override - public Collection extract(Collection data) { - Collection extractedData = new ArrayList(); - for (DataType dataEntry : data) { - ExtractedType extractedDataEntry = extract(dataEntry); - if (extractedDataEntry != null) { - extractedData.add(extractedDataEntry); - } - } - return extractedData; - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/AbstractGrouper.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/AbstractGroupingWorker.java similarity index 82% rename from java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/AbstractGrouper.java rename to java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/AbstractGroupingWorker.java index 01901f91996..cc9ad148667 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/AbstractGrouper.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/AbstractGroupingWorker.java @@ -8,8 +8,8 @@ import java.util.Map; import com.sap.sailing.datamining.GroupingWorker; import com.sap.sailing.datamining.shared.GroupKey; -public abstract class AbstractGrouper extends AbstractComponentWorker>> - implements GroupingWorker { +public abstract class AbstractGroupingWorker extends AbstractComponentWorker>> + implements GroupingWorker { private Collection data; diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/DataAmountExtractor.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/DataAmountExtractor.java deleted file mode 100644 index 5ddc0ff1d69..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/DataAmountExtractor.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.sap.sailing.datamining.impl; - -import java.util.ArrayList; -import java.util.Collection; - -import com.sap.sailing.datamining.shared.Unit; - -public class DataAmountExtractor extends AbstractExtractor { - - public DataAmountExtractor() { - super("amount of fixes", Unit.None, 0); - } - - @Override - public Collection extract(Collection data) { - Collection extractedData = new ArrayList(); - extractedData.add(data.size()); - return extractedData; - } - - @Override - public Integer extract(DataType dataEntry) { - return 1; - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/DynamicGrouper.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/DynamicGrouper.java index b7fc2d05d13..7ccf044d2c5 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/DynamicGrouper.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/DynamicGrouper.java @@ -8,7 +8,7 @@ import com.sap.sailing.datamining.BaseBindingProvider; import com.sap.sailing.datamining.shared.GenericGroupKey; import com.sap.sailing.datamining.shared.GroupKey; -public class DynamicGrouper extends AbstractGrouper { +public class DynamicGrouper extends AbstractGroupingWorker { private Script script; private Binding binding; diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/GroupByDimension.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/GroupByDimension.java index 90c697f2b45..3760c8f9fe1 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/GroupByDimension.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/GroupByDimension.java @@ -9,7 +9,7 @@ import com.sap.sailing.datamining.shared.CompoundGroupKey; import com.sap.sailing.datamining.shared.GenericGroupKey; import com.sap.sailing.datamining.shared.GroupKey; -public class GroupByDimension extends AbstractGrouper { +public class GroupByDimension extends AbstractGroupingWorker { private Collection> dimensions; diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/SimpleParallelDataRetriever.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/GroupDividingParallelDataRetriever.java similarity index 70% rename from java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/SimpleParallelDataRetriever.java rename to java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/GroupDividingParallelDataRetriever.java index b7d439c30d9..0521e097569 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/SimpleParallelDataRetriever.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/GroupDividingParallelDataRetriever.java @@ -12,16 +12,12 @@ import com.sap.sailing.datamining.WorkerBuilder; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; import com.sap.sailing.server.RacingEventService; -public class SimpleParallelDataRetriever extends AbstractParallelComponent> - implements ParallelDataRetriever { +public class GroupDividingParallelDataRetriever extends AbstractParallelComponent> + implements ParallelDataRetriever { private WorkerBuilder> workerBuilder; - /** - * Creates a new parallel working data retriever with the given executer and data retriever as base for the workers. - * If a new worker is needed, the worker base will be cloned. - */ - public SimpleParallelDataRetriever(WorkerBuilder> workerBuilder, ThreadPoolExecutor executor) { + public GroupDividingParallelDataRetriever(WorkerBuilder> workerBuilder, ThreadPoolExecutor executor) { super(executor); this.workerBuilder = workerBuilder; } diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/GroupDividingParallelExtractor.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/GroupDividingParallelExtractor.java new file mode 100644 index 00000000000..624bb694a0a --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/GroupDividingParallelExtractor.java @@ -0,0 +1,74 @@ +package com.sap.sailing.datamining.impl; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ThreadPoolExecutor; + +import com.sap.sailing.datamining.ExtractionWorker; +import com.sap.sailing.datamining.ParallelExtractor; +import com.sap.sailing.datamining.WorkerBuilder; +import com.sap.sailing.datamining.shared.GroupKey; +import com.sap.sailing.datamining.shared.Unit; + +public class GroupDividingParallelExtractor extends AbstractParallelComponent>, + Map>> + implements ParallelExtractor { + + private String signifier; + private Unit unit; + private int valueDecimals; + + private WorkerBuilder> workerBuilder; + + public GroupDividingParallelExtractor(String signifier, Unit unit, int valueDecimals, + WorkerBuilder> workerBuilder, ThreadPoolExecutor executor) { + super(executor); + this.signifier = signifier; + this.unit = unit; + this.valueDecimals = valueDecimals; + this.workerBuilder = workerBuilder; + } + + @Override + protected void setUpWorkersFor(Map> data) { + for (Entry> entry : data.entrySet()) { + ExtractionWorker worker = workerBuilder.build(); + worker.setReceiver(this); + + Map> dataToExtractFrom = new HashMap>(); + dataToExtractFrom.put(entry.getKey(), entry.getValue()); + worker.setDataToExtractFrom(dataToExtractFrom); + + addWorker(worker); + } + } + + @Override + protected Map> finalizeData() { + Map> data = new HashMap>(); + for (Map> result : getResults()) { + data.putAll(result); + } + return Collections.unmodifiableMap(new ConcurrentHashMap>(data)); + } + + @Override + public String getSignifier() { + return signifier; + } + + @Override + public Unit getUnit() { + return unit; + } + + @Override + public int getValueDecimals() { + return valueDecimals; + } + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/SimpleParallelFilter.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/PartitioningParallelFilter.java similarity index 82% rename from java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/SimpleParallelFilter.java rename to java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/PartitioningParallelFilter.java index 1cfc0836064..79bda99d660 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/SimpleParallelFilter.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/PartitioningParallelFilter.java @@ -11,12 +11,12 @@ import com.sap.sailing.datamining.FiltrationWorker; import com.sap.sailing.datamining.ParallelFilter; import com.sap.sailing.datamining.WorkerBuilder; -public class SimpleParallelFilter extends AbstractParallelComponent, Collection> - implements ParallelFilter { +public class PartitioningParallelFilter extends AbstractParallelComponent, Collection> + implements ParallelFilter { private final WorkerBuilder> workerBuilder; - public SimpleParallelFilter(WorkerBuilder> workerBuilder, ThreadPoolExecutor executor) { + public PartitioningParallelFilter(WorkerBuilder> workerBuilder, ThreadPoolExecutor executor) { super(executor); this.workerBuilder = workerBuilder; } diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/QueryImpl.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/QueryImpl.java index f42d1957b33..0790f789bb3 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/QueryImpl.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/QueryImpl.java @@ -6,8 +6,8 @@ import java.util.Map.Entry; import java.util.concurrent.ExecutionException; import com.sap.sailing.datamining.Aggregator; -import com.sap.sailing.datamining.Extractor; import com.sap.sailing.datamining.ParallelDataRetriever; +import com.sap.sailing.datamining.ParallelExtractor; import com.sap.sailing.datamining.ParallelFilter; import com.sap.sailing.datamining.ParallelGrouper; import com.sap.sailing.datamining.Query; @@ -22,10 +22,10 @@ public class QueryImpl implements Query private ParallelFilter filter; private ParallelGrouper grouper; - private Extractor extractor; + private ParallelExtractor extractor; private Aggregator aggregator; - public QueryImpl(ParallelDataRetriever retriever, ParallelFilter filter, ParallelGrouper grouper, Extractor extractor, Aggregator aggregator) { + public QueryImpl(ParallelDataRetriever retriever, ParallelFilter filter, ParallelGrouper grouper, ParallelExtractor extractor, Aggregator aggregator) { this.retriever = retriever; this.filter = filter; this.grouper = grouper; @@ -39,12 +39,13 @@ public class QueryImpl implements Query Collection retrievedData = retriever.start(racingEventService).get(); Collection filteredData = filter.start(retrievedData).get(); + Map> groupedData = grouper.start(filteredData).get(); + Map> extractedData = extractor.start(groupedData).get(); + QueryResultImpl result = new QueryResultImpl(retrievedData.size(), filteredData.size(), createResultSignifier(), extractor.getUnit(), extractor.getValueDecimals()); - Map> groupedFixes = grouper.start(filteredData).get(); - for (Entry> groupEntry : groupedFixes.entrySet()) { - Collection extractedData = extractor.extract(groupEntry.getValue()); - AggregatedType aggregatedData = aggregator.aggregate(extractedData); - result.addResult(groupEntry.getKey(), aggregatedData); + for (Entry> extractedEntry : extractedData.entrySet()) { + AggregatedType aggregatedData = aggregator.aggregate(extractedEntry.getValue()); + result.addResult(extractedEntry.getKey(), aggregatedData); } final long endTime = System.nanoTime(); diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/SpeedInKnotsExtractor.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/SpeedInKnotsExtractor.java index e3aa46786e9..7c2f6c58e95 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/SpeedInKnotsExtractor.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/SpeedInKnotsExtractor.java @@ -1,13 +1,8 @@ package com.sap.sailing.datamining.impl; -import com.sap.sailing.datamining.shared.Unit; import com.sap.sailing.domain.base.Moving; -public class SpeedInKnotsExtractor extends AbstractExtractor { - - public SpeedInKnotsExtractor() { - super("speed in knots", Unit.Knots, 2); - } +public class SpeedInKnotsExtractor extends AbstractExtractionWorker { @Override public Double extract(Moving dataEntry) { diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/trackedLegOfCompetitor/DistanceTraveledExtractor.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/trackedLegOfCompetitor/DistanceTraveledExtractor.java index 2582340e53b..d67e913a64b 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/trackedLegOfCompetitor/DistanceTraveledExtractor.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/trackedLegOfCompetitor/DistanceTraveledExtractor.java @@ -1,15 +1,10 @@ package com.sap.sailing.datamining.impl.trackedLegOfCompetitor; import com.sap.sailing.datamining.data.TrackedLegOfCompetitorWithContext; -import com.sap.sailing.datamining.impl.AbstractExtractor; -import com.sap.sailing.datamining.shared.Unit; +import com.sap.sailing.datamining.impl.AbstractExtractionWorker; import com.sap.sailing.domain.common.Distance; -public class DistanceTraveledExtractor extends AbstractExtractor { - - public DistanceTraveledExtractor() { - super("distance in meters", Unit.Meters, 2); - } +public class DistanceTraveledExtractor extends AbstractExtractionWorker { @Override public Double extract(TrackedLegOfCompetitorWithContext dataEntry) { diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/shared/Components.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/shared/Components.java index 27966dde369..24a3e3cfddd 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/shared/Components.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/shared/Components.java @@ -10,23 +10,42 @@ public final class Components { Sum, Average, Median } + public static enum ValueType { + Integer, Double + } + public enum StatisticType { - DataAmount(ValueType.Integer), Speed(ValueType.Double), Distance_TrackedLegOfCompetitor(ValueType.Double); - - public static enum ValueType { - Integer, Double - } + Speed(ValueType.Double, "speed in knots", Unit.Knots, 2), + Distance_TrackedLegOfCompetitor(ValueType.Double, "distance in meters", Unit.Meters, 2); private ValueType valueType; + private String signifier; + private Unit unit; + private int valueDecimals; - private StatisticType(ValueType valueType) { + private StatisticType(ValueType valueType, String signifier, Unit unit, int valueDecimals) { this.valueType = valueType; + this.signifier = signifier; + this.unit = unit; + this.valueDecimals = valueDecimals; } public ValueType getValueType() { return valueType; } + + public String getSignifier() { + return signifier; + } + + public Unit getUnit() { + return unit; + } + + public int getValueDecimals() { + return valueDecimals; + } } diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT.launch b/java/com.sap.sailing.gwt.ui/SailingGWT.launch index 16c65f0e0b3..3d50fff92ec 100755 --- a/java/com.sap.sailing.gwt.ui/SailingGWT.launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT.launch @@ -48,7 +48,7 @@ - + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/SimpleQueryDefinitionProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/SimpleQueryDefinitionProvider.java index 41f53d049b9..ec7cf031a4d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/SimpleQueryDefinitionProvider.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/SimpleQueryDefinitionProvider.java @@ -145,11 +145,10 @@ public class SimpleQueryDefinitionProvider extends AbstractQueryDefinitionProvid notifyQueryDefinitionChanged(); } }); - statisticsProvider.addStatistic(StatisticType.DataAmount, AggregatorType.Sum, DataTypes.GPSFix); statisticsProvider.addStatistic(StatisticType.Speed, AggregatorType.Average, DataTypes.GPSFix); statisticsProvider.addStatistic(StatisticType.Distance_TrackedLegOfCompetitor, AggregatorType.Sum, DataTypes.TrackedLegOfCompetitor); statisticsProvider.addStatistic(StatisticType.Distance_TrackedLegOfCompetitor, AggregatorType.Average, DataTypes.TrackedLegOfCompetitor); - statisticsListBox.setValue(statisticsProvider.getStatistic(StatisticType.DataAmount, AggregatorType.Sum, DataTypes.GPSFix), false); + statisticsListBox.setValue(statisticsProvider.getStatistic(StatisticType.Speed, AggregatorType.Average, DataTypes.GPSFix), false); statisticsListBox.setAcceptableValues(statisticsProvider.getAllStatistics()); functionsPanel.add(statisticsListBox);