mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-17 01:31:01 +00:00
can remove the first grouping dimension upon click on the bar
Change-Id: Ida0b4e7fe972a6ea0dfaea45affd3f1356156d6d
This commit is contained in:
1 parent
9665ac08a8
commit
254d008e87
6 files changed
+79
-28
No files matched your search
+6
-4
@@ -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);
|
||||
|
||||
+11
-8
@@ -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);
|
||||
|
||||
}
|
||||
+10
-9
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+7
-5
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+16
-1
@@ -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() {
|
||||
|
||||
+29
-1
@@ -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
|
||||
|
||||
Reference in new issue
Block a user