compilable but untested version that captures the dimension reduction

Change-Id: Id48f8b09018aec881ee19ed3d05a52ffc1f8f846
This commit is contained in:
Axel Uhl committed 2017-10-07 00:10:17 +02:00
1 parent 254d008e87
commit ec56c95dba
15 files changed
+215 -69

No files matched your search

@@ -0,0 +1,67 @@
package com.google.gwt.user.client.rpc.core.com.sap.sse.datamining.shared.impl.dto;
import java.util.HashMap;
import java.util.HashSet;
import com.google.gwt.user.client.rpc.CustomFieldSerializer;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.client.rpc.SerializationStreamReader;
import com.google.gwt.user.client.rpc.SerializationStreamWriter;
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverLevelDTO;
import com.sap.sse.datamining.shared.impl.dto.FunctionDTO;
import com.sap.sse.datamining.shared.impl.dto.ReducedDimensionsDTO;
/**
* Ensures that the {@link FunctionDTO#getLocalizedName() localizedName} field is serialized by
* really evaluating it eagerly now; this way, an optional lazy evaluation function does not need
* to be serialized.
*
* @author Axel Uhl (d043530)
*
*/
public class ReducedDimensionsDTO_CustomFieldSerializer extends CustomFieldSerializer<ReducedDimensionsDTO> {
@Override
public void serializeInstance(SerializationStreamWriter streamWriter, ReducedDimensionsDTO instance)
throws SerializationException {
serialize(streamWriter, instance);
}
public static void serialize(SerializationStreamWriter streamWriter, ReducedDimensionsDTO instance)
throws SerializationException {
final HashMap<DataRetrieverLevelDTO, HashSet<FunctionDTO>> reducedDimensions = instance.getReducedDimensions();
streamWriter.writeObject(reducedDimensions);
final HashMap<FunctionDTO, FunctionDTO> fromOriginalToReducedDimension = new HashMap<>(instance.getFromOriginalToReducedDimension());
streamWriter.writeObject(fromOriginalToReducedDimension);
}
@Override
public boolean hasCustomInstantiateInstance() {
return true;
}
@Override
public ReducedDimensionsDTO instantiateInstance(SerializationStreamReader streamReader)
throws SerializationException {
return instantiate(streamReader);
}
@SuppressWarnings("unchecked") // the cast to List<String> is the problem here
public static ReducedDimensionsDTO instantiate(SerializationStreamReader streamReader)
throws SerializationException {
final HashMap<FunctionDTO, FunctionDTO> fromOriginalToReducedDimension = (HashMap<FunctionDTO, FunctionDTO>) streamReader.readObject();
final HashMap<DataRetrieverLevelDTO, HashSet<FunctionDTO>> reducedDimensions = (HashMap<DataRetrieverLevelDTO, HashSet<FunctionDTO>>) streamReader.readObject();
return new ReducedDimensionsDTO(reducedDimensions, fromOriginalToReducedDimension);
}
@Override
public void deserializeInstance(SerializationStreamReader streamReader, ReducedDimensionsDTO instance)
throws SerializationException {
deserialize(streamReader, instance);
}
public static void deserialize(SerializationStreamReader streamReader, ReducedDimensionsDTO instance) {
// Done by instantiateInstance
}
}
@@ -17,6 +17,7 @@ import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverLevelDTO;
import com.sap.sse.datamining.shared.impl.dto.FunctionDTO;
import com.sap.sse.datamining.shared.impl.dto.QueryResultDTO;
import com.sap.sse.datamining.shared.impl.dto.ReducedDimensionsDTO;
public interface DataMiningService extends RemoteService {
@@ -28,9 +29,7 @@ public interface DataMiningService extends RemoteService {
HashSet<AggregationProcessorDefinitionDTO> getAggregatorDefinitionsFor(FunctionDTO extractionFunction, String localeInfoName);
HashSet<FunctionDTO> getDimensionsFor(DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO, String localeInfoName);
HashMap<DataRetrieverLevelDTO, HashSet<FunctionDTO>> getDimensionsMappedByLevelFor(
DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO, String localeInfoName);
HashMap<DataRetrieverLevelDTO, HashSet<FunctionDTO>> getReducedDimensionsMappedByLevelFor(
ReducedDimensionsDTO getReducedDimensionsMappedByLevelFor(
DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO, String localeInfoName);
ArrayList<DataRetrieverChainDefinitionDTO> getDataRetrieverChainDefinitions(String localeName);
@@ -18,6 +18,7 @@ import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverLevelDTO;
import com.sap.sse.datamining.shared.impl.dto.FunctionDTO;
import com.sap.sse.datamining.shared.impl.dto.QueryResultDTO;
import com.sap.sse.datamining.shared.impl.dto.ReducedDimensionsDTO;
public interface DataMiningServiceAsync {
@@ -31,10 +32,8 @@ public interface DataMiningServiceAsync {
AsyncCallback<HashSet<AggregationProcessorDefinitionDTO>> asyncCallback);
void getDimensionsFor(DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO, String localeInfoName, AsyncCallback<HashSet<FunctionDTO>> callback);
void getDimensionsMappedByLevelFor(DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO, String localeInfoName,
AsyncCallback<HashMap<DataRetrieverLevelDTO, HashSet<FunctionDTO>>> callback);
public void getReducedDimensionsMappedByLevelFor(DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO, String localeInfoName,
AsyncCallback<HashMap<DataRetrieverLevelDTO, HashSet<FunctionDTO>>> callback);
void getReducedDimensionsMappedByLevelFor(DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO,
String localeInfoName, AsyncCallback<ReducedDimensionsDTO> callback);
void getDataRetrieverChainDefinitions(String localeInfoName, AsyncCallback<ArrayList<DataRetrieverChainDefinitionDTO>> asyncCallback);
void getDataRetrieverChainDefinitionsFor(FunctionDTO statisticToCalculate, String localeInfoName,
@@ -5,6 +5,7 @@ import java.util.HashMap;
import java.util.HashSet;
import com.sap.sse.common.settings.SerializableSettings;
import com.sap.sse.datamining.shared.GroupKey;
import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverLevelDTO;
import com.sap.sse.datamining.shared.impl.dto.FunctionDTO;
@@ -19,4 +20,6 @@ public interface FilterSelectionProvider extends DataMiningComponentProvider<Ser
public void clearSelection();
void setHighestRetrieverLevelWithFilterDimension(FunctionDTO dimension, GroupKey groupKey);
}
@@ -188,6 +188,7 @@ public class QueryDefinitionProviderWithControls extends AbstractQueryDefinition
if (!dimensionsToGroupBy.isEmpty()) {
final FunctionDTO firstDimension = dimensionsToGroupBy.iterator().next();
groupingProvider.removeDimensionToGroupBy(firstDimension);
filterSelectionProvider.setHighestRetrieverLevelWithFilterDimension(firstDimension, groupKey);
result = true;
} else {
result = false;
@@ -195,11 +195,7 @@ class DimensionFilterSelectionProvider {
} else {
selectionChanged = selectionTable.updateContent(content, notifyListenersWhenSelectionChanged);
}
if (selectionToBeApplied != null) {
selectionTable.setSelection(selectionToBeApplied, notifyListenersWhenSelectionChanged);
selectionToBeApplied = null;
}
updateSelectionTable(notifyListenersWhenSelectionChanged);
busyIndicator.setVisible(false);
selectionTable.setVisible(true);
toggleFilterButton.setVisible(true);
@@ -222,6 +218,22 @@ class DimensionFilterSelectionProvider {
});
}
/**
* If {@code #selectionToBeApplied} is not {@code null}, the table displaying the selection will have its selection
* model updated based on the contents of {@link #selectionToBeApplied}, and {@link #selectionToBeApplied} will be
* set to {@code null} afterwards.
*
* @param notifyListenersWhenSelectionChanged
* if {@code true}, selection listeners will be notified about any change that is caused by invoking this
* method
*/
private void updateSelectionTable(final boolean notifyListenersWhenSelectionChanged) {
if (selectionToBeApplied != null) {
selectionTable.setSelection(selectionToBeApplied, notifyListenersWhenSelectionChanged);
selectionToBeApplied = null;
}
}
void setAvailableDimensions(Collection<FunctionDTO> availableDimensions) {
dimensionListBox.setAcceptableValues(availableDimensions);
}
@@ -240,8 +252,9 @@ class DimensionFilterSelectionProvider {
void setSelectedDimensionAndValues(FunctionDTO functionDTO, Collection<?> selection) {
dimensionChangedHandler.firstChange = false;
selectionToBeApplied = selection;
dimensionListBox.setValue(functionDTO, true);
selectionToBeApplied = selection;
updateSelectionTable(/* notifyListenersWhenSelectionChanged */ true);
}
public Widget getEntryWidget() {
@@ -1,6 +1,7 @@
package com.sap.sailing.gwt.ui.datamining.selection.filter;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -32,10 +33,12 @@ import com.sap.sailing.gwt.ui.datamining.FilterSelectionProvider;
import com.sap.sailing.gwt.ui.datamining.presentation.PlainFilterSelectionPresenter;
import com.sap.sse.common.settings.SerializableSettings;
import com.sap.sse.datamining.shared.DataMiningSession;
import com.sap.sse.datamining.shared.GroupKey;
import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverLevelDTO;
import com.sap.sse.datamining.shared.impl.dto.FunctionDTO;
import com.sap.sse.datamining.shared.impl.dto.ReducedDimensionsDTO;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.shared.components.AbstractComponent;
import com.sap.sse.gwt.client.shared.components.Component;
@@ -105,6 +108,17 @@ public class ListRetrieverChainFilterSelectionProvider extends AbstractComponent
mainPanel.setWidgetHidden(selectionPresenterScrollPanel, true);
}
@Override
public void setHighestRetrieverLevelWithFilterDimension(FunctionDTO dimension, GroupKey groupKey) {
for (final DataRetrieverLevelDTO retrieverLevel : retrieverChain.getRetrieverLevels()) {
final RetrieverLevelFilterSelectionProvider selectionProvider = selectionProvidersMappedByRetrievedDataType.get(retrieverLevel);
if (selectionProvider.hasDimension(dimension)) {
selectionProvider.addFilter(dimension, Collections.singleton(groupKey));
break;
}
}
}
@Override
public void awaitReloadComponents() {
isAwaitingReload = true;
@@ -139,15 +153,16 @@ public class ListRetrieverChainFilterSelectionProvider extends AbstractComponent
retrieverLevelDataProvider.getList().addAll(retrieverChain.getRetrieverLevels());
retrieverLevelList.setPageSize(retrieverLevelDataProvider.getList().size());
dataMiningService.getReducedDimensionsMappedByLevelFor(retrieverChain, LocaleInfo.getCurrentLocale().getLocaleName(), new AsyncCallback<HashMap<DataRetrieverLevelDTO, HashSet<FunctionDTO>>>() {
dataMiningService.getReducedDimensionsMappedByLevelFor(retrieverChain, LocaleInfo.getCurrentLocale().getLocaleName(),
new AsyncCallback<ReducedDimensionsDTO>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error fetching the dimensions of the retrieval chain from the server: " + caught.getMessage());
}
@Override
public void onSuccess(HashMap<DataRetrieverLevelDTO, HashSet<FunctionDTO>> dimensionsMappedByLevel) {
public void onSuccess(ReducedDimensionsDTO dimensionsMappedByLevel) {
int firstFilterableRetrieverLevel = Integer.MAX_VALUE;
for (Entry<DataRetrieverLevelDTO, HashSet<FunctionDTO>> dimensionsEntry : dimensionsMappedByLevel.entrySet()) {
for (Entry<DataRetrieverLevelDTO, HashSet<FunctionDTO>> dimensionsEntry : dimensionsMappedByLevel.getReducedDimensions().entrySet()) {
if (!dimensionsEntry.getValue().isEmpty()) {
DataRetrieverLevelDTO retrieverLevel = dimensionsEntry.getKey();
RetrieverLevelFilterSelectionProvider selectionProvider =
@@ -158,12 +173,10 @@ public class ListRetrieverChainFilterSelectionProvider extends AbstractComponent
retrieverChain,retrieverLevel);
selectionProvider.setAvailableDimensions(dimensionsEntry.getValue());
selectionProvidersMappedByRetrievedDataType.put(retrieverLevel, selectionProvider);
firstFilterableRetrieverLevel = retrieverLevel.getLevel() < firstFilterableRetrieverLevel ?
retrieverLevel.getLevel() : firstFilterableRetrieverLevel;
}
}
retrieverLevelSelectionModel.setSelected(retrieverChain.getRetrieverLevel(firstFilterableRetrieverLevel), true);
}
});
@@ -9,11 +9,13 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync;
import com.sap.sse.common.Util;
import com.sap.sse.common.settings.AbstractSettings;
import com.sap.sse.common.settings.SerializableSettings;
import com.sap.sse.datamining.shared.DataMiningSession;
@@ -116,7 +118,11 @@ public class RetrieverLevelFilterSelectionProvider extends AbstractComponent<Abs
dimensionFilter.setAvailableDimensions(remainingDimensions);
}
}
public boolean hasDimension(FunctionDTO dimension) {
return availableDimensions.contains(dimension);
}
private Collection<FunctionDTO> getSelectedDimensions() {
Collection<FunctionDTO> selectedDimensions = new ArrayList<>();
for (DimensionFilterSelectionProvider dimensionFilter : dimensionSelectionProviders) {
@@ -174,13 +180,35 @@ public class RetrieverLevelFilterSelectionProvider extends AbstractComponent<Abs
return filterSelection;
}
/**
* If there is already a filter set for {@code dimension}, replace its value selection by the {@code values}
* provided. Otherwise, add a {@link DimensionFilterSelectionProvider} for {@code dimension} and set its
* filter values to {@code values}.<p>
*
* <em>Precondition:</em> {@link #hasDimension(FunctionDTO) hasDimension(dimension)}{@code == true}
*/
public void addFilter(FunctionDTO dimension, Set<? extends Serializable> values) {
DimensionFilterSelectionProvider dimensionFilter = null;
for (final DimensionFilterSelectionProvider dimensionSelectionProvider : dimensionSelectionProviders) {
if (Util.equalsWithNull(dimensionSelectionProvider.getSelectedDimension(), dimension)) {
dimensionFilter = dimensionSelectionProvider;
break;
}
}
if (dimensionFilter == null) {
// add dimension filter and set value selection:
dimensionFilter = createDimensionSelectionProvider();
addDimensionSelectionProvider(dimensionFilter);
updateAvailableDimensions();
}
dimensionFilter.setSelectedDimensionAndValues(dimension, values);
}
public void applySelection(HashMap<FunctionDTO, HashSet<? extends Serializable>> filterSelection) {
dimensionSelectionProviders.clear();
mainPanel.clear();
List<FunctionDTO> sortedDimensions = new ArrayList<>(filterSelection.keySet());
Collections.sort(sortedDimensions);
for (FunctionDTO functionDTO : sortedDimensions) {
DimensionFilterSelectionProvider dimensionFilter = createDimensionSelectionProvider();
addDimensionSelectionProvider(dimensionFilter);
@@ -34,6 +34,7 @@ import com.sap.sse.datamining.data.QueryResult;
import com.sap.sse.datamining.factories.DataMiningDTOFactory;
import com.sap.sse.datamining.functions.Function;
import com.sap.sse.datamining.impl.components.DataRetrieverLevel;
import com.sap.sse.datamining.impl.components.management.ReducedDimensions;
import com.sap.sse.datamining.impl.data.QueryResultImpl;
import com.sap.sse.datamining.shared.DataMiningSession;
import com.sap.sse.datamining.shared.GroupKey;
@@ -48,6 +49,7 @@ import com.sap.sse.datamining.shared.impl.dto.DataRetrieverLevelDTO;
import com.sap.sse.datamining.shared.impl.dto.FunctionDTO;
import com.sap.sse.datamining.shared.impl.dto.ModifiableStatisticQueryDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.QueryResultDTO;
import com.sap.sse.datamining.shared.impl.dto.ReducedDimensionsDTO;
import com.sap.sse.i18n.ResourceBundleStringMessages;
public class DataMiningServiceImpl extends RemoteServiceServlet implements DataMiningService {
@@ -133,34 +135,29 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
}
@Override
public HashMap<DataRetrieverLevelDTO, HashSet<FunctionDTO>> getDimensionsMappedByLevelFor(DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO, String localeInfoName) {
SecurityUtils.getSubject().checkPermission(Permission.DATA_MINING.getStringPermissionForObjects(Mode.READ, dataRetrieverChainDefinitionDTO.getName()));
DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition = getDataMiningServer().getDataRetrieverChainDefinitionForDTO(dataRetrieverChainDefinitionDTO);
Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> dimensions = getDataMiningServer()
.getDimensionsMappedByLevelFor(dataRetrieverChainDefinition);
return dimensionsMappedByLevelAsDTOs(dimensions, localeInfoName);
}
@Override
public HashMap<DataRetrieverLevelDTO, HashSet<FunctionDTO>> getReducedDimensionsMappedByLevelFor(
public ReducedDimensionsDTO getReducedDimensionsMappedByLevelFor(
DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO, String localeInfoName) {
SecurityUtils.getSubject().checkPermission(Permission.DATA_MINING.getStringPermissionForObjects(Mode.READ, dataRetrieverChainDefinitionDTO.getName()));
DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition = getDataMiningServer().getDataRetrieverChainDefinitionForDTO(dataRetrieverChainDefinitionDTO);
Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> reducedDimensions = getDataMiningServer()
.getReducedDimensionsMappedByLevelFor(dataRetrieverChainDefinition);
return dimensionsMappedByLevelAsDTOs(reducedDimensions, localeInfoName);
ReducedDimensions reducedDimensions = getDataMiningServer().getReducedDimensionsMappedByLevelFor(dataRetrieverChainDefinition);
return reducedDimensionsAsDTO(reducedDimensions, localeInfoName);
}
private HashMap<DataRetrieverLevelDTO, HashSet<FunctionDTO>> dimensionsMappedByLevelAsDTOs(
Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> dimensions, String localeInfoName) {
private ReducedDimensionsDTO reducedDimensionsAsDTO(
ReducedDimensions dimensions, String localeInfoName) {
HashMap<DataRetrieverLevelDTO, HashSet<FunctionDTO>> dimensionDTOs = new HashMap<>();
ResourceBundleStringMessages stringMessages = getDataMiningServer().getStringMessages();
Locale locale = ResourceBundleStringMessages.Util.getLocaleFor(localeInfoName);
for (Entry<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> dimensionsEntry : dimensions.entrySet()) {
for (final Entry<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> dimensionsEntry : dimensions.getReducedDimensions().entrySet()) {
dimensionDTOs.put(dtoFactory.createDataRetrieverLevelDTO(dimensionsEntry.getKey(), stringMessages, locale),
functionsAsDTOs(dimensionsEntry.getValue(), localeInfoName));
}
return dimensionDTOs;
HashMap<FunctionDTO, FunctionDTO> fromOriginalToReducedDTO = new HashMap<>();
for (final Entry<Function<?>, Function<?>> fromOriginalToReduced : dimensions.getFromOriginalDimensionToReducedDimension().entrySet()) {
fromOriginalToReducedDTO.put(dtoFactory.createFunctionDTO(fromOriginalToReduced.getKey(), stringMessages, locale),
dtoFactory.createFunctionDTO(fromOriginalToReduced.getValue(), stringMessages, locale));
}
return new ReducedDimensionsDTO(dimensionDTOs, fromOriginalToReducedDTO);
}
private HashSet<FunctionDTO> functionsAsDTOs(Iterable<Function<?>> functions, String localeInfoName) {
@@ -16,7 +16,7 @@
<inherits name="com.sap.sse.gwt.AdminConsole" />
<inherits name="com.sap.sse.security.ui.LoginPanel" />
<inherits name="com.sap.sse.security.ui.Settings" />
<inherits name='com.sap.sailing.gwt.settings.Settings'/>
<inherits name='com.sap.sailing.gwt.settings.Settings'/>
<!-- Highcharts API -->
<inherits name="com.sap.sse.gwt.Highcharts_Autoinject" />
@@ -114,7 +114,7 @@ public class TestFunctionManagerAsFunctionProvider {
break;
}
}
final Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> reducedDimensionsMappedByLevel = server.getReducedDimensionsMappedByLevelFor(retrieverChain);
final Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> reducedDimensionsMappedByLevel = server.getReducedDimensionsMappedByLevelFor(retrieverChain).getReducedDimensions();
assertThat(reducedDimensionsMappedByLevel, is(expectedDimensions));
}
@@ -17,6 +17,7 @@ import com.sap.sse.datamining.components.management.QueryDefinitionDTOProvider;
import com.sap.sse.datamining.data.QueryResult;
import com.sap.sse.datamining.functions.Function;
import com.sap.sse.datamining.impl.components.DataRetrieverLevel;
import com.sap.sse.datamining.impl.components.management.ReducedDimensions;
import com.sap.sse.datamining.shared.DataMiningSession;
import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO;
import com.sap.sse.datamining.shared.impl.PredefinedQueryIdentifier;
@@ -40,7 +41,7 @@ public interface DataMiningServer {
Iterable<Function<?>> getStatisticsFor(Class<?> sourceType);
Iterable<Function<?>> getDimensionsFor(Class<?> sourceType);
Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> getDimensionsMappedByLevelFor(DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition);
Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> getReducedDimensionsMappedByLevelFor(DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition);
ReducedDimensions getReducedDimensionsMappedByLevelFor(DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition);
Function<?> getFunctionForDTO(FunctionDTO functionDTO);
DataRetrieverChainDefinitionProvider getDataRetrieverChainDefinitionProvider();
@@ -6,6 +6,7 @@ import java.util.Map;
import com.sap.sse.datamining.components.DataRetrieverChainDefinition;
import com.sap.sse.datamining.functions.Function;
import com.sap.sse.datamining.impl.components.DataRetrieverLevel;
import com.sap.sse.datamining.impl.components.management.ReducedDimensions;
import com.sap.sse.datamining.shared.impl.dto.FunctionDTO;
public interface FunctionProvider {
@@ -19,7 +20,7 @@ public interface FunctionProvider {
public Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> getDimensionsMappedByLevelFor(
DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition);
public Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> getReducedDimensionsMappedByLevelFor(
public ReducedDimensions getReducedDimensionsMappedByLevelFor(
DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition);
/**
@@ -38,6 +38,7 @@ import com.sap.sse.datamining.functions.Function;
import com.sap.sse.datamining.impl.components.DataRetrieverLevel;
import com.sap.sse.datamining.impl.components.management.AbstractMemoryMonitorAction;
import com.sap.sse.datamining.impl.components.management.QueryManagerMemoryMonitor;
import com.sap.sse.datamining.impl.components.management.ReducedDimensions;
import com.sap.sse.datamining.impl.components.management.RuntimeMemoryInfoProvider;
import com.sap.sse.datamining.impl.components.management.StrategyPerQueryTypeManager;
import com.sap.sse.datamining.shared.DataMiningSession;
@@ -234,7 +235,7 @@ public class DataMiningServerImpl implements ModifiableDataMiningServer {
}
@Override
public Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> getReducedDimensionsMappedByLevelFor(
public ReducedDimensions getReducedDimensionsMappedByLevelFor(
DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition) {
return functionRegistry.getReducedDimensionsMappedByLevelFor(dataRetrieverChainDefinition);
}
@@ -285,48 +285,71 @@ public class FunctionManager implements FunctionRegistry, FunctionProvider {
}
@Override
public Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> getReducedDimensionsMappedByLevelFor(
public ReducedDimensions getReducedDimensionsMappedByLevelFor(
DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition) {
Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> dimensionsMappedByLevel = getDimensionsMappedByLevelFor(dataRetrieverChainDefinition);
Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> reducedDimensions = new HashMap<>();
List<? extends DataRetrieverLevel<?, ?>> retrieverLevels = dataRetrieverChainDefinition.getDataRetrieverLevels();
ReducedDimensions reducedDimensions = new ReducedDimensions();
for (DataRetrieverLevel<?, ?> retrieverLevel : retrieverLevels) {
Iterable<Function<?>> dimensions = dimensionsMappedByLevel.get(retrieverLevel);
Iterable<Function<?>> dimensionsOfLevel = dimensionsMappedByLevel.get(retrieverLevel);
DataRetrieverLevel<?, ?> previousRetrieverLevel = retrieverLevel.getLevel() > 0 ? retrieverLevels.get(retrieverLevel.getLevel() - 1) : null;
if (reducedDimensions.isEmpty() || previousRetrieverLevel == null) {
reducedDimensions.put(retrieverLevel, dimensions);
final ReducedDimensions reducedDimensionsForLevel;
if (previousRetrieverLevel == null) {
assert reducedDimensions.getReducedDimensions().isEmpty();
// for the first retriever level no reduction takes place; create a ReducedDimensions object
// to "add" onto the empty ReducedDimensions object using the full set of dimensions of this level
final Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> currentLevelToAllItsDimensions = new HashMap<>();
final Map<Function<?>, Function<?>> fromOriginalToReducedDimension = new HashMap<>();
currentLevelToAllItsDimensions.put(retrieverLevel, dimensionsOfLevel);
for (final Function<?> dimension : dimensionsOfLevel) {
fromOriginalToReducedDimension.put(dimension, dimension);
}
reducedDimensionsForLevel = new ReducedDimensions(currentLevelToAllItsDimensions, fromOriginalToReducedDimension);
} else {
reducedDimensions.put(retrieverLevel, reduce(dimensions, previousRetrieverLevel, dimensionsMappedByLevel.get(previousRetrieverLevel)));
reducedDimensionsForLevel = reduce(dimensionsOfLevel, previousRetrieverLevel,
dimensionsMappedByLevel.get(previousRetrieverLevel), retrieverLevel);
}
reducedDimensions = reducedDimensions.createByAdd(reducedDimensionsForLevel,
/* replaceExistingMappingsFromOriginalToReducedDimension */ true);
}
return reducedDimensions;
}
private Iterable<Function<?>> reduce(Iterable<Function<?>> dimensionsToReduce, DataRetrieverLevel<?, ?> previousRetrieverLevel, Iterable<Function<?>> previousDimensions) {
private ReducedDimensions reduce(Iterable<Function<?>> dimensionsToReduce,
DataRetrieverLevel<?, ?> previousRetrieverLevel, Iterable<Function<?>> previousDimensions,
DataRetrieverLevel<?, ?> currentRetrieverLevel) {
final Iterable<Function<?>> reducedDimensions;
final Map<Function<?>, Function<?>> fromOriginalToReducedDimensions = new HashMap<>();
if (Util.isEmpty(previousDimensions)) {
return dimensionsToReduce;
}
Collection<Function<?>> reducedDimensions = new HashSet<>();
for (Function<?> dimension : dimensionsToReduce) {
boolean isAllowed = true;
if (ConcatenatingCompoundFunction.class.isAssignableFrom(dimension.getClass())) {
ConcatenatingCompoundFunction<?> compoundDimension = (ConcatenatingCompoundFunction<?>) dimension;
List<MethodWrappingFunction<?>> simpleFunctions = compoundDimension.getSimpleFunctions();
if (previousRetrieverLevel.getRetrievedDataType().isAssignableFrom(simpleFunctions.get(0).getReturnType())) {
List<MethodWrappingFunction<?>> subList = simpleFunctions.subList(1, compoundDimension.getSimpleFunctions().size());
Function<?> subFunction = subList.size() == 1 ? subList.get(0)
: functionFactory.createCompoundFunction(subList);
if (Util.contains(previousDimensions, subFunction)) {
isAllowed = false;
reducedDimensions = dimensionsToReduce;
for (final Function<?> dimensionToReduce : dimensionsToReduce) {
fromOriginalToReducedDimensions.put(dimensionToReduce, dimensionToReduce);
}
} else {
final Set<Function<?>> modifiableReducedDimensions = new HashSet<>();
reducedDimensions = modifiableReducedDimensions;
for (Function<?> dimension : dimensionsToReduce) {
boolean isAllowed = true;
if (ConcatenatingCompoundFunction.class.isAssignableFrom(dimension.getClass())) {
ConcatenatingCompoundFunction<?> compoundDimension = (ConcatenatingCompoundFunction<?>) dimension;
List<MethodWrappingFunction<?>> simpleFunctions = compoundDimension.getSimpleFunctions();
if (previousRetrieverLevel.getRetrievedDataType().isAssignableFrom(simpleFunctions.get(0).getReturnType())) {
List<MethodWrappingFunction<?>> subList = simpleFunctions.subList(1, simpleFunctions.size());
Function<?> subFunction = subList.size() == 1 ? subList.get(0)
: functionFactory.createCompoundFunction(subList);
if (Util.contains(previousDimensions, subFunction)) {
isAllowed = false; // TODO record the reduction process, mapping original dimension to equal element from previousDimensions
}
}
}
}
if (isAllowed) {
reducedDimensions.add(dimension);
if (isAllowed) {
modifiableReducedDimensions.add(dimension);
}
}
}
return reducedDimensions;
final Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> reducedDimensionsPerRetrieverLevel = new HashMap<>();
reducedDimensionsPerRetrieverLevel.put(currentRetrieverLevel, reducedDimensions);
return new ReducedDimensions(reducedDimensionsPerRetrieverLevel, fromOriginalToReducedDimensions);
}
@Override