The PlainResultsPresenter now shows two dimensional results as table and not as list

This commit is contained in:
Lennart Hensler
2017-02-20 18:50:32 +01:00
parent 341cc0e60e
commit 01aa65df62
5 changed files with 115 additions and 21 deletions
@@ -34,6 +34,7 @@ implements ResultsPresenterWithControls<SettingsType> {
private QueryResultDTO<?> currentResult;
private boolean isCurrentResultSimple;
private boolean isCurrentResultTwoDimensional;
public AbstractResultsPresenter(StringMessages stringMessages) {
this.stringMessages = stringMessages;
@@ -87,12 +88,12 @@ implements ResultsPresenterWithControls<SettingsType> {
}
this.currentResult = result;
updateIsCurrentResultSimple();
updateCurrentResultInfo();
internalShowResults(getCurrentResult());
} else {
this.currentResult = null;
updateIsCurrentResultSimple();
updateCurrentResultInfo();
showError(getStringMessages().noDataFound() + ".");
}
}
@@ -110,7 +111,7 @@ implements ResultsPresenterWithControls<SettingsType> {
}
currentResult = null;
updateIsCurrentResultSimple();
updateCurrentResultInfo();
presentationPanel.setWidget(errorLabel);
}
@@ -132,27 +133,43 @@ implements ResultsPresenterWithControls<SettingsType> {
}
currentResult = null;
updateIsCurrentResultSimple();
updateCurrentResultInfo();
}
private void updateIsCurrentResultSimple() {
private void updateCurrentResultInfo() {
boolean isSimple = false;
boolean isTwoDimensional = false;
if (currentResult != null) {
isSimple = true;
isTwoDimensional = true;
for (GroupKey groupKey : getCurrentResult().getResults().keySet()) {
if (groupKey.hasSubKeys()) {
int size = groupKey.size();
if (size != 1) {
isSimple = false;
break;
if (!isTwoDimensional) {
break;
}
}
if (size != 2) {
isTwoDimensional = false;
if (!isSimple) {
break;
}
}
}
}
isCurrentResultSimple = isSimple;
isCurrentResultTwoDimensional = isTwoDimensional;
}
protected boolean isCurrentResultSimple() {
return isCurrentResultSimple;
}
protected boolean isCurrentResultTwoDimensional() {
return isCurrentResultTwoDimensional;
}
protected StringMessages getStringMessages() {
return stringMessages;
}
@@ -2,8 +2,12 @@ package com.sap.sailing.gwt.ui.datamining.presentation;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.client.ui.HTML;
@@ -31,26 +35,73 @@ public class PlainResultsPresenter extends AbstractNumericResultsPresenter<Setti
protected void internalShowNumericResult(Map<GroupKey, Number> resultValues) {
QueryResultDTO<?> result = getCurrentResult();
SafeHtmlBuilder resultsBuilder = new SafeHtmlBuilder();
resultsBuilder.appendHtmlConstant("<b>");
resultsBuilder.appendEscaped(result.getResultSignifier());
resultsBuilder.appendHtmlConstant("</b></ br>");
resultsBuilder.appendHtmlConstant("<b>").appendEscaped(result.getResultSignifier()).appendHtmlConstant("</b>");
resultsBuilder.appendHtmlConstant("<br />");
resultsBuilder.appendHtmlConstant("<table>");
for (GroupKey key : getSortedKeys(result)) {
resultsBuilder.appendHtmlConstant("<tr>");
resultsBuilder.appendHtmlConstant("<td><b>");
resultsBuilder.appendEscaped(key.toString());
resultsBuilder.appendHtmlConstant("</b>:</td>");
resultsBuilder.appendHtmlConstant("<td>");
resultsBuilder.append(resultValues.get(key).doubleValue());
resultsBuilder.appendHtmlConstant("</td>");
resultsBuilder.appendHtmlConstant("</tr>");
if (isCurrentResultTwoDimensional()) {
buildTable(resultValues, resultsBuilder);
} else {
buildList(resultValues, resultsBuilder);
}
resultsBuilder.appendHtmlConstant("</table>");
resultsLabel.setHTML(resultsBuilder.toSafeHtml().asString());
}
private void buildTable(Map<GroupKey, Number> twoDimensionalResultValues, SafeHtmlBuilder resultsBuilder) {
Map<GroupKey, Map<GroupKey, Number>> unfoldedResultValues = unfoldResultValues(twoDimensionalResultValues);
List<GroupKey> sortedMainKeys = new ArrayList<>(unfoldedResultValues.keySet());
Collections.sort(sortedMainKeys);
Set<GroupKey> allSubKeys = new HashSet<>();
unfoldedResultValues.forEach((key, values) -> allSubKeys.addAll(values.keySet()));
List<GroupKey> sortedSubKeys = new ArrayList<>(allSubKeys);
Collections.sort(sortedSubKeys);
resultsBuilder.appendHtmlConstant("<tr><th>&nbsp;</th>"); // First column empty for main keys, but selectable to copy the content
for (GroupKey subKey : sortedSubKeys) {
resultsBuilder.appendHtmlConstant("<th>").appendEscaped(subKey.toString()).appendHtmlConstant("</th>");
}
resultsBuilder.appendHtmlConstant("</tr>");
for (GroupKey mainKey : sortedMainKeys) {
resultsBuilder.appendHtmlConstant("<tr>");
resultsBuilder.appendHtmlConstant("<td><b>").appendEscaped(mainKey + ":").appendHtmlConstant("</b></td>");
for (GroupKey subKey : sortedSubKeys) {
resultsBuilder.appendHtmlConstant("<td>").append(unfoldedResultValues.get(mainKey).get(subKey).doubleValue()).appendHtmlConstant("</td>");
}
resultsBuilder.appendHtmlConstant("</tr>");
}
}
private Map<GroupKey, Map<GroupKey, Number>> unfoldResultValues(Map<GroupKey, Number> twoDimensionalResultValues) {
Map<GroupKey, Map<GroupKey, Number>> unfoldedResultValues = new HashMap<>();
for (Entry<GroupKey, Number> entry : twoDimensionalResultValues.entrySet()) {
List<? extends GroupKey> keys = entry.getKey().getKeys();
GroupKey mainKey = keys.get(0);
GroupKey subKey = keys.get(1);
Map<GroupKey, Number> values = unfoldedResultValues.get(mainKey);
if (values == null) {
values = new HashMap<>();
unfoldedResultValues.put(mainKey, values);
}
values.put(subKey, entry.getValue());
}
return unfoldedResultValues;
}
private void buildList(Map<GroupKey, Number> resultValues, SafeHtmlBuilder resultsBuilder) {
for (GroupKey key : getSortedKeys()) {
resultsBuilder.appendHtmlConstant("<tr>");
resultsBuilder.appendHtmlConstant("<td><b>").appendEscaped(key + ":").appendHtmlConstant("</b></td>");
resultsBuilder.appendHtmlConstant("<td>").append(resultValues.get(key).doubleValue()).appendHtmlConstant("</td>");
resultsBuilder.appendHtmlConstant("</tr>");
}
}
private Iterable<GroupKey> getSortedKeys(QueryResultDTO<?> result) {
List<GroupKey> sortedKeys = new ArrayList<>(result.getResults().keySet());
private Iterable<GroupKey> getSortedKeys() {
List<GroupKey> sortedKeys = new ArrayList<>(getCurrentResult().getResults().keySet());
Collections.sort(sortedKeys);
return sortedKeys;
}
@@ -19,6 +19,18 @@ public interface GroupKey extends Serializable, Comparable<GroupKey> {
*/
public boolean hasSubKeys();
/**
* Returns the number of group keys represented by this key:
* <ul>
* <li>{@link #hasSubKeys()} == <code>false</code>: 1
* </li>
* <li>{@link #hasSubKeys()} == <code>true</code>: The sum of the size of each {@link #getKeys() contained key}.
* </li>
* </ul>
* @return the number of group keys represented by this key.
*/
public int size();
/**
* Returns a non-empty {@link List} of group keys that are represented by this key:
* <ul>
@@ -52,6 +52,15 @@ public class CompoundGroupKey extends AbstractGroupKey {
return hasSubKeys;
}
@Override
public int size() {
int size = 0;
for (GroupKey key : keys) {
size += key.size();
}
return size;
}
@Override
public List<? extends GroupKey> getKeys() {
if (hasSubKeys) {
@@ -31,6 +31,11 @@ public class GenericGroupKey<T> extends AbstractGroupKey {
public boolean hasSubKeys() {
return false;
}
@Override
public int size() {
return 1;
}
@Override
public List<? extends GroupKey> getKeys() {