can remove the first grouping dimension upon click on the bar

Change-Id: Ida0b4e7fe972a6ea0dfaea45affd3f1356156d6d
This commit is contained in:
Axel Uhl committed 2017-10-04 18:34:44 +02:00
1 parent 9665ac08a8
commit 254d008e87
6 files changed
+79 -28

No files matched your search

@@ -36,6 +36,8 @@ public class DataMiningEntryPoint extends AbstractSailingEntryPoint {
private DataMiningSession session;
private QueryDefinitionProviderWithControls queryDefinitionProviderWithControls;
@Override
protected void doOnModuleLoad() {
Highcharts.ensureInjectedWithMore();
@@ -55,15 +57,15 @@ public class DataMiningEntryPoint extends AbstractSailingEntryPoint {
public Widget get() {
DataMiningSettingsControl settingsControl = new AnchorDataMiningSettingsControl(null, null,
getStringMessages());
ResultsPresenter<?> resultsPresenter = new TabbedResultsPresenter(null, null, getStringMessages());
ResultsPresenter<?> resultsPresenter = new TabbedResultsPresenter(/* parent */ null, /* context */ null,
/* delegate drillDownCallback */ groupKey -> queryDefinitionProviderWithControls.drillDown(groupKey),
getStringMessages());
DockLayoutPanel selectionDockPanel = new DockLayoutPanel(Unit.PX);
QueryDefinitionProviderWithControls queryDefinitionProviderWithControls =
queryDefinitionProviderWithControls =
new QueryDefinitionProviderWithControls(null, null, session, getStringMessages(),
dataMiningService, DataMiningEntryPoint.this, settingsControl, resultsPresenter);
queryDefinitionProviderWithControls.getEntryWidget().addStyleName("dataMiningPanel");
selectionDockPanel.add(queryDefinitionProviderWithControls.getEntryWidget());
QueryRunner queryRunner = new SimpleQueryRunner(null, null, session, getStringMessages(),
dataMiningService,
DataMiningEntryPoint.this, queryDefinitionProviderWithControls, resultsPresenter);
@@ -6,13 +6,16 @@ import com.sap.sse.common.settings.SerializableSettings;
import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.FunctionDTO;
public interface GroupingProvider extends DataMiningComponentProvider<SerializableSettings>, DataRetrieverChainDefinitionChangedListener {
public Collection<FunctionDTO> getDimensionsToGroupBy();
public String getCustomGrouperScriptText();
public void applyQueryDefinition(StatisticQueryDefinitionDTO queryDefinition);
public void addGroupingChangedListener(GroupingChangedListener listener);
public interface GroupingProvider
extends DataMiningComponentProvider<SerializableSettings>, DataRetrieverChainDefinitionChangedListener {
Collection<FunctionDTO> getDimensionsToGroupBy();
String getCustomGrouperScriptText();
void applyQueryDefinition(StatisticQueryDefinitionDTO queryDefinition);
void addGroupingChangedListener(GroupingChangedListener listener);
void removeDimensionToGroupBy(FunctionDTO dimension);
}
@@ -15,6 +15,7 @@ import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.controls.AbstractObjectRenderer;
import com.sap.sailing.gwt.ui.datamining.ResultsPresenter;
import com.sap.sailing.gwt.ui.datamining.presentation.ResultsChart.DrillDownCallback;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.datamining.shared.impl.dto.QueryResultDTO;
import com.sap.sse.gwt.client.shared.components.AbstractComponent;
@@ -33,12 +34,12 @@ public class MultiResultsPresenter extends AbstractComponent<Settings> implement
private List<PresenterDescriptor<Object>> availablePresenters;
public MultiResultsPresenter(Component<?> parent, ComponentContext<?> context, StringMessages stringMessages) {
public MultiResultsPresenter(Component<?> parent, ComponentContext<?> context, DrillDownCallback drillDownCallback, StringMessages stringMessages) {
super(parent, context);
this.stringMessages = stringMessages;
availablePresenters = new ArrayList<>();
availablePresenters.add(new ColumnChartDescriptor());
availablePresenters.add(new ColumnChartDescriptorWithErrorBars());
availablePresenters.add(new ColumnChartDescriptor(drillDownCallback));
availablePresenters.add(new ColumnChartDescriptorWithErrorBars(drillDownCallback));
availablePresenters.add(new PlainDescriptor());
presenterPanel = new DeckLayoutPanel();
@@ -195,9 +196,9 @@ public class MultiResultsPresenter extends AbstractComponent<Settings> implement
private final ResultsChart presenter;
private final String name;
public AbstractColumnChartDescriptor(String name, boolean showErrorBars) {
public AbstractColumnChartDescriptor(String name, boolean showErrorBars, DrillDownCallback drillDownCallback) {
this.name = name;
presenter = new ResultsChart(MultiResultsPresenter.this, getComponentContext(), stringMessages, showErrorBars, /* drillDownCallback */ null);
presenter = new ResultsChart(MultiResultsPresenter.this, getComponentContext(), stringMessages, showErrorBars, drillDownCallback);
}
@Override
@@ -212,14 +213,14 @@ public class MultiResultsPresenter extends AbstractComponent<Settings> implement
}
private class ColumnChartDescriptor extends AbstractColumnChartDescriptor {
public ColumnChartDescriptor() {
super(stringMessages.columnChart(), /* showErrorBars */ false);
public ColumnChartDescriptor(DrillDownCallback drillDownCallback) {
super(stringMessages.columnChart(), /* showErrorBars */ false, drillDownCallback);
}
}
private class ColumnChartDescriptorWithErrorBars extends AbstractColumnChartDescriptor {
public ColumnChartDescriptorWithErrorBars() {
super(stringMessages.columnChartWithErrorBars(), /* showErrorBars */ true);
public ColumnChartDescriptorWithErrorBars(DrillDownCallback drillDownCallback) {
super(stringMessages.columnChartWithErrorBars(), /* showErrorBars */ true, drillDownCallback);
}
}
@@ -18,6 +18,7 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.controls.ScrolledTabLayoutPanel;
import com.sap.sailing.gwt.ui.datamining.DataMiningResources;
import com.sap.sailing.gwt.ui.datamining.ResultsPresenter;
import com.sap.sailing.gwt.ui.datamining.presentation.ResultsChart.DrillDownCallback;
import com.sap.sailing.gwt.ui.polarmining.PolarBackendResultsPresenter;
import com.sap.sailing.gwt.ui.polarmining.PolarResultsPresenter;
import com.sap.sse.common.settings.Settings;
@@ -35,18 +36,19 @@ public class TabbedResultsPresenter extends AbstractComponent<Settings> implemen
private final ScrolledTabLayoutPanel tabPanel;
private final Map<Widget, ResultsPresenter<?>> presentersMappedByHeader;
private final DrillDownCallback drillDownCallback;
public TabbedResultsPresenter(Component<?> parent, ComponentContext<?> context, StringMessages stringMessages) {
public TabbedResultsPresenter(Component<?> parent, ComponentContext<?> context, DrillDownCallback drillDownCallback, StringMessages stringMessages) {
super(parent, context);
this.stringMessages = stringMessages;
this.drillDownCallback = drillDownCallback;
tabPanel = new ScrolledTabLayoutPanel(30, Unit.PX, resources.arrowLeftIcon(), resources.arrowRightIcon());
tabPanel.setAnimationDuration(0);
tabPanel.getElement().getStyle().setMarginTop(10, Unit.PX);
presentersMappedByHeader = new HashMap<>();
addNewTabTab();
addTabAndFocus(new MultiResultsPresenter(this, context, stringMessages));
addTabAndFocus(new MultiResultsPresenter(this, context, drillDownCallback, stringMessages));
}
private void addNewTabTab() {
@@ -60,7 +62,7 @@ public class TabbedResultsPresenter extends AbstractComponent<Settings> implemen
if (event.getItem() == tabPanel.getWidgetCount() - 1) {
event.cancel();
addTabAndFocus(new MultiResultsPresenter(TabbedResultsPresenter.this, getComponentContext(),
stringMessages));
drillDownCallback, stringMessages));
}
}
});
@@ -82,7 +84,7 @@ public class TabbedResultsPresenter extends AbstractComponent<Settings> implemen
} else {
if (!(getSelectedPresenter() instanceof MultiResultsPresenter)) {
CloseableTabHeader oldHeader = getSelectedHeader();
addTabAndFocus(new MultiResultsPresenter(this, getComponentContext(), stringMessages));
addTabAndFocus(new MultiResultsPresenter(this, getComponentContext(), drillDownCallback, stringMessages));
removeTab(oldHeader);
}
}
@@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.Set;
@@ -22,6 +23,7 @@ import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync;
import com.sap.sailing.gwt.ui.datamining.DataRetrieverChainDefinitionProvider;
import com.sap.sailing.gwt.ui.datamining.GroupingChangedListener;
import com.sap.sailing.gwt.ui.datamining.GroupingProvider;
import com.sap.sse.common.Util;
import com.sap.sse.common.settings.SerializableSettings;
import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
@@ -194,7 +196,7 @@ public class MultiDimensionalGroupingProvider extends AbstractComponent<Serializ
@Override
public Collection<FunctionDTO> getDimensionsToGroupBy() {
Collection<FunctionDTO> dimensionsToGroupBy = new ArrayList<FunctionDTO>();
Collection<FunctionDTO> dimensionsToGroupBy = new ArrayList<>();
for (ValueListBox<FunctionDTO> dimensionListBox : dimensionToGroupByBoxes) {
if (dimensionListBox.getValue() != null) {
dimensionsToGroupBy.add(dimensionListBox.getValue());
@@ -202,6 +204,19 @@ public class MultiDimensionalGroupingProvider extends AbstractComponent<Serializ
}
return dimensionsToGroupBy;
}
@Override
public void removeDimensionToGroupBy(FunctionDTO dimension) {
for (final Iterator<ValueListBox<FunctionDTO>> i=dimensionToGroupByBoxes.iterator(); i.hasNext(); ) {
final ValueListBox<FunctionDTO> dimensionListBox = i.next();
if (Util.equalsWithNull(dimension, dimensionListBox.getValue())) {
i.remove();
mainPanel.remove(dimensionListBox);
updateAcceptableValues();
notifyListeners();
}
}
}
@Override
public String getCustomGrouperScriptText() {
@@ -34,11 +34,13 @@ import com.sap.sailing.gwt.ui.datamining.StatisticProvider;
import com.sap.sailing.gwt.ui.datamining.WithControls;
import com.sap.sailing.gwt.ui.datamining.developer.PredefinedQueryRunner;
import com.sap.sailing.gwt.ui.datamining.developer.QueryDefinitionViewer;
import com.sap.sailing.gwt.ui.datamining.presentation.ResultsChart.DrillDownCallback;
import com.sap.sailing.gwt.ui.datamining.selection.filter.ListRetrieverChainFilterSelectionProvider;
import com.sap.sailing.gwt.ui.datamining.settings.AdvancedDataMiningSettings;
import com.sap.sailing.gwt.ui.datamining.settings.AdvancedDataMiningSettingsDialogComponent;
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.AggregationProcessorDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
@@ -50,7 +52,7 @@ import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
import com.sap.sse.gwt.client.shared.settings.ComponentContext;
public class QueryDefinitionProviderWithControls extends AbstractQueryDefinitionProvider<AdvancedDataMiningSettings> implements WithControls {
public class QueryDefinitionProviderWithControls extends AbstractQueryDefinitionProvider<AdvancedDataMiningSettings> implements WithControls, DrillDownCallback {
private static final double headerPanelHeight = 45;
private static final double footerPanelHeight = 50;
@@ -167,6 +169,32 @@ public class QueryDefinitionProviderWithControls extends AbstractQueryDefinition
providers.forEach(provider -> provider.awaitReloadComponents());
}
/**
* The first {@link FunctionDTO dimension} of which the {@code groupKey} is assumed to be an instance will be
* removed from the {@link #groupingProvider}. A filter criterion for that dimension will be added to the
* {@link #filterSelectionProvider}, filtering such that only {@code groupKey} will be accepted as value. For this
* purpose, the retriever levels are scanned from top to bottom to find the topmost occurrence of that dimension.<p>
*
* If the {@link #groupingProvider} had only one grouping level, a popup menu is displayed where the user must select
* another dimension to group by, before the query can be run again. Otherwise, the query is executed again after
* the first grouping level has been removed and the filter has been set.
*
* @return {@code true} if it seems the drill-down has worked
*/
@Override
public boolean drillDown(GroupKey groupKey) {
final boolean result;
final Collection<FunctionDTO> dimensionsToGroupBy = groupingProvider.getDimensionsToGroupBy();
if (!dimensionsToGroupBy.isEmpty()) {
final FunctionDTO firstDimension = dimensionsToGroupBy.iterator().next();
groupingProvider.removeDimensionToGroupBy(firstDimension);
result = true;
} else {
result = false;
}
return result;
}
@Override
public void awaitReloadComponents() {
// Nothing to do here