limit the number of plots

This commit is contained in:
2017-02-12 18:17:36 +01:00
parent e47519e6d9
commit d137f7c9cb
11 changed files with 215 additions and 17 deletions

View File

@@ -0,0 +1,5 @@
package org.lucares.pdb.plot.api;
public enum Limit {
NO_LIMIT, MOST_VALUES, FEWEST_VALUES
}

View File

@@ -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;
}
}

View File

@@ -1,8 +1,13 @@
package org.lucares.recommind.logs;
import java.io.File;
import java.util.Comparator;
public class DataSeries {
public static final Comparator<? super DataSeries> BY_VALUES = (a, b) -> {
return a.getValues() - b.getValues();
};
private final File dataFile;
private final String title;

View File

@@ -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> dataSeries = new ArrayList<>();
final List<DataSeries> 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> 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<? super DataSeries> 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);
}