diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningEntryPoint.java index b2f838b24e9..ccfbf051c9e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningEntryPoint.java @@ -31,6 +31,8 @@ public class DataMiningEntryPoint extends AbstractEntryPoint { private double overallTimeSum = 0; private double serverTimeSum = 0; + private QueryBenchmarkResultsChart resultsChart; + @Override protected void doOnModuleLoad() { super.doOnModuleLoad(); @@ -45,11 +47,14 @@ public class DataMiningEntryPoint extends AbstractEntryPoint { dataMiningElementsPanel.add(resultsPanel); resultsPanel.add(createOverallTimePanel()); resultsPanel.add(createServerTimePanel()); + resultsChart = new QueryBenchmarkResultsChart(); + resultsPanel.add(resultsChart); resultsPanel.add(createResultsTable()); } private void run() { benchmarkStatusLabel.setText(" | Running"); + resultsChart.reset(); resetResults(); final int times = numberOfQueriesBox.getValue() == null ? 1 : numberOfQueriesBox.getValue(); String[] selectionIdentifiers = new String[] {"KW 2013 International (STR)", "KW 2013 International (H-Boat)", "KW 2013 International (29ER)", @@ -72,11 +77,14 @@ public class DataMiningEntryPoint extends AbstractEntryPoint { public void onSuccess(Pair result) { long endTime = System.currentTimeMillis(); double overallTime = (endTime - startTimesMap.get(number)) / 1000.0; - updateResults(new QueryBenchmarkResult("Run " + number, result.getB().intValue(), result.getA(), overallTime)); + QueryBenchmarkResult newResult = new QueryBenchmarkResult("Run " + number, result.getB().intValue(), result.getA(), overallTime); + updateResults(newResult); + resultsChart.addResult(newResult); synchronized (resultsDataProvider) { if (resultsDataProvider.getList().size() == times) { benchmarkStatusLabel.setText(" | Done"); + resultsChart.showResults(); } else { benchmarkStatusLabel.setText(" | Running (last finished: " + number + ")"); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryBenchmarkResultsChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryBenchmarkResultsChart.java index 18b2fc3330f..d93a3f5f837 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryBenchmarkResultsChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryBenchmarkResultsChart.java @@ -1,14 +1,23 @@ package com.sap.sailing.gwt.ui.datamining; +import java.util.ArrayList; +import java.util.List; + import org.moxieapps.gwt.highcharts.client.Axis; import org.moxieapps.gwt.highcharts.client.Chart; +import org.moxieapps.gwt.highcharts.client.ChartSubtitle; import org.moxieapps.gwt.highcharts.client.ChartTitle; import org.moxieapps.gwt.highcharts.client.Credits; import org.moxieapps.gwt.highcharts.client.PlotLine; +import org.moxieapps.gwt.highcharts.client.PlotLine.DashStyle; +import org.moxieapps.gwt.highcharts.client.Point; import org.moxieapps.gwt.highcharts.client.Series; +import org.moxieapps.gwt.highcharts.client.ToolTip; import org.moxieapps.gwt.highcharts.client.labels.AxisLabelsData; import org.moxieapps.gwt.highcharts.client.labels.AxisLabelsFormatter; import org.moxieapps.gwt.highcharts.client.labels.YAxisLabels; +import org.moxieapps.gwt.highcharts.client.plotOptions.LinePlotOptions; +import org.moxieapps.gwt.highcharts.client.plotOptions.Marker; import com.google.gwt.user.client.ui.RequiresResize; import com.google.gwt.user.client.ui.SimplePanel; @@ -19,61 +28,108 @@ public class QueryBenchmarkResultsChart extends SimplePanel implements RequiresR private Series serverTimeSeries; private double serverTimeSum = 0; private PlotLine averageServerTimePlotLine; -// private Series overallTimeSeries; -// private Series gpsFixAmountSeries; + + private Series overallTimeSeries; + private double overallTimeSum = 0; + private PlotLine averageOverallTimePlotLine; + + private List results; public QueryBenchmarkResultsChart() { + results = new ArrayList(); chart = new Chart() .setMarginLeft(100) - .setMarginRight(100) + .setMarginRight(45) .setWidth100() - .setHeight100() .setCredits(new Credits().setEnabled(false)) .setChartTitle(new ChartTitle().setText("Query Benchmark Results")); - chart.getXAxis().setType(Axis.Type.LINEAR); + chart.getXAxis().setType(Axis.Type.LINEAR).setAllowDecimals(false); - chart.getYAxis(0).setAxisTitleText("Time").setLabels(new YAxisLabels().setFormatter(new AxisLabelsFormatter() { + chart.getYAxis().setAxisTitleText("Time").setLabels(new YAxisLabels().setFormatter(new AxisLabelsFormatter() { @Override public String format(AxisLabelsData axisLabelsData) { - return axisLabelsData.getValueAsDouble() + "s"; + try { + return axisLabelsData.getValueAsDouble() + "s"; + } catch (Exception e) { + return ""; + } } })); - averageServerTimePlotLine = chart.getYAxis(0).createPlotLine().setWidth(1); -// chart.getYAxis(1).setAxisTitleText("Number of GPS-Fixes"); - serverTimeSeries = chart.createSeries().setName("Server Time").setYAxis(0); -// overallTimeSeries = chart.createSeries().setName("Overall Time").setYAxis(0); -// gpsFixAmountSeries = chart.createSeries().setName("Number of GPS-Fixes").setYAxis(1); + chart.setToolTip(new ToolTip().setPointFormat("{series.name}: {point.y}s
")); + + serverTimeSeries = chart.createSeries().setName("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("#00bb00").setMarker(new Marker().setEnabled(false))); + averageOverallTimePlotLine = chart.getYAxis().createPlotLine().setColor("#00bb00").setWidth(2).setDashStyle(DashStyle.SOLID); this.setWidget(chart); } - public void updateResults(QueryBenchmarkResult newResult) { - serverTimeSeries.addPoint(newResult.getServerTime()); - serverTimeSum += newResult.getServerTime(); + public void addResult(QueryBenchmarkResult newResult) { + results.add(newResult); + } + + public void showResults() { + int i = 0; + Point[] serverTimePoints = new Point[results.size()]; + Point[] overallTimePoints = new Point[results.size()]; + for (QueryBenchmarkResult result : results) { + serverTimePoints[i] = new Point(i + 1, result.getServerTime()).setName(result.getIdentifier()); + serverTimeSum += result.getServerTime(); + overallTimePoints[i] = new Point(i + 1, result.getOverallTime()).setName(result.getIdentifier()); + overallTimeSum += result.getOverallTime(); + i++; + } + + //This method has to be called, before the points are added to the chart. + updateChartSubtitle(); + serverTimeSeries.setPoints(serverTimePoints); + overallTimeSeries.setPoints(overallTimePoints); updatePlotLines(); -// overallTimeSeries.addPoint(newResult.getOverallTime()); -// gpsFixAmountSeries.addPoint(newResult.getNumberOfGPSFixes()); if (!serverTimeSeries.isVisible()) { chart.addSeries(serverTimeSeries); -// chart.addSeries(overallTimeSeries); -// chart.addSeries(gpsFixAmountSeries); + chart.addSeries(overallTimeSeries); } } + private void updateChartSubtitle() { + StringBuilder subtitelBuilder = new StringBuilder(); + subtitelBuilder.append("Number of GPS-Fixes: " + results.get(0).getNumberOfGPSFixes()); + subtitelBuilder.append(" - \u2300 Server Time: " + getAverageServerTime() + "s"); + subtitelBuilder.append(" - \u2300 Overall Time: " + getAverageOverallTime() + "s"); + + chart.setChartSubtitle(new ChartSubtitle().setText(subtitelBuilder.toString())); + //This is needed, so that the subtitle is updated. Otherwise the text would stay empty + this.setWidget(null); + this.setWidget(chart); + } + private void updatePlotLines() { - chart.getYAxis(0).removePlotLine(averageServerTimePlotLine); - averageServerTimePlotLine.setValue(serverTimeSum / serverTimeSeries.getPoints().length); - chart.getYAxis(0).addPlotLines(averageServerTimePlotLine); + chart.getYAxis().removePlotLine(averageServerTimePlotLine); + chart.getYAxis().removePlotLine(averageOverallTimePlotLine); + averageServerTimePlotLine.setValue(getAverageServerTime()); + averageOverallTimePlotLine.setValue(getAverageOverallTime()); + chart.getYAxis().addPlotLines(averageServerTimePlotLine, averageOverallTimePlotLine); + } + + private double getAverageOverallTime() { + return overallTimeSum / results.size(); + } + + private double getAverageServerTime() { + return serverTimeSum / results.size(); } public void reset() { + results.clear(); serverTimeSum = 0; - for (Series series : chart.getSeries()) { - series.setPoints(new Number[0]); - } + overallTimeSum = 0; + serverTimeSeries.setPoints(new Point[0]); + overallTimeSeries.setPoints(new Point[0]); } @Override