wgraph
Version:
An optionnal thin abstraction layer of LevelGraph
176 lines (146 loc) • 5.17 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _util = require('util');
var _util2 = _interopRequireDefault(_util);
var _levelup = require('levelup');
var _levelup2 = _interopRequireDefault(_levelup);
var _levelgraph = require('levelgraph');
var _levelgraph2 = _interopRequireDefault(_levelgraph);
var _rsvp = require('rsvp');
var _rsvp2 = _interopRequireDefault(_rsvp);
var _node = require('./node');
var _node2 = _interopRequireDefault(_node);
var _leveldbprops = require('./leveldbprops');
var _leveldbprops2 = _interopRequireDefault(_leveldbprops);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
class WGraph {
constructor(dbFolder) {
this.dbFolder = dbFolder;
this.db = (0, _levelup2.default)(this.dbFolder);
this.graph = (0, _levelgraph2.default)(this.db);
this.properties = new _leveldbprops2.default(this.db);
this.graph.db = this.db;
this.graph.properties = this.properties;
}
triplet(subject, predicate, object) {
return {
subject: subject || this.graph.v('subject'),
predicate: predicate || this.graph.v('predicate'),
object: object || this.graph.v('object')
};
}
triplets() {
return this.graph.searchStream(this.triplet());
}
node(index, properties) {
let node = new _node2.default(this, index);
if (properties) node.props.set(properties);
return node;
}
nodes() {
let nodes = {};
for (let i in arguments) nodes[arguments[i]] = this.node(arguments[i]);
return nodes;
}
_fetch(fn) {
return this.triplets().on('data', fn);
}
count() {
return new _rsvp2.default.Promise((resolve, reject) => {
let nbTriplets = 0;
this._fetch(() => nbTriplets++).on('end', () => {
resolve(nbTriplets);
}).on('error', reject);
});
}
del() {
return new _rsvp2.default.Promise((resolve, reject) => {
this._nodes(true, true).then(nodes => {
return _rsvp2.default.all(nodes.map(n => {
return n.del();
})).then(() => resolve(this));
}).catch(reject);
});
}
search() {
var args = arguments;
if (args.length === 1 && Array.isArray(args[0])) return this.search.apply(this, args[0]);
return new _rsvp2.default.Promise((resolve, reject) => {
let indexes = [];
for (let i in args) indexes.push(args[i]);
let search = this.triplet();
search.filter = triplet => {
return indexes.indexOf(triplet.subject) > -1;
};
this.graph.search(search, (err, triplets) => {
if (err) return reject(err);
let result = {};
if (!triplets.length) return resolve(result);
let nodes = triplets.map(triplet => triplet.subject).filter((index, i, arr) => arr.indexOf(index) === i).map(index => new _node2.default(this, index).load());
_rsvp2.default.all(nodes).then(nodes => {
if (args.length === 1) return resolve(nodes.shift());
nodes.forEach(node => result[node.index] = node);
resolve(result);
}).catch(reject);
});
});
}
static _nodesMapToArray(nodesMap) {
let nodes = [];
for (let i in nodesMap) nodes.push(nodesMap[i]);
return nodes;
}
//TODO test
subGraph() {
let name = arguments[0];
delete arguments[0];
if (!name) throw new Error('Sub graph name required');
let args = [];
for (let i in arguments) args.push(arguments[i]);
return new _rsvp2.default.Promise((resolve, reject) => {
this.search.apply(this, args).then(nodes => {
nodes = nodes.constructor.name === 'Node' ? [nodes] : WGraph._nodesMapToArray(nodes);
return _rsvp2.default.all(nodes.map(n => {
return n.load(true, true);
}));
}).then(nodes => {
let subGraph = new WGraph(name);
let save = [];
for (let i in nodes) {
let sNode = subGraph.node(nodes[i].index);
for (let j in nodes[i].edges) sNode.rel(nodes[i].edges[j].predicate, nodes[i].edges[j].object, nodes[i].edges[j].propsMap);
save.push(sNode.save());
}
return _rsvp2.default.all(save).then(() => resolve(subGraph));
}).catch(reject);
});
}
_nodes(syncProps, syncEdgesProps) {
return new _rsvp2.default.Promise((resolve, reject) => {
let indexes = [];
this._fetch(triplet => {
indexes.push(triplet.subject);
indexes.push(triplet.object);
}).on('end', () => {
_rsvp2.default.all(indexes.filter((index, i, arr) => {
return arr.indexOf(index) === i;
}).map(index => {
return new _node2.default(this, index).load(syncProps, syncEdgesProps);
})).then(nodes => resolve(nodes)).catch(reject);
}).on('error', reject);
});
}
export() {
return new _rsvp2.default.Promise((resolve, reject) => {
let edges = [];
this._nodes(true, true).then(nodes => {
nodes = nodes.map(node => node.export(edges));
resolve({ nodes: nodes, edges: edges });
}).catch(reject);
});
}
}
exports.default = WGraph;
//# sourceMappingURL=wgraph.js.map