Using DataRetrieverLevel(DTO) instead of a simple int everywhere

This commit is contained in:
Lennart Hensler committed 2015-09-09 16:49:35 +02:00
1 parent 8fabab0436
commit e680df0d12
27 files changed
+146 -101

No files matched your search

@@ -1342,4 +1342,4 @@ cantDisplayDataOfType=Can''t display data of type {0}
shownDecimals=Shown Decimals
openFullscreenView=Open fullscreen view
closeFullscreenView=Close fullscreen view
analyse=Analyze
analyze=Analyze
@@ -1331,4 +1331,4 @@ cantDisplayDataOfType=Daten des Typs {0} können nicht dargestellt werden
shownDecimals=Angezeigte Nachkommastellen
openFullscreenView=Vollbildansicht öffnen
closeFullscreenView=Vollbildansicht schließen
analyse=Untersuche
analyze=Untersuche
@@ -1281,4 +1281,4 @@ cantDisplayDataOfType=Can''t display data of type {0}
shownDecimals=Shown Decimals
openFullscreenView=Open fullscreen view
closeFullscreenView=Close fullscreen view
analyse=Analyze
analyze=Analyze
@@ -34,8 +34,8 @@ public interface DataMiningService extends RemoteService {
ArrayList<DataRetrieverChainDefinitionDTO> getDataRetrieverChainDefinitions(String localeName);
ArrayList<DataRetrieverChainDefinitionDTO> getDataRetrieverChainDefinitionsFor(FunctionDTO statisticToCalculate, String localeInfoName);
QueryResultDTO<HashSet<Object>> getDimensionValuesFor(DataMiningSession session, DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO, int retrieverLevel,
HashSet<FunctionDTO> dimensionDTOs, HashMap<Integer, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelectionDTO, String localeInfoName);
QueryResultDTO<HashSet<Object>> getDimensionValuesFor(DataMiningSession session, DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO, DataRetrieverLevelDTO retrieverLevel,
HashSet<FunctionDTO> dimensionDTOs, HashMap<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelectionDTO, String localeInfoName);
<ResultType> QueryResultDTO<ResultType> runQuery(DataMiningSession session, StatisticQueryDefinitionDTO queryDefinition);
@@ -38,8 +38,8 @@ public interface DataMiningServiceAsync {
void getDataRetrieverChainDefinitionsFor(FunctionDTO statisticToCalculate, String localeInfoName,
AsyncCallback<ArrayList<DataRetrieverChainDefinitionDTO>> callback);
void getDimensionValuesFor(DataMiningSession session, DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO, int retrieverLevel,
HashSet<FunctionDTO> dimensionDTOs, HashMap<Integer, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelectionDTO,
void getDimensionValuesFor(DataMiningSession session, DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO, DataRetrieverLevelDTO retrieverLevel,
HashSet<FunctionDTO> dimensionDTOs, HashMap<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelectionDTO,
String localeInfoName, AsyncCallback<QueryResultDTO<HashSet<Object>>> callback);
<ResultType> void runQuery(DataMiningSession session, StatisticQueryDefinitionDTO queryDefinition, AsyncCallback<QueryResultDTO<ResultType>> callback);
@@ -5,13 +5,14 @@ import java.util.HashMap;
import java.util.HashSet;
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;
public interface FilterSelectionProvider extends DataMiningComponentProvider, DataRetrieverChainDefinitionChangedListener {
public void addSelectionChangedListener(FilterSelectionChangedListener listener);
public HashMap<Integer, HashMap<FunctionDTO, HashSet<? extends Serializable>>> getSelection();
public HashMap<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> getSelection();
public void applySelection(StatisticQueryDefinitionDTO queryDefinition);
@@ -65,13 +65,12 @@ public class PlainFilterSelectionPresenter implements FilterSelectionPresenter,
public void selectionChanged() {
presentationPanel.clear();
Map<Integer, HashMap<FunctionDTO, HashSet<? extends Serializable>>> selection = filterSelectionProvider.getSelection();
List<Integer> sortedLevels = new ArrayList<>(selection.keySet());
Map<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> selection = filterSelectionProvider.getSelection();
List<DataRetrieverLevelDTO> sortedLevels = new ArrayList<>(selection.keySet());
Collections.sort(sortedLevels);
boolean first = true;
for (Integer levelIndex : sortedLevels) {
Map<FunctionDTO, HashSet<? extends Serializable>> levelSelection = selection.get(levelIndex);
DataRetrieverLevelDTO retrieverLevel = retrieverChain.getRetrieverLevel(levelIndex);
for (DataRetrieverLevelDTO retrieverLevel : sortedLevels) {
Map<FunctionDTO, HashSet<? extends Serializable>> levelSelection = selection.get(retrieverLevel);
RetrieverLevelFilterSelectionPresenter levelSelectionPresenter = new RetrieverLevelFilterSelectionPresenter(retrieverLevel, levelSelection);
if (!first) {
levelSelectionPresenter.getEntryWidget().getElement().getStyle().setMarginTop(5, Unit.PX);
@@ -36,6 +36,7 @@ import com.sap.sse.datamining.shared.DataMiningSession;
import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.AggregationProcessorDefinitionDTO;
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.ModifiableStatisticQueryDefinitionDTO;
import com.sap.sse.gwt.client.ErrorReporter;
@@ -178,7 +179,7 @@ public class BufferingQueryDefinitionProviderWithControls extends AbstractQueryD
queryDTO.appendDimensionToGroupBy(dimension);
}
for (Entry<Integer, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelectionEntry : filterSelectionProvider.getSelection().entrySet()) {
for (Entry<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelectionEntry : filterSelectionProvider.getSelection().entrySet()) {
queryDTO.setFilterSelectionFor(filterSelectionEntry.getKey(), filterSelectionEntry.getValue());
}
@@ -34,6 +34,7 @@ import com.sap.sailing.gwt.ui.datamining.execution.SimpleManagedDataMiningQuerie
import com.sap.sse.datamining.shared.DataMiningSession;
import com.sap.sse.datamining.shared.GroupKey;
import com.sap.sse.datamining.shared.impl.GenericGroupKey;
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.gwt.client.ErrorReporter;
@@ -158,15 +159,15 @@ class DimensionFilterSelectionProvider {
final FunctionDTO dimension = getSelectedDimension();
HashSet<FunctionDTO> dimensionDTOs = new HashSet<>();
dimensionDTOs.add(dimension);
HashMap<Integer, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelectionDTO = retrieverLevelSelectionProvider.getCompleteFilterSelection();
int retrieverLevel = retrieverLevelSelectionProvider.getRetrieverLevel();
HashMap<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelectionDTO = retrieverLevelSelectionProvider.getCompleteFilterSelection();
DataRetrieverLevelDTO retrieverLevel = retrieverLevelSelectionProvider.getRetrieverLevel();
if (filterSelectionDTO.containsKey(retrieverLevel)) {
filterSelectionDTO.get(retrieverLevel).remove(dimension);
}
busyIndicator.setVisible(true);
counter.increase();
dataMiningService.getDimensionValuesFor(session, retrieverLevelSelectionProvider.getDataRetrieverChain(),
retrieverLevelSelectionProvider.getRetrieverLevel(), dimensionDTOs, filterSelectionDTO,
retrieverLevel, dimensionDTOs, filterSelectionDTO,
LocaleInfo.getCurrentLocale().getLocaleName(), new ManagedDataMiningQueryCallback<HashSet<Object>>(counter) {
@Override
protected void handleSuccess(QueryResultDTO<HashSet<Object>> result) {
@@ -177,15 +177,16 @@ public class ListRetrieverChainFilterSelectionProvider implements FilterSelectio
}
}
void updateFilterSelectionProviders(int beginningWithLevel, final FunctionDTO exceptForDimension) {
void updateFilterSelectionProviders(DataRetrieverLevelDTO beginningWithLevel, final FunctionDTO exceptForDimension) {
DataRetrieverLevelDTO currentLevel = beginningWithLevel;
DataRetrieverLevelDTO retrieverLevelToUpdate = null;
for (int retrieverLevelIndex = beginningWithLevel; retrieverLevelIndex < retrieverChain.size(); retrieverLevelIndex++) {
DataRetrieverLevelDTO retrieverLevel = retrieverChain.getRetrieverLevel(retrieverLevelIndex);
if (selectionProvidersMappedByRetrievedDataType.containsKey(retrieverLevel)) {
retrieverLevelToUpdate = retrieverLevel;
do {
if (selectionProvidersMappedByRetrievedDataType.containsKey(currentLevel)) {
retrieverLevelToUpdate = currentLevel;
break;
}
}
currentLevel = retrieverChain.getNextRetrieverLevel(currentLevel);
} while (currentLevel != null);
if (retrieverLevelToUpdate != null) {
selectionProvidersMappedByRetrievedDataType.get(retrieverLevelToUpdate).updateAvailableData(exceptForDimension);
@@ -201,8 +202,8 @@ public class ListRetrieverChainFilterSelectionProvider implements FilterSelectio
}
@Override
public HashMap<Integer, HashMap<FunctionDTO, HashSet<? extends Serializable>>> getSelection() {
HashMap<Integer, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelection = new HashMap<>();
public HashMap<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> getSelection() {
HashMap<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelection = new HashMap<>();
for (RetrieverLevelFilterSelectionProvider selectionProvider : selectionProvidersMappedByRetrievedDataType.values()) {
Map<FunctionDTO, HashSet<? extends Serializable>> levelFilterSelection = selectionProvider.getFilterSelection();
if (!levelFilterSelection.isEmpty()) {
@@ -215,8 +216,8 @@ public class ListRetrieverChainFilterSelectionProvider implements FilterSelectio
@Override
public void applySelection(StatisticQueryDefinitionDTO queryDefinition) {
for (RetrieverLevelFilterSelectionProvider selectionProvider : selectionProvidersMappedByRetrievedDataType.values()) {
Map<Integer, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelection = queryDefinition.getFilterSelection();
int retrieverLevel = selectionProvider.getRetrieverLevel();
Map<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelection = queryDefinition.getFilterSelection();
DataRetrieverLevelDTO retrieverLevel = selectionProvider.getRetrieverLevel();
if (filterSelection.containsKey(retrieverLevel)) {
selectionProvider.applySelection(filterSelection.get(retrieverLevel));
}
@@ -19,7 +19,6 @@ import com.sap.sse.datamining.shared.DataMiningSession;
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.LocalizedTypeDTO;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
@@ -142,7 +141,7 @@ public class RetrieverLevelFilterSelectionProvider implements Component<Abstract
}
} else {
// Update for this level is completed. Continue with the next level.
retrieverChainSelectionProvider.updateFilterSelectionProviders(getRetrieverLevel() + 1, exceptForDimension);
retrieverChainSelectionProvider.updateFilterSelectionProviders(retrieverChain.getNextRetrieverLevel(getRetrieverLevel()), exceptForDimension);
}
}
@@ -150,7 +149,7 @@ public class RetrieverLevelFilterSelectionProvider implements Component<Abstract
retrieverChainSelectionProvider.retrieverLevelFilterSelectionChanged(this, dimensionFilterSelectionProvider);
}
HashMap<Integer, HashMap<FunctionDTO, HashSet<? extends Serializable>>> getCompleteFilterSelection() {
HashMap<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> getCompleteFilterSelection() {
return retrieverChainSelectionProvider.getSelection();
}
@@ -193,12 +192,8 @@ public class RetrieverLevelFilterSelectionProvider implements Component<Abstract
return retrieverChain;
}
public int getRetrieverLevel() {
return retrieverLevel.getLevel();
}
public LocalizedTypeDTO getRetrievedDataType() {
return retrieverLevel.getRetrievedDataType();
public DataRetrieverLevelDTO getRetrieverLevel() {
return retrieverLevel;
}
@Override
@@ -187,11 +187,12 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
@Override
public QueryResultDTO<HashSet<Object>> getDimensionValuesFor(DataMiningSession session, DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO,
int retrieverLevel, HashSet<FunctionDTO> dimensionDTOs, HashMap<Integer, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelectionDTO, String localeInfoName) {
DataRetrieverLevelDTO retrieverLevelDTO, HashSet<FunctionDTO> dimensionDTOs, HashMap<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelectionDTO, String localeInfoName) {
DataMiningServer dataMiningServer = getDataMiningServer();
DataRetrieverChainDefinition<RacingEventService, ?> retrieverChainDefinition = dataMiningServer.getDataRetrieverChainDefinition(dataRetrieverChainDefinitionDTO.getId());
DataRetrieverLevel<?, ?> retrieverLevel = retrieverChainDefinition.getDataRetrieverLevel(retrieverLevelDTO.getLevel());
Iterable<Function<?>> dimensions = functionDTOsAsFunctions(dimensionDTOs);
Map<Integer, Map<Function<?>, Collection<?>>> filterSelection = filterSelectionDTOAsFilterSelection(filterSelectionDTO);
Map<DataRetrieverLevel<?, ?>, Map<Function<?>, Collection<?>>> filterSelection = filterSelectionDTOAsFilterSelection(filterSelectionDTO, retrieverChainDefinition);
Locale locale = ResourceBundleStringMessages.Util.getLocaleFor(localeInfoName);
Query<HashSet<Object>> dimensionValuesQuery = dataMiningServer.createDimensionValuesQuery(retrieverChainDefinition, retrieverLevel, dimensions, filterSelection, locale);
QueryResult<HashSet<Object>> result = dataMiningServer.runNewQueryAndAbortPreviousQueries(session, dimensionValuesQuery);
@@ -210,14 +211,16 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
return functions;
}
private Map<Integer, Map<Function<?>, Collection<?>>> filterSelectionDTOAsFilterSelection(
HashMap<Integer, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelectionDTO) {
Map<Integer, Map<Function<?>, Collection<?>>> filterSelection = new HashMap<>();
for (Integer retrieverLevel : filterSelectionDTO.keySet()) {
HashMap<FunctionDTO, HashSet<? extends Serializable>> retrievalLevelSelection = filterSelectionDTO.get(retrieverLevel);
private Map<DataRetrieverLevel<?, ?>, Map<Function<?>, Collection<?>>> filterSelectionDTOAsFilterSelection(
HashMap<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelectionDTO,
DataRetrieverChainDefinition<?, ?> retrieverChainDefinition) {
Map<DataRetrieverLevel<?, ?>, Map<Function<?>, Collection<?>>> filterSelection = new HashMap<>();
for (DataRetrieverLevelDTO retrieverLevelDTO : filterSelectionDTO.keySet()) {
HashMap<FunctionDTO, HashSet<? extends Serializable>> retrievalLevelSelection = filterSelectionDTO.get(retrieverLevelDTO);
for (FunctionDTO dimensionDTO : retrievalLevelSelection.keySet()) {
if (!retrievalLevelSelection.get(dimensionDTO).isEmpty()) {
Function<?> function = getDataMiningServer().getFunctionForDTO(dimensionDTO);
DataRetrieverLevel<?, ?> retrieverLevel = retrieverChainDefinition.getDataRetrieverLevel(retrieverLevelDTO.getLevel());
if (function != null) {
if (!filterSelection.containsKey(retrieverLevel)) {
filterSelection.put(retrieverLevel, new HashMap<Function<?>, Collection<?>>());
@@ -4,9 +4,11 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import com.sap.sse.datamining.shared.impl.dto.AggregationProcessorDefinitionDTO;
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;
public interface StatisticQueryDefinitionDTO extends Serializable {
@@ -14,7 +16,7 @@ public interface StatisticQueryDefinitionDTO extends Serializable {
public String getLocaleInfoName();
public DataRetrieverChainDefinitionDTO getDataRetrieverChainDefinition();
public HashMap<Integer, HashMap<FunctionDTO, HashSet<? extends Serializable>>> getFilterSelection();
public Map<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> getFilterSelection();
public ArrayList<FunctionDTO> getDimensionsToGroupBy();
public FunctionDTO getStatisticToCalculate();
public AggregationProcessorDefinitionDTO getAggregatorDefinition();
@@ -47,27 +47,53 @@ public class DataRetrieverChainDefinitionDTO implements Serializable, Comparable
return retrieverLevels;
}
public int size() {
public int getLevelAmount() {
return retrieverLevels.size();
}
public DataRetrieverLevelDTO getRetrieverLevel(int retrieverLevel) {
return retrieverLevels.get(retrieverLevel);
/**
* @param levelIndex
* @return The retriever level for the given index or <code>null</code>, if the index is out of bounds.
*/
public DataRetrieverLevelDTO getRetrieverLevel(int levelIndex) {
if (levelIndex < 0 || levelIndex >= getLevelAmount()) {
return null;
}
return retrieverLevels.get(levelIndex);
}
/**
* @param retrieverLevel
* @return The retriever level after the given one or <code>null</code>, if the given one is the last one in the chain.
*/
public DataRetrieverLevelDTO getNextRetrieverLevel(DataRetrieverLevelDTO retrieverLevel) {
return getRetrieverLevel(retrieverLevel.getLevel() + 1);
}
/**
* @param retrieverLevel
* @return The retriever level before the given one or <code>null</code>, if the given one is the first one in the chain.
*/
public DataRetrieverLevelDTO getPreviousRetrieverLevel(DataRetrieverLevelDTO retrieverLevel) {
return getRetrieverLevel(retrieverLevel.getLevel() - 1);
}
@Override
public int compareTo(DataRetrieverChainDefinitionDTO d) {
return this.getName().compareTo(d.getName());
}
@Override
public String toString() {
return getDataSourceTypeName() + " -> " + getRetrievedDataTypeName() +
"[ID: " + id + ", name: " + name + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((dataSourceTypeName == null) ? 0 : dataSourceTypeName.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((retrieverLevels == null) ? 0 : retrieverLevels.hashCode());
return result;
}
@@ -80,26 +106,11 @@ public class DataRetrieverChainDefinitionDTO implements Serializable, Comparable
if (getClass() != obj.getClass())
return false;
DataRetrieverChainDefinitionDTO other = (DataRetrieverChainDefinitionDTO) obj;
if (dataSourceTypeName == null) {
if (other.dataSourceTypeName != null)
return false;
} else if (!dataSourceTypeName.equals(other.dataSourceTypeName))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (retrieverLevels == null) {
if (other.retrieverLevels != null)
return false;
} else if (!retrieverLevels.equals(other.retrieverLevels))
return false;
return true;
}
@@ -2,7 +2,7 @@ package com.sap.sse.datamining.shared.impl.dto;
import java.io.Serializable;
public class DataRetrieverLevelDTO implements Serializable {
public class DataRetrieverLevelDTO implements Serializable, Comparable<DataRetrieverLevelDTO> {
private static final long serialVersionUID = 6911713148350359643L;
private int retrieverLevel;
@@ -32,6 +32,11 @@ public class DataRetrieverLevelDTO implements Serializable {
public LocalizedTypeDTO getRetrievedDataType() {
return retrievedDataType;
}
@Override
public int compareTo(DataRetrieverLevelDTO otherRetrieverLevel) {
return Integer.compare(getLevel(), otherRetrieverLevel.getLevel());
}
@Override
public int hashCode() {
@@ -15,7 +15,7 @@ public class ModifiableStatisticQueryDefinitionDTO implements StatisticQueryDefi
private AggregationProcessorDefinitionDTO aggregatorDefinition;
private ArrayList<FunctionDTO> dimensionsToGroupBy;
private DataRetrieverChainDefinitionDTO dataRetrieverChainDefinition;
private HashMap<Integer, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelection;
private HashMap<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelection;
/**
* <b>Constructor for the GWT-Serialization. Don't use this!</b>
@@ -32,7 +32,7 @@ public class ModifiableStatisticQueryDefinitionDTO implements StatisticQueryDefi
this.dimensionsToGroupBy = new ArrayList<FunctionDTO>();
}
public void setFilterSelectionFor(Integer retrieverLevel, HashMap<FunctionDTO, HashSet<? extends Serializable>> levelFilterSelection) {
public void setFilterSelectionFor(DataRetrieverLevelDTO retrieverLevel, HashMap<FunctionDTO, HashSet<? extends Serializable>> levelFilterSelection) {
filterSelection.put(retrieverLevel, levelFilterSelection);
}
@@ -51,7 +51,7 @@ public class ModifiableStatisticQueryDefinitionDTO implements StatisticQueryDefi
}
@Override
public HashMap<Integer, HashMap<FunctionDTO, HashSet<? extends Serializable>>> getFilterSelection() {
public HashMap<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> getFilterSelection() {
return filterSelection;
}
@@ -19,6 +19,7 @@ import com.sap.sse.datamining.components.DataRetrieverChainDefinition;
import com.sap.sse.datamining.components.Processor;
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.SimpleDataRetrieverChainDefinition;
import com.sap.sse.datamining.shared.GroupKey;
import com.sap.sse.datamining.shared.impl.GenericGroupKey;
@@ -95,8 +96,8 @@ public class TestDimensionsValuesQuery {
raceDimensions.add(dimensionRaceName);
raceDimensions.add(dimensionBoatClassName);
raceDimensions.add(dimensionYear);
Map<Integer, Map<Function<?>, Collection<?>>> filterSelection = new HashMap<>();
Query<HashSet<Object>> dimensionsValueQuery = server.createDimensionValuesQuery(dataRetrieverChainDefinition, 1 /*race*/, raceDimensions, filterSelection, locale);
Map<DataRetrieverLevel<?, ?>, Map<Function<?>, Collection<?>>> filterSelection = new HashMap<>();
Query<HashSet<Object>> dimensionsValueQuery = server.createDimensionValuesQuery(dataRetrieverChainDefinition, dataRetrieverChainDefinition.getDataRetrieverLevel(/*race*/ 1), raceDimensions, filterSelection, locale);
Map<GroupKey, HashSet<Object>> expectedRaceResultData = buildExpectedRaceResultData();
QueryResult<HashSet<Object>> result = dimensionsValueQuery.run();
@@ -106,7 +107,7 @@ public class TestDimensionsValuesQuery {
legDimensions.add(dimensionLegNumber);
legDimensions.add(dimensionCompetitorName);
legDimensions.add(dimensionCompetitorSailID);
dimensionsValueQuery = server.createDimensionValuesQuery(dataRetrieverChainDefinition, 2 /*leg*/, legDimensions, filterSelection, locale);
dimensionsValueQuery = server.createDimensionValuesQuery(dataRetrieverChainDefinition, dataRetrieverChainDefinition.getDataRetrieverLevel(/*leg*/ 2), legDimensions, filterSelection, locale);
Map<GroupKey, HashSet<Object>> expectedLegResultData = buildExpectedLegResultData();
result = dimensionsValueQuery.run();
@@ -82,7 +82,7 @@ public class TestStatisticQuery {
definition.addDimensionToGroupBy(functionFactory.createMethodWrappingFunction(getLengthMethod));
Method getValueMethod = FunctionTestsUtil.getMethodFromClass(Number.class, "getValue");
definition.setFilterSelection(0, functionFactory.createMethodWrappingFunction(getValueMethod), Arrays.asList(10, 100, 1000));
definition.setFilterSelection(retrieverChain.getDataRetrieverLevel(0), functionFactory.createMethodWrappingFunction(getValueMethod), Arrays.asList(10, 100, 1000));
return definition;
}
@@ -55,8 +55,8 @@ public interface DataMiningServer {
Class<DataSourceType> dataSourceType, Class<DataType> retrievedDataType);
public <DataSourceType, DataType> DataRetrieverChainDefinition<DataSourceType, DataType> getDataRetrieverChainDefinition(UUID id);
public <DataSourceType> Query<HashSet<Object>> createDimensionValuesQuery(DataRetrieverChainDefinition<DataSourceType, ?> dataRetrieverChainDefinition, int retrieverLevel,
Iterable<Function<?>> dimensions, Map<Integer, Map<Function<?>, Collection<?>>> filterSelection, Locale locale);
public <DataSourceType> Query<HashSet<Object>> createDimensionValuesQuery(DataRetrieverChainDefinition<DataSourceType, ?> dataRetrieverChainDefinition, DataRetrieverLevel<?, ?> retrieverLevel,
Iterable<Function<?>> dimensions, Map<DataRetrieverLevel<?, ?>, Map<Function<?>, Collection<?>>> filterSelection, Locale locale);
public <DataSourceType, DataType, ExtractedType, ResultType> StatisticQueryDefinition<DataSourceType, DataType, ExtractedType, ResultType> getQueryDefinitionForDTO(StatisticQueryDefinitionDTO queryDefinitionDTO);
public <DataSourceType, ResultType> Query<ResultType> createQuery(StatisticQueryDefinition<DataSourceType, ?, ?, ResultType> queryDefinition);
public <ResultType> QueryResult<ResultType> runNewQueryAndAbortPreviousQueries(DataMiningSession session, Query<ResultType> query);
@@ -8,6 +8,7 @@ import java.util.Map;
import com.sap.sse.datamining.components.AggregationProcessorDefinition;
import com.sap.sse.datamining.components.DataRetrieverChainDefinition;
import com.sap.sse.datamining.functions.Function;
import com.sap.sse.datamining.impl.components.DataRetrieverLevel;
public interface StatisticQueryDefinition<DataSourceType, DataType, ExtractedType, ResultType> {
@@ -19,7 +20,7 @@ public interface StatisticQueryDefinition<DataSourceType, DataType, ExtractedTyp
public Locale getLocale();
public DataRetrieverChainDefinition<DataSourceType, DataType> getDataRetrieverChainDefinition();
public Map<Integer, Map<Function<?>, Collection<?>>> getFilterSelection();
public Map<DataRetrieverLevel<?, ?>, Map<Function<?>, Collection<?>>> getFilterSelection();
public List<Function<?>> getDimensionsToGroupBy();
public Function<ExtractedType> getStatisticToCalculate();
public AggregationProcessorDefinition<ExtractedType, ResultType> getAggregatorDefinition();
@@ -1,5 +1,7 @@
package com.sap.sse.datamining.components;
import com.sap.sse.datamining.impl.components.DataRetrieverLevel;
/**
* Used to construct a chain of retriever processors step by step. Allows to set the filter and result
@@ -11,6 +13,11 @@ package com.sap.sse.datamining.components;
*/
public interface DataRetrieverChainBuilder<DataSourceType> {
/**
* @return <code>true</code>, if {@link #canStepFurther()} has been called.
*/
public boolean hasBeenInitialized();
/**
* @return <code>true</code>, if there's a next data retriever in the chain.
*/
@@ -30,9 +37,9 @@ public interface DataRetrieverChainBuilder<DataSourceType> {
public Class<?> getCurrentRetrievedDataType();
/**
* @return The current retriever level or <code>-1</code> if {@link #stepFurther()} has not yet been called.
* @return The current retriever level or <code>null</code> if {@link #stepFurther()} has not yet been called.
*/
public int getCurrentRetrieverLevel();
public DataRetrieverLevel<?, ?> getCurrentRetrieverLevel();
/**
* Sets the filter for the data retriever of the current level.
@@ -108,6 +108,12 @@ public interface DataRetrieverChainDefinition<DataSourceType, DataType> {
*/
public List<? extends DataRetrieverLevel<?, ?>> getDataRetrieverLevels();
/**
* @param levelIndex
* @return The retriever level for the given index or <code>null</code>, if the index is out of bounds.
*/
public DataRetrieverLevel<?, ?> getDataRetrieverLevel(int levelIndex);
/**
* Returns a {@link DataRetrieverChainBuilder}, that is used to construct the chain. {@link #endWith(Class, Class, Class, String)}
* has to be called before you can use this method. Otherwise an exception will be thrown.
@@ -22,6 +22,7 @@ import com.sap.sse.datamining.functions.ParameterizedFunction;
import com.sap.sse.datamining.impl.AdditionalDimensionValuesQueryData;
import com.sap.sse.datamining.impl.AdditionalStatisticQueryData;
import com.sap.sse.datamining.impl.ProcessorQuery;
import com.sap.sse.datamining.impl.components.DataRetrieverLevel;
import com.sap.sse.datamining.impl.components.GroupedDataEntry;
import com.sap.sse.datamining.impl.criterias.AndCompoundFilterCriterion;
import com.sap.sse.datamining.impl.criterias.CompoundFilterCriterion;
@@ -49,7 +50,7 @@ public class QueryFactory {
Processor<DataType, GroupedDataEntry<DataType>> groupingProcessor = processorFactory.createGroupingProcessor(dataTypeToRetrieve, extractionProcessor, getParameterProvidersFor(queryDefinition.getDimensionsToGroupBy(), stringMessages, queryDefinition.getLocale()));
DataRetrieverChainBuilder<DataSourceType> chainBuilder = queryDefinition.getDataRetrieverChainDefinition().startBuilding(executor);
Map<Integer, FilterCriterion<?>> criteriaMappedByRetrieverLevel = createFilterCriteria(queryDefinition.getFilterSelection());
Map<DataRetrieverLevel<?, ?>, FilterCriterion<?>> criteriaMappedByRetrieverLevel = createFilterCriteria(queryDefinition.getFilterSelection());
while (chainBuilder.canStepFurther()) {
chainBuilder.stepFurther();
@@ -98,9 +99,9 @@ public class QueryFactory {
}
@SuppressWarnings("unchecked")
private <DataType> Map<Integer, FilterCriterion<?>> createFilterCriteria(Map<Integer, Map<Function<?>, Collection<?>>> filterSelection) {
Map<Integer, CompoundFilterCriterion<?>> criteriaMappedByRetrieverLevel = new HashMap<>();
for (Entry<Integer, Map<Function<?>, Collection<?>>> levelFilterSelection : filterSelection.entrySet()) {
private <DataType> Map<DataRetrieverLevel<?, ?>, FilterCriterion<?>> createFilterCriteria(Map<DataRetrieverLevel<?, ?>, Map<Function<?>, Collection<?>>> filterSelection) {
Map<DataRetrieverLevel<?, ?>, FilterCriterion<?>> criteriaMappedByRetrieverLevel = new HashMap<>();
for (Entry<DataRetrieverLevel<?, ?>, Map<Function<?>, Collection<?>>> levelFilterSelection : filterSelection.entrySet()) {
for (Entry<Function<?>, Collection<?>> levelFilterSelectionEntry : levelFilterSelection.getValue().entrySet()) {
Function<?> function = levelFilterSelectionEntry.getKey();
ParameterProvider parameterProvider = ParameterProvider.NULL;
@@ -114,25 +115,25 @@ public class QueryFactory {
((CompoundFilterCriterion<DataType>) criteriaMappedByRetrieverLevel.get(levelFilterSelection.getKey())).addCriteria(new FunctionValuesFilterCriterion<>(dataType, function, parameterProvider, filterValues));
}
}
return (Map<Integer, FilterCriterion<?>>)(Map<Integer, ?>) criteriaMappedByRetrieverLevel;
return criteriaMappedByRetrieverLevel;
}
public <DataSource> Query<HashSet<Object>> createDimensionValuesQuery(DataSource dataSource,
final DataRetrieverChainDefinition<DataSource, ?> dataRetrieverChainDefinition, final int retrieverLevel,
final Iterable<Function<?>> dimensions, final Map<Integer, Map<Function<?>, Collection<?>>> filterSelection, final Locale locale,
public <DataSourceType> Query<HashSet<Object>> createDimensionValuesQuery(DataSourceType dataSource,
final DataRetrieverChainDefinition<DataSourceType, ?> dataRetrieverChainDefinition, final DataRetrieverLevel<?, ?> retrieverLevel,
final Iterable<Function<?>> dimensions, final Map<DataRetrieverLevel<?, ?>, Map<Function<?>, Collection<?>>> filterSelection, final Locale locale,
final ResourceBundleStringMessages stringMessages, final ExecutorService executor) {
@SuppressWarnings("unchecked")
Class<HashSet<Object>> resultType = (Class<HashSet<Object>>)(Class<?>) HashSet.class;
return new ProcessorQuery<HashSet<Object>, DataSource>(dataSource, stringMessages, locale, resultType, new AdditionalDimensionValuesQueryData(dataRetrieverChainDefinition.getID(), dimensions)) {
return new ProcessorQuery<HashSet<Object>, DataSourceType>(dataSource, stringMessages, locale, resultType, new AdditionalDimensionValuesQueryData(dataRetrieverChainDefinition.getID(), dimensions)) {
@Override
protected Processor<DataSource, ?> createChainAndReturnFirstProcessor(Processor<Map<GroupKey, HashSet<Object>>, Void> resultReceiver) {
protected Processor<DataSourceType, ?> createChainAndReturnFirstProcessor(Processor<Map<GroupKey, HashSet<Object>>, Void> resultReceiver) {
ProcessorFactory processorFactory = new ProcessorFactory(executor);
Processor<GroupedDataEntry<Object>, Map<GroupKey, HashSet<Object>>> valueCollector = processorFactory.createGroupedDataCollectingAsSetProcessor(/*query*/ this);
Map<Integer, FilterCriterion<?>> criteriaMappedByRetrieverLevel = createFilterCriteria(filterSelection);
DataRetrieverChainBuilder<DataSource> chainBuilder = dataRetrieverChainDefinition.startBuilding(executor);
while (chainBuilder.getCurrentRetrieverLevel() < retrieverLevel) {
Map<DataRetrieverLevel<?, ?>, FilterCriterion<?>> criteriaMappedByRetrieverLevel = createFilterCriteria(filterSelection);
DataRetrieverChainBuilder<DataSourceType> chainBuilder = dataRetrieverChainDefinition.startBuilding(executor);
while (!chainBuilder.hasBeenInitialized() || chainBuilder.getCurrentRetrieverLevel().getLevel() < retrieverLevel.getLevel()) {
chainBuilder.stepFurther();
if (criteriaMappedByRetrieverLevel.containsKey(chainBuilder.getCurrentRetrieverLevel())) {
@@ -33,6 +33,7 @@ import com.sap.sse.datamining.impl.components.management.StrategyPerQueryTypeMan
import com.sap.sse.datamining.shared.DataMiningSession;
import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.AggregationProcessorDefinitionDTO;
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.i18n.ResourceBundleStringMessages;
@@ -298,8 +299,8 @@ public class DataMiningServerImpl implements ModifiableDataMiningServer {
AggregationProcessorDefinition<ExtractedType, ResultType> aggregatorDefinition = getAggregationProcessorDefinitionForDTO(queryDefinitionDTO.getAggregatorDefinition());
queryDefinition = new ModifiableStatisticQueryDefinition<>(locale, retrieverChain, statisticToCalculate, aggregatorDefinition);
for (Entry<Integer, HashMap<FunctionDTO, HashSet<? extends Serializable>>> levelSpecificFilterSelection : queryDefinitionDTO.getFilterSelection().entrySet()) {
Integer retrieverLevel = levelSpecificFilterSelection.getKey();
for (Entry<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> levelSpecificFilterSelection : queryDefinitionDTO.getFilterSelection().entrySet()) {
DataRetrieverLevel<?, ?> retrieverLevel = retrieverChain.getDataRetrieverLevel(levelSpecificFilterSelection.getKey().getLevel());
for (Entry<FunctionDTO, HashSet<? extends Serializable>> levelSpecificFilterSelectionEntry : levelSpecificFilterSelection.getValue().entrySet()) {
Function<?> dimensionToFilterBy = getFunctionForDTO(levelSpecificFilterSelectionEntry.getKey());
if (dimensionToFilterBy != null) {
@@ -326,8 +327,8 @@ public class DataMiningServerImpl implements ModifiableDataMiningServer {
}
@Override
public <DataSourceType> Query<HashSet<Object>> createDimensionValuesQuery(DataRetrieverChainDefinition<DataSourceType, ?> dataRetrieverChainDefinition, int retrieverLevel,
Iterable<Function<?>> dimensions, Map<Integer, Map<Function<?>, Collection<?>>> filterSelection, Locale locale) {
public <DataSourceType> Query<HashSet<Object>> createDimensionValuesQuery(DataRetrieverChainDefinition<DataSourceType, ?> dataRetrieverChainDefinition, DataRetrieverLevel<?, ?> retrieverLevel,
Iterable<Function<?>> dimensions, Map<DataRetrieverLevel<?, ?>, Map<Function<?>, Collection<?>>> filterSelection, Locale locale) {
DataSourceProvider<DataSourceType> dataSourceProvider = getDataSourceProviderFor(dataRetrieverChainDefinition.getDataSourceType());
return queryFactory.createDimensionValuesQuery(dataSourceProvider.getDataSource(), dataRetrieverChainDefinition, retrieverLevel, dimensions, filterSelection, locale, getStringMessages(), getExecutorService());
}
@@ -11,13 +11,14 @@ import com.sap.sse.datamining.StatisticQueryDefinition;
import com.sap.sse.datamining.components.AggregationProcessorDefinition;
import com.sap.sse.datamining.components.DataRetrieverChainDefinition;
import com.sap.sse.datamining.functions.Function;
import com.sap.sse.datamining.impl.components.DataRetrieverLevel;
public class ModifiableStatisticQueryDefinition<DataSourceType, DataType, ExtractedType, ResultType> implements StatisticQueryDefinition<DataSourceType, DataType, ExtractedType, ResultType> {
private final Locale locale;
private final DataRetrieverChainDefinition<DataSourceType, DataType> retrieverChain;
private final Map<Integer, Map<Function<?>, Collection<?>>> filterSelection;
private final Map<DataRetrieverLevel<?, ?>, Map<Function<?>, Collection<?>>> filterSelection;
private final List<Function<?>> dimensionsToGroupBy;
@@ -67,7 +68,7 @@ public class ModifiableStatisticQueryDefinition<DataSourceType, DataType, Extrac
}
@Override
public Map<Integer, Map<Function<?>, Collection<?>>> getFilterSelection() {
public Map<DataRetrieverLevel<?, ?>, Map<Function<?>, Collection<?>>> getFilterSelection() {
return filterSelection;
}
@@ -86,7 +87,7 @@ public class ModifiableStatisticQueryDefinition<DataSourceType, DataType, Extrac
return aggregatorDefinition;
}
public void setFilterSelection(Integer retrieverLevel, Function<?> dimensionToFilterBy, Collection<?> filterSelection) {
public void setFilterSelection(DataRetrieverLevel<?, ?> retrieverLevel, Function<?> dimensionToFilterBy, Collection<?> filterSelection) {
if (!this.filterSelection.containsKey(retrieverLevel)) {
this.filterSelection.put(retrieverLevel, new HashMap<Function<?>, Collection<?>>());
}
@@ -109,8 +109,8 @@ public class SimpleDataRetrieverChainBuilder<DataSourceType> implements DataRetr
}
@Override
public int getCurrentRetrieverLevel() {
return currentRetrieverTypeIndex;
public DataRetrieverLevel<?, ?> getCurrentRetrieverLevel() {
return hasBeenInitialized() ? dataRetrieverTypesWithInformation.get(currentRetrieverTypeIndex) : null;
}
@SuppressWarnings("unchecked")
@@ -129,7 +129,7 @@ public class SimpleDataRetrieverChainBuilder<DataSourceType> implements DataRetr
return (Processor<DataSourceType, ?>) firstRetriever;
}
private boolean hasBeenInitialized() {
public boolean hasBeenInitialized() {
return currentRetrieverTypeIndex >= 0;
}
@@ -128,6 +128,14 @@ public class SimpleDataRetrieverChainDefinition<DataSourceType, DataType> implem
public List<? extends DataRetrieverLevel<?, ?>> getDataRetrieverLevels() {
return dataRetrieverTypesWithInformation;
}
@Override
public DataRetrieverLevel<?, ?> getDataRetrieverLevel(int levelIndex) {
if (levelIndex < 0 || levelIndex >= getDataRetrieverLevels().size()) {
return null;
}
return getDataRetrieverLevels().get(levelIndex);
}
@Override
public DataRetrieverChainBuilder<DataSourceType> startBuilding(ExecutorService executor) {