diff --git a/pdb-api/src/main/java/org/lucares/pdb/api/Tags.java b/pdb-api/src/main/java/org/lucares/pdb/api/Tags.java index b66595a..90b89b9 100644 --- a/pdb-api/src/main/java/org/lucares/pdb/api/Tags.java +++ b/pdb-api/src/main/java/org/lucares/pdb/api/Tags.java @@ -1,7 +1,8 @@ package org.lucares.pdb.api; import java.util.Collections; -import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -29,16 +30,25 @@ public class Tags { return EMPTY; } + public static Tags create(final String key, final String value) { + final Map tags = new LinkedHashMap<>(1); + tags.put(key, new Tag(key, value)); + return new Tags(tags); + } + public static Tags create(final String key1, final String value1, final String key2, final String value2) { - final Map tags = new HashMap<>(2); + final Map tags = new LinkedHashMap<>(2); tags.put(key1, new Tag(key1, value1)); tags.put(key2, new Tag(key2, value2)); return new Tags(tags); } - public static Tags create(final String key, final String value) { - final Map tags = new HashMap<>(1); - tags.put(key, new Tag(key, value)); + public static Tags create(final String key1, final String value1, final String key2, final String value2, + final String key3, final String value3) { + final Map tags = new LinkedHashMap<>(3); + tags.put(key1, new Tag(key1, value1)); + tags.put(key2, new Tag(key2, value2)); + tags.put(key3, new Tag(key3, value3)); return new Tags(tags); } @@ -46,7 +56,7 @@ public class Tags { Objects.requireNonNull(key, "key must not be null"); Objects.requireNonNull(value, "value must not be null"); - final Map newTags = new HashMap<>(tags); + final Map newTags = new LinkedHashMap<>(tags); newTags.put(key, new Tag(key, value)); @@ -82,7 +92,7 @@ public class Tags { @Override public String toString() { - return String.valueOf(tags); + return String.valueOf(tags.values()); } @Override @@ -142,4 +152,23 @@ public class Tags { return s.substring(0, Math.min(maxLength, s.length())); } + public Tags subset(final List groupByFields) { + + Tags result = new Tags(); + + for (final String field : groupByFields) { + final String value = getValue(field); + + if (value != null) { + result = result.copyAdd(field, value); + } + } + + return result; + } + + public boolean isEmpty() { + return tags.isEmpty(); + } + } 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 index 8b75d25..35bc8e1 100644 --- 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 @@ -6,6 +6,7 @@ import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; +import java.util.List; import org.apache.commons.lang3.StringUtils; @@ -19,7 +20,7 @@ public class PlotSettings { private int width; - private String groupBy; + private List groupBy; private Limit limitBy; @@ -53,11 +54,11 @@ public class PlotSettings { this.width = width; } - public String getGroupBy() { + public List getGroupBy() { return groupBy; } - public void setGroupBy(final String groupBy) { + public void setGroupBy(final List groupBy) { this.groupBy = groupBy; } 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 07c195d..c8475d0 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 @@ -36,6 +36,8 @@ public class Plotter { private static final Logger LOGGER = LoggerFactory.getLogger(Plotter.class); private static final Logger METRICS_LOGGER = LoggerFactory.getLogger("org.lucares.metrics.plotter"); + private static final String DEFAULT_GROUP = ""; + private final PerformanceDb db; private final Path tmpBaseDir; private final Path outputDir; @@ -68,7 +70,7 @@ public class Plotter { final List dataSeries = new ArrayList<>(); final String query = plotSettings.getQuery(); - final String groupBy = plotSettings.getGroupBy(); + final List groupBy = plotSettings.getGroupBy(); final int height = plotSettings.getHeight(); final int width = plotSettings.getWidth(); final OffsetDateTime dateFrom = plotSettings.dateFrom(); @@ -165,12 +167,18 @@ public class Plotter { final StringBuilder result = new StringBuilder(); - assert tags.getKeys().size() <= 1; - tags.forEach((k, v) -> { - result.append(v); - }); + if (tags.isEmpty()) { + result.append(DEFAULT_GROUP); + } else { + tags.forEach((k, v) -> { + if (result.length() > 0) { + result.append(" / "); + } + result.append(v); + }); + } - result.append("("); + result.append(" ("); result.append(values); result.append(")"); 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 4abbf23..619d8a6 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 @@ -1,5 +1,7 @@ package org.lucares.pdbui.domain; +import java.util.List; + public class PlotRequest { private String query; @@ -7,7 +9,7 @@ public class PlotRequest { private int width = 1000; - private String groupBy; + private List groupBy; private LimitBy limitBy = LimitBy.NO_LIMIT; @@ -46,11 +48,11 @@ public class PlotRequest { return query + ":" + height + "x" + width; } - public String getGroupBy() { + public List getGroupBy() { return groupBy; } - public void setGroupBy(final String groupBy) { + public void setGroupBy(final List groupBy) { this.groupBy = groupBy; } diff --git a/pdb-ui/src/main/resources/resources/js/search.js b/pdb-ui/src/main/resources/resources/js/search.js index 0bb9319..17a86ef 100644 --- a/pdb-ui/src/main/resources/resources/js/search.js +++ b/pdb-ui/src/main/resources/resources/js/search.js @@ -52,18 +52,9 @@ function renderGroupBy() var success = function(response){ - $('#search-group-by').empty(); - - var option = new Option("", ""); - $('#search-group-by').append($(option)); - - response.forEach( - (item, index) => { - var option = new Option(item, item); - $('#search-group-by').append($(option)); - } - ); - + initSearchGroupBy('#search-group-by-1', response); + initSearchGroupBy('#search-group-by-2', response); + initSearchGroupBy('#search-group-by-3', response); }; var error = function(e) { $('#result-view').text("FAILED: " + JSON.parse(e.responseText).message); @@ -73,6 +64,20 @@ function renderGroupBy() getJson("fields", request, success, error); } +function initSearchGroupBy(selector, response) +{ + $(selector).empty(); + var option = new Option("", ""); + $(selector).append($(option)); + + response.forEach( + (item, index) => { + var option = new Option(item, item); + $(selector).append($(option)); + } + ); +} + function showLoadingIcon() { $('#result-view').html("
"); @@ -86,7 +91,7 @@ function plot(event){ request['query'] = $('#search-input').val(); request['height'] = $('#result-view').height()-15; request['width'] = $('#result-view').width()-15; - request['groupBy'] = $('#search-group-by').val(); + request['groupBy'] = groupBy(); request['limitBy'] = $('#search-limit-by').val(); request['limit'] = parseInt($('#search-limit-value').val()); request['dateFrom'] = $('#search-date-from').val(); @@ -111,6 +116,20 @@ function plot(event){ } +function groupBy() +{ + var result = []; + + for (var i = 1; i <= 3; i++) + { + if ($('#search-group-by-'+i).val() != "") + { + result.push($('#search-group-by-'+i).val()); + } + } + return result; +} + function postJson(url, requestData, successCallback, errorCallback) { $.ajax({ @@ -135,3 +154,4 @@ function getJson(url, requestData, successCallback, errorCallback) { .fail(errorCallback); } + diff --git a/pdb-ui/src/main/resources/templates/main.html b/pdb-ui/src/main/resources/templates/main.html index d27175e..55670e7 100644 --- a/pdb-ui/src/main/resources/templates/main.html +++ b/pdb-ui/src/main/resources/templates/main.html @@ -19,7 +19,10 @@
- + + + +