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 fe183b7..77abca7 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 @@ -11,22 +11,17 @@ public class DataSeries { private final Integer pointType; - public DataSeries(final File dataFile, final String title) { + private final int values; + + public DataSeries(final File dataFile, final String title, final int values) { super(); this.dataFile = dataFile; this.title = title; + this.values = values; this.color = null; this.pointType = null; } - public DataSeries(final File dataFile, final String title, final GnuplotColor color, final Integer pointType) { - super(); - this.dataFile = dataFile; - this.title = title; - this.color = color; - this.pointType = pointType; - } - public GnuplotColor getColor() { return color; } @@ -42,4 +37,8 @@ public class DataSeries { public String getTitle() { return title; } + + public int getValues() { + return values; + } } 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 e63614b..3d7a61e 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 @@ -17,7 +17,11 @@ import java.util.Iterator; 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.performance.db.FileUtils; +import org.lucares.performance.db.Grouping; import org.lucares.performance.db.PerformanceDb; public class Plotter { @@ -43,17 +47,24 @@ public class Plotter { return outputDir; } - public File plot(final String query, final int height, final int width) throws InternalPlottingException { + public File plot(final String query, final int height, final int width, final String groupBy) + throws InternalPlottingException { try { final Collection dataSeries = new ArrayList<>(); - final Stream entries = db.get(query).singleGroup().asStream(); + final Result result = db.get(query, groupBy); - final File dataFile = File.createTempFile("data", ".dat", tmpBaseDir.toFile()); - final DataSeries dataSerie = new DataSeries(dataFile, query); - toCsv(entries, dataFile); + for (final GroupResult groupResult : result.getGroups()) { - dataSeries.add(dataSerie); + final Stream entries = groupResult.asStream(); + + final File dataFile = File.createTempFile("data", ".dat", tmpBaseDir.toFile()); + final int values = toCsv(entries, dataFile); + + final String title = title(groupResult.getGroupedBy(), values); + final DataSeries dataSerie = new DataSeries(dataFile, title, values); + dataSeries.add(dataSerie); + } final File outputFile = File.createTempFile("out", ".png", outputDir.toFile()); final Gnuplot gnuplot = new Gnuplot(tmpBaseDir); @@ -70,6 +81,23 @@ public class Plotter { } } + private String title(final Tags tags, final int values) { + + final StringBuilder result = new StringBuilder(); + + assert tags.getKeys().size() <= 1; + tags.forEach((k, v) -> { + result.append(v); + }); + + result.append("("); + result.append(values); + result.append(")"); + + return result.toString(); + + } + public static void main(final String[] args) throws Exception { final Path dataDirectory = Paths.get(args[0]); final Path outputDirectory = Paths.get(args[1]); @@ -81,7 +109,7 @@ 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); + final File image = plotter.plot(query, 1600, 1200, Grouping.NO_GROUPING); System.out.println("plotted image: " + image); } @@ -90,7 +118,7 @@ public class Plotter { } } - private static void toCsv(final Stream entries, final File dataFile) throws IOException { + private static int toCsv(final Stream entries, final File dataFile) throws IOException { final long start = System.nanoTime(); int count = 0; @@ -111,6 +139,8 @@ public class Plotter { count++; } } + System.out.println("wrote " + count + " values to csv in: " + (System.nanoTime() - start) / 1_000_000.0 + "ms"); + return count; } } 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 8d60b76..ba63f80 100644 --- a/pdb-ui/src/main/java/org/lucares/pdbui/PdbController.java +++ b/pdb-ui/src/main/java/org/lucares/pdbui/PdbController.java @@ -50,7 +50,7 @@ public class PdbController implements HardcodedValues, CollectionUtils { final int width = request.getWidth(); System.out.println(query); - final File image = plotter.plot(query, height, width); + final File image = plotter.plot(query, height, width, request.getGroupBy()); final Path relativeImagePath = plotter.getOutputDir().relativize(image.toPath()); return new PlotResponse(WEB_IMAGE_OUTPUT_PATH + "/" + relativeImagePath.toString()); @@ -88,6 +88,26 @@ public class PdbController implements HardcodedValues, CollectionUtils { } } + @RequestMapping(path = "/fields", // + method = RequestMethod.GET, // + consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, // + produces = MediaType.APPLICATION_JSON_UTF8_VALUE // + ) + @ResponseBody + List fields() { + + try { + + final List fields = db.getDb().getFields(); + + return fields; + + } catch (final Exception e) { + e.printStackTrace(); + throw new InternalServerError(e); + } + } + private List toAutocompleteProposals(final List proposals) { final List result = new ArrayList<>(); 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 efabdbb..3e29926 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 @@ -7,6 +7,8 @@ public class PlotRequest { private int width; + private String groupBy; + public String getQuery() { return query; } @@ -35,4 +37,12 @@ public class PlotRequest { public String toString() { return query + ":" + height + "x" + width; } + + public String getGroupBy() { + return groupBy; + } + + public void setGroupBy(final String groupBy) { + this.groupBy = groupBy; + } } diff --git a/pdb-ui/src/main/resources/resources/index.html b/pdb-ui/src/main/resources/resources/index.html index 41aaddd..e0fcdb2 100644 --- a/pdb-ui/src/main/resources/resources/index.html +++ b/pdb-ui/src/main/resources/resources/index.html @@ -20,6 +20,8 @@ +
+
diff --git a/pdb-ui/src/main/resources/resources/js/search.js b/pdb-ui/src/main/resources/resources/js/search.js index 8f4f5f2..24e904c 100644 --- a/pdb-ui/src/main/resources/resources/js/search.js +++ b/pdb-ui/src/main/resources/resources/js/search.js @@ -3,6 +3,8 @@ $(document).ready(function(){ $('#search-submit').click(plot); + initGroupBy(); + AutoComplete({ HttpMethod: "GET", Delay: 300, @@ -27,6 +29,24 @@ $(document).ready(function(){ }); }); +function initGroupBy() +{ + var successCallback = function (response) { + + response.forEach(function(item, index){ + $('#search-group-by').append(''); + }); + + }; + + var errorCallback = function (){ + $('#result-view').text("FAILED: " + JSON.stringify(e)); + }; + + getJson("fields", {}, successCallback, errorCallback) + +} + function showLoadingIcon() { $('#result-view').html("
"); @@ -41,6 +61,7 @@ function plot(event){ request['query'] = $('#search-input').val(); request['height'] = $('#result-view').height()-10; request['width'] = $('#result-view').width()-10; + request['groupBy'] = $('input[name=groupBy]:checked').val(); var success = function(response){ @@ -67,4 +88,15 @@ function postJson(url, requestData, successCallback, errorCallback) { .fail(errorCallback); } +function getJson(url, requestData, successCallback, errorCallback) { + + $.ajax({ + type: "GET", + url: url, + data: requestData, + contentType: 'application/json' + }) + .done(successCallback) + .fail(errorCallback); +} diff --git a/performanceDb/src/main/java/org/lucares/performance/db/Grouping.java b/performanceDb/src/main/java/org/lucares/performance/db/Grouping.java index 506f6dc..a6b54cc 100644 --- a/performanceDb/src/main/java/org/lucares/performance/db/Grouping.java +++ b/performanceDb/src/main/java/org/lucares/performance/db/Grouping.java @@ -11,6 +11,7 @@ import org.lucares.pdb.api.Tags; public class Grouping { public static final String NO_GROUPING = null; + public static final String DEFAULT_GROUP = ""; private final List groups = new ArrayList<>(); private Grouping(final Group group) { @@ -25,7 +26,7 @@ public class Grouping { final Grouping result; if (groupByField == NO_GROUPING) { - final Group group = new Group(null, pdbReaders); + final Group group = new Group(Tags.EMPTY, pdbReaders); result = new Grouping(group); } else { @@ -35,10 +36,10 @@ public class Grouping { final Tags tags = pdbReader.getPdbFile().getTags(); final String value = tags.getValue(groupByField); - if (value != null) { - addIfNotExists(grouping, groupByField, value); - grouping.get(value).addReader(pdbReader); - } + final String groupName = value != null ? value : DEFAULT_GROUP; + + addIfNotExists(grouping, groupByField, groupName); + grouping.get(groupName).addReader(pdbReader); } result = new Grouping(grouping.values()); } diff --git a/performanceDb/src/main/java/org/lucares/performance/db/PerformanceDb.java b/performanceDb/src/main/java/org/lucares/performance/db/PerformanceDb.java index d7ad7e2..2961c24 100644 --- a/performanceDb/src/main/java/org/lucares/performance/db/PerformanceDb.java +++ b/performanceDb/src/main/java/org/lucares/performance/db/PerformanceDb.java @@ -15,6 +15,7 @@ import java.util.logging.Logger; import java.util.stream.Stream; import java.util.stream.StreamSupport; +import org.lucares.ludb.Field; import org.lucares.ludb.H2DB; import org.lucares.ludb.Proposal; import org.lucares.pdb.api.Entry; @@ -22,7 +23,7 @@ import org.lucares.pdb.api.GroupResult; import org.lucares.pdb.api.Result; import org.lucares.pdb.api.Tags; -public class PerformanceDb implements AutoCloseable { +public class PerformanceDb implements AutoCloseable, CollectionUtils { private static final Logger LOGGER = Logger.getLogger(PerformanceDb.class.getCanonicalName()); private final TagsToFile tagsToFile; @@ -178,4 +179,10 @@ public class PerformanceDb implements AutoCloseable { public List autocomplete(final String query, final int caretIndex) { return db.proposeTagForQuery(query, caretIndex); } + + public List getFields() { + final List fields = db.getAvailableFields(""); + + return map(fields, Field::getName); + } }