mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-13 14:12:11 +00:00
compilable but untested version that captures the dimension reduction
Change-Id: Id48f8b09018aec881ee19ed3d05a52ffc1f8f846
This commit is contained in:
1 parent
254d008e87
commit
ec56c95dba
15 files changed
+215
-69
No files matched your search
+67
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
+2
-3
@@ -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);
|
||||
|
||||
+3
-4
@@ -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,
|
||||
|
||||
+3
@@ -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);
|
||||
|
||||
}
|
||||
+1
@@ -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;
|
||||
|
||||
+19
-6
@@ -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() {
|
||||
|
||||
+18
-5
@@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
+31
-3
@@ -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);
|
||||
|
||||
+14
-17
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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" />
|
||||
|
||||
+1
-1
@@ -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();
|
||||
|
||||
+2
-1
@@ -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);
|
||||
|
||||
/**
|
||||
|
||||
+2
-1
@@ -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);
|
||||
}
|
||||
|
||||
+49
-26
@@ -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
|
||||
|
||||
Reference in new issue
Block a user