Extracted a QueryBenchmarkPanel from the DataMiningEntryPoint

This commit is contained in:
Lennart Hensler committed 2013-08-06 13:41:21 +02:00
1 parent 6fb6520117
commit 8bee8b60bd
8 files changed
+212 -132

No files matched your search

@@ -749,4 +749,18 @@ public interface StringMessages extends Messages {
String legType();
String sailID();
String clearSelection();
String running();
String runAsSubstantive();
String done();
String lastFinished();
String run();
String times();
String numberOfGPSFixes();
String averageCleanedServerTime();
String averageCleanedOverallTime();
String dataMiningBenchmarkResults();
String serverTime();
String cleanedServerTime();
String overallTime();
String cleanedOverallTime();
}
@@ -742,4 +742,18 @@ timeSinceLastPositionFixTooltip=Time since last received GPS position
trackingQuality=Tracking quality
legType=Leg Type
sailID=Sail Number
clearSelection=Clear Selection
clearSelection=Clear Selection
running=Running
runAsSubstantive=Run
done=Done
lastFinished=Last finished
run=Run
times=times
numberOfGPSFixes=Number of GPS-Fixes
averageCleanedServerTime=\u2205 Cleaned Server Time
averageCleanedOverallTime=\u2205 Cleaned Overall Time
dataMiningBenchmarkResults=Data Mining Benchmark Results
serverTime=Server Time
cleanedServerTime=Cleaned Server Time
overallTime=Overall Time
cleanedOverallTime=Cleaned Overall Time
@@ -738,4 +738,18 @@ timeSinceLastPositionFixTooltip=Zeit seit der letzten empfangenen GPS-Position
trackingQuality=Tracking-Qualität
legType=Art des Schenkels
sailID=Segelnummer
clearSelection=Auswahl leeren
clearSelection=Auswahl leeren
running=Läuft
runAsSubstantive=Durchlauf
done=Fertig
lastFinished=Zuletzt fertig
run=Ausführen
times=mal
numberOfGPSFixes=Anzahl der GPS-Fixes
averageCleanedServerTime=\u2205 Bereinigte Server-Zeit
averageCleanedOverallTime=\u2205 Bereinigte Gesamt-Zeit
dataMiningBenchmarkResults=Data Mining Benchmark Ergebnisse
serverTime=Server-Zeit
cleanedServerTime=Bereinigte Server-Zeit
overallTime=Gesamt-Zeit
cleanedOverallTime=Bereinigte Gesamt-Zeit
@@ -1,30 +1,11 @@
package com.sap.sailing.gwt.ui.datamining;
import java.util.List;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.IntegerBox;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.gwt.ui.client.AbstractEntryPoint;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
public class DataMiningEntryPoint extends AbstractEntryPoint {
private SelectionPanel selectionPanel;
private IntegerBox numberOfQueriesBox;
private Label benchmarkStatusLabel;
private FlowPanel resultsPanel;
private QueryBenchmarkResultsChart resultsChart;
@Override
protected void doOnModuleLoad() {
super.doOnModuleLoad();
@@ -32,79 +13,11 @@ public class DataMiningEntryPoint extends AbstractEntryPoint {
FlowPanel dataMiningElementsPanel = new FlowPanel();
rootPanel.add(dataMiningElementsPanel);
selectionPanel = new SelectionPanel(stringMessages, sailingService, this);
SelectionPanel selectionPanel = new SelectionPanel(stringMessages, sailingService, this);
dataMiningElementsPanel.add(selectionPanel);
dataMiningElementsPanel.add(createFunctionsPanel());
resultsPanel = new FlowPanel();
dataMiningElementsPanel.add(resultsPanel);
resultsChart = new QueryBenchmarkResultsChart();
resultsPanel.add(resultsChart);
}
private void runBenchmark() {
benchmarkStatusLabel.setText(" | Running");
resultsChart.reset();
sailingService.getRegattas(new AsyncCallback<List<RegattaDTO>>() {
@Override
public void onFailure(Throwable caught) {
DataMiningEntryPoint.this.reportError("Error fetching the regattas from the server: " + caught.getMessage());
}
@Override
public void onSuccess(List<RegattaDTO> regattas) {
final int times = numberOfQueriesBox.getValue() == null ? 1 : numberOfQueriesBox.getValue();
runQuery(new ClientQueryData(selectionPanel.getSelection(), times, 1));
}
});
}
private void runQuery(final ClientQueryData queryData) {
final long startTime = System.currentTimeMillis();
sailingService.runQueryAsBenchmark(queryData.getSelection(), new AsyncCallback<Pair<Double, Integer>>() {
@Override
public void onFailure(Throwable caught) {
DataMiningEntryPoint.this.reportError("Error running a query: " + caught.getMessage());
}
@Override
public void onSuccess(Pair<Double, Integer> result) {
long endTime = System.currentTimeMillis();
double overallTime = (endTime - startTime) / 1000.0;
resultsChart.addResult(new QueryBenchmarkResult("Run " + queryData.getCurrentRun(), result.getB().intValue(), result.getA(), overallTime));
if (queryData.isFinished()) {
benchmarkStatusLabel.setText(" | Done");
resultsChart.showResults();
} else {
benchmarkStatusLabel.setText(" | Running (last finished: " + queryData.getCurrentRun() + ")");
queryData.incrementCurrentRun();
runQuery(queryData);
}
}
});
}
private HorizontalPanel createFunctionsPanel() {
HorizontalPanel functionsPanel = new HorizontalPanel();
functionsPanel.setSpacing(5);
Button runQueryButton = new Button("Run");
runQueryButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
runBenchmark();
}
});
functionsPanel.add(runQueryButton);
numberOfQueriesBox = new IntegerBox();
numberOfQueriesBox.setValue(1);
functionsPanel.add(numberOfQueriesBox);
functionsPanel.add(new Label("times"));
benchmarkStatusLabel = new Label();
functionsPanel.add(benchmarkStatusLabel);
return functionsPanel;
QueryBenchmarkPanel benchmarkPanel = new QueryBenchmarkPanel(stringMessages, sailingService, this, selectionPanel);
dataMiningElementsPanel.add(benchmarkPanel);
}
}
@@ -0,0 +1,106 @@
package com.sap.sailing.gwt.ui.datamining;
import java.util.List;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.IntegerBox;
import com.google.gwt.user.client.ui.Label;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
public class QueryBenchmarkPanel extends FlowPanel {
private SailingServiceAsync sailingService;
private ErrorReporter errorReporter;
private StringMessages stringMessages;
private QuerySelectionProvider selectionProvider;
private IntegerBox numberOfQueriesBox;
private Label benchmarkStatusLabel;
private QueryBenchmarkResultsChart resultsChart;
public QueryBenchmarkPanel(StringMessages stringMessages, SailingServiceAsync sailingService,
ErrorReporter errorReporter, QuerySelectionProvider selectionProvider) {
this.sailingService = sailingService;
this.errorReporter = errorReporter;
this.stringMessages = stringMessages;
this.selectionProvider = selectionProvider;
add(createFunctionsPanel());
resultsChart = new QueryBenchmarkResultsChart(stringMessages);
add(resultsChart);
}
private void runBenchmark() {
benchmarkStatusLabel.setText(" | " + stringMessages.running());
resultsChart.reset();
sailingService.getRegattas(new AsyncCallback<List<RegattaDTO>>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error fetching the regattas from the server: " + caught.getMessage());
}
@Override
public void onSuccess(List<RegattaDTO> regattas) {
final int times = numberOfQueriesBox.getValue() == null ? 1 : numberOfQueriesBox.getValue();
runQuery(new ClientQueryData(selectionProvider.getSelection(), times, 1));
}
});
}
private void runQuery(final ClientQueryData queryData) {
final long startTime = System.currentTimeMillis();
sailingService.runQueryAsBenchmark(queryData.getSelection(), new AsyncCallback<Pair<Double, Integer>>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error running a query: " + caught.getMessage());
}
@Override
public void onSuccess(Pair<Double, Integer> result) {
long endTime = System.currentTimeMillis();
double overallTime = (endTime - startTime) / 1000.0;
resultsChart.addResult(new QueryBenchmarkResult(stringMessages.runAsSubstantive() + " " + queryData.getCurrentRun(), result.getB().intValue(), result.getA(), overallTime));
if (queryData.isFinished()) {
benchmarkStatusLabel.setText(" | " + stringMessages.done());
resultsChart.showResults();
} else {
benchmarkStatusLabel.setText(" | " + stringMessages.running() + " (" + stringMessages.lastFinished() + ": " + queryData.getCurrentRun() + ")");
queryData.incrementCurrentRun();
runQuery(queryData);
}
}
});
}
private HorizontalPanel createFunctionsPanel() {
HorizontalPanel functionsPanel = new HorizontalPanel();
functionsPanel.setSpacing(5);
Button runQueryButton = new Button(stringMessages.run());
runQueryButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
runBenchmark();
}
});
functionsPanel.add(runQueryButton);
numberOfQueriesBox = new IntegerBox();
numberOfQueriesBox.setValue(1);
functionsPanel.add(numberOfQueriesBox);
functionsPanel.add(new Label(stringMessages.times()));
benchmarkStatusLabel = new Label();
functionsPanel.add(benchmarkStatusLabel);
return functionsPanel;
}
}
@@ -24,10 +24,15 @@ import org.moxieapps.gwt.highcharts.client.plotOptions.Marker;
import com.google.gwt.user.client.ui.RequiresResize;
import com.google.gwt.user.client.ui.SimplePanel;
import com.sap.sailing.gwt.ui.client.StringMessages;
public class QueryBenchmarkResultsChart extends SimplePanel implements RequiresResize {
private StringMessages stringMessages;
private List<QueryBenchmarkResult> results;
private double thresholdFactor;
private Chart chart;
private Series serverTimeSeries;
private Series cleanedServerTimeSeries;
private PlotLine averageServerTimePlotLine;
@@ -36,42 +41,13 @@ public class QueryBenchmarkResultsChart extends SimplePanel implements RequiresR
private Series cleanedOverallTimeSeries;
private PlotLine averageOverallTimePlotLine;
private List<QueryBenchmarkResult> results;
private double thresholdFactor;
public QueryBenchmarkResultsChart() {
public QueryBenchmarkResultsChart(StringMessages stringMessages) {
this.stringMessages = stringMessages;
results = new ArrayList<QueryBenchmarkResult>();
thresholdFactor = 5;
chart = new Chart()
.setMarginLeft(100)
.setMarginRight(45)
.setWidth100()
.setCredits(new Credits().setEnabled(false))
.setChartTitle(new ChartTitle().setText("Query Benchmark Results"));
chart.getXAxis().setType(Axis.Type.LINEAR).setAllowDecimals(false);
chart.getYAxis().setAxisTitleText("Time").setLabels(new YAxisLabels().setFormatter(new AxisLabelsFormatter() {
@Override
public String format(AxisLabelsData axisLabelsData) {
try {
return axisLabelsData.getValueAsDouble() + "s";
} catch (Exception e) {
return "";
}
}
}));
chart.setToolTip(new ToolTip().setPointFormat("<span style=\"color:{series.color}\">{series.name}</span>: <b>{point.y}s</b><br/>"));
serverTimeSeries = chart.createSeries().setName("Server Time").setPlotOptions(new LinePlotOptions().setColor("#656565").setMarker(new Marker().setEnabled(false)));
cleanedServerTimeSeries = chart.createSeries().setName("Cleaned Server Time").setPlotOptions(new LinePlotOptions().setColor("#000099").setMarker(new Marker().setEnabled(false)));
averageServerTimePlotLine = chart.getYAxis().createPlotLine().setColor("#000099").setWidth(2).setDashStyle(DashStyle.SOLID);
overallTimeSeries = chart.createSeries().setName("Overall Time").setPlotOptions(new LinePlotOptions().setColor("#656565").setMarker(new Marker().setEnabled(false)));
cleanedOverallTimeSeries = chart.createSeries().setName("Cleaned Overall Time").setPlotOptions(new LinePlotOptions().setColor("#00bb00").setMarker(new Marker().setEnabled(false)));
averageOverallTimePlotLine = chart.getYAxis().createPlotLine().setColor("#00bb00").setWidth(2).setDashStyle(DashStyle.SOLID);
createChart();
this.setWidget(chart);
}
@@ -172,9 +148,9 @@ public class QueryBenchmarkResultsChart extends SimplePanel implements RequiresR
private void updateChartSubtitle(int numberOfGPSFixes, double averageServerTime, double averageOverallTime) {
StringBuilder subtitelBuilder = new StringBuilder();
subtitelBuilder.append("Number of GPS-Fixes: " + numberOfGPSFixes);
subtitelBuilder.append(" - \u2300 Cleaned Server Time: " + averageServerTime + "s");
subtitelBuilder.append(" - \u2300 Cleaned Overall Time: " + averageOverallTime + "s");
subtitelBuilder.append(stringMessages.numberOfGPSFixes() + ": " + numberOfGPSFixes);
subtitelBuilder.append(" - " + stringMessages.averageCleanedServerTime() + ": " + averageServerTime + "s");
subtitelBuilder.append(" - " + stringMessages.averageCleanedOverallTime() + ": " + averageOverallTime + "s");
chart.setChartSubtitle(new ChartSubtitle().setText(subtitelBuilder.toString()));
//This is needed, so that the subtitle is updated. Otherwise the text would stay empty
@@ -197,11 +173,41 @@ public class QueryBenchmarkResultsChart extends SimplePanel implements RequiresR
}
}
private void createChart() {
chart = new Chart()
.setMarginLeft(100)
.setMarginRight(45)
.setWidth100()
.setCredits(new Credits().setEnabled(false))
.setChartTitle(new ChartTitle().setText(stringMessages.dataMiningBenchmarkResults()));
chart.getXAxis().setType(Axis.Type.LINEAR).setAllowDecimals(false);
chart.getYAxis().setAxisTitleText(stringMessages.time()).setLabels(new YAxisLabels().setFormatter(new AxisLabelsFormatter() {
@Override
public String format(AxisLabelsData axisLabelsData) {
try {
return axisLabelsData.getValueAsDouble() + "s";
} catch (Exception e) {
return "";
}
}
}));
chart.setToolTip(new ToolTip().setPointFormat("<span style=\"color:{series.color}\">{series.name}</span>: <b>{point.y}s</b><br/>"));
serverTimeSeries = chart.createSeries().setName(stringMessages.serverTime()).setPlotOptions(new LinePlotOptions().setColor("#656565").setMarker(new Marker().setEnabled(false)));
cleanedServerTimeSeries = chart.createSeries().setName(stringMessages.cleanedServerTime()).setPlotOptions(new LinePlotOptions().setColor("#000099").setMarker(new Marker().setEnabled(false)));
averageServerTimePlotLine = chart.getYAxis().createPlotLine().setColor("#000099").setWidth(2).setDashStyle(DashStyle.SOLID);
overallTimeSeries = chart.createSeries().setName(stringMessages.overallTime()).setPlotOptions(new LinePlotOptions().setColor("#656565").setMarker(new Marker().setEnabled(false)));
cleanedOverallTimeSeries = chart.createSeries().setName(stringMessages.cleanedOverallTime()).setPlotOptions(new LinePlotOptions().setColor("#00bb00").setMarker(new Marker().setEnabled(false)));
averageOverallTimePlotLine = chart.getYAxis().createPlotLine().setColor("#00bb00").setWidth(2).setDashStyle(DashStyle.SOLID);
}
@Override
public void onResize() {
chart.setSizeToMatchContainer();
// it's important here to recall the redraw method, otherwise the bug fix for wrong checkbox positions (nativeAdjustCheckboxPosition)
// in the BaseChart class would not be called
chart.redraw();
}
@@ -0,0 +1,12 @@
package com.sap.sailing.gwt.ui.datamining;
import java.util.Collection;
import java.util.Map;
import com.sap.sailing.datamining.shared.Dimension;
public interface QuerySelectionProvider {
public Map<Dimension, Collection<?>> getSelection();
}
@@ -25,7 +25,7 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.RaceWithCompetitorsDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
public class SelectionPanel extends FlowPanel {
public class SelectionPanel extends FlowPanel implements QuerySelectionProvider {
private StringMessages stringMessages;
private SailingServiceAsync sailingService;
@@ -61,6 +61,7 @@ public class SelectionPanel extends FlowPanel {
fillSelectionTables();
}
@Override
public Map<Dimension, Collection<?>> getSelection() {
Map<Dimension, Collection<?>> selection = new HashMap<Dimension, Collection<?>>();
for (SelectionTable<?, ?> table : tablesMappedByDimension.values()) {