UNPKG

@tuddman/gremlin-orm

Version:
549 lines (462 loc) 21.8 kB
'use strict'; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var Model = require('./model'); /** * @param {string} label * @param {object} schema * @param {object} gorm */ var VertexModel = function (_Model) { _inherits(VertexModel, _Model); function VertexModel(label, schema, gorm) { _classCallCheck(this, VertexModel); var _this = _possibleConstructorReturn(this, (VertexModel.__proto__ || Object.getPrototypeOf(VertexModel)).call(this, gorm, '')); _this.label = label; _this.schema = schema; return _this; } /** * Creates a new vertex * Returns single vertex model object * @param {object} props */ _createClass(VertexModel, [{ key: 'create', value: function create(props, callback) { if (!callback) throw new Error('Callback is required'); var checkSchemaResponse = this.checkSchema(this.schema, props, true); if (this.checkSchemaFailed(checkSchemaResponse)) { callback(checkSchemaResponse); return; } var gremlinStr = 'g.addV(\'' + this.label + '\')'; if (this.g.dialect === this.g.DIALECTS.AZURE) { gremlinStr += '.property(\'' + this.g.partition + '\', \'' + props[Object.keys(props)[0]] + '\')'; } gremlinStr += this.actionBuilder('property', props) + ".toList()"; return this.executeQuery(gremlinStr, callback, true); } /** * Creates a new edge * @param {string} edge * @param {object} props * @param {object} vertex */ }, { key: 'createEdge', value: function createEdge(edgeModel, properties, vertex, bothWays, callback) { var _this2 = this; var both = void 0, cb = void 0; if (typeof arguments[3] === 'function' || arguments.length < 4) { both = false; cb = arguments[3]; } else { both = arguments[3]; cb = arguments[4]; } if (!cb) throw new Error('Callback is required'); var label = void 0, props = void 0, model = void 0; if (typeof edgeModel === 'string') { label = edgeModel; props = properties; model = new this.g.edgeModel(label, {}, this.g); } else { label = edgeModel.label; props = this.parseProps(properties, edgeModel); model = edgeModel; } var outGremlinStr = this.getGremlinStr(); var inGremlinStr = vertex.getGremlinStr(); if (outGremlinStr === '') { return cb({ 'error': 'Gremlin Query has not been initialised for out Vertex' }); } else if (inGremlinStr === '') { return cb({ 'error': 'Gremlin Query has not been initialised for in Vertex' }); } if (typeof edgeModel !== 'string') { var checkSchemaResponse = this.checkSchema(edgeModel.schema, props, true); if (this.checkSchemaFailed(checkSchemaResponse)) { cb(checkSchemaResponse); return; } } // Remove 'g' from 'g.V()...' // inGremlinStr = inGremlinStr.slice(2); var _getRandomVariable = this.getRandomVariable(), _getRandomVariable2 = _slicedToArray(_getRandomVariable, 1), a = _getRandomVariable2[0]; // var gremlinQuery = outGremlinStr + ('.as(\'' + a + '\')') + '.addE(\'' + label + '\')' + this.actionBuilder('property', props) + '.to(this.g.' +inGremlinStr + ').toList()'; let gremlinQuery = outGremlinStr + `.as('${a}')` + inGremlinStr; gremlinQuery += `.addE('${label}')${this.actionBuilder('property', props)}.from('${a}')`; if (both === true) { var _getRandomVariable3 = this.getRandomVariable(1, [a]), _getRandomVariable4 = _slicedToArray(_getRandomVariable3, 1), b = _getRandomVariable4[0]; // var extraGremlinQuery = vertex.getGremlinStr() + ('.as(\'' + a + '\')') + '.addE(\'' + label + '\')' + this.actionBuilder('property', props) + '.to('this.g.' + this.getGremlinStr() + ').toList()'; // vertex.getGremlinStr() + '.as(\'' + b + '\')' + this.getGremlinStr().slice(1) + ('.addE(\'' + label + '\')' + this.actionBuilder('property', props) + '.from(\'' + b + '\')'); let extraGremlinQuery = `${vertex.getGremlinStr()}.as('${b}')${this.getGremlinStr().slice(1)}` + `.addE('${label}')${this.actionBuilder('property', props)}.from('${b}')`; var intermediate = function intermediate(err, results) { if (err) return cb(err); var resultsSoFar = results.slice(0); var concater = function concater(err, results) { resultsSoFar = resultsSoFar.concat(results); cb(err, resultsSoFar); }; _this2.executeOrPass.call(model, extraGremlinQuery, concater); }; return this.executeOrPass.call(model, gremlinQuery, intermediate); } else { return this.executeOrPass.call(model, gremlinQuery, cb); } } /** * Finds first vertex with matching properties * @param {object} properties */ }, { key: 'find', value: function find(properties, callback) { var props = this.parseProps(properties); var gremlinStr = 'g.V(' + this.getIdFromProps(props) + ').hasLabel(\'' + this.label + '\')' + this.actionBuilder('has', props) ; return this.executeOrPass(gremlinStr, callback, true); } /** * Finds all vertexes with matching properties * @param {object} properties */ }, { key: 'findAll', value: function findAll(properties, callback) { var props = this.parseProps(properties); var gremlinStr = 'g.V(' + this.getIdFromProps(props) + ').hasLabel(\'' + this.label + '\')' + this.actionBuilder('has', props); return this.executeOrPass(gremlinStr, callback); } /** * find all vertexes connected to initial vertex(es) through a type of edge with optional properties * @param {string} label * @param {object} properties * @param {number} depth */ }, { key: 'findRelated', value: function findRelated(edgeModel, properties, depth, inV, callback) { var label = void 0, props = void 0, inModel = void 0, inLabel = void 0, cb = void 0; if (typeof edgeModel === 'string') { label = edgeModel; props = properties; } else { label = edgeModel.label; props = this.parseProps(properties, edgeModel); } if (arguments.length < 4 || typeof arguments[3] === 'function') { inModel = this; inLabel = this.label; cb = arguments[3]; } else { if (typeof arguments[3] === 'string') { inLabel = arguments[3]; inModel = new this.g.vertexModel(inLabel, {}, this.g); cb = arguments[4]; } else { inModel = arguments[3]; inLabel = inModel.label; cb = arguments[4]; } } var gremlinStr = this.getGremlinStr(); for (var i = 0; i < depth; i += 1) { gremlinStr += '.outE().hasLabel(\'' + label + '\')' + this.actionBuilder('has', props) + '.inV().hasLabel(\'' + inLabel + '\')'; } return this.executeOrPass.call(inModel, gremlinStr, cb); } /** * find all edges connected to initial vertex(es) with matching label and optional properties * @param {string} label * @param {object} props * @param {number} depth */ }, { key: 'findEdge', value: function findEdge(edgeModel, properties, callback) { var label = void 0, props = void 0, model = void 0; if (typeof edgeModel === 'string') { label = edgeModel; props = properties; model = new this.g.edgeModel(label, {}, this.g); } else { label = edgeModel.label; props = this.parseProps(properties, edgeModel); model = edgeModel; } var gremlinStr = this.getGremlinStr(); gremlinStr += '.bothE(\'' + label + '\')' + this.actionBuilder('has', props); return this.executeOrPass.call(model, gremlinStr, callback); } /** * find all vertexes which have the same edge relations in that the current vertex(es) has out to another vertex * @param {string} label * @param {object} properties */ }, { key: 'findImplicit', value: function findImplicit(edgeModel, properties, callback) { var label = void 0, props = void 0, model = void 0; if (typeof edgeModel === 'string') { label = edgeModel; props = properties; } else {'use strict'; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var Model = require('./model'); /** * @param {string} label * @param {object} schema * @param {object} gorm */ var VertexModel = function (_Model) { _inherits(VertexModel, _Model); function VertexModel(label, schema, gorm) { _classCallCheck(this, VertexModel); var _this = _possibleConstructorReturn(this, (VertexModel.__proto__ || Object.getPrototypeOf(VertexModel)).call(this, gorm, '')); _this.label = label; _this.schema = schema; return _this; } /** * Creates a new vertex * Returns single vertex model object * @param {object} props */ _createClass(VertexModel, [{ key: 'create', value: function create(props, callback) { if (!callback) throw new Error('Callback is required'); var checkSchemaResponse = this.checkSchema(this.schema, props, true); if (this.checkSchemaFailed(checkSchemaResponse)) { callback(checkSchemaResponse); return; } var gremlinStr = 'g.addV(\'' + this.label + '\')'; if (this.g.dialect === this.g.DIALECTS.AZURE) { gremlinStr += '.property(\'' + this.g.partition + '\', \'' + props[Object.keys(props)[0]] + '\')'; } gremlinStr += this.actionBuilder('property', props) + ".toList()"; return this.executeQuery(gremlinStr, callback, true); } /** * Creates a new edge * @param {string} edge * @param {object} props * @param {object} vertex */ }, { key: 'createEdge', value: function createEdge(edgeModel, properties, vertex, bothWays, callback) { var _this2 = this; var both = void 0, cb = void 0; if (typeof arguments[3] === 'function' || arguments.length < 4) { both = false; cb = arguments[3]; } else { both = arguments[3]; cb = arguments[4]; } if (!cb) throw new Error('Callback is required'); var label = void 0, props = void 0, model = void 0; if (typeof edgeModel === 'string') { label = edgeModel; props = properties; model = new this.g.edgeModel(label, {}, this.g); } else { label = edgeModel.label; props = this.parseProps(properties, edgeModel); model = edgeModel; } var outGremlinStr = this.getGremlinStr(); var inGremlinStr = vertex.getGremlinStr(); if (outGremlinStr === '') { return cb({ 'error': 'Gremlin Query has not been initialised for out Vertex' }); } else if (inGremlinStr === '') { return cb({ 'error': 'Gremlin Query has not been initialised for in Vertex' }); } if (typeof edgeModel !== 'string') { var checkSchemaResponse = this.checkSchema(edgeModel.schema, props, true); if (this.checkSchemaFailed(checkSchemaResponse)) { cb(checkSchemaResponse); return; } } // Remove 'g' from 'g.V()...' // inGremlinStr = inGremlinStr.slice(2); var _getRandomVariable = this.getRandomVariable(), _getRandomVariable2 = _slicedToArray(_getRandomVariable, 1), a = _getRandomVariable2[0]; var gremlinQuery = outGremlinStr + ('.as(\'' + a + '\')') + '.addE(\'' + label + '\')' + this.actionBuilder('property', props) + '.to(this.g.' +inGremlinStr + ').toList()'; if (both === true) { var _getRandomVariable3 = this.getRandomVariable(1, [a]), _getRandomVariable4 = _slicedToArray(_getRandomVariable3, 1), b = _getRandomVariable4[0]; var extraGremlinQuery = vertex.getGremlinStr() + ('.as(\'' + a + '\')') + '.addE(\'' + label + '\')' + this.actionBuilder('property', props) + '.to(this.g.' + this.getGremlinStr() + ').toList()'; var intermediate = function intermediate(err, results) { if (err) return cb(err); var resultsSoFar = results.slice(0); var concater = function concater(err, results) { resultsSoFar = resultsSoFar.concat(results); cb(err, resultsSoFar); }; _this2.executeOrPass.call(model, extraGremlinQuery, concater); }; return this.executeOrPass.call(model, gremlinQuery, intermediate); } else { return this.executeOrPass.call(model, gremlinQuery, cb); } } /** * Finds first vertex with matching properties * @param {object} properties */ }, { key: 'find', value: function find(properties, callback) { var props = this.parseProps(properties); var gremlinStr = 'g.V(' + this.getIdFromProps(props) + ').hasLabel(\'' + this.label + '\')' + this.actionBuilder('has', props) ; return this.executeOrPass(gremlinStr, callback, true); } /** * Finds all vertexes with matching properties * @param {object} properties */ }, { key: 'findAll', value: function findAll(properties, callback) { var props = this.parseProps(properties); var gremlinStr = 'g.V(' + this.getIdFromProps(props) + ').hasLabel(\'' + this.label + '\')' + this.actionBuilder('has', props); return this.executeOrPass(gremlinStr, callback); } /** * find all vertexes connected to initial vertex(es) through a type of edge with optional properties * @param {string} label * @param {object} properties * @param {number} depth */ }, { key: 'findRelated', value: function findRelated(edgeModel, properties, depth, inV, callback) { var label = void 0, props = void 0, inModel = void 0, inLabel = void 0, cb = void 0; if (typeof edgeModel === 'string') { label = edgeModel; props = properties; } else { label = edgeModel.label; props = this.parseProps(properties, edgeModel); } if (arguments.length < 4 || typeof arguments[3] === 'function') { inModel = this; inLabel = this.label; cb = arguments[3]; } else { if (typeof arguments[3] === 'string') { inLabel = arguments[3]; inModel = new this.g.vertexModel(inLabel, {}, this.g); cb = arguments[4]; } else { inModel = arguments[3]; inLabel = inModel.label; cb = arguments[4]; } } var gremlinStr = this.getGremlinStr(); for (var i = 0; i < depth; i += 1) { gremlinStr += '.outE().hasLabel(\'' + label + '\')' + this.actionBuilder('has', props) + '.inV().hasLabel(\'' + inLabel + '\')'; } return this.executeOrPass.call(inModel, gremlinStr, cb); } /** * find all edges connected to initial vertex(es) with matching label and optional properties * @param {string} label * @param {object} props * @param {number} depth */ }, { key: 'findEdge', value: function findEdge(edgeModel, properties, callback) { var label = void 0, props = void 0, model = void 0; if (typeof edgeModel === 'string') { label = edgeModel; props = properties; model = new this.g.edgeModel(label, {}, this.g); } else { label = edgeModel.label; props = this.parseProps(properties, edgeModel); model = edgeModel; } var gremlinStr = this.getGremlinStr(); gremlinStr += '.bothE(\'' + label + '\')' + this.actionBuilder('has', props); return this.executeOrPass.call(model, gremlinStr, callback); } /** * find all vertexes which have the same edge relations in that the current vertex(es) has out to another vertex * @param {string} label * @param {object} properties */ }, { key: 'findImplicit', value: function findImplicit(edgeModel, properties, callback) { var label = void 0, props = void 0, model = void 0; if (typeof edgeModel === 'string') { label = edgeModel; props = properties; } else { label = edgeModel.label; props = this.parseProps(properties, edgeModel); } var gremlinStr = this.getGremlinStr(); var originalAs = this.getRandomVariable()[0]; gremlinStr += '.as(\'' + originalAs + '\').outE(\'' + label + '\')' + this.actionBuilder('has', props) + ('inV().inE(\'' + label + '\')' + this.actionBuilder('has', props) + '.outV()') + ('.where(neq(\'' + originalAs + '\'))') ; return this.executeOrPass(gremlinStr, callback); } }]); return VertexModel; }(Model); module.exports = VertexModel; label = edgeModel.label; props = this.parseProps(properties, edgeModel); } var gremlinStr = this.getGremlinStr(); var originalAs = this.getRandomVariable()[0]; gremlinStr += '.as(\'' + originalAs + '\').outE(\'' + label + '\')' + this.actionBuilder('has', props) + ('inV().inE(\'' + label + '\')' + this.actionBuilder('has', props) + '.outV()') + ('.where(neq(\'' + originalAs + '\'))') ; return this.executeOrPass(gremlinStr, callback); } }]); return VertexModel; }(Model); module.exports = VertexModel;