bug4789: a few minor fixes; a few things start to work around report parameters

This commit is contained in:
Axel Uhl
2023-02-10 18:43:38 +01:00
parent a94dbadc0d
commit e5cfbde869
7 changed files with 47 additions and 12 deletions
@@ -848,14 +848,25 @@ public class Util {
}
return list;
}
/**
* Creates a new set in any case
*/
public static <T> Set<T> asNewSet(Iterable<T> iterable) {
final Set<T> result = new HashSet<>();
addAll(iterable, result);
return result;
}
/**
* If {@code iterable} already is a set, return it; otherwise create a new set
*/
public static <T> Set<T> asSet(Iterable<T> iterable) {
final Set<T> result;
if (iterable instanceof Set<?>) {
result = (Set<T>) iterable;
} else {
result = new HashSet<>();
addAll(iterable, result);
result = asNewSet(iterable);
}
return result;
}
@@ -46,6 +46,10 @@ public class ReportParameterToDimensionFilterBindings implements Iterable<Entry<
*/
public ReportParameterToDimensionFilterBindings(ReportParameterToDimensionFilterBindings other) {
this();
fillFromOther(other);
}
private void fillFromOther(ReportParameterToDimensionFilterBindings other) {
for (final Entry<FilterDimensionIdentifier, FilterDimensionParameter> e : other) {
setParameterBinding(e.getKey(), e.getValue());
}
@@ -67,4 +71,9 @@ public class ReportParameterToDimensionFilterBindings implements Iterable<Entry<
public Iterator<Entry<FilterDimensionIdentifier, FilterDimensionParameter>> iterator() {
return parameterBindings.entrySet().iterator();
}
public void set(ReportParameterToDimensionFilterBindings parameterUsages) {
parameterBindings.clear();
fillFromOther(parameterUsages);
}
}
@@ -70,6 +70,7 @@ public class ModifiableDataMiningReportDTO implements DataMiningReportDTO {
this.parameters = new HashSet<>();
Util.addAll(parameters, this.parameters);
parameterModelListeners = new HashSet<>();
parameterUsages = new IdentityHashMap<>();
}
/**
@@ -40,6 +40,7 @@ import com.google.gwt.view.client.DefaultSelectionEventManager.SelectAction;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.sap.sse.common.Util;
import com.sap.sse.common.settings.SerializableSettings;
import com.sap.sse.common.util.NaturalComparator;
import com.sap.sse.datamining.shared.DataMiningSession;
@@ -232,22 +233,29 @@ public class DimensionFilterSelectionProvider extends AbstractDataMiningComponen
parameterSettingsButton.addStyleName("query-parameter");
parameterSettingsButton.addClickHandler(e -> {
if (this.parameter == null) {
// TODO bug4789: when binding a parameter to this dimension filter, observe its value set and record usage in temporary structure ReportParameterToDimensionFilterBindings
new PickOrCreateReportParameterDialog(reportProvider.getCurrentReport(), dimension.getReturnTypeName(), getDataMiningStringMessages(),
final DataMiningReportDTO currentReport = reportProvider.getCurrentReport();
final Set<FilterDimensionParameter> reportParametersBeforeDialogShown = Util.asNewSet(currentReport.getParameters());
new PickOrCreateReportParameterDialog(currentReport, dimension.getReturnTypeName(), getDataMiningStringMessages(),
new DialogCallback<FilterDimensionParameter>() {
@Override
public void ok(FilterDimensionParameter editedObject) {
parameter = editedObject;
reportParameterBindings.setParameterBinding(new FilterDimensionIdentifier(retrieverLevel, dimension), editedObject);
if (Util.contains(reportParametersBeforeDialogShown, editedObject)) {
// the parameter existed before; copy its value set to the current selection:
parameterValueChanged(editedObject, Collections.emptySet());
} else {
// a new parameter; set the parameter's value to the current selection:
parameter.setValues(selectionModel.getSelectedSet());
}
editedObject.addParameterModelListener(DimensionFilterSelectionProvider.this);
parameterValueChanged(editedObject, Collections.emptySet()); // update this dimension filter's selection based on parameter value set
}
@Override
public void cancel() {
parameterSettingsButton.setDown(false);
}
}).center();
}).show();
} else {
unbindFromParameter(this.parameter);
}
@@ -438,13 +438,13 @@ public class HierarchicalDimensionListFilterSelectionProvider extends AbstractDa
}
private void selectedFilterDimensionsChanged(SelectionChangeEvent event) {
Iterable<DimensionWithContext> displayedDimensions = new HashSet<>(dimensionFilterSelectionProviders.keySet());
for (DimensionWithContext displayedDimension : displayedDimensions) {
final Iterable<DimensionWithContext> displayedDimensions = new HashSet<>(dimensionFilterSelectionProviders.keySet());
for (final DimensionWithContext displayedDimension : displayedDimensions) {
if (!filterDimensionSelectionModel.isSelected(displayedDimension)) {
removeDimensionFilterSelectionProvider(displayedDimension);
}
}
for (DimensionWithContext selectedDimension : filterDimensionSelectionModel.getSelectedSet()) {
for (final DimensionWithContext selectedDimension : filterDimensionSelectionModel.getSelectedSet()) {
if (!dimensionFilterSelectionProviders.containsKey(selectedDimension)) {
addDimensionFilterSelectionProvider(selectedDimension);
}
@@ -92,7 +92,7 @@ public class PickOrCreateReportParameterDialog extends DataEntryDialog<FilterDim
this(report, typeName, stringMessages, callback, /* paramtersAdded */ new HashSet<>(), /* parametersRemoved */ new HashSet<>());
}
public PickOrCreateReportParameterDialog(DataMiningReportDTO report,
private PickOrCreateReportParameterDialog(DataMiningReportDTO report,
String typeName, StringMessages stringMessages, DialogCallback<FilterDimensionParameter> callback,
Set<FilterDimensionParameter> parametersAdded, Set<FilterDimensionParameter> parametersRemoved) {
super(stringMessages.pickOrCreateReportParameter(), stringMessages.pickOrCreateReportParameterMessage(),
@@ -180,6 +180,7 @@ public class PickOrCreateReportParameterDialog extends DataEntryDialog<FilterDim
final FilterDimensionParameter newParameter = new ValueListFilterParameter(newParameterName, typeName, Collections.emptySet());
parametersAdded.add(newParameter);
parametersListBox.addItem(newParameter);
parametersListBox.setSelectedIndex(parametersListBox.getItemCount()-1);
}
@Override
@@ -125,13 +125,17 @@ public class QueryDefinitionProviderWithControls extends AbstractQueryDefinition
* together with the query so that the current report can be updated from it. See also
* {@link DataMiningReportDTO#replaceQueryDefinition(StatisticQueryDefinitionDTO, ModifiableStatisticQueryDefinitionDTO, ReportParameterToDimensionFilterBindings)}.
*/
private ReportParameterToDimensionFilterBindings reportParameterBindings;
private final ReportParameterToDimensionFilterBindings reportParameterBindings;
private final ReportProvider reportProvider;
public QueryDefinitionProviderWithControls(Component<?> parent, ComponentContext<?> context,
DataMiningSession session, DataMiningServiceAsync dataMiningService, ReportProvider reportProvider,
ErrorReporter errorReporter, DataMiningSettingsControl settingsControl,
DataMiningSettingsInfoManager settingsManager, Consumer<Pair<ModifiableStatisticQueryDefinitionDTO, ReportParameterToDimensionFilterBindings>> queryRunner) {
super(parent, context, dataMiningService, errorReporter);
this.reportProvider = reportProvider;
this.reportParameterBindings = new ReportParameterToDimensionFilterBindings();
providerListener = new ProviderListener();
mainPanel = new LayoutPanel();
// Creating the header panel, that contains the retriever chain provider and the controls
@@ -382,7 +386,8 @@ public class QueryDefinitionProviderWithControls extends AbstractQueryDefinition
* its constituents to the various elements of this UI widget. A new query definition will be produced from this
* editor UI in {@link #getQueryDefinition()}.
*/
private void setQueryDefinition(StatisticQueryDefinitionDTO queryDefinition) { // TODO bug4789: deliver parameter bindings and establish in local temporary model of type ReportParameterToDimensionFilterBindings
private void setQueryDefinition(StatisticQueryDefinitionDTO queryDefinition) {
reportParameterBindings.set(reportProvider.getCurrentReport().getParameterUsages(queryDefinition));
final Set<ApplyCallback> callbacks = new HashSet<>();
final Collection<String> errorMessages = new ArrayList<>();
final String retrieverChainName = queryDefinition.getDataRetrieverChainDefinition().getName();