Changeset View
Changeset View
Standalone View
Standalone View
java/src/main/java/org/softwareheritage/graph/server/Endpoint.java
Show All 30 Lines | public class Endpoint { | ||||
* href="https://docs.softwareheritage.org/devel/swh-graph/api.html#terminology">allowed edges</a> | * href="https://docs.softwareheritage.org/devel/swh-graph/api.html#terminology">allowed edges</a> | ||||
*/ | */ | ||||
public Endpoint(Graph graph, String direction, String edgesFmt) { | public Endpoint(Graph graph, String direction, String edgesFmt) { | ||||
this.graph = graph; | this.graph = graph; | ||||
this.traversal = new Traversal(graph, direction, edgesFmt); | this.traversal = new Traversal(graph, direction, edgesFmt); | ||||
} | } | ||||
/** | /** | ||||
* Converts a list of (internal) long node ids to a list of corresponding (external) SWH PIDs. | * Converts a list of (internal) long node ids to a list of corresponding (external) SWHIDs. | ||||
* | * | ||||
* @param nodeIds the list of long node ids | * @param nodeIds the list of long node ids | ||||
* @return a list of corresponding SWH PIDs | * @return a list of corresponding SWHIDs | ||||
*/ | */ | ||||
private ArrayList<SwhPID> convertNodesToSwhPIDs(ArrayList<Long> nodeIds) { | private ArrayList<SWHID> convertNodesToSWHIDs(ArrayList<Long> nodeIds) { | ||||
haltode: Maybe rename it to `swhids`? | |||||
Done Inline ActionsYes, having the first letter of variables lowercase is important. seirl: Yes, having the first letter of variables lowercase is important. | |||||
ArrayList<SwhPID> swhPIDs = new ArrayList<>(); | ArrayList<SWHID> swhids = new ArrayList<>(); | ||||
for (long nodeId : nodeIds) { | for (long nodeId : nodeIds) { | ||||
swhPIDs.add(graph.getSwhPID(nodeId)); | swhids.add(graph.getSWHID(nodeId)); | ||||
} | } | ||||
return swhPIDs; | return swhids; | ||||
} | } | ||||
/** | /** | ||||
* Converts a list of (internal) long node ids to the corresponding {@link SwhPath}. | * Converts a list of (internal) long node ids to the corresponding {@link SwhPath}. | ||||
* | * | ||||
* @param nodeIds the list of long node ids | * @param nodeIds the list of long node ids | ||||
* @return the corresponding {@link SwhPath} | * @return the corresponding {@link SwhPath} | ||||
* @see org.softwareheritage.graph.SwhPath | * @see org.softwareheritage.graph.SwhPath | ||||
*/ | */ | ||||
private SwhPath convertNodesToSwhPath(ArrayList<Long> nodeIds) { | private SwhPath convertNodesToSwhPath(ArrayList<Long> nodeIds) { | ||||
SwhPath path = new SwhPath(); | SwhPath path = new SwhPath(); | ||||
for (long nodeId : nodeIds) { | for (long nodeId : nodeIds) { | ||||
path.add(graph.getSwhPID(nodeId)); | path.add(graph.getSWHID(nodeId)); | ||||
} | } | ||||
return path; | return path; | ||||
} | } | ||||
/** | /** | ||||
* Converts a list of paths made of (internal) long node ids to one made of {@link SwhPath}-s. | * Converts a list of paths made of (internal) long node ids to one made of {@link SwhPath}-s. | ||||
* | * | ||||
* @param pathsNodeId the list of paths with long node ids | * @param pathsNodeId the list of paths with long node ids | ||||
* @return a list of corresponding {@link SwhPath} | * @return a list of corresponding {@link SwhPath} | ||||
* @see org.softwareheritage.graph.SwhPath | * @see org.softwareheritage.graph.SwhPath | ||||
*/ | */ | ||||
private ArrayList<SwhPath> convertPathsToSwhPIDs(ArrayList<ArrayList<Long>> pathsNodeId) { | private ArrayList<SwhPath> convertPathsToSWHIDs(ArrayList<ArrayList<Long>> pathsNodeId) { | ||||
ArrayList<SwhPath> paths = new ArrayList<>(); | ArrayList<SwhPath> paths = new ArrayList<>(); | ||||
for (ArrayList<Long> path : pathsNodeId) { | for (ArrayList<Long> path : pathsNodeId) { | ||||
paths.add(convertNodesToSwhPath(path)); | paths.add(convertNodesToSwhPath(path)); | ||||
} | } | ||||
return paths; | return paths; | ||||
} | } | ||||
/** | /** | ||||
* Leaves endpoint wrapper. | * Leaves endpoint wrapper. | ||||
* | * | ||||
* @param input input parameters for the underlying endpoint call | * @param input input parameters for the underlying endpoint call | ||||
* @return the resulting list of {@link SwhPID} from endpoint call and operation metadata | * @return the resulting list of {@link SWHID} from endpoint call and operation metadata | ||||
* @see org.softwareheritage.graph.SwhPID | * @see SWHID | ||||
* @see Traversal#leaves(long) | * @see Traversal#leaves(long) | ||||
*/ | */ | ||||
public Output leaves(Input input) { | public Output leaves(Input input) { | ||||
Output<ArrayList<SwhPID>> output = new Output<>(); | Output<ArrayList<SWHID>> output = new Output<>(); | ||||
long startTime; | long startTime; | ||||
startTime = Timing.start(); | startTime = Timing.start(); | ||||
long srcNodeId = graph.getNodeId(input.src); | long srcNodeId = graph.getNodeId(input.src); | ||||
output.meta.timings.pid2node = Timing.stop(startTime); | output.meta.timings.swhid2node = Timing.stop(startTime); | ||||
startTime = Timing.start(); | startTime = Timing.start(); | ||||
ArrayList<Long> nodeIds = traversal.leaves(srcNodeId); | ArrayList<Long> nodeIds = traversal.leaves(srcNodeId); | ||||
output.meta.timings.traversal = Timing.stop(startTime); | output.meta.timings.traversal = Timing.stop(startTime); | ||||
output.meta.nbEdgesAccessed = traversal.getNbEdgesAccessed(); | output.meta.nbEdgesAccessed = traversal.getNbEdgesAccessed(); | ||||
startTime = Timing.start(); | startTime = Timing.start(); | ||||
output.result = convertNodesToSwhPIDs(nodeIds); | output.result = convertNodesToSWHIDs(nodeIds); | ||||
output.meta.timings.node2pid = Timing.stop(startTime); | output.meta.timings.node2swhid = Timing.stop(startTime); | ||||
return output; | return output; | ||||
} | } | ||||
/** | /** | ||||
* Neighbors endpoint wrapper. | * Neighbors endpoint wrapper. | ||||
* | * | ||||
* @param input input parameters for the underlying endpoint call | * @param input input parameters for the underlying endpoint call | ||||
* @return the resulting list of {@link SwhPID} from endpoint call and operation metadata | * @return the resulting list of {@link SWHID} from endpoint call and operation metadata | ||||
* @see org.softwareheritage.graph.SwhPID | * @see SWHID | ||||
* @see Traversal#neighbors(long) | * @see Traversal#neighbors(long) | ||||
*/ | */ | ||||
public Output neighbors(Input input) { | public Output neighbors(Input input) { | ||||
Output<ArrayList<SwhPID>> output = new Output<>(); | Output<ArrayList<SWHID>> output = new Output<>(); | ||||
long startTime; | long startTime; | ||||
startTime = Timing.start(); | startTime = Timing.start(); | ||||
long srcNodeId = graph.getNodeId(input.src); | long srcNodeId = graph.getNodeId(input.src); | ||||
output.meta.timings.pid2node = Timing.stop(startTime); | output.meta.timings.swhid2node = Timing.stop(startTime); | ||||
startTime = Timing.start(); | startTime = Timing.start(); | ||||
ArrayList<Long> nodeIds = traversal.neighbors(srcNodeId); | ArrayList<Long> nodeIds = traversal.neighbors(srcNodeId); | ||||
output.meta.timings.traversal = Timing.stop(startTime); | output.meta.timings.traversal = Timing.stop(startTime); | ||||
output.meta.nbEdgesAccessed = traversal.getNbEdgesAccessed(); | output.meta.nbEdgesAccessed = traversal.getNbEdgesAccessed(); | ||||
startTime = Timing.start(); | startTime = Timing.start(); | ||||
output.result = convertNodesToSwhPIDs(nodeIds); | output.result = convertNodesToSWHIDs(nodeIds); | ||||
output.meta.timings.node2pid = Timing.stop(startTime); | output.meta.timings.node2swhid = Timing.stop(startTime); | ||||
return output; | return output; | ||||
} | } | ||||
/** | /** | ||||
* Walk endpoint wrapper. | * Walk endpoint wrapper. | ||||
* | * | ||||
* @param input input parameters for the underlying endpoint call | * @param input input parameters for the underlying endpoint call | ||||
* @return the resulting {@link SwhPath} from endpoint call and operation metadata | * @return the resulting {@link SwhPath} from endpoint call and operation metadata | ||||
* @see org.softwareheritage.graph.SwhPID | * @see SWHID | ||||
* @see org.softwareheritage.graph.SwhPath | * @see org.softwareheritage.graph.SwhPath | ||||
* @see Traversal#walk | * @see Traversal#walk | ||||
*/ | */ | ||||
public Output walk(Input input) { | public Output walk(Input input) { | ||||
Output<SwhPath> output = new Output<>(); | Output<SwhPath> output = new Output<>(); | ||||
long startTime; | long startTime; | ||||
startTime = Timing.start(); | startTime = Timing.start(); | ||||
long srcNodeId = graph.getNodeId(input.src); | long srcNodeId = graph.getNodeId(input.src); | ||||
output.meta.timings.pid2node = Timing.stop(startTime); | output.meta.timings.swhid2node = Timing.stop(startTime); | ||||
ArrayList<Long> nodeIds = new ArrayList<Long>(); | ArrayList<Long> nodeIds = new ArrayList<Long>(); | ||||
// Destination is either a SWH PID or a node type | // Destination is either a SWHID or a node type | ||||
try { | try { | ||||
SwhPID dstSwhPID = new SwhPID(input.dstFmt); | SWHID dstSWHID = new SWHID(input.dstFmt); | ||||
long dstNodeId = graph.getNodeId(dstSwhPID); | long dstNodeId = graph.getNodeId(dstSWHID); | ||||
startTime = Timing.start(); | startTime = Timing.start(); | ||||
nodeIds = traversal.walk(srcNodeId, dstNodeId, input.algorithm); | nodeIds = traversal.walk(srcNodeId, dstNodeId, input.algorithm); | ||||
output.meta.timings.traversal = Timing.stop(startTime); | output.meta.timings.traversal = Timing.stop(startTime); | ||||
} catch (IllegalArgumentException ignored1) { | } catch (IllegalArgumentException ignored1) { | ||||
try { | try { | ||||
Node.Type dstType = Node.Type.fromStr(input.dstFmt); | Node.Type dstType = Node.Type.fromStr(input.dstFmt); | ||||
startTime = Timing.start(); | startTime = Timing.start(); | ||||
nodeIds = traversal.walk(srcNodeId, dstType, input.algorithm); | nodeIds = traversal.walk(srcNodeId, dstType, input.algorithm); | ||||
output.meta.timings.traversal = Timing.stop(startTime); | output.meta.timings.traversal = Timing.stop(startTime); | ||||
} catch (IllegalArgumentException ignored2) { | } catch (IllegalArgumentException ignored2) { | ||||
} | } | ||||
} | } | ||||
output.meta.nbEdgesAccessed = traversal.getNbEdgesAccessed(); | output.meta.nbEdgesAccessed = traversal.getNbEdgesAccessed(); | ||||
startTime = Timing.start(); | startTime = Timing.start(); | ||||
output.result = convertNodesToSwhPath(nodeIds); | output.result = convertNodesToSwhPath(nodeIds); | ||||
output.meta.timings.node2pid = Timing.stop(startTime); | output.meta.timings.node2swhid = Timing.stop(startTime); | ||||
return output; | return output; | ||||
} | } | ||||
/** | /** | ||||
* VisitNodes endpoint wrapper. | * VisitNodes endpoint wrapper. | ||||
* | * | ||||
* @param input input parameters for the underlying endpoint call | * @param input input parameters for the underlying endpoint call | ||||
* @return the resulting list of {@link SwhPID} from endpoint call and operation metadata | * @return the resulting list of {@link SWHID} from endpoint call and operation metadata | ||||
* @see org.softwareheritage.graph.SwhPID | * @see SWHID | ||||
* @see Traversal#visitNodes(long) | * @see Traversal#visitNodes(long) | ||||
*/ | */ | ||||
public Output visitNodes(Input input) { | public Output visitNodes(Input input) { | ||||
Output<ArrayList<SwhPID>> output = new Output<>(); | Output<ArrayList<SWHID>> output = new Output<>(); | ||||
long startTime; | long startTime; | ||||
startTime = Timing.start(); | startTime = Timing.start(); | ||||
long srcNodeId = graph.getNodeId(input.src); | long srcNodeId = graph.getNodeId(input.src); | ||||
output.meta.timings.pid2node = Timing.stop(startTime); | output.meta.timings.swhid2node = Timing.stop(startTime); | ||||
startTime = Timing.start(); | startTime = Timing.start(); | ||||
ArrayList<Long> nodeIds = traversal.visitNodes(srcNodeId); | ArrayList<Long> nodeIds = traversal.visitNodes(srcNodeId); | ||||
output.meta.timings.traversal = Timing.stop(startTime); | output.meta.timings.traversal = Timing.stop(startTime); | ||||
output.meta.nbEdgesAccessed = traversal.getNbEdgesAccessed(); | output.meta.nbEdgesAccessed = traversal.getNbEdgesAccessed(); | ||||
startTime = Timing.start(); | startTime = Timing.start(); | ||||
output.result = convertNodesToSwhPIDs(nodeIds); | output.result = convertNodesToSWHIDs(nodeIds); | ||||
output.meta.timings.node2pid = Timing.stop(startTime); | output.meta.timings.node2swhid = Timing.stop(startTime); | ||||
return output; | return output; | ||||
} | } | ||||
/** | /** | ||||
* VisitPaths endpoint wrapper. | * VisitPaths endpoint wrapper. | ||||
* | * | ||||
* @param input input parameters for the underlying endpoint call | * @param input input parameters for the underlying endpoint call | ||||
* @return the resulting list of {@link SwhPath} from endpoint call and operation metadata | * @return the resulting list of {@link SwhPath} from endpoint call and operation metadata | ||||
* @see org.softwareheritage.graph.SwhPID | * @see SWHID | ||||
* @see org.softwareheritage.graph.SwhPath | * @see org.softwareheritage.graph.SwhPath | ||||
* @see Traversal#visitPaths(long) | * @see Traversal#visitPaths(long) | ||||
*/ | */ | ||||
public Output visitPaths(Input input) { | public Output visitPaths(Input input) { | ||||
Output<ArrayList<SwhPath>> output = new Output<>(); | Output<ArrayList<SwhPath>> output = new Output<>(); | ||||
long startTime; | long startTime; | ||||
startTime = Timing.start(); | startTime = Timing.start(); | ||||
long srcNodeId = graph.getNodeId(input.src); | long srcNodeId = graph.getNodeId(input.src); | ||||
output.meta.timings.pid2node = Timing.stop(startTime); | output.meta.timings.swhid2node = Timing.stop(startTime); | ||||
startTime = Timing.start(); | startTime = Timing.start(); | ||||
ArrayList<ArrayList<Long>> paths = traversal.visitPaths(srcNodeId); | ArrayList<ArrayList<Long>> paths = traversal.visitPaths(srcNodeId); | ||||
output.meta.timings.traversal = Timing.stop(startTime); | output.meta.timings.traversal = Timing.stop(startTime); | ||||
output.meta.nbEdgesAccessed = traversal.getNbEdgesAccessed(); | output.meta.nbEdgesAccessed = traversal.getNbEdgesAccessed(); | ||||
startTime = Timing.start(); | startTime = Timing.start(); | ||||
output.result = convertPathsToSwhPIDs(paths); | output.result = convertPathsToSWHIDs(paths); | ||||
output.meta.timings.node2pid = Timing.stop(startTime); | output.meta.timings.node2swhid = Timing.stop(startTime); | ||||
return output; | return output; | ||||
} | } | ||||
/** | /** | ||||
* Wrapper class to unify traversal methods input signatures. | * Wrapper class to unify traversal methods input signatures. | ||||
*/ | */ | ||||
public static class Input { | public static class Input { | ||||
/** Source node of endpoint call specified as a {@link SwhPID} */ | /** Source node of endpoint call specified as a {@link SWHID} */ | ||||
public SwhPID src; | public SWHID src; | ||||
/** | /** | ||||
* Destination formatted string as described in the <a | * Destination formatted string as described in the <a | ||||
* href="https://docs.softwareheritage.org/devel/swh-graph/api.html#walk">API</a> | * href="https://docs.softwareheritage.org/devel/swh-graph/api.html#walk">API</a> | ||||
*/ | */ | ||||
public String dstFmt; | public String dstFmt; | ||||
/** Traversal algorithm used in endpoint call (either "dfs" or "bfs") */ | /** Traversal algorithm used in endpoint call (either "dfs" or "bfs") */ | ||||
public String algorithm; | public String algorithm; | ||||
public Input(SwhPID src) { | public Input(SWHID src) { | ||||
this.src = src; | this.src = src; | ||||
} | } | ||||
public Input(SwhPID src, String dstFmt, String algorithm) { | public Input(SWHID src, String dstFmt, String algorithm) { | ||||
this.src = src; | this.src = src; | ||||
this.dstFmt = dstFmt; | this.dstFmt = dstFmt; | ||||
this.algorithm = algorithm; | this.algorithm = algorithm; | ||||
} | } | ||||
} | } | ||||
/** | /** | ||||
* Wrapper class to return both the endpoint result and metadata (such as timings). | * Wrapper class to return both the endpoint result and metadata (such as timings). | ||||
Show All 24 Lines | public static class Output<T> { | ||||
} | } | ||||
/** | /** | ||||
* Wrapper class for JSON output format. | * Wrapper class for JSON output format. | ||||
*/ | */ | ||||
public class Timings { | public class Timings { | ||||
/** Time in seconds to do the traversal */ | /** Time in seconds to do the traversal */ | ||||
public double traversal; | public double traversal; | ||||
/** Time in seconds to convert input SWH PID to node id */ | /** Time in seconds to convert input SWHID to node id */ | ||||
public double pid2node; | public double swhid2node; | ||||
/** Time in seconds to convert output node ids to SWH PIDs */ | /** Time in seconds to convert output node ids to SWHIDs */ | ||||
public double node2pid; | public double node2swhid; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } |
Maybe rename it to swhids?