Page Menu
Home
Software Heritage
Search
Configure Global Search
Log In
Files
F9345355
D6594.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
31 KB
Subscribers
None
D6594.diff
View Options
diff --git a/java/src/main/java/org/softwareheritage/graph/Entry.java b/java/src/main/java/org/softwareheritage/graph/Entry.java
--- a/java/src/main/java/org/softwareheritage/graph/Entry.java
+++ b/java/src/main/java/org/softwareheritage/graph/Entry.java
@@ -14,7 +14,7 @@
public void load_graph(String graphBasename) throws IOException {
System.err.println("Loading graph " + graphBasename + " ...");
- this.graph = Graph.loadMapped(graphBasename);
+ this.graph = Graph.loadMapped(graphBasename, Graph.LoadDirection.BOTH);
System.err.println("Graph loaded.");
}
diff --git a/java/src/main/java/org/softwareheritage/graph/Graph.java b/java/src/main/java/org/softwareheritage/graph/Graph.java
--- a/java/src/main/java/org/softwareheritage/graph/Graph.java
+++ b/java/src/main/java/org/softwareheritage/graph/Graph.java
@@ -46,14 +46,27 @@
/** Mapping long id → node types */
NodeTypesMap nodeTypesMap;
+ /**
+ * Defines which directions of the graph can be loaded in memory.
+ */
+ public enum LoadDirection {
+ FORWARD,
+ BACKWARD,
+ BOTH
+ }
+
+ /** The direction of the graph loaded into memory */
+ private LoadDirection loadedDirection;
+
/**
* Constructor.
*
* @param path path and basename of the compressed graph to load
+ * @param direction the direction of the graph to load into memory
*/
- private Graph(String path) throws IOException {
- loadInternal(path, null, LoadMethod.MAPPED);
+ private Graph(String path, LoadDirection direction) throws IOException {
+ loadInternal(path, null, LoadMethod.MAPPED, direction);
}
/**
@@ -64,60 +77,74 @@
MEMORY, MAPPED, OFFLINE,
}
- protected Graph loadInternal(String path, ProgressLogger pl, LoadMethod method) throws IOException {
+ protected Graph loadInternal(String path, ProgressLogger pl, LoadMethod method, LoadDirection direction) throws IOException {
this.path = path;
+ this.loadedDirection = direction;
if (method == LoadMethod.MEMORY) {
- this.graph = ImmutableGraph.load(path, pl);
- this.graphTransposed = ImmutableGraph.load(path + "-transposed", pl);
+ loadInternal(ImmutableGraph::load, path, pl, direction);
} else if (method == LoadMethod.MAPPED) {
- this.graph = ImmutableGraph.loadMapped(path, pl);
- this.graphTransposed = ImmutableGraph.loadMapped(path + "-transposed", pl);
+ loadInternal(ImmutableGraph::loadMapped, path, pl, direction);
} else if (method == LoadMethod.OFFLINE) {
- this.graph = ImmutableGraph.loadOffline(path, pl);
- this.graphTransposed = ImmutableGraph.loadOffline(path + "-transposed", pl);
+ loadInternal(ImmutableGraph::loadOffline, path, pl, direction);
}
this.nodeTypesMap = new NodeTypesMap(path);
this.nodeIdMap = new NodeIdMap(path, numNodes());
return this;
}
+ private interface GraphLoader {
+ ImmutableGraph load(String path, ProgressLogger pl) throws IOException;
+ }
+
+ private void loadInternal(GraphLoader loader, String path, ProgressLogger pl, LoadDirection direction) throws IOException {
+ if (direction == LoadDirection.FORWARD) {
+ this.graph = loader.load(path, pl);
+ } else if (direction == LoadDirection.BACKWARD) {
+ this.graph = loader.load(path + "-transposed", pl);
+ } else if (direction == LoadDirection.BOTH) {
+ this.graph = loader.load(path, pl);
+ this.graphTransposed = loader.load(path + "-transposed", pl);
+ }
+ }
+
protected Graph() {
}
- public static Graph load(String path, ProgressLogger pl) throws IOException {
- return new Graph().loadInternal(path, pl, LoadMethod.MEMORY);
+ public static Graph load(String path, ProgressLogger pl, LoadDirection direction) throws IOException {
+ return new Graph().loadInternal(path, pl, LoadMethod.MEMORY, direction);
}
- public static Graph loadMapped(String path, ProgressLogger pl) throws IOException {
- return new Graph().loadInternal(path, pl, LoadMethod.MAPPED);
+ public static Graph loadMapped(String path, ProgressLogger pl, LoadDirection direction) throws IOException {
+ return new Graph().loadInternal(path, pl, LoadMethod.MAPPED, direction);
}
- public static Graph loadOffline(String path, ProgressLogger pl) throws IOException {
- return new Graph().loadInternal(path, null, LoadMethod.OFFLINE);
+ public static Graph loadOffline(String path, ProgressLogger pl, LoadDirection direction) throws IOException {
+ return new Graph().loadInternal(path, pl, LoadMethod.OFFLINE, direction);
}
- public static Graph load(String path) throws IOException {
- return new Graph().loadInternal(path, null, LoadMethod.MEMORY);
+ public static Graph load(String path, LoadDirection direction) throws IOException {
+ return load(path, null, direction);
}
- public static Graph loadMapped(String path) throws IOException {
- return new Graph().loadInternal(path, null, LoadMethod.MAPPED);
+ public static Graph loadMapped(String path, LoadDirection direction) throws IOException {
+ return loadMapped(path, null, direction);
}
- public static Graph loadOffline(String path) throws IOException {
- return new Graph().loadInternal(path, null, LoadMethod.OFFLINE);
+ public static Graph loadOffline(String path, LoadDirection direction) throws IOException {
+ return loadOffline(path, null, direction);
}
/**
* Constructor used for copy()
*/
protected Graph(ImmutableGraph graph, ImmutableGraph graphTransposed, String path, NodeIdMap nodeIdMap,
- NodeTypesMap nodeTypesMap) {
+ NodeTypesMap nodeTypesMap, LoadDirection direction) {
this.graph = graph;
this.graphTransposed = graphTransposed;
this.path = path;
this.nodeIdMap = nodeIdMap;
this.nodeTypesMap = nodeTypesMap;
+ this.loadedDirection = direction;
}
/**
@@ -125,27 +152,38 @@
*/
@Override
public Graph copy() {
- return new Graph(this.graph.copy(), this.graphTransposed.copy(), this.path, this.nodeIdMap, this.nodeTypesMap);
+ ImmutableGraph initial = this.graph.copy();
+ ImmutableGraph transposed = null;
+ if (this.loadedDirection == LoadDirection.BOTH) {
+ transposed = this.graphTransposed.copy();
+ }
+ return new Graph(initial, transposed, this.path, this.nodeIdMap, this.nodeTypesMap, this.loadedDirection);
}
@Override
public boolean randomAccess() {
- return graph.randomAccess() && graphTransposed.randomAccess();
+ return graph.randomAccess() && (this.loadedDirection != LoadDirection.BOTH || graphTransposed.randomAccess());
}
/**
* Return a transposed version of the graph.
*/
public Graph transpose() {
- return new Graph(this.graphTransposed, this.graph, this.path, this.nodeIdMap, this.nodeTypesMap);
+ if (this.loadedDirection != LoadDirection.BOTH) {
+ throw new UnsupportedOperationException("Unable to transpose graph: both directions must be loaded into memory.");
+ }
+ return new Graph(this.graphTransposed, this.graph, this.path, this.nodeIdMap, this.nodeTypesMap, this.loadedDirection);
}
/**
* Return a symmetric version of the graph.
*/
public Graph symmetrize() {
+ if (this.loadedDirection != LoadDirection.BOTH) {
+ throw new UnsupportedOperationException("Unable to symmetrize graph: both directions must be loaded into memory.");
+ }
ImmutableGraph symmetric = Transform.union(graph, graphTransposed);
- return new Graph(symmetric, symmetric, this.path, this.nodeIdMap, this.nodeTypesMap);
+ return new Graph(symmetric, symmetric, this.path, this.nodeIdMap, this.nodeTypesMap, this.loadedDirection);
}
/**
@@ -307,4 +345,11 @@
public Node.Type getNodeType(long nodeId) {
return nodeTypesMap.getType(nodeId);
}
+
+ /**
+ * Returns the direction of the graph loaded into memory.
+ */
+ public LoadDirection getLoadedDirection() {
+ return loadedDirection;
+ }
}
diff --git a/java/src/main/java/org/softwareheritage/graph/Traversal.java b/java/src/main/java/org/softwareheritage/graph/Traversal.java
--- a/java/src/main/java/org/softwareheritage/graph/Traversal.java
+++ b/java/src/main/java/org/softwareheritage/graph/Traversal.java
@@ -70,8 +70,11 @@
if (!direction.matches("forward|backward")) {
throw new IllegalArgumentException("Unknown traversal direction: " + direction);
}
-
- if (direction.equals("backward")) {
+ Graph.LoadDirection loadedDirection = graph.getLoadedDirection();
+ if (loadedDirection != Graph.LoadDirection.BOTH && !loadedDirection.name().toLowerCase().equals(direction)) {
+ throw new IllegalArgumentException("Invalid traversal direction: " + direction + ". Different direction was loaded.");
+ }
+ if (loadedDirection == Graph.LoadDirection.BOTH && direction.equals("backward")) {
this.graph = graph.transpose();
} else {
this.graph = graph;
diff --git a/java/src/main/java/org/softwareheritage/graph/benchmark/AccessEdge.java b/java/src/main/java/org/softwareheritage/graph/benchmark/AccessEdge.java
--- a/java/src/main/java/org/softwareheritage/graph/benchmark/AccessEdge.java
+++ b/java/src/main/java/org/softwareheritage/graph/benchmark/AccessEdge.java
@@ -25,7 +25,7 @@
Benchmark bench = new Benchmark();
bench.parseCommandLineArgs(args);
- Graph graph = Graph.loadMapped(bench.args.graphPath);
+ Graph graph = Graph.loadMapped(bench.args.graphPath, Graph.LoadDirection.BOTH);
long[] nodeIds = bench.args.random.generateNodeIds(graph, bench.args.nbNodes);
diff --git a/java/src/main/java/org/softwareheritage/graph/benchmark/BFS.java b/java/src/main/java/org/softwareheritage/graph/benchmark/BFS.java
--- a/java/src/main/java/org/softwareheritage/graph/benchmark/BFS.java
+++ b/java/src/main/java/org/softwareheritage/graph/benchmark/BFS.java
@@ -50,7 +50,7 @@
boolean useTransposed = config.getBoolean("useTransposed");
System.err.println("Loading graph " + graphPath + " ...");
- Graph graph = Graph.loadMapped(graphPath);
+ Graph graph = Graph.loadMapped(graphPath, Graph.LoadDirection.BOTH);
System.err.println("Graph loaded.");
if (useTransposed)
diff --git a/java/src/main/java/org/softwareheritage/graph/benchmark/Browsing.java b/java/src/main/java/org/softwareheritage/graph/benchmark/Browsing.java
--- a/java/src/main/java/org/softwareheritage/graph/benchmark/Browsing.java
+++ b/java/src/main/java/org/softwareheritage/graph/benchmark/Browsing.java
@@ -25,7 +25,7 @@
Benchmark bench = new Benchmark();
bench.parseCommandLineArgs(args);
- Graph graph = Graph.loadMapped(bench.args.graphPath);
+ Graph graph = Graph.loadMapped(bench.args.graphPath, Graph.LoadDirection.BOTH);
long[] dirNodeIds = bench.args.random.generateNodeIdsOfType(graph, bench.args.nbNodes, Node.Type.DIR);
long[] revNodeIds = bench.args.random.generateNodeIdsOfType(graph, bench.args.nbNodes, Node.Type.REV);
diff --git a/java/src/main/java/org/softwareheritage/graph/benchmark/Provenance.java b/java/src/main/java/org/softwareheritage/graph/benchmark/Provenance.java
--- a/java/src/main/java/org/softwareheritage/graph/benchmark/Provenance.java
+++ b/java/src/main/java/org/softwareheritage/graph/benchmark/Provenance.java
@@ -24,7 +24,7 @@
Benchmark bench = new Benchmark();
bench.parseCommandLineArgs(args);
- Graph graph = Graph.loadMapped(bench.args.graphPath);
+ Graph graph = Graph.loadMapped(bench.args.graphPath, Graph.LoadDirection.BOTH);
long[] nodeIds = bench.args.random.generateNodeIds(graph, bench.args.nbNodes);
diff --git a/java/src/main/java/org/softwareheritage/graph/benchmark/Vault.java b/java/src/main/java/org/softwareheritage/graph/benchmark/Vault.java
--- a/java/src/main/java/org/softwareheritage/graph/benchmark/Vault.java
+++ b/java/src/main/java/org/softwareheritage/graph/benchmark/Vault.java
@@ -24,7 +24,7 @@
Benchmark bench = new Benchmark();
bench.parseCommandLineArgs(args);
- Graph graph = Graph.loadMapped(bench.args.graphPath);
+ Graph graph = Graph.loadMapped(bench.args.graphPath, Graph.LoadDirection.BOTH);
long[] nodeIds = bench.args.random.generateNodeIds(graph, bench.args.nbNodes);
diff --git a/java/src/main/java/org/softwareheritage/graph/experiments/forks/FindCommonAncestor.java b/java/src/main/java/org/softwareheritage/graph/experiments/forks/FindCommonAncestor.java
--- a/java/src/main/java/org/softwareheritage/graph/experiments/forks/FindCommonAncestor.java
+++ b/java/src/main/java/org/softwareheritage/graph/experiments/forks/FindCommonAncestor.java
@@ -12,7 +12,7 @@
private void load_graph(String graphBasename) throws IOException {
System.err.println("Loading graph " + graphBasename + " ...");
- this.graph = Graph.loadMapped(graphBasename);
+ this.graph = Graph.loadMapped(graphBasename, Graph.LoadDirection.BOTH);
System.err.println("Graph loaded.");
}
diff --git a/java/src/main/java/org/softwareheritage/graph/experiments/forks/FindPath.java b/java/src/main/java/org/softwareheritage/graph/experiments/forks/FindPath.java
--- a/java/src/main/java/org/softwareheritage/graph/experiments/forks/FindPath.java
+++ b/java/src/main/java/org/softwareheritage/graph/experiments/forks/FindPath.java
@@ -14,7 +14,7 @@
private void load_graph(String graphBasename) throws IOException {
System.err.println("Loading graph " + graphBasename + " ...");
- this.graph = Graph.loadMapped(graphBasename).symmetrize();
+ this.graph = Graph.loadMapped(graphBasename, Graph.LoadDirection.BOTH).symmetrize();
System.err.println("Graph loaded.");
this.emptySnapshot = null;
}
diff --git a/java/src/main/java/org/softwareheritage/graph/experiments/forks/ForkCC.java b/java/src/main/java/org/softwareheritage/graph/experiments/forks/ForkCC.java
--- a/java/src/main/java/org/softwareheritage/graph/experiments/forks/ForkCC.java
+++ b/java/src/main/java/org/softwareheritage/graph/experiments/forks/ForkCC.java
@@ -72,7 +72,7 @@
private void load_graph(String graphBasename) throws IOException {
System.err.println("Loading graph " + graphBasename + " ...");
- this.graph = Graph.loadMapped(graphBasename).symmetrize();
+ this.graph = Graph.loadMapped(graphBasename, Graph.LoadDirection.BOTH).symmetrize();
System.err.println("Graph loaded.");
this.emptySnapshot = null;
this.whitelist = null;
diff --git a/java/src/main/java/org/softwareheritage/graph/experiments/forks/ForkCliques.java b/java/src/main/java/org/softwareheritage/graph/experiments/forks/ForkCliques.java
--- a/java/src/main/java/org/softwareheritage/graph/experiments/forks/ForkCliques.java
+++ b/java/src/main/java/org/softwareheritage/graph/experiments/forks/ForkCliques.java
@@ -24,7 +24,7 @@
private void load_graph(String graphBasename) throws IOException {
System.err.println("Loading graph " + graphBasename + " ...");
- this.graph = Graph.loadMapped(graphBasename);
+ this.graph = Graph.loadMapped(graphBasename, Graph.LoadDirection.BOTH);
System.err.println("Graph loaded.");
this.whitelist = null;
}
diff --git a/java/src/main/java/org/softwareheritage/graph/experiments/forks/ListEmptyOrigins.java b/java/src/main/java/org/softwareheritage/graph/experiments/forks/ListEmptyOrigins.java
--- a/java/src/main/java/org/softwareheritage/graph/experiments/forks/ListEmptyOrigins.java
+++ b/java/src/main/java/org/softwareheritage/graph/experiments/forks/ListEmptyOrigins.java
@@ -49,7 +49,7 @@
private void load_graph(String graphBasename) throws IOException {
System.err.println("Loading graph " + graphBasename + " ...");
- this.graph = Graph.loadMapped(graphBasename);
+ this.graph = Graph.loadMapped(graphBasename, Graph.LoadDirection.BOTH);
System.err.println("Graph loaded.");
this.emptySnapshot = null;
}
diff --git a/java/src/main/java/org/softwareheritage/graph/experiments/multiplicationfactor/GenDistribution.java b/java/src/main/java/org/softwareheritage/graph/experiments/multiplicationfactor/GenDistribution.java
--- a/java/src/main/java/org/softwareheritage/graph/experiments/multiplicationfactor/GenDistribution.java
+++ b/java/src/main/java/org/softwareheritage/graph/experiments/multiplicationfactor/GenDistribution.java
@@ -124,7 +124,7 @@
private void load_graph(String graphBasename) throws IOException {
System.err.println("Loading graph " + graphBasename + " ...");
- this.graph = Graph.loadMapped(graphBasename);
+ this.graph = Graph.loadMapped(graphBasename, Graph.LoadDirection.BOTH);
System.err.println("Graph loaded.");
}
}
diff --git a/java/src/main/java/org/softwareheritage/graph/experiments/topology/AveragePaths.java b/java/src/main/java/org/softwareheritage/graph/experiments/topology/AveragePaths.java
--- a/java/src/main/java/org/softwareheritage/graph/experiments/topology/AveragePaths.java
+++ b/java/src/main/java/org/softwareheritage/graph/experiments/topology/AveragePaths.java
@@ -24,7 +24,7 @@
public AveragePaths(String graphBasename, String allowedNodes, String outdir) throws IOException {
System.err.println("Loading graph " + graphBasename + " ...");
- this.graph = Graph.loadMapped(graphBasename);
+ this.graph = Graph.loadMapped(graphBasename, Graph.LoadDirection.BOTH);
this.subgraph = new Subgraph(this.graph, new AllowedNodes(allowedNodes));
this.outdir = outdir;
System.err.println("Graph loaded.");
diff --git a/java/src/main/java/org/softwareheritage/graph/experiments/topology/ClusteringCoefficient.java b/java/src/main/java/org/softwareheritage/graph/experiments/topology/ClusteringCoefficient.java
--- a/java/src/main/java/org/softwareheritage/graph/experiments/topology/ClusteringCoefficient.java
+++ b/java/src/main/java/org/softwareheritage/graph/experiments/topology/ClusteringCoefficient.java
@@ -27,7 +27,7 @@
public ClusteringCoefficient(String graphBasename, String outdirPath) throws IOException {
this.outdirPath = outdirPath;
System.err.println("Loading graph " + graphBasename + " ...");
- Graph directedGraph = Graph.loadMapped(graphBasename);
+ Graph directedGraph = Graph.loadMapped(graphBasename, Graph.LoadDirection.BOTH);
this.graph = directedGraph.symmetrize();
System.err.println("Graph loaded.");
diff --git a/java/src/main/java/org/softwareheritage/graph/experiments/topology/ConnectedComponents.java b/java/src/main/java/org/softwareheritage/graph/experiments/topology/ConnectedComponents.java
--- a/java/src/main/java/org/softwareheritage/graph/experiments/topology/ConnectedComponents.java
+++ b/java/src/main/java/org/softwareheritage/graph/experiments/topology/ConnectedComponents.java
@@ -23,7 +23,7 @@
private void load_graph(String graphBasename, String nodeTypes) throws IOException {
System.err.println("Loading graph " + graphBasename + " ...");
- var underlyingGraph = Graph.loadMapped(graphBasename);
+ var underlyingGraph = Graph.loadMapped(graphBasename, Graph.LoadDirection.BOTH);
var underlyingGraphSym = underlyingGraph.symmetrize();
graph = new Subgraph(underlyingGraphSym, new AllowedNodes(nodeTypes));
System.err.println("Graph loaded.");
diff --git a/java/src/main/java/org/softwareheritage/graph/experiments/topology/InOutDegree.java b/java/src/main/java/org/softwareheritage/graph/experiments/topology/InOutDegree.java
--- a/java/src/main/java/org/softwareheritage/graph/experiments/topology/InOutDegree.java
+++ b/java/src/main/java/org/softwareheritage/graph/experiments/topology/InOutDegree.java
@@ -233,7 +233,7 @@
final ProgressLogger pl = new ProgressLogger();
- Graph graph = Graph.loadMapped(basename);
+ Graph graph = Graph.loadMapped(basename, Graph.LoadDirection.BOTH);
run(graph, resultsDir);
}
}
diff --git a/java/src/main/java/org/softwareheritage/graph/experiments/topology/SubdatasetSizeFunction.java b/java/src/main/java/org/softwareheritage/graph/experiments/topology/SubdatasetSizeFunction.java
--- a/java/src/main/java/org/softwareheritage/graph/experiments/topology/SubdatasetSizeFunction.java
+++ b/java/src/main/java/org/softwareheritage/graph/experiments/topology/SubdatasetSizeFunction.java
@@ -84,7 +84,7 @@
final String basename = jsapResult.getString("basename");
- Graph graph = Graph.loadMapped(basename);
+ Graph graph = Graph.loadMapped(basename, Graph.LoadDirection.BOTH);
run(graph);
}
}
diff --git a/java/src/main/java/org/softwareheritage/graph/server/App.java b/java/src/main/java/org/softwareheritage/graph/server/App.java
--- a/java/src/main/java/org/softwareheritage/graph/server/App.java
+++ b/java/src/main/java/org/softwareheritage/graph/server/App.java
@@ -6,13 +6,16 @@
import io.javalin.Javalin;
import io.javalin.http.Context;
import io.javalin.plugin.json.JavalinJackson;
+import it.unimi.dsi.lang.EnumStringParser;
import org.softwareheritage.graph.Graph;
import org.softwareheritage.graph.Stats;
import org.softwareheritage.graph.SWHID;
import java.io.IOException;
+import java.util.Arrays;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
/**
* Web framework of the swh-graph server RPC API.
@@ -34,6 +37,13 @@
"Binding port of the server."),
new UnflaggedOption("graphPath", JSAP.STRING_PARSER, JSAP.NO_DEFAULT, JSAP.REQUIRED,
JSAP.NOT_GREEDY, "The basename of the compressed graph."),
+ new FlaggedOption("direction", EnumStringParser.getParser(Graph.LoadDirection.class, true),
+ Graph.LoadDirection.BOTH.name(), JSAP.NOT_REQUIRED, 'd', "direction",
+ "Direction of the graph loaded in memory - " +
+ Arrays.stream(Graph.LoadDirection.values())
+ .map(Graph.LoadDirection::name)
+ .map(String::toLowerCase)
+ .collect(Collectors.joining("|")) + "."),
new Switch("timings", 't', "timings", "Show timings in API result metadata."),});
JSAPResult config = jsap.parse(args);
@@ -44,8 +54,9 @@
String graphPath = config.getString("graphPath");
int port = config.getInt("port");
boolean showTimings = config.getBoolean("timings");
+ var direction = (Graph.LoadDirection) config.getObject("direction");
- startServer(graphPath, port, showTimings);
+ startServer(graphPath, port, showTimings, direction);
}
/**
@@ -54,9 +65,10 @@
* @param graphPath basename of the compressed graph
* @param port binding port of the server
* @param showTimings true if timings should be in results metadata, false otherwise
+ * @param loadDirection the direction of the graph to load int memory
*/
- private static void startServer(String graphPath, int port, boolean showTimings) throws IOException {
- Graph graph = Graph.loadMapped(graphPath);
+ private static void startServer(String graphPath, int port, boolean showTimings, Graph.LoadDirection loadDirection) throws IOException {
+ Graph graph = Graph.loadMapped(graphPath, loadDirection);
Stats stats = new Stats(graphPath);
// Clean up on exit
@@ -97,12 +109,14 @@
ctx.json(stats);
});
+ String loadDirectionStr = loadDirection == Graph.LoadDirection.BACKWARD ? "backward" : "forward";
+
// Graph traversal endpoints
// By default the traversal is a forward DFS using all edges
app.get("/leaves/:src", ctx -> {
SWHID src = new SWHID(ctx.pathParam("src"));
- String direction = ctx.queryParam("direction", "forward");
+ String direction = ctx.queryParam("direction", loadDirectionStr);
String edgesFmt = ctx.queryParam("edges", "*");
Endpoint endpoint = new Endpoint(graph, direction, edgesFmt);
@@ -112,7 +126,7 @@
app.get("/neighbors/:src", ctx -> {
SWHID src = new SWHID(ctx.pathParam("src"));
- String direction = ctx.queryParam("direction", "forward");
+ String direction = ctx.queryParam("direction", loadDirectionStr);
String edgesFmt = ctx.queryParam("edges", "*");
Endpoint endpoint = new Endpoint(graph, direction, edgesFmt);
@@ -122,7 +136,7 @@
app.get("/visit/nodes/:src", ctx -> {
SWHID src = new SWHID(ctx.pathParam("src"));
- String direction = ctx.queryParam("direction", "forward");
+ String direction = ctx.queryParam("direction", loadDirectionStr);
String edgesFmt = ctx.queryParam("edges", "*");
Endpoint endpoint = new Endpoint(graph, direction, edgesFmt);
@@ -132,7 +146,7 @@
app.get("/visit/paths/:src", ctx -> {
SWHID src = new SWHID(ctx.pathParam("src"));
- String direction = ctx.queryParam("direction", "forward");
+ String direction = ctx.queryParam("direction", loadDirectionStr);
String edgesFmt = ctx.queryParam("edges", "*");
Endpoint endpoint = new Endpoint(graph, direction, edgesFmt);
@@ -143,7 +157,7 @@
app.get("/walk/:src/:dst", ctx -> {
SWHID src = new SWHID(ctx.pathParam("src"));
String dstFmt = ctx.pathParam("dst");
- String direction = ctx.queryParam("direction", "forward");
+ String direction = ctx.queryParam("direction", loadDirectionStr);
String edgesFmt = ctx.queryParam("edges", "*");
String algorithm = ctx.queryParam("traversal", "dfs");
diff --git a/java/src/main/java/org/softwareheritage/graph/utils/ExportSubdataset.java b/java/src/main/java/org/softwareheritage/graph/utils/ExportSubdataset.java
--- a/java/src/main/java/org/softwareheritage/graph/utils/ExportSubdataset.java
+++ b/java/src/main/java/org/softwareheritage/graph/utils/ExportSubdataset.java
@@ -22,7 +22,7 @@
public static void main(String[] args) throws IOException, ClassNotFoundException {
System.err.print("Loading everything...");
String graphPath = args[0];
- Graph graph = Graph.loadMapped(graphPath);
+ Graph graph = Graph.loadMapped(graphPath, Graph.LoadDirection.BOTH);
Object2LongFunction<byte[]> mphMap = NodeIdMap.loadMph(graphPath + ".mph");
System.err.println(" done.");
diff --git a/java/src/main/java/org/softwareheritage/graph/utils/FindEarliestRevision.java b/java/src/main/java/org/softwareheritage/graph/utils/FindEarliestRevision.java
--- a/java/src/main/java/org/softwareheritage/graph/utils/FindEarliestRevision.java
+++ b/java/src/main/java/org/softwareheritage/graph/utils/FindEarliestRevision.java
@@ -36,7 +36,7 @@
System.err.println("loading transposed graph...");
ts = System.nanoTime();
- Graph graph = Graph.loadMapped(graphPath).transpose();
+ Graph graph = Graph.loadMapped(graphPath, Graph.LoadDirection.BOTH).transpose();
elapsed = Duration.ofNanos(System.nanoTime() - ts);
System.err.println(String.format("transposed graph loaded (duration: %s).", elapsed));
diff --git a/java/src/test/java/org/softwareheritage/graph/GraphTest.java b/java/src/test/java/org/softwareheritage/graph/GraphTest.java
--- a/java/src/test/java/org/softwareheritage/graph/GraphTest.java
+++ b/java/src/test/java/org/softwareheritage/graph/GraphTest.java
@@ -16,17 +16,29 @@
public class GraphTest {
static Graph graph;
+ static Graph forwardGraph;
+ static Graph backwardGraph;
@BeforeAll
public static void setUp() throws IOException {
Path graphPath = Paths.get("..", "swh", "graph", "tests", "dataset", "output", "example");
- graph = Graph.loadMapped(graphPath.toString());
+ graph = Graph.loadMapped(graphPath.toString(), Graph.LoadDirection.BOTH);
+ forwardGraph = Graph.loadMapped(graphPath.toString(), Graph.LoadDirection.FORWARD);
+ backwardGraph = Graph.loadMapped(graphPath.toString(), Graph.LoadDirection.BACKWARD);
}
public Graph getGraph() {
return graph;
}
+ public Graph getForwardGraph() {
+ return forwardGraph;
+ }
+
+ public Graph getBackwardGraph() {
+ return backwardGraph;
+ }
+
public static SWHID fakeSWHID(String type, int num) {
return new SWHID(String.format("swh:1:%s:%040d", type, num));
}
diff --git a/java/src/test/java/org/softwareheritage/graph/LoadDirectionTest.java b/java/src/test/java/org/softwareheritage/graph/LoadDirectionTest.java
new file mode 100644
--- /dev/null
+++ b/java/src/test/java/org/softwareheritage/graph/LoadDirectionTest.java
@@ -0,0 +1,45 @@
+package org.softwareheritage.graph;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.softwareheritage.graph.server.Endpoint;
+
+import java.util.ArrayList;
+
+// Avoid warnings concerning Endpoint.Output.result manual cast
+@SuppressWarnings("unchecked")
+public class LoadDirectionTest extends GraphTest {
+
+ @Test
+ public void leavesForwardSameAsBoth() {
+ Graph graph = getGraph();
+ Graph forwardGraph = getForwardGraph();
+ SWHID src = new SWHID("swh:1:dir:0000000000000000000000000000000000000008");
+ Endpoint endpoint = new Endpoint(graph, "forward", "dir:*");
+ Endpoint forwardEndpoint = new Endpoint(forwardGraph, "forward", "dir:*");
+
+ ArrayList<SWHID> expectedLeaves = (ArrayList) endpoint.leaves(new Endpoint.Input(src)).result;
+ ArrayList<SWHID> actualLeaves = (ArrayList) forwardEndpoint.leaves(new Endpoint.Input(src)).result;
+ GraphTest.assertEqualsAnyOrder(expectedLeaves, actualLeaves);
+ }
+
+ @Test
+ public void leavesBackwardSameAsBoth() {
+ Graph graph = getGraph();
+ Graph backwardGraph = getBackwardGraph();
+ SWHID src = new SWHID("swh:1:cnt:0000000000000000000000000000000000000005");
+ Endpoint endpoint = new Endpoint(graph, "backward", "cnt:dir,dir:dir");
+ Endpoint backwardEndpoint = new Endpoint(backwardGraph, "backward", "cnt:dir,dir:dir");
+
+ ArrayList<SWHID> expectedLeaves = (ArrayList) endpoint.leaves(new Endpoint.Input(src)).result;
+ ArrayList<SWHID> actualLeaves = (ArrayList) backwardEndpoint.leaves(new Endpoint.Input(src)).result;
+ GraphTest.assertEqualsAnyOrder(expectedLeaves, actualLeaves);
+ }
+
+ @Test
+ public void invalidQueryDirection() {
+ Graph backwardGraph = getBackwardGraph();
+ Assertions.assertThrows(IllegalArgumentException.class,
+ () -> new Endpoint(backwardGraph, "forward", "cnt:dir,dir:dir"));
+ }
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Jul 3, 3:19 PM (5 d, 16 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3225051
Attached To
D6594: Add parameter to load a single graph direction in memory.
Event Timeline
Log In to Comment