mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-06 19:12:23 +00:00
Extracted a QueryBenchmarkPanel from the DataMiningEntryPoint
This commit is contained in:
1 parent
6fb6520117
commit
8bee8b60bd
8 files changed
+212
-132
No files matched your search
+14
@@ -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();
|
||||
}
|
||||
+15
-1
@@ -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
|
||||
+15
-1
@@ -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
|
||||
+3
-90
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+106
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+45
-39
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
+12
@@ -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();
|
||||
|
||||
}
|
||||
+2
-1
@@ -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()) {
|
||||
|
||||
Reference in new issue
Block a user