diff --git a/api/server/src/main/java/org/softwareheritage/graph/App.java b/api/server/src/main/java/org/softwareheritage/graph/App.java index f93e671..4b4b75b 100644 --- a/api/server/src/main/java/org/softwareheritage/graph/App.java +++ b/api/server/src/main/java/org/softwareheritage/graph/App.java @@ -1,23 +1,41 @@ package org.softwareheritage.graph; +import java.io.FileNotFoundException; +import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import io.javalin.Javalin; import org.softwareheritage.graph.Dataset; import org.softwareheritage.graph.Graph; +import org.softwareheritage.graph.algo.Stats; public class App { public static void main(String[] args) { Path path = Paths.get(args[0]); Graph graph = new Graph(path.toString()); + Stats stats = new Stats(graph); + Javalin app = Javalin.create().start(5010); - app.get("/nb_nodes", ctx -> { - ctx.json(graph.nbNodes()); + + app.get("/stats/:dataset", ctx -> { + try { + String dataset = ctx.pathParam("dataset").toUpperCase(); + ctx.json(stats.getStats(Dataset.Name.valueOf(dataset))); + } catch (IllegalArgumentException | IOException e) { + ctx.status(404); + } catch (Exception e) { + ctx.status(400); + ctx.result(e.toString()); + } + }); + + app.error(404, ctx -> { + ctx.result("Not found"); }); } } diff --git a/api/server/src/main/java/org/softwareheritage/graph/algo/Stats.java b/api/server/src/main/java/org/softwareheritage/graph/algo/Stats.java new file mode 100644 index 0000000..cbbf994 --- /dev/null +++ b/api/server/src/main/java/org/softwareheritage/graph/algo/Stats.java @@ -0,0 +1,69 @@ +package org.softwareheritage.graph.algo; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.List; + +import org.softwareheritage.graph.Dataset; +import org.softwareheritage.graph.Graph; + +public class Stats +{ + class DatasetStat { + public long nbNodes; + public long nbEdges; + public double compressionRatio; + public double bitsPerNode; + public double bitsPerEdge; + public double avgLocality; + public long minIndegree; + public long maxIndegree; + public double avgIndegree; + public long minOutdegree; + public long maxOutdegree; + public double avgOutdegree; + } + + Graph graph; + + public Stats(Graph graph) + { + this.graph = graph; + } + + public DatasetStat getStats(Dataset.Name datasetName) throws IOException + { + Dataset dataset = graph.getDataset(datasetName); + HashMap statsMap = new HashMap<>(); + + // Parse statistics from generated files + Path dotProperties = Paths.get(dataset.getPath() + ".properties"); + Path dotStats = Paths.get(dataset.getPath() + ".stats"); + List lines = Files.readAllLines(dotProperties); + lines.addAll(Files.readAllLines(dotStats)); + for (String line : lines) { + String[] parts = line.split("="); + if (parts.length == 2) + statsMap.put(parts[0], parts[1]); + } + + DatasetStat stats = new DatasetStat(); + stats.nbNodes = Long.parseLong(statsMap.get("nodes")); + stats.nbEdges = Long.parseLong(statsMap.get("arcs")); + stats.compressionRatio = Double.parseDouble(statsMap.get("compratio")); + stats.bitsPerNode = Double.parseDouble(statsMap.get("bitspernode")); + stats.bitsPerEdge = Double.parseDouble(statsMap.get("bitsperlink")); + stats.avgLocality = Double.parseDouble(statsMap.get("avglocality")); + stats.minIndegree = Long.parseLong(statsMap.get("minindegree")); + stats.maxIndegree = Long.parseLong(statsMap.get("maxindegree")); + stats.avgIndegree = Double.parseDouble(statsMap.get("avgindegree")); + stats.minOutdegree = Long.parseLong(statsMap.get("minoutdegree")); + stats.maxOutdegree = Long.parseLong(statsMap.get("maxoutdegree")); + stats.avgOutdegree = Double.parseDouble(statsMap.get("avgoutdegree")); + + return stats; + } +}