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 c737622dbc9..741ee870614 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,6 +17,7 @@ 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; @@ -37,12 +38,14 @@ 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; @@ -150,12 +153,36 @@ public class SailingDataMiningFactory { private Collection> getDimensionsOf( DataRetrieverChainDefinition dataRetrieverChainDefinition) { Collection> dimensions = new HashSet<>(); - for (DataRetrieverTypeWithInformation dataRetrieverTypeWithInformation : dataRetrieverChainDefinition.getDataRetrieverTypesWithInformation()) { - dimensions.addAll(functionProvider.getDimensionsFor(dataRetrieverTypeWithInformation.getRetrievedDataType())); + 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/TestDataRetrieverChainCreation.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestDataRetrieverChainCreation.java index 369ca617de6..b652835fa6e 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestDataRetrieverChainCreation.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestDataRetrieverChainCreation.java @@ -3,9 +3,11 @@ package com.sap.sse.datamining.impl; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.lessThanOrEqualTo; +import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertThat; import java.util.Collection; +import java.util.List; import org.junit.Before; import org.junit.Test; @@ -14,7 +16,6 @@ import com.sap.sse.datamining.DataRetrieverChainBuilder; import com.sap.sse.datamining.DataRetrieverChainDefinition; import com.sap.sse.datamining.components.FilterCriterion; import com.sap.sse.datamining.components.Processor; -import com.sap.sse.datamining.impl.SimpleDataRetrieverChainDefinition; import com.sap.sse.datamining.impl.criterias.AbstractFilterCriterion; import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Regatta; import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegOfCompetitorContext; @@ -85,8 +86,10 @@ public class TestDataRetrieverChainCreation { assertThat(chainClone.getDataSourceType().equals(dataRetrieverChainDefinition.getDataSourceType()), is(true)); assertThat(chainClone.getRetrievedDataType().equals(dataRetrieverChainDefinition.getRetrievedDataType()), is(true)); - Collection> cloneDataRetrieverTypesWithInformation = (Collection>) chainClone.getDataRetrieverTypesWithInformation(); + List> cloneDataRetrieverTypesWithInformation = (List>) chainClone.getDataRetrieverTypesWithInformation(); assertThat(cloneDataRetrieverTypesWithInformation, is(dataRetrieverChainDefinition.getDataRetrieverTypesWithInformation())); + + assertThat(chainClone.getUUID(), not(dataRetrieverChainDefinition.getUUID())); } @SuppressWarnings("unchecked") diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataRetrieverChainDefinition.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataRetrieverChainDefinition.java index 8529ef86ba9..3f8a9d01f8c 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataRetrieverChainDefinition.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataRetrieverChainDefinition.java @@ -1,6 +1,6 @@ package com.sap.sse.datamining; -import java.util.Collection; +import java.util.List; import java.util.Locale; import java.util.UUID; import java.util.concurrent.ExecutorService; @@ -32,7 +32,7 @@ public interface DataRetrieverChainDefinition { Class> nextRetrieverType, Class retrievedDataType); - public Collection> getDataRetrieverTypesWithInformation(); + public List> getDataRetrieverTypesWithInformation(); public DataRetrieverChainBuilder startBuilding(ExecutorService executor); diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/FunctionFactory.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/FunctionFactory.java index 40325ee8c54..19d67484780 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/FunctionFactory.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/FunctionFactory.java @@ -42,4 +42,25 @@ public class FunctionFactory { return createCompoundFunction(name, functions); } + /** + * Creates a new Function for the given function, without the first method in the list.
+ * @return A new CompoundFunction without the first method in the list or null, if the given + * function is no CompoundFunction or the method list has the size of 1. + */ + public Function trimFirstMethod(Function function) { + if (function instanceof ConcatenatingCompoundFunction) { + ConcatenatingCompoundFunction compoundFunction = (ConcatenatingCompoundFunction) function; + List> methodList = compoundFunction.getFunctions(); + if (methodList.size() > 1) { + List> trimmedMethodList = new ArrayList<>(); + for (int i = 1; i < methodList.size(); i++) { + trimmedMethodList.add(methodList.get(i)); + } + return trimmedMethodList.size() == 1 ? trimmedMethodList.get(0) : createCompoundFunction(trimmedMethodList); + } + } + + return null; + } + } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SimpleDataRetrieverChainDefinition.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SimpleDataRetrieverChainDefinition.java index 997bf321e11..046593ba832 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SimpleDataRetrieverChainDefinition.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SimpleDataRetrieverChainDefinition.java @@ -104,7 +104,7 @@ public class SimpleDataRetrieverChainDefinition implements } @Override - public Collection> getDataRetrieverTypesWithInformation() { + public List> getDataRetrieverTypesWithInformation() { return dataRetrieverTypesWithInformation; } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/ConcatenatingCompoundFunction.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/ConcatenatingCompoundFunction.java index 64d10261ba1..7e5b1a6c93e 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/ConcatenatingCompoundFunction.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/ConcatenatingCompoundFunction.java @@ -156,6 +156,10 @@ public class ConcatenatingCompoundFunction extends AbstractFunction< public int getOrdinal() { return ordinal; } + + public List> getFunctions() { + return functions; + } private Function getFirstFunction() { return functions.get(0);