mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-20 04:35:32 +00:00
The PlainResultsPresenter now shows two dimensional results as table and not as list
This commit is contained in:
+24
-7
@@ -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;
|
||||
}
|
||||
|
||||
+65
-14
@@ -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> </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>
|
||||
|
||||
+9
@@ -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) {
|
||||
|
||||
+5
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user