diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataMiningFactory.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataMiningFactory.java index 741ee870614..197055bf5af 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataMiningFactory.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataMiningFactory.java @@ -17,14 +17,12 @@ import com.sap.sse.datamining.DataRetrieverChainDefinition; import com.sap.sse.datamining.Query; import com.sap.sse.datamining.components.FilterCriterion; import com.sap.sse.datamining.components.Processor; -import com.sap.sse.datamining.factories.FunctionFactory; 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.DataRetrieverChainDefinitionRegistry; -import com.sap.sse.datamining.impl.DataRetrieverTypeWithInformation; import com.sap.sse.datamining.impl.ProcessorQuery; import com.sap.sse.datamining.impl.components.GroupedDataEntry; import com.sap.sse.datamining.impl.criterias.AndCompoundFilterCriterion; @@ -38,14 +36,12 @@ import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO; public class SailingDataMiningFactory { private final ProcessorFactory processorFactory; - private final FunctionFactory functionFactory; private final FunctionProvider functionProvider; private final DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry; public SailingDataMiningFactory(FunctionProvider functionProvider, DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry) { processorFactory = new ProcessorFactory(DataMiningActivator.getExecutor()); - functionFactory = new FunctionFactory(); this.functionProvider = functionProvider; this.dataRetrieverChainDefinitionRegistry = dataRetrieverChainDefinitionRegistry; @@ -126,7 +122,7 @@ public class SailingDataMiningFactory { DataRetrieverChainDefinition dataRetrieverChainDefinition = dataRetrieverChainDefinitionRegistry.getDataRetrieverChainDefinition(RacingEventService.class, dataRetrieverChainDefinitionDTO.getId()); DataRetrieverChainBuilder chainBuilder = dataRetrieverChainDefinition.startBuilding(DataMiningActivator.getExecutor()); - Collection> dimensions = getDimensionsOf(dataRetrieverChainDefinition); + Collection> dimensions = functionProvider.getMinimizedDimensionsFor(dataRetrieverChainDefinition); Map, Collection>> dimensionsMappedByDeclaringType = mapFunctionsByDeclaringType(dimensions); while (!dimensionsMappedByDeclaringType.isEmpty()) { Class dataType = chainBuilder.getCurrentRetrievedDataType(); @@ -150,39 +146,6 @@ public class SailingDataMiningFactory { }; } - private Collection> getDimensionsOf( - DataRetrieverChainDefinition dataRetrieverChainDefinition) { - Collection> dimensions = new HashSet<>(); - List> dataRetrieverTypesWithInformation = dataRetrieverChainDefinition.getDataRetrieverTypesWithInformation(); - for (int i = dataRetrieverTypesWithInformation.size() - 1; i >= 0; i--) { - DataRetrieverTypeWithInformation dataRetrieverTypeWithInformation = dataRetrieverTypesWithInformation.get(i); - Collection> dimensionsOfDataType = functionProvider.getDimensionsFor(dataRetrieverTypeWithInformation.getRetrievedDataType()); - - if (!dimensions.isEmpty()) { - Map, Function> dimensionsMappedByTrimmedDimensions = trimFirstMethodAndMapOriginal(dimensions); - for (Function dimensionOfDataType : dimensionsOfDataType) { - if (dimensionsMappedByTrimmedDimensions.containsKey(dimensionOfDataType)) { - dimensions.remove(dimensionsMappedByTrimmedDimensions.get(dimensionOfDataType)); - } - } - } - - dimensions.addAll(dimensionsOfDataType); - } - return dimensions; - } - - private Map, Function> trimFirstMethodAndMapOriginal(Collection> dimensions) { - Map, Function> dimensionsMappedByTrimmedDimensions = new HashMap<>(); - for (Function dimension : dimensions) { - Function trimmedDimension = functionFactory.trimFirstMethod(dimension); - if (trimmedDimension != null) { - dimensionsMappedByTrimmedDimensions.put(trimmedDimension, dimension); - } - } - return dimensionsMappedByTrimmedDimensions; - } - private Map, Collection>> mapFunctionsByDeclaringType(Collection> functions) { Map, Collection>> mappedFunctions = new HashMap<>(); for (Function function : functions) { diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionProvider.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionProvider.java index da885e89836..19ecfded7e8 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionProvider.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionProvider.java @@ -13,12 +13,16 @@ import java.util.Locale; import org.junit.Before; import org.junit.Test; +import com.sap.sse.datamining.DataRetrieverChainDefinition; +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.functions.FunctionRegistry; import com.sap.sse.datamining.i18n.DataMiningStringMessages; +import com.sap.sse.datamining.impl.SimpleDataRetrieverChainDefinition; import com.sap.sse.datamining.shared.dto.FunctionDTO; import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Named; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Regatta; import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegOfCompetitorContext; import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegOfCompetitorContextImpl; import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContext; @@ -28,6 +32,9 @@ import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryCl import com.sap.sse.datamining.test.util.ExpectedFunctionRegistryUtil; import com.sap.sse.datamining.test.util.FunctionTestsUtil; import com.sap.sse.datamining.test.util.TestsUtil; +import com.sap.sse.datamining.test.util.components.TestLegOfCompetitorWithContextRetrievalProcessor; +import com.sap.sse.datamining.test.util.components.TestRaceWithContextRetrievalProcessor; +import com.sap.sse.datamining.test.util.components.TestRegattaRetrievalProcessor; public class TestFunctionProvider { @@ -71,6 +78,37 @@ public class TestFunctionProvider { assertThat(functionProvider.getDimensionsFor(Test_HasLegOfCompetitorContextImpl.class), is(expectedDimensions)); } + @Test + public void testGetDimensionsForDataRetrieverChainDefinition() { + FunctionProvider functionProvider = new RegistryFunctionProvider(functionRegistry); + DataRetrieverChainDefinition> dataRetrieverChainDefinition = createDataRetrieverChainDefinition(); + + Collection> expectedDimensions = functionRegistryUtil.getExpectedDimensionsFor(Test_HasRaceContext.class); + expectedDimensions.addAll(functionRegistryUtil.getExpectedDimensionsFor(Test_HasLegOfCompetitorContext.class)); + assertThat(functionProvider.getMinimizedDimensionsFor(dataRetrieverChainDefinition), is(expectedDimensions)); + } + + @SuppressWarnings("unchecked") + public DataRetrieverChainDefinition> createDataRetrieverChainDefinition() { + DataRetrieverChainDefinition> dataRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>((Class>)(Class) Collection.class, "TestRetrieverChain"); + Class, Test_Regatta>> regattaRetrieverClass = (Class, Test_Regatta>>)(Class) TestRegattaRetrievalProcessor.class; + dataRetrieverChainDefinition.startWith(regattaRetrieverClass, Test_Regatta.class); + + Class> raceRetrieverClass = + (Class>)(Class) TestRaceWithContextRetrievalProcessor.class; + dataRetrieverChainDefinition.addAsLast(regattaRetrieverClass, + raceRetrieverClass, + Test_HasRaceContext.class); + + Class> legRetrieverClass = + (Class>)(Class) TestLegOfCompetitorWithContextRetrievalProcessor.class; + dataRetrieverChainDefinition.addAsLast(raceRetrieverClass, + legRetrieverClass, + Test_HasLegOfCompetitorContext.class); + + return dataRetrieverChainDefinition; + } + @Test public void testGetStatisticsForType() { FunctionProvider functionProvider = new RegistryFunctionProvider(functionRegistry); diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionProvider.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionProvider.java index 2d62b06d690..3f8d2fe4df8 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionProvider.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionProvider.java @@ -2,6 +2,7 @@ package com.sap.sse.datamining.functions; import java.util.Collection; +import com.sap.sse.datamining.DataRetrieverChainDefinition; import com.sap.sse.datamining.shared.dto.FunctionDTO; public interface FunctionProvider { @@ -14,6 +15,9 @@ public interface FunctionProvider { public Collection> getDimensionsFor(Class sourceType); + public Collection> getMinimizedDimensionsFor( + DataRetrieverChainDefinition dataRetrieverChainDefinition); + /** * @return The first function, that matches the given DTO or null */ diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/RegistryFunctionProvider.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/RegistryFunctionProvider.java index 10fe000bb79..cbc5755ad92 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/RegistryFunctionProvider.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/RegistryFunctionProvider.java @@ -2,15 +2,21 @@ package com.sap.sse.datamining.impl.functions; import java.util.Arrays; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; +import java.util.List; +import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; +import com.sap.sse.datamining.DataRetrieverChainDefinition; import com.sap.sse.datamining.components.FilterCriterion; import com.sap.sse.datamining.factories.FunctionDTOFactory; +import com.sap.sse.datamining.factories.FunctionFactory; import com.sap.sse.datamining.functions.Function; import com.sap.sse.datamining.functions.FunctionProvider; import com.sap.sse.datamining.functions.FunctionRegistry; +import com.sap.sse.datamining.impl.DataRetrieverTypeWithInformation; import com.sap.sse.datamining.impl.functions.criterias.FunctionMatchesDTOFilterCriterion; import com.sap.sse.datamining.shared.dto.FunctionDTO; @@ -42,6 +48,7 @@ public class RegistryFunctionProvider implements FunctionProvider { private static final Logger LOGGER = Logger.getLogger(RegistryFunctionProvider.class.getName()); + private final FunctionFactory functionFactory; private final FunctionDTOFactory functionDTOFactory; private final Collection functionRegistries; @@ -50,6 +57,7 @@ public class RegistryFunctionProvider implements FunctionProvider { } public RegistryFunctionProvider(Collection functionRegistries) { + functionFactory = new FunctionFactory(); functionDTOFactory = new FunctionDTOFactory(); this.functionRegistries = new HashSet<>(functionRegistries); } @@ -73,6 +81,39 @@ public class RegistryFunctionProvider implements FunctionProvider { return getFunctionsFor(sourceType, FunctionRetrievalStrategies.Dimensions); } + @Override + public Collection> getMinimizedDimensionsFor(DataRetrieverChainDefinition dataRetrieverChainDefinition) { + Collection> dimensions = new HashSet<>(); + List> dataRetrieverTypesWithInformation = dataRetrieverChainDefinition.getDataRetrieverTypesWithInformation(); + for (int i = dataRetrieverTypesWithInformation.size() - 1; i >= 0; i--) { + DataRetrieverTypeWithInformation dataRetrieverTypeWithInformation = dataRetrieverTypesWithInformation.get(i); + Collection> dimensionsOfDataType = getDimensionsFor(dataRetrieverTypeWithInformation.getRetrievedDataType()); + + if (!dimensions.isEmpty()) { + Map, Function> dimensionsMappedByTrimmedDimensions = trimFirstMethodAndMapOriginal(dimensions); + for (Function dimensionOfDataType : dimensionsOfDataType) { + if (dimensionsMappedByTrimmedDimensions.containsKey(dimensionOfDataType)) { + dimensions.remove(dimensionsMappedByTrimmedDimensions.get(dimensionOfDataType)); + } + } + } + + dimensions.addAll(dimensionsOfDataType); + } + return dimensions; + } + + private Map, Function> trimFirstMethodAndMapOriginal(Collection> dimensions) { + Map, Function> dimensionsMappedByTrimmedDimensions = new HashMap<>(); + for (Function dimension : dimensions) { + Function trimmedDimension = functionFactory.trimFirstMethod(dimension); + if (trimmedDimension != null) { + dimensionsMappedByTrimmedDimensions.put(trimmedDimension, dimension); + } + } + return dimensionsMappedByTrimmedDimensions; + } + @Override public Collection> getStatisticsFor(Class sourceType) { return getFunctionsFor(sourceType, FunctionRetrievalStrategies.Statistics);