Fixed a drill down issue where the filter selection would be outdated due to the asynchronicity of the filter selection widgets

This commit is contained in:
Lennart Hensler committed 2018-08-07 18:51:01 +02:00
1 parent 447f69ae24
commit f44322e4e9
3 files changed
+61 -58

No files matched your search

@@ -17,6 +17,6 @@ public interface FilterSelectionProvider
public void clearSelection();
void setHighestRetrieverLevelWithFilterDimension(FunctionDTO dimension, Serializable groupKey);
void setFilterSelectionForUnreducedDimension(FunctionDTO unreducedDimension, Serializable filterValue, Runnable onCompletion);
}
@@ -277,18 +277,6 @@ public class HierarchicalDimensionListFilterSelectionProvider extends AbstractDa
filterDimensionSelectionModel.clear();
filterFilterDimensionsPanel.removeAll();
}
@Override
public void setHighestRetrieverLevelWithFilterDimension(FunctionDTO dimension, Serializable groupKey) {
FunctionDTO reducedDimension = reducedDimensions == null ? dimension : reducedDimensions.getReducedDimension(dimension);
Collection<Serializable> items = Collections.singleton(groupKey);
for (DimensionWithContext dimensionWithContext : availableFilterDimensions) {
if (dimensionWithContext.getDimension().equals(reducedDimension)) {
setDimensionSelection(dimensionWithContext, items, m -> { });
break;
}
}
}
@Override
public void applyQueryDefinition(StatisticQueryDefinitionDTO queryDefinition, Consumer<Iterable<String>> callback) {
@@ -367,6 +355,25 @@ public class HierarchicalDimensionListFilterSelectionProvider extends AbstractDa
}
@Override
public void setFilterSelectionForUnreducedDimension(FunctionDTO unreducedDimension, Serializable filterValue, Runnable onCompletion) {
FunctionDTO reducedDimension = reducedDimensions == null ? unreducedDimension : reducedDimensions.getReducedDimension(unreducedDimension);
DimensionWithContext dimensionToChange = null;
for (DimensionWithContext dimensionWithContext : availableFilterDimensions) {
if (dimensionWithContext.getDimension().equals(reducedDimension)) {
dimensionToChange = dimensionWithContext;
break;
}
}
if (dimensionToChange != null) {
ignoreSelectionChangedNotifications = true;
setDimensionSelection(dimensionToChange, Collections.singleton(filterValue), m -> { });
ignoreSelectionChangedNotifications = false;
updateAvailableFilterValues(dimensionToChange.getRetrieverLevel(), dimensionToChange, onCompletion);
}
}
private void setDimensionSelection(DimensionWithContext dimension, Collection<? extends Serializable> items, Consumer<Iterable<String>> callback) {
DimensionFilterSelectionProvider selectionProvider;
if (filterDimensionSelectionModel.isSelected(dimension)) {
@@ -256,61 +256,22 @@ public class QueryDefinitionProviderWithControls extends AbstractQueryDefinition
*/
public void drillDown(GroupKey groupKey, Runnable onSuccessCallback) {
assert groupKey instanceof GenericGroupKey<?>;
final GenericGroupKey<?> groupKeyForSingleDimension = (GenericGroupKey<?>) groupKey;
final Serializable filterValue = (Serializable) ((GenericGroupKey<?>) groupKey).getValue();
final Collection<FunctionDTO> dimensionsToGroupBy = groupingProvider.getDimensionsToGroupBy();
if (!dimensionsToGroupBy.isEmpty()) {
final FunctionDTO firstDimension = dimensionsToGroupBy.iterator().next();
final FunctionDTO firstDimension = Util.first(dimensionsToGroupBy);
if (dimensionsToGroupBy.size() == 1) {
letUserSelectADifferentFirstDimension(() -> {
filterSelectionProvider.setHighestRetrieverLevelWithFilterDimension(firstDimension,
(Serializable) groupKeyForSingleDimension.getValue());
onSuccessCallback.run();
showSelectNewFirstDimensionDialog(() -> {
filterSelectionProvider.setFilterSelectionForUnreducedDimension(firstDimension, filterValue, onSuccessCallback);
});
} else {
filterSelectionProvider.setHighestRetrieverLevelWithFilterDimension(firstDimension,
(Serializable) groupKeyForSingleDimension.getValue());
groupingProvider.removeDimensionToGroupBy(firstDimension);
onSuccessCallback.run();
filterSelectionProvider.setFilterSelectionForUnreducedDimension(firstDimension, filterValue, onSuccessCallback);
}
}
}
private class FirstDimensionSelectionDialog extends DataEntryDialog<FunctionDTO> {
private ValueListBox<FunctionDTO> dimensionChooser;
public FirstDimensionSelectionDialog(DialogCallback<FunctionDTO> callback) {
super(getDataMiningStringMessages().chooseDifferentDimensionTitle(),
getDataMiningStringMessages().chooseDifferentDimensionMessage(), getDataMiningStringMessages().ok(),
getDataMiningStringMessages().cancel(), new DataEntryDialog.Validator<FunctionDTO>() {
@Override
public String getErrorMessage(FunctionDTO valueToValidate) {
if (valueToValidate == null) {
return getDataMiningStringMessages().pleaseSelectADimension();
} else {
return null;
}
}
}, callback);
dimensionChooser = groupingProvider.createDimensionToGroupByBoxWithoutEventHandler();
Collection<FunctionDTO> acceptableValues = new ArrayList<>();
Util.addAll(groupingProvider.getAvailableDimensions(), acceptableValues);
acceptableValues.add(null);
dimensionChooser.setAcceptableValues(acceptableValues);
dimensionChooser.addValueChangeHandler(e -> validateAndUpdate());
}
@Override
protected Widget getAdditionalWidget() {
return dimensionChooser;
}
@Override
protected FunctionDTO getResult() {
return dimensionChooser.getValue();
}
}
private void letUserSelectADifferentFirstDimension(final Runnable onSuccessCallback) {
private void showSelectNewFirstDimensionDialog(final Runnable onSuccessCallback) {
final FirstDimensionSelectionDialog dialog = new FirstDimensionSelectionDialog(
new DialogCallback<FunctionDTO>() {
@Override
@@ -614,4 +575,39 @@ public class QueryDefinitionProviderWithControls extends AbstractQueryDefinition
}
private class FirstDimensionSelectionDialog extends DataEntryDialog<FunctionDTO> {
private ValueListBox<FunctionDTO> dimensionChooser;
public FirstDimensionSelectionDialog(DialogCallback<FunctionDTO> callback) {
super(getDataMiningStringMessages().chooseDifferentDimensionTitle(),
getDataMiningStringMessages().chooseDifferentDimensionMessage(), getDataMiningStringMessages().ok(),
getDataMiningStringMessages().cancel(), new DataEntryDialog.Validator<FunctionDTO>() {
@Override
public String getErrorMessage(FunctionDTO valueToValidate) {
if (valueToValidate == null) {
return getDataMiningStringMessages().pleaseSelectADimension();
} else {
return null;
}
}
}, callback);
dimensionChooser = groupingProvider.createDimensionToGroupByBoxWithoutEventHandler();
Collection<FunctionDTO> acceptableValues = new ArrayList<>();
Util.addAll(groupingProvider.getAvailableDimensions(), acceptableValues);
acceptableValues.add(null);
dimensionChooser.setAcceptableValues(acceptableValues);
dimensionChooser.addValueChangeHandler(e -> validateAndUpdate());
}
@Override
protected Widget getAdditionalWidget() {
return dimensionChooser;
}
@Override
protected FunctionDTO getResult() {
return dimensionChooser.getValue();
}
}
}