diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/Limit.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/Limit.java new file mode 100644 index 0000000..56d02d6 --- /dev/null +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/Limit.java @@ -0,0 +1,5 @@ +package org.lucares.pdb.plot.api; + +public enum Limit { + NO_LIMIT, MOST_VALUES, FEWEST_VALUES +} diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/PlotSettings.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/PlotSettings.java new file mode 100644 index 0000000..6c5067a --- /dev/null +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/PlotSettings.java @@ -0,0 +1,63 @@ +package org.lucares.pdb.plot.api; + +public class PlotSettings { + private String query; + + private int height; + + private int width; + + private String groupBy; + + private Limit limitBy; + + private int limit; + + public String getQuery() { + return query; + } + + public void setQuery(final String query) { + this.query = query; + } + + public int getHeight() { + return height; + } + + public void setHeight(final int height) { + this.height = height; + } + + public int getWidth() { + return width; + } + + public void setWidth(final int width) { + this.width = width; + } + + public String getGroupBy() { + return groupBy; + } + + public void setGroupBy(final String groupBy) { + this.groupBy = groupBy; + } + + public Limit getLimitBy() { + return limitBy; + } + + public void setLimitBy(final Limit limitBy) { + this.limitBy = limitBy; + } + + public int getLimit() { + return limit; + } + + public void setLimit(final int limit) { + this.limit = limit; + } +} 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 77abca7..a6bce54 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 @@ -1,8 +1,13 @@ package org.lucares.recommind.logs; import java.io.File; +import java.util.Comparator; public class DataSeries { + public static final Comparator BY_VALUES = (a, b) -> { + return a.getValues() - b.getValues(); + }; + private final File dataFile; private final String title; diff --git a/pdb-plotting/src/main/java/org/lucares/recommind/logs/Plotter.java b/pdb-plotting/src/main/java/org/lucares/recommind/logs/Plotter.java index 3d7a61e..e033831 100644 --- a/pdb-plotting/src/main/java/org/lucares/recommind/logs/Plotter.java +++ b/pdb-plotting/src/main/java/org/lucares/recommind/logs/Plotter.java @@ -12,14 +12,17 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.time.format.DateTimeFormatter; import java.util.ArrayList; -import java.util.Collection; +import java.util.Comparator; import java.util.Iterator; +import java.util.List; import java.util.stream.Stream; import org.lucares.pdb.api.Entry; import org.lucares.pdb.api.GroupResult; import org.lucares.pdb.api.Result; import org.lucares.pdb.api.Tags; +import org.lucares.pdb.plot.api.Limit; +import org.lucares.pdb.plot.api.PlotSettings; import org.lucares.performance.db.FileUtils; import org.lucares.performance.db.Grouping; import org.lucares.performance.db.PerformanceDb; @@ -47,10 +50,14 @@ public class Plotter { return outputDir; } - public File plot(final String query, final int height, final int width, final String groupBy) - throws InternalPlottingException { + public File plot(final PlotSettings plotSettings) throws InternalPlottingException { try { - final Collection dataSeries = new ArrayList<>(); + final List dataSeries = new ArrayList<>(); + + final String query = plotSettings.getQuery(); + final String groupBy = plotSettings.getGroupBy(); + final int height = plotSettings.getHeight(); + final int width = plotSettings.getWidth(); final Result result = db.get(query, groupBy); @@ -66,12 +73,14 @@ public class Plotter { dataSeries.add(dataSerie); } + sortAndLimit(dataSeries, plotSettings); + final File outputFile = File.createTempFile("out", ".png", outputDir.toFile()); final Gnuplot gnuplot = new Gnuplot(tmpBaseDir); - final GnuplotSettings settings = new GnuplotSettings(outputFile); - settings.setHeight(height); - settings.setWidth(width); - gnuplot.plot(settings, dataSeries); + final GnuplotSettings gnuplotSettings = new GnuplotSettings(outputFile); + gnuplotSettings.setHeight(height); + gnuplotSettings.setWidth(width); + gnuplot.plot(gnuplotSettings, dataSeries); return outputFile; } catch (final InterruptedException e) { Thread.currentThread().interrupt(); @@ -81,6 +90,29 @@ public class Plotter { } } + private void sortAndLimit(final List dataSeries, final PlotSettings plotSettings) { + + final Limit limitBy = plotSettings.getLimitBy(); + if (limitBy != Limit.NO_LIMIT) { + + dataSeries.sort(getDataSeriesComparator(limitBy)); + + while (dataSeries.size() > plotSettings.getLimit()) { + dataSeries.remove(plotSettings.getLimit()); + } + } + + } + + private Comparator getDataSeriesComparator(final Limit limitBy) { + + if (limitBy == Limit.MOST_VALUES) { + return DataSeries.BY_VALUES.reversed(); + } + + return DataSeries.BY_VALUES; + } + private String title(final Tags tags, final int values) { final StringBuilder result = new StringBuilder(); @@ -109,7 +141,15 @@ public class Plotter { try (PerformanceDb db = new PerformanceDb(dataDirectory)) { final Plotter plotter = new Plotter(db, tmpBaseDir, outputDirectory); - final File image = plotter.plot(query, 1600, 1200, Grouping.NO_GROUPING); + // query, 1600, 1200, Grouping.NO_GROUPING + + final PlotSettings plotSettings = new PlotSettings(); + plotSettings.setQuery(query); + plotSettings.setWidth(1600); + plotSettings.setHeight(1200); + plotSettings.setGroupBy(Grouping.NO_GROUPING); + + final File image = plotter.plot(plotSettings); System.out.println("plotted image: " + image); } 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 e9325b8..fbe0c0b 100644 --- a/pdb-ui/src/main/java/org/lucares/pdbui/PdbController.java +++ b/pdb-ui/src/main/java/org/lucares/pdbui/PdbController.java @@ -7,6 +7,7 @@ import java.util.Collections; import java.util.List; import org.lucares.ludb.Proposal; +import org.lucares.pdb.plot.api.PlotSettings; import org.lucares.pdbui.domain.AutocompleteProposal; import org.lucares.pdbui.domain.AutocompleteProposalByValue; import org.lucares.pdbui.domain.AutocompleteResponse; @@ -46,12 +47,10 @@ public class PdbController implements HardcodedValues, CollectionUtils { PlotResponse createPlot(@RequestBody final PlotRequest request) { try { - final String query = request.getQuery(); - final int height = request.getHeight(); - final int width = request.getWidth(); - System.out.println(query); - final File image = plotter.plot(query, height, width, request.getGroupBy()); + final PlotSettings plotSettings = PlotSettingsTransformer.toSettings(request); + + final File image = plotter.plot(plotSettings); final Path relativeImagePath = plotter.getOutputDir().relativize(image.toPath()); return new PlotResponse(WEB_IMAGE_OUTPUT_PATH + "/" + relativeImagePath.toString()); diff --git a/pdb-ui/src/main/java/org/lucares/pdbui/PlotSettingsTransformer.java b/pdb-ui/src/main/java/org/lucares/pdbui/PlotSettingsTransformer.java new file mode 100644 index 0000000..67f3568 --- /dev/null +++ b/pdb-ui/src/main/java/org/lucares/pdbui/PlotSettingsTransformer.java @@ -0,0 +1,35 @@ +package org.lucares.pdbui; + +import org.lucares.pdb.plot.api.Limit; +import org.lucares.pdb.plot.api.PlotSettings; +import org.lucares.pdbui.domain.LimitBy; +import org.lucares.pdbui.domain.PlotRequest; + +class PlotSettingsTransformer { + static PlotSettings toSettings(final PlotRequest request) { + + final PlotSettings result = new PlotSettings(); + + result.setQuery(request.getQuery()); + result.setGroupBy(request.getGroupBy()); + result.setHeight(request.getHeight()); + result.setWidth(request.getWidth()); + result.setLimit(request.getLimit()); + result.setLimitBy(toLimit(request.getLimitBy())); + + return result; + } + + private static Limit toLimit(final LimitBy limitBy) { + switch (limitBy) { + case NO_LIMIT: + return Limit.NO_LIMIT; + case FEWEST_VALUES: + return Limit.FEWEST_VALUES; + case MOST_VALUES: + return Limit.MOST_VALUES; + default: + throw new IllegalStateException("unhandled enum: " + limitBy); + } + } +} diff --git a/pdb-ui/src/main/java/org/lucares/pdbui/domain/LimitBy.java b/pdb-ui/src/main/java/org/lucares/pdbui/domain/LimitBy.java new file mode 100644 index 0000000..b39244b --- /dev/null +++ b/pdb-ui/src/main/java/org/lucares/pdbui/domain/LimitBy.java @@ -0,0 +1,5 @@ +package org.lucares.pdbui.domain; + +public enum LimitBy { + NO_LIMIT, MOST_VALUES, FEWEST_VALUES +} diff --git a/pdb-ui/src/main/java/org/lucares/pdbui/domain/PlotRequest.java b/pdb-ui/src/main/java/org/lucares/pdbui/domain/PlotRequest.java index 3e29926..c1b15f4 100644 --- a/pdb-ui/src/main/java/org/lucares/pdbui/domain/PlotRequest.java +++ b/pdb-ui/src/main/java/org/lucares/pdbui/domain/PlotRequest.java @@ -9,6 +9,10 @@ public class PlotRequest { private String groupBy; + private LimitBy limitBy = LimitBy.NO_LIMIT; + + private int limit = Integer.MAX_VALUE; + public String getQuery() { return query; } @@ -45,4 +49,20 @@ public class PlotRequest { public void setGroupBy(final String groupBy) { this.groupBy = groupBy; } + + public LimitBy getLimitBy() { + return limitBy; + } + + public void setLimitBy(final LimitBy limitBy) { + this.limitBy = limitBy; + } + + public int getLimit() { + return limit; + } + + public void setLimit(final int limit) { + this.limit = limit; + } } diff --git a/pdb-ui/src/main/resources/resources/css/icons.css b/pdb-ui/src/main/resources/resources/css/icons.css index 178ba03..e114a16 100644 --- a/pdb-ui/src/main/resources/resources/css/icons.css +++ b/pdb-ui/src/main/resources/resources/css/icons.css @@ -33,6 +33,10 @@ content: "\f1c5" } +.fa-area-chart:before { + content: "\f1fe" +} + .fa-icons:before { content: "\f002"; } \ No newline at end of file diff --git a/pdb-ui/src/main/resources/resources/index.html b/pdb-ui/src/main/resources/resources/index.html index 02d1cbf..562c590 100644 --- a/pdb-ui/src/main/resources/resources/index.html +++ b/pdb-ui/src/main/resources/resources/index.html @@ -21,7 +21,15 @@ data-autocomplete-empty-message="nothing found" /> - + + + + +
diff --git a/pdb-ui/src/main/resources/resources/js/search.js b/pdb-ui/src/main/resources/resources/js/search.js index b262af8..544b483 100644 --- a/pdb-ui/src/main/resources/resources/js/search.js +++ b/pdb-ui/src/main/resources/resources/js/search.js @@ -5,6 +5,17 @@ $(document).ready(function(){ renderFields(); + $('#search-limit-by').change(function () { + var optionSelected = $(this).find("option:selected"); + var valueSelected = optionSelected.val(); + console.log(valueSelected); + if (valueSelected == "NO_LIMIT"){ + $('#search-limit-value').hide(); + }else{ + $('#search-limit-value').show(); + } + }); + AutoComplete({ HttpMethod: "GET", Delay: 300, @@ -69,9 +80,12 @@ function plot(event){ showLoadingIcon(); var request = {}; request['query'] = $('#search-input').val(); - request['height'] = $('#result-view').height()-10; - request['width'] = $('#result-view').width()-10; + request['height'] = $('#result-view').height()-15; + request['width'] = $('#result-view').width()-15; request['groupBy'] = $('#search-group-by').val(); + request['limitBy'] = $('#search-limit-by').val(); + request['limit'] = parseInt($('#search-limit-value').val()); + var success = function(response){