diff --git a/pdb-plotting/src/main/java/org/lucares/recommind/logs/DataSeries.java b/pdb-plotting/src/main/java/org/lucares/recommind/logs/DataSeries.java index f4d2bb3..c1fdc1d 100644 --- a/pdb-plotting/src/main/java/org/lucares/recommind/logs/DataSeries.java +++ b/pdb-plotting/src/main/java/org/lucares/recommind/logs/DataSeries.java @@ -9,8 +9,7 @@ import org.lucares.pdb.plot.api.AggregatedData; import org.lucares.pdb.plot.api.Limit; public interface DataSeries { - public static final Comparator BY_NUMBER_OF_VALUES = ( - a, b) -> { + public static final Comparator BY_NUMBER_OF_VALUES = (a, b) -> { return a.getValues() - b.getValues(); }; @@ -18,24 +17,27 @@ public interface DataSeries { final long result = a.getMaxValue() - b.getMaxValue(); return result < 0 ? -1 : (result > 0 ? 1 : 0); }; - - public static final Comparator BY_NAME = (a,b) -> { + + public static final Comparator BY_NAME = (a, b) -> { return a.getTitle().compareToIgnoreCase(b.getTitle()); }; public String getIdAsString(); - + public int getId(); public String getTitle(); + public int getValues(); + public long getMaxValue(); public void setStyle(String style); + public String getStyle(); - + public AggregatedData getAggregatedData(); - + public String getGnuplotPlotDefinition(); public static Map toMap(final List dataSeries) { @@ -53,7 +55,7 @@ public interface DataSeries { static Comparator getDataSeriesComparator(final Limit limitBy) { switch (limitBy) { - case MOST_VALUES: + case MOST_VALUES: return DataSeries.BY_NUMBER_OF_VALUES.reversed(); case FEWEST_VALUES: return DataSeries.BY_NUMBER_OF_VALUES; @@ -64,13 +66,13 @@ public interface DataSeries { case NO_LIMIT: return DataSeries.BY_NAME; } - throw new IllegalStateException("unhandled enum: "+ limitBy); + throw new IllegalStateException("unhandled enum: " + limitBy); } - + static void sortAndLimit(final List dataSeries, final Limit limitBy, final int limit) { dataSeries.sort(DataSeries.getDataSeriesComparator(limitBy)); - + switch (limitBy) { case FEWEST_VALUES: case MOST_VALUES: @@ -84,30 +86,27 @@ public interface DataSeries { } } - static void setColors(List dataSeries){ - + static void setColors(final List dataSeries) { + int i = 0; - - for (DataSeries dataSerie : dataSeries) { - + + for (final DataSeries dataSerie : dataSeries) { + final int numColors = GnuplotColorPalettes.DEFAULT.size(); final int numDashTypes = DashTypes.DEFAULT.size(); - - GnuplotColor color = GnuplotColorPalettes.DEFAULT.get(i % numColors); - if (dataSerie.getAggregatedData() != null){ - // color = color.brighter(); + + final GnuplotColor color = GnuplotColorPalettes.DEFAULT.get(i % numColors); + if (dataSerie.getAggregatedData() != null) { + // color = color.brighter(); } - final String dashType = DashTypes.DEFAULT.get((i/numColors) % numDashTypes); - String style = String.format("lt %s dt %s ",// - color.getColor(),// + final String dashType = DashTypes.DEFAULT.get((i / numColors) % numDashTypes); + final String style = String.format("lt %s dt %s ", // + color.getColor(), // dashType// - ); + ); dataSerie.setStyle(style); i++; } } - - - } diff --git a/pdb-ui/src/main/java/org/lucares/pdbui/PdbController.java b/pdb-ui/src/main/java/org/lucares/pdbui/PdbController.java index 851a1fc..a4f3cb1 100644 --- a/pdb-ui/src/main/java/org/lucares/pdbui/PdbController.java +++ b/pdb-ui/src/main/java/org/lucares/pdbui/PdbController.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.SortedSet; +import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; import org.apache.commons.lang3.StringUtils; @@ -24,8 +25,8 @@ import org.lucares.pdbui.domain.AutocompleteProposalByValue; import org.lucares.pdbui.domain.AutocompleteResponse; import org.lucares.pdbui.domain.PlotRequest; import org.lucares.pdbui.domain.PlotResponse; +import org.lucares.pdbui.domain.PlotResponseStats; import org.lucares.performance.db.PerformanceDb; -import org.lucares.recommind.logs.DataSeries; import org.lucares.recommind.logs.InternalPlottingException; import org.lucares.recommind.logs.NoDataPointsException; import org.lucares.recommind.logs.PlotResult; @@ -94,7 +95,7 @@ public class PdbController implements HardcodedValues { // TODO the UI should cancel requests that are in flight before sending a plot // request - if (plotterLock.tryLock()) { + if (plotterLock.tryLock(5, TimeUnit.SECONDS)) { try { final PlotResult result = plotter.plot(plotSettings); @@ -105,7 +106,8 @@ public class PdbController implements HardcodedValues { ? WEB_IMAGE_OUTPUT_PATH + "/" + result.getThumbnailName() : imageUrl; - return new PlotResponse(DataSeries.toMap(result.getDataSeries()), imageUrl, thumbnailUrl); + final PlotResponseStats stats = PlotResponseStats.fromDataSeries(result.getDataSeries()); + return new PlotResponse(stats, imageUrl, thumbnailUrl); } catch (final NoDataPointsException e) { throw new NotFoundException(e); } finally { diff --git a/pdb-ui/src/main/java/org/lucares/pdbui/domain/PlotResponse.java b/pdb-ui/src/main/java/org/lucares/pdbui/domain/PlotResponse.java index 3690ca6..d9a6de0 100644 --- a/pdb-ui/src/main/java/org/lucares/pdbui/domain/PlotResponse.java +++ b/pdb-ui/src/main/java/org/lucares/pdbui/domain/PlotResponse.java @@ -1,14 +1,12 @@ package org.lucares.pdbui.domain; -import java.util.Map; - public class PlotResponse { private String imageUrl = ""; - private Map dataSeries; - private final String thumbnailUrl; + private PlotResponseStats stats; + private String thumbnailUrl; - public PlotResponse(final Map dataSeries, final String imageUrl, final String thumbnailUrl) { - this.dataSeries = dataSeries; + public PlotResponse(final PlotResponseStats stats, final String imageUrl, final String thumbnailUrl) { + this.stats = stats; this.imageUrl = imageUrl; this.thumbnailUrl = thumbnailUrl; } @@ -25,16 +23,21 @@ public class PlotResponse { return thumbnailUrl; } - public Map getDataSeries() { - return dataSeries; + public PlotResponseStats getStats() { + return stats; } - public void setDataSeries(final Map dataSeries) { - this.dataSeries = dataSeries; + public void setStats(final PlotResponseStats stats) { + this.stats = stats; + } + + public void setThumbnailUrl(final String thumbnailUrl) { + this.thumbnailUrl = thumbnailUrl; } @Override public String toString() { - return imageUrl + " " + dataSeries + " " + thumbnailUrl; + return "PlotResponse [imageUrl=" + imageUrl + ", stats=" + stats + ", thumbnailUrl=" + thumbnailUrl + "]"; } + } diff --git a/pdb-ui/src/main/java/org/lucares/pdbui/domain/PlotResponseStats.java b/pdb-ui/src/main/java/org/lucares/pdbui/domain/PlotResponseStats.java new file mode 100644 index 0000000..29e7df0 --- /dev/null +++ b/pdb-ui/src/main/java/org/lucares/pdbui/domain/PlotResponseStats.java @@ -0,0 +1,55 @@ +package org.lucares.pdbui.domain; + +import java.util.List; + +import org.lucares.recommind.logs.DataSeries; + +public class PlotResponseStats { + private long maxValue; + + private int values; + + public PlotResponseStats() { + super(); + } + + public PlotResponseStats(final long maxValue, final int values) { + + this.maxValue = maxValue; + this.values = values; + } + + public long getMaxValue() { + return maxValue; + } + + public void setMaxValue(final long maxValue) { + this.maxValue = maxValue; + } + + public int getValues() { + return values; + } + + public void setValues(final int values) { + this.values = values; + } + + @Override + public String toString() { + return "PlotResponseStats [maxValue=" + maxValue + ", values=" + values + "]"; + } + + public static PlotResponseStats fromDataSeries(final List dataSeries) { + + int values = 0; + long maxValue = 0; + + for (final DataSeries dataSerie : dataSeries) { + values += dataSerie.getValues(); + maxValue = Math.max(maxValue, dataSerie.getMaxValue()); + } + + return new PlotResponseStats(maxValue, values); + } +} diff --git a/pdb-ui/src/main/resources/resources/css/design.css b/pdb-ui/src/main/resources/resources/css/design.css index af396ca..25a5744 100644 --- a/pdb-ui/src/main/resources/resources/css/design.css +++ b/pdb-ui/src/main/resources/resources/css/design.css @@ -71,9 +71,12 @@ textarea { / 1fr } -#navigation { +#navigation-bar { grid-area: navigation; - background-color: #aaa; + background-color: #ccc; +} + +#navigation { display: flex; justify-content: space-between; } diff --git a/pdb-ui/src/main/resources/resources/js/ui.js b/pdb-ui/src/main/resources/resources/js/ui.js index c086da1..a2b31de 100644 --- a/pdb-ui/src/main/resources/resources/js/ui.js +++ b/pdb-ui/src/main/resources/resources/js/ui.js @@ -237,10 +237,51 @@ Vue.component('result-view-dashboard-item', {
{{ dashboardItem.error }}
-
{{ dashboardItem.fieldValue }}
+
{{ dashboardItem.fieldValue }} ({{ dashboardItem.stats.values }}) ({{ dashboardItem.stats.maxValue }})
` }); +Vue.component('navigation-bar-dashboard', { + props: ['dashboard'], + methods: { + sort: function() { + sortTiles(); + } + }, + computed: { + navigationVisible: function() { + return data.dashboard.tiles.length > 0; + } + }, + template: ` + + ` +}); + Vue.component('navigation-bar', { props: [], methods: { @@ -405,10 +446,13 @@ Vue.component('navigation-bar', { computed: { navigationDisabled: function() { return !data.resultView.imageUrl; + }, + navigationVisible: function() { + return data.dashboard.tiles.length == 0; } }, template: ` -