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 3faaec8..cdcbb28 100644 --- a/api/server/src/main/java/org/softwareheritage/graph/App.java +++ b/api/server/src/main/java/org/softwareheritage/graph/App.java @@ -1,45 +1,46 @@ package org.softwareheritage.graph; import java.io.IOException; import java.util.Optional; import io.javalin.Javalin; import org.softwareheritage.graph.Graph; import org.softwareheritage.graph.algo.Stats; import org.softwareheritage.graph.algo.Visit; public class App { public static void main(String[] args) throws IOException, Exception { String path = args[0]; Graph graph = new Graph(path); - Stats stats = new Stats(graph); Javalin app = Javalin.create().start(5010); - app.get("/stats/", ctx -> { + app.get("/stats/:src_type/:dst_type", ctx -> { try { - ctx.json(stats); + String srcType = ctx.pathParam("src_type"); + String dstType = ctx.pathParam("dst_type"); + ctx.json(new Stats(srcType, dstType)); } catch (IllegalArgumentException e) { ctx.status(404); } catch (Exception e) { ctx.status(400); ctx.result(e.toString()); } }); app.get("/visit/:swh_id", ctx -> { String start = ctx.pathParam("swh_id"); // By default, traversal is a forward DFS using all edges String algorithm = Optional.ofNullable(ctx.queryParam("traversal")).orElse("dfs"); String direction = Optional.ofNullable(ctx.queryParam("direction")).orElse("forward"); String edges = Optional.ofNullable(ctx.queryParam("edges")).orElse("cnt:dir:rel:rev:snp"); // TODO: Use transposed graph depending on 'direction' ctx.json(new Visit(graph, start, edges, algorithm)); }); 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 index 10d296c..0862de6 100644 --- a/api/server/src/main/java/org/softwareheritage/graph/algo/Stats.java +++ b/api/server/src/main/java/org/softwareheritage/graph/algo/Stats.java @@ -1,54 +1,61 @@ 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.Graph; +/* + TODO: + - add check for srcType_to_dstType + - merge the two stats files (.properties and .stats) into one +*/ + public class Stats { 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; - public Stats(Graph graph) throws IOException { + public Stats(String srcType, String dstType) throws IOException { HashMap statsMap = new HashMap<>(); // Parse statistics from generated files - Path dotProperties = Paths.get(graph.getPath() + ".properties"); - Path dotStats = Paths.get(graph.getPath() + ".stats"); + Path statsPath = Paths.get("stats", srcType + "_to_" + dstType); + Path dotProperties = Paths.get(statsPath + ".properties"); + Path dotStats = Paths.get(statsPath + ".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]); } } this.nbNodes = Long.parseLong(statsMap.get("nodes")); this.nbEdges = Long.parseLong(statsMap.get("arcs")); this.compressionRatio = Double.parseDouble(statsMap.get("compratio")); this.bitsPerNode = Double.parseDouble(statsMap.get("bitspernode")); this.bitsPerEdge = Double.parseDouble(statsMap.get("bitsperlink")); this.avgLocality = Double.parseDouble(statsMap.get("avglocality")); this.minIndegree = Long.parseLong(statsMap.get("minindegree")); this.maxIndegree = Long.parseLong(statsMap.get("maxindegree")); this.avgIndegree = Double.parseDouble(statsMap.get("avgindegree")); this.minOutdegree = Long.parseLong(statsMap.get("minoutdegree")); this.maxOutdegree = Long.parseLong(statsMap.get("maxoutdegree")); this.avgOutdegree = Double.parseDouble(statsMap.get("avgoutdegree")); } }