all files / semantic-graphql/src/graph/ traversal.js

92.59% Statements 25/27
70% Branches 14/20
100% Functions 2/2
100% Lines 16/16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43                 42× 34×   34×   34×   34×           26× 25×   25×   25×   25×                
const warn = require('../utils/warn');
 
// Possible bug: stack overflow
 
// Both methods walk a graph: g
// from a given vertex (:=startVertex): iri
 
// Adds startVertex to the output
// exits startVertex using a given edge: walkIri, and recurse on the result
function walkmap(g, iri, walkIri, s = new Set()) {
  if (s.has(iri)) return s; // Prevents cycles
  Iif (!g[iri]) return warn(`Resource missing in graph: ${iri}`) || s;
 
  s.add(iri);
 
  if (g[iri][walkIri]) g[iri][walkIri].forEach(wIri => walkmap(g, wIri, walkIri, s));
 
  return s;
}
 
// Adds vertices connected to startVertex by a given edge: lookIri, to the output
// if the output is not empty returns the output
// else exit startVertex using a given edge: walkIri, and recurse on the result
function walklook(g, iri, walkIri, lookIri, s = new Set(), ws = new Set()) {
  if (ws.has(iri)) return s; // Prevents cycles
  Iif (!g[iri]) return warn(`Resource missing in graph: ${iri}`) || s;
 
  ws.add(iri);
 
  if (g[iri][lookIri]) g[iri][lookIri].forEach(lIri => s.add(lIri));
 
  if (s.size) return s;
 
  if (g[iri][walkIri]) g[iri][walkIri].forEach(wIri => walklook(g, wIri, walkIri, lookIri, s, ws));
 
  return s;
}
 
module.exports = {
  walkmap,
  walklook,
};