From 70e586b7e90fa8713e58578080324a0feceae621 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Sat, 23 Sep 2017 18:56:02 +0200 Subject: [PATCH] limit by max/min value --- .../java/org/lucares/pdb/plot/api/Limit.java | 2 +- .../lucares/recommind/logs/CsvSummary.java | 19 +++---- .../lucares/recommind/logs/DataSeries.java | 16 +++++- .../org/lucares/recommind/logs/Plotter.java | 54 +++++++++---------- .../pdbui/PlotSettingsTransformer.java | 4 ++ .../org/lucares/pdbui/domain/LimitBy.java | 2 +- pdb-ui/src/main/resources/templates/main.html | 2 + 7 files changed, 53 insertions(+), 46 deletions(-) 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 index 56d02d6..5349484 100644 --- 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 @@ -1,5 +1,5 @@ package org.lucares.pdb.plot.api; public enum Limit { - NO_LIMIT, MOST_VALUES, FEWEST_VALUES + NO_LIMIT, MOST_VALUES, FEWEST_VALUES, MAX_VALUE, MIN_VALUE } diff --git a/pdb-plotting/src/main/java/org/lucares/recommind/logs/CsvSummary.java b/pdb-plotting/src/main/java/org/lucares/recommind/logs/CsvSummary.java index b7b70b6..63945c7 100644 --- a/pdb-plotting/src/main/java/org/lucares/recommind/logs/CsvSummary.java +++ b/pdb-plotting/src/main/java/org/lucares/recommind/logs/CsvSummary.java @@ -1,28 +1,21 @@ package org.lucares.recommind.logs; -import java.time.OffsetDateTime; class CsvSummary { private final int values; - private final OffsetDateTime maxDate; - private final OffsetDateTime minDate; + private long maxValue; - public CsvSummary(final int values, final OffsetDateTime maxDate, final OffsetDateTime minDate) { + public CsvSummary(final int values, long maxValue) { super(); this.values = values; - this.maxDate = maxDate; - this.minDate = minDate; + this.maxValue = maxValue; } public int getValues() { return values; } - - public OffsetDateTime getMaxDate() { - return maxDate; - } - - public OffsetDateTime getMinDate() { - return minDate; + + public long getMaxValue() { + return maxValue; } } 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 b974738..e443a0a 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 @@ -7,9 +7,14 @@ import java.util.List; import java.util.Map; public class DataSeries { - public static final Comparator BY_VALUES = (a, b) -> { + public static final Comparator BY_NUMBER_OF_VALUES = (a, b) -> { return a.getValues() - b.getValues(); }; + + public static final Comparator BY_MAX_VALUE = (a, b) -> { + final long result = a.getMaxValue() - b.getMaxValue(); + return result <0 ? -1 : (result > 0 ? 1 : 0); + }; private final File dataFile; @@ -21,11 +26,14 @@ public class DataSeries { private final int values; - public DataSeries(final File dataFile, final String title, final int values) { + private long maxValue; + + public DataSeries(final File dataFile, final String title, final int values, long maxValue) { super(); this.dataFile = dataFile; this.title = title; this.values = values; + this.maxValue = maxValue; this.color = null; this.pointType = null; } @@ -49,6 +57,10 @@ public class DataSeries { public int getValues() { return values; } + + public long getMaxValue() { + return maxValue; + } public static Map toMap(final List dataSeries) { final Map result = new LinkedHashMap<>(); 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 4d4f729..dd12c7e 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 @@ -76,13 +76,6 @@ public class Plotter { final Result result = db.get(query, groupBy); - // OffsetDateTime maxDate = - // OffsetDateTime.ofInstant(Instant.ofEpochMilli(Long.MIN_VALUE), - // ZoneOffset.UTC); - // OffsetDateTime minDate = - // OffsetDateTime.ofInstant(Instant.ofEpochMilli(Long.MAX_VALUE), - // ZoneOffset.UTC); - for (final GroupResult groupResult : result.getGroups()) { final Stream entries = groupResult.asStream(); @@ -91,14 +84,9 @@ public class Plotter { final CsvSummary csvSummary = toCsv(entries, dataFile, dateFrom, dateTo); final String title = title(groupResult.getGroupedBy(), csvSummary.getValues()); - final DataSeries dataSerie = new DataSeries(dataFile, title, csvSummary.getValues()); + final DataSeries dataSerie = new DataSeries(dataFile, title, csvSummary.getValues(), csvSummary.getMaxValue()); if (dataSerie.getValues() > 0) { dataSeries.add(dataSerie); - - // maxDate = maxDate.compareTo(csvSummary.getMaxDate()) > 0 - // ? maxDate : csvSummary.getMaxDate(); - // minDate = minDate.compareTo(csvSummary.getMinDate()) < 0 - // ? minDate : csvSummary.getMinDate(); } } @@ -163,26 +151,36 @@ 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)); - + dataSeries.sort(getDataSeriesComparator(limitBy)); + + switch (limitBy) { + case FEWEST_VALUES: + case MOST_VALUES: + case MAX_VALUE: + case MIN_VALUE: while (dataSeries.size() > plotSettings.getLimit()) { dataSeries.remove(plotSettings.getLimit()); } - } else { - dataSeries.sort(getDataSeriesComparator(Limit.MOST_VALUES)); + break; + case NO_LIMIT: } - } private Comparator getDataSeriesComparator(final Limit limitBy) { - if (limitBy == Limit.MOST_VALUES) { - return DataSeries.BY_VALUES.reversed(); + switch (limitBy) { + case MOST_VALUES: + return DataSeries.BY_NUMBER_OF_VALUES.reversed(); + case FEWEST_VALUES: + return DataSeries.BY_NUMBER_OF_VALUES; + case MAX_VALUE: + return DataSeries.BY_MAX_VALUE.reversed(); + case MIN_VALUE: + return DataSeries.BY_MAX_VALUE; + case NO_LIMIT: + return DataSeries.BY_NUMBER_OF_VALUES; } - - return DataSeries.BY_VALUES; + throw new IllegalStateException("unhandled enum: "+ limitBy); } private String title(final Tags tags, final int values) { @@ -215,8 +213,7 @@ public class Plotter { int count = 0; final long fromEpochMilli = dateFrom.toInstant().toEpochMilli(); final long toEpochMilli = dateTo.toInstant().toEpochMilli(); - OffsetDateTime maxDate = OffsetDateTime.MIN; - OffsetDateTime minDate = OffsetDateTime.MAX; + long maxValue = 0; final int separator = ','; final int newline = '\n'; try (final Writer output = new OutputStreamWriter(new FileOutputStream(dataFile), StandardCharsets.US_ASCII);) { @@ -235,13 +232,12 @@ public class Plotter { output.write(newline); count++; - maxDate = maxDate.compareTo(date) > 0 ? maxDate : date; - minDate = minDate.compareTo(date) < 0 ? minDate : date; + maxValue = Math.max(maxValue, entry.getValue()); } } } METRICS_LOGGER.debug("wrote {} values to csv in: {}ms", count, (System.nanoTime() - start) / 1_000_000.0); - return new CsvSummary(count, maxDate, minDate); + return new CsvSummary(count, maxValue); } } diff --git a/pdb-ui/src/main/java/org/lucares/pdbui/PlotSettingsTransformer.java b/pdb-ui/src/main/java/org/lucares/pdbui/PlotSettingsTransformer.java index 4ce4448..61ace69 100644 --- a/pdb-ui/src/main/java/org/lucares/pdbui/PlotSettingsTransformer.java +++ b/pdb-ui/src/main/java/org/lucares/pdbui/PlotSettingsTransformer.java @@ -57,6 +57,10 @@ class PlotSettingsTransformer { return Limit.FEWEST_VALUES; case MOST_VALUES: return Limit.MOST_VALUES; + case MAX_VALUE: + return Limit.MAX_VALUE; + case MIN_VALUE: + return Limit.MIN_VALUE; 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 index b39244b..51a03e1 100644 --- a/pdb-ui/src/main/java/org/lucares/pdbui/domain/LimitBy.java +++ b/pdb-ui/src/main/java/org/lucares/pdbui/domain/LimitBy.java @@ -1,5 +1,5 @@ package org.lucares.pdbui.domain; public enum LimitBy { - NO_LIMIT, MOST_VALUES, FEWEST_VALUES + NO_LIMIT, MOST_VALUES, FEWEST_VALUES, MAX_VALUE, MIN_VALUE } diff --git a/pdb-ui/src/main/resources/templates/main.html b/pdb-ui/src/main/resources/templates/main.html index 99faf32..24947bf 100644 --- a/pdb-ui/src/main/resources/templates/main.html +++ b/pdb-ui/src/main/resources/templates/main.html @@ -31,6 +31,8 @@ + +