Skip to content

Commit

Permalink
DRYness and cleanup.
Browse files Browse the repository at this point in the history
  • Loading branch information
devinivy committed Nov 4, 2015
1 parent e36d323 commit 60ead46
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 107 deletions.
46 changes: 0 additions & 46 deletions lib/formatting.js

This file was deleted.

87 changes: 29 additions & 58 deletions lib/graph.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
var Hoek = require('hoek');
var Joi = require('joi');
var Formatting = require('./formatting');
var Utilities = require('./utilities');
var Schema = require('./schema');
var Traversal = require('./traversal');

var internals = {};

exports = module.exports = internals.Graph = function (definition) {

definition = definition || {};

var validated = Joi.validate(definition, Schema.definition);
Hoek.assert(!validated.error, validated.error);

Expand Down Expand Up @@ -353,24 +351,15 @@ internals.Graph.prototype.equals = function (graph, matchWeights) {
return false;
}

var normalizeEdges = function (edgeObj) {
var normalizeEdges = function (pairsObj) {

var normalized = {};

var u;
var us = Object.keys(edgeObj);
for (var i = 0; i < us.length; i++) {

u = us[i];
Utilities.traversePairsObj(pairsObj, function (u, v) {

var v;
var vs = Object.keys(edgeObj[u]);
for (var j = 0; j < vs.length; j++) {
v = vs[j];
normalized[u] = normalized[u] || {};
normalized[u][v] = matchWeights ? edgeObj[u][v].weight : true;
}
}
normalized[u] = normalized[u] || {};
normalized[u][v] = matchWeights ? pairsObj[u][v].weight : true;
});

return normalized;
};
Expand Down Expand Up @@ -435,10 +424,10 @@ internals.Graph.prototype.snapshot = function () {
var pairsObj = this._edges;

if (!this.directed) {
pairsObj = Formatting.halvePairsObj(pairsObj);
pairsObj = Utilities.halvePairsObj(pairsObj);
}

var pairs = Formatting.pairsObjToArray(pairsObj);
var pairs = Utilities.pairsObjToArray(pairsObj);

return this.subgraph({
vertices: Object.keys(this._vertices),
Expand Down Expand Up @@ -485,10 +474,10 @@ internals.Graph.prototype.complement = function () {
}

if (!this.directed) {
edges = Formatting.halvePairsObj(edges);
edges = Utilities.halvePairsObj(edges);
}

edges = Formatting.pairsObjToArray(edges);
edges = Utilities.pairsObjToArray(edges);

definition.vertices = vertices;
definition.edges = edges;
Expand Down Expand Up @@ -569,24 +558,15 @@ internals.Graph.prototype.union = function (graph) {
var edgeInfo = Hoek.merge(Hoek.clone(graph._edges), this._edges);

// For traversing
var edgeObj = this.directed ? edgeInfo : Formatting.halvePairsObj(edgeInfo);
var pairsObj = this.directed ? edgeInfo : Utilities.halvePairsObj(edgeInfo);

var u;
var us = Object.keys(edgeObj);
for (var j = 0; j < us.length; j++) {

u = us[j];

var w;
var ws = Object.keys(edgeObj[u]);
for (var k = 0; k < ws.length; k++) {
w = ws[k];
// Fix destruction of pairs from the edge merge
edgeInfo[u][w].pair = [u, w];
edgeInfo[u][w].labels = Object.keys(edgeInfo[u][w].labels);
edges.push(edgeInfo[u][w]);
}
}
Utilities.traversePairsObj(pairsObj, function (u, w) {

// Fix destruction of pairs from the edge merge
edgeInfo[u][w].pair = [u, w];
edgeInfo[u][w].labels = Object.keys(edgeInfo[u][w].labels);
edges.push(edgeInfo[u][w]);
});

definition.vertices = vertices;
definition.edges = edges;
Expand Down Expand Up @@ -623,27 +603,18 @@ internals.Graph.prototype.intersection = function (graph) {
var theirEdgeInfo = graph._edges;

// For traversing
var edgeObj = this.directed ? ourEdgeInfo : Formatting.halvePairsObj(ourEdgeInfo);

var u;
var us = Object.keys(edgeObj);
for (var j = 0; j < us.length; j++) {
var pairsObj = this.directed ? ourEdgeInfo : Utilities.halvePairsObj(ourEdgeInfo);

u = us[j];
Utilities.traversePairsObj(pairsObj, function (u, w) {

var w;
var ws = Object.keys(edgeObj[u]);
for (var k = 0; k < ws.length; k++) {
w = ws[k];
if (graph._lookupEdge(u, w)) {
edges.push({
pair: [u, w],
labels: Hoek.intersect(Object.keys(ourEdgeInfo[u][w].labels), Object.keys(theirEdgeInfo[u][w].labels)),
weight: ourEdgeInfo[u][w].weight
});
}
if (graph._lookupEdge(u, w)) {
edges.push({
pair: [u, w],
labels: Hoek.intersect(Object.keys(ourEdgeInfo[u][w].labels), Object.keys(theirEdgeInfo[u][w].labels)),
weight: ourEdgeInfo[u][w].weight
});
}
}
});

definition.vertices = vertices;
definition.edges = edges;
Expand Down Expand Up @@ -897,10 +868,10 @@ internals.Graph.prototype._getEdgePairsByLabel = function (label) {
var pairsObj = label ? (this._edgeLabels[label] || {}) : this._edges;

if (!this.directed) {
pairsObj = Formatting.halvePairsObj(pairsObj);
pairsObj = Utilities.halvePairsObj(pairsObj);
}

return Formatting.pairsObjToArray(pairsObj);
return Utilities.pairsObjToArray(pairsObj);
};

internals.Graph.prototype._publicizeVertex = function (vertex) {
Expand Down
2 changes: 1 addition & 1 deletion lib/schema.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,4 @@ exports.definition = Joi.object({
weight: Joi.number()
})
])
});
}).default();
4 changes: 2 additions & 2 deletions lib/traversal.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
var Hoek = require('hoek');
var Formatting = require('./formatting');
var Utilities = require('./utilities');

var internals = {};

Expand Down Expand Up @@ -60,7 +60,7 @@ internals.Traversal.prototype.subgraph = function () {

var subset = {
vertices: Object.keys(this._visited),
edges: Formatting.pairsObjToArray(this._edges)
edges: Utilities.pairsObjToArray(this._edges)
};

return this.graph.subgraph(subset);
Expand Down
45 changes: 45 additions & 0 deletions lib/utilities.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
exports.traversePairsObj = function (pairsObj, step) {

var u;
var us = Object.keys(pairsObj);
for (var i = 0; i < us.length; i++) {

u = us[i];

var v;
var vs = Object.keys(pairsObj[u]);
for (var j = 0; j < vs.length; j++) {
v = vs[j];
step(u, v);
}
}
};

// { a: { b: true, c: true } } -> [ [a, b], [a, c] ]
exports.pairsObjToArray = function (obj) {

var pairs = [];

exports.traversePairsObj(obj, function (u, v) {

pairs.push([u, v]);
});

return pairs;
};

// { a: { b: true }, b: { a: true } } -> { a: { b: true } }
exports.halvePairsObj = function (obj) {

var halved = {};

exports.traversePairsObj(obj, function (u, v) {

if (!halved[v] || !halved[v][u]) {
halved[u] = halved[u] || {};
halved[u][v] = obj[u][v];
}
});

return halved;
};

0 comments on commit 60ead46

Please sign in to comment.