From e0f56a8b590f7d73f971117de259bffb15952f4e Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Fri, 26 Feb 2016 11:36:40 -0800 Subject: [PATCH 01/27] 3.0.0-alpha.1 --- CHANGELOG.md | 11 + dist/js-data-rethinkdb.js | 1081 ++++++++++++++++++++++++--------- dist/js-data-rethinkdb.js.map | 2 +- mocha.start.js | 14 +- package.json | 10 +- src/index.js | 999 ++++++++++++++++++++++-------- 6 files changed, 1541 insertions(+), 576 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 071b0f5..ec18cda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +##### 3.0.0-alpha.1 - 26 February 2016 + +###### Breaking API changes +- Now depends on js-data 3.x +- Now longer uses internal `defaults` property, settings are on the adapter instance itself + +###### Backwards compatible API changes +- Added createMany and updateMany methods +- Added lifecycle hooks for all methods +- Added contains, notContains, |contains, and |notContains operators + ##### 2.2.0 - 25 February 2016 ###### Other diff --git a/dist/js-data-rethinkdb.js b/dist/js-data-rethinkdb.js index 21f49ed..19c95a0 100644 --- a/dist/js-data-rethinkdb.js +++ b/dist/js-data-rethinkdb.js @@ -1,5 +1,7 @@ 'use strict'; +var jsData = require('js-data'); + var babelHelpers = {}; babelHelpers.typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; @@ -7,12 +9,6 @@ babelHelpers.typeof = typeof Symbol === "function" && typeof Symbol.iterator === return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; -babelHelpers.classCallCheck = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}; - babelHelpers.defineProperty = function (obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { @@ -31,43 +27,22 @@ babelHelpers.defineProperty = function (obj, key, value) { babelHelpers; var rethinkdbdash = require('rethinkdbdash'); -var JSData = require('js-data'); -var DSUtils = JSData.DSUtils; -var upperCase = DSUtils.upperCase; -var contains = DSUtils.contains; -var forOwn = DSUtils.forOwn; -var isEmpty = DSUtils.isEmpty; -var keys = DSUtils.keys; -var deepMixIn = DSUtils.deepMixIn; -var forEach = DSUtils.forEach; -var isObject = DSUtils.isObject; -var isString = DSUtils.isString; -var removeCircular = DSUtils.removeCircular; -var omit = DSUtils.omit; +var addHiddenPropsToTarget = jsData.utils.addHiddenPropsToTarget; +var fillIn = jsData.utils.fillIn; +var forEachRelation = jsData.utils.forEachRelation; +var forOwn = jsData.utils.forOwn; +var get = jsData.utils.get; +var isArray = jsData.utils.isArray; +var isObject = jsData.utils.isObject; +var isString = jsData.utils.isString; +var isUndefined = jsData.utils.isUndefined; +var resolve = jsData.utils.resolve; var underscore = require('mout/string/underscore'); var reserved = ['orderBy', 'sort', 'limit', 'offset', 'skip', 'where']; -var addHiddenPropsToTarget = function addHiddenPropsToTarget(target, props) { - DSUtils.forOwn(props, function (value, key) { - props[key] = { - writable: true, - value: value - }; - }); - Object.defineProperties(target, props); -}; - -var fillIn = function fillIn(dest, src) { - DSUtils.forOwn(src, function (value, key) { - if (!dest.hasOwnProperty(key) || dest[key] === undefined) { - dest[key] = value; - } - }); -}; - var unique = function unique(array) { var seen = {}; var final = []; @@ -81,19 +56,120 @@ var unique = function unique(array) { return final; }; -var Defaults = function Defaults() { - babelHelpers.classCallCheck(this, Defaults); +var noop = function noop() { + var self = this; + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var opts = args[args.length - 1]; + self.dbg.apply(self, [opts.op].concat(args)); + return resolve(); }; -addHiddenPropsToTarget(Defaults.prototype, { - host: 'localhost', - port: 28015, +var noop2 = function noop2() { + var self = this; + + for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + var opts = args[args.length - 2]; + self.dbg.apply(self, [opts.op].concat(args)); + return resolve(); +}; + +var DEFAULTS = { + /** + * TODO + * + * @name RethinkDBAdapter#authKey + * @type {string} + */ authKey: '', + + /** + * TODO + * + * @name RethinkDBAdapter#bufferSize + * @type {number} + * @default 10 + */ + bufferSize: 10, + + /** + * TODO + * + * @name RethinkDBAdapter#db + * @type {string} + * @default "test" + */ db: 'test', + + /** + * TODO + * + * @name RethinkDBAdapter#debug + * @type {boolean} + * @default false + */ + debug: false, + + /** + * TODO + * + * @name RethinkDBAdapter#host + * @type {string} + * @default "localhost" + */ + host: 'localhost', + + /** + * TODO + * + * @name RethinkDBAdapter#min + * @type {number} + * @default 10 + */ min: 10, + + /** + * TODO + * + * @name RethinkDBAdapter#max + * @type {number} + * @default 50 + */ max: 50, - bufferSize: 10 -}); + + /** + * TODO + * + * @name RethinkDBAdapter#port + * @type {number} + * @default 10 + */ + port: 28015, + + /** + * TODO + * + * @name RethinkDBAdapter#raw + * @type {boolean} + * @default false + */ + raw: false, + + /** + * TODO + * + * @name RethinkDBAdapter#returnDeletedIds + * @type {boolean} + * @default false + */ + returnDeletedIds: false +}; /** * RethinkDBAdapter class. @@ -117,11 +193,10 @@ addHiddenPropsToTarget(Defaults.prototype, { */ function RethinkDBAdapter(opts) { var self = this; - - self.defaults = new Defaults(); - deepMixIn(self.defaults, opts); + opts || (opts = {}); + fillIn(opts, DEFAULTS); fillIn(self, opts); - self.r = rethinkdbdash(self.defaults); + self.r = rethinkdbdash(opts); self.databases = {}; self.tables = {}; self.indices = {}; @@ -136,8 +211,131 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { throw new Error('Unknown RethinkDB Error'); } }, + + /** + * @name RethinkDBAdapter#afterCreate + * @method + */ + afterCreate: noop2, + + /** + * @name RethinkDBAdapter#afterCreateMany + * @method + */ + afterCreateMany: noop2, + + /** + * @name RethinkDBAdapter#afterDestroy + * @method + */ + afterDestroy: noop2, + + /** + * @name RethinkDBAdapter#afterDestroyAll + * @method + */ + afterDestroyAll: noop2, + + /** + * @name RethinkDBAdapter#afterFind + * @method + */ + afterFind: noop2, + + /** + * @name RethinkDBAdapter#afterFindAll + * @method + */ + afterFindAll: noop2, + + /** + * @name RethinkDBAdapter#afterUpdate + * @method + */ + afterUpdate: noop2, + + /** + * @name RethinkDBAdapter#afterUpdateAll + * @method + */ + afterUpdateAll: noop2, + + /** + * @name RethinkDBAdapter#afterUpdateMany + * @method + */ + afterUpdateMany: noop2, + + /** + * @name RethinkDBAdapter#beforeCreate + * @method + */ + beforeCreate: noop, + + /** + * @name RethinkDBAdapter#beforeCreateMany + * @method + */ + beforeCreateMany: noop, + + /** + * @name RethinkDBAdapter#beforeDestroy + * @method + */ + beforeDestroy: noop, + + /** + * @name RethinkDBAdapter#beforeDestroyAll + * @method + */ + beforeDestroyAll: noop, + + /** + * @name RethinkDBAdapter#beforeFind + * @method + */ + beforeFind: noop, + + /** + * @name RethinkDBAdapter#beforeFindAll + * @method + */ + beforeFindAll: noop, + + /** + * @name RethinkDBAdapter#beforeUpdate + * @method + */ + beforeUpdate: noop, + + /** + * @name RethinkDBAdapter#beforeUpdateAll + * @method + */ + beforeUpdateAll: noop, + + /** + * @name RethinkDBAdapter#beforeUpdateMany + * @method + */ + beforeUpdateMany: noop, + + /** + * @name RethinkDBAdapter#dbg + * @method + */ + dbg: function dbg() { + for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + + this.log.apply(this, ['debug'].concat(args)); + }, + selectDb: function selectDb(opts) { + return this.r.db(isUndefined(opts.db) ? this.db : opts.db); + }, selectTable: function selectTable(Resource, opts) { - return this.r.db(opts.db || this.defaults.db).table(Resource.table || underscore(Resource.name)); + return this.selectDb(opts).table(Resource.table || underscore(Resource.name)); }, filterSequence: function filterSequence(sequence, params) { var r = this.r; @@ -146,9 +344,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { params.orderBy = params.orderBy || params.sort; params.skip = params.skip || params.offset; - forEach(keys(params), function (k) { + Object.keys(params).forEach(function (k) { var v = params[k]; - if (!contains(reserved, k)) { + if (reserved.indexOf(k) === -1) { if (isObject(v)) { params.where[k] = v; } else { @@ -162,7 +360,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { var query = sequence; - if (!isEmpty(params.where)) { + if (Object.keys(params.where).length !== 0) { query = query.filter(function (row) { var subQuery = undefined; forOwn(params.where, function (criteria, field) { @@ -190,6 +388,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null)); } else if (op === 'notIn') { subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not(); + } else if (op === 'contains') { + subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v)) : row(field).default([]).contains(v); + } else if (op === 'notContains') { + subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not(); } else if (op === '|==' || op === '|===') { subQuery = subQuery ? subQuery.or(row(field).default(null).eq(v)) : row(field).default(null).eq(v); } else if (op === '|!=' || op === '|!==') { @@ -210,10 +412,14 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null)); } else if (op === '|notIn') { subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not(); + } else if (op === '|contains') { + subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v)) : row(field).default([]).contains(v); + } else if (op === '|notContains') { + subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not(); } }); }); - return subQuery; + return subQuery || true; }); } @@ -225,7 +431,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { if (isString(params.orderBy[i])) { params.orderBy[i] = [params.orderBy[i], 'asc']; } - query = upperCase(params.orderBy[i][1]) === 'DESC' ? query.orderBy(r.desc(params.orderBy[i][0])) : query.orderBy(params.orderBy[i][0]); + query = (params.orderBy[i][1] || '').toUpperCase() === 'DESC' ? query.orderBy(r.desc(params.orderBy[i][0])) : query.orderBy(params.orderBy[i][0]); } } @@ -241,8 +447,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }, waitForDb: function waitForDb(opts) { var self = this; - opts = opts || {}; - var db = opts.db || self.defaults.db; + opts || (opts = {}); + var db = isUndefined(opts.db) ? self.db : opts.db; if (!self.databases[db]) { self.databases[db] = self.r.branch(self.r.dbList().contains(db), true, self.r.dbCreate(db)).run(); } @@ -255,21 +461,91 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * * @name RethinkDBAdapter#create * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {Object} props The record to be created. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO * @return {Promise} */ - create: function create(Resource, props, opts) { + create: function create(mapper, props, opts) { var self = this; - props = removeCircular(omit(props, Resource.relationFields || [])); + var op = undefined; + props || (props = {}); opts || (opts = {}); - return self.waitForTable(Resource.table || underscore(Resource.name), opts).then(function () { - return self.selectTable(Resource, opts).insert(props, { returnChanges: true }).run(); + return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + // beforeCreate lifecycle hook + op = opts.op = 'beforeCreate'; + return resolve(self[op](mapper, props, opts)); + }).then(function (_props) { + // Allow for re-assignment from lifecycle hook + _props = isUndefined(_props) ? props : _props; + return self.selectTable(mapper, opts).insert(_props, { returnChanges: true }).run(); }).then(function (cursor) { self._handleErrors(cursor); - return cursor.changes[0].new_val; + var record = undefined; + if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { + record = cursor.changes[0].new_val; + } + // afterCreate lifecycle hook + op = opts.op = 'afterCreate'; + return self[op](mapper, props, opts, record).then(function (_record) { + // Allow for re-assignment from lifecycle hook + record = isUndefined(_record) ? record : _record; + var result = {}; + fillIn(result, cursor); + result.data = record; + result.created = record ? 1 : 0; + return self.getRaw(opts) ? result : result.data; + }); + }); + }, + + + /** + * Create multiple records in a single batch. + * + * @name RethinkDBAdapter#createMany + * @method + * @param {Object} mapper The mapper. + * @param {Object} props The records to be created. + * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO + * @return {Promise} + */ + createMany: function createMany(mapper, props, opts) { + var self = this; + var op = undefined; + props || (props = {}); + opts || (opts = {}); + + return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + // beforeCreateMany lifecycle hook + op = opts.op = 'beforeCreateMany'; + return resolve(self[op](mapper, props, opts)); + }).then(function (_props) { + // Allow for re-assignment from lifecycle hook + _props = isUndefined(_props) ? props : _props; + return self.selectTable(mapper, opts).insert(_props, { returnChanges: true }).run(); + }).then(function (cursor) { + self._handleErrors(cursor); + var records = []; + if (cursor && cursor.changes && cursor.changes.length && cursor.changes) { + records = cursor.changes.map(function (change) { + return change.new_val; + }); + } + // afterCreateMany lifecycle hook + op = opts.op = 'afterCreateMany'; + return self[op](mapper, props, opts, records).then(function (_records) { + // Allow for re-assignment from lifecycle hook + records = isUndefined(_records) ? records : _records; + var result = {}; + fillIn(result, cursor); + result.data = records; + result.created = records.length; + return self.getRaw(opts) ? result : result.data; + }); }); }, @@ -279,19 +555,43 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * * @name RethinkDBAdapter#destroy * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to destroy. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO + * @param {boolean} [opts.returnDeletedIds=false] Whether to return the + * primary keys of any deleted records. * @return {Promise} */ - destroy: function destroy(Resource, id, opts) { + destroy: function destroy(mapper, id, opts) { var self = this; + var op = undefined; opts || (opts = {}); + var returnDeletedIds = isUndefined(opts.returnDeletedIds) ? self.returnDeletedIds : !!opts.returnDeletedIds; - return self.waitForTable(Resource.table || underscore(Resource.name), opts).then(function () { - return self.selectTable(Resource, opts).get(id).delete().run(); + return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + // beforeDestroy lifecycle hook + op = opts.op = 'beforeDestroy'; + return resolve(self[op](mapper, id, opts)); }).then(function () { - return undefined; + op = opts.op = 'destroy'; + self.dbg(op, id, opts); + return self.selectTable(mapper, opts).get(id).delete().run(); + }).then(function (cursor) { + var deleted = 0; + if (cursor && cursor.deleted) { + deleted = cursor.deleted; + } + // afterDestroy lifecycle hook + op = opts.op = 'afterDestroy'; + return resolve(self[op](mapper, id, opts, deleted ? id : undefined)).then(function (_id) { + // Allow for re-assignment from lifecycle hook + id = isUndefined(_id) && returnDeletedIds ? id : _id; + var result = {}; + fillIn(result, cursor); + result.data = deleted ? id : undefined; + return self.getRaw(opts) ? result : result.data; + }); }); }, @@ -301,20 +601,54 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * * @name RethinkDBAdapter#destroyAll * @method - * @param {Object} Resource the Resource. + * @param {Object} mapper the mapper. * @param {Object} [query] Selection query. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO + * @param {boolean} [opts.returnDeletedIds=false] Whether to return the + * primary keys of any deleted records. * @return {Promise} */ - destroyAll: function destroyAll(Resource, query, opts) { + destroyAll: function destroyAll(mapper, query, opts) { var self = this; + var idAttribute = mapper.idAttribute; + var op = undefined; query || (query = {}); opts || (opts = {}); + var returnDeletedIds = isUndefined(opts.returnDeletedIds) ? self.returnDeletedIds : !!opts.returnDeletedIds; - return self.waitForTable(Resource.table || underscore(Resource.name), opts).then(function () { - return self.filterSequence(self.selectTable(Resource, opts), query).delete().run(); + return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + // beforeDestroyAll lifecycle hook + op = opts.op = 'beforeDestroyAll'; + return resolve(self[op](mapper, query, opts)); }).then(function () { - return undefined; + op = opts.op = 'destroyAll'; + self.dbg(op, query, opts); + return self.filterSequence(self.selectTable(mapper, opts), query).delete({ returnChanges: returnDeletedIds }).merge(function (cursor) { + return { + changes: cursor('changes').default([]).map(function (record) { + return record('old_val').default({})(idAttribute).default({}); + }).filter(function (id) { + return id; + }) + }; + }).run(); + }).then(function (cursor) { + var deletedIds = undefined; + if (cursor && cursor.changes && returnDeletedIds) { + deletedIds = cursor.changes; + delete cursor.changes; + } + // afterDestroyAll lifecycle hook + op = opts.op = 'afterDestroyAll'; + return resolve(self[op](mapper, query, opts, deletedIds)).then(function (_deletedIds) { + // Allow for re-assignment from lifecycle hook + deletedIds = isUndefined(_deletedIds) ? deletedIds : _deletedIds; + var result = {}; + fillIn(result, cursor); + result.data = deletedIds; + return self.getRaw(opts) ? result : result.data; + }); }); }, @@ -330,7 +664,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @return {*} */ makeHasManyForeignKey: function makeHasManyForeignKey(Resource, def, record) { - return DSUtils.get(record, Resource.idAttribute); + return def.getForeignKey(record); }, @@ -341,11 +675,11 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @method * @return {Promise} */ - loadHasMany: function loadHasMany(Resource, def, records, __options) { + loadHasMany: function loadHasMany(Resource, def, records, __opts) { var self = this; var singular = false; - if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + if (isObject(records) && !isArray(records)) { singular = true; records = [records]; } @@ -362,7 +696,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return id; }); } - return self.findAll(Resource.getResource(def.relation), query, __options).then(function (relatedItems) { + return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) { records.forEach(function (record) { var attached = []; // avoid unneccesary iteration when we only have one record @@ -370,12 +704,12 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { attached = relatedItems; } else { relatedItems.forEach(function (relatedItem) { - if (DSUtils.get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) { + if (get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) { attached.push(relatedItem); } }); } - DSUtils.set(record, def.localField, attached); + def.setLocalField(record, attached); }); }); }, @@ -388,15 +722,15 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @method * @return {Promise} */ - loadHasOne: function loadHasOne(Resource, def, records, __options) { - if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + loadHasOne: function loadHasOne(Resource, def, records, __opts) { + if (isObject(records) && !isArray(records)) { records = [records]; } - return this.loadHasMany(Resource, def, records, __options).then(function () { + return this.loadHasMany(Resource, def, records, __opts).then(function () { records.forEach(function (record) { - var relatedData = DSUtils.get(record, def.localField); - if (DSUtils.isArray(relatedData) && relatedData.length) { - DSUtils.set(record, def.localField, relatedData[0]); + var relatedData = def.getLocalField(record); + if (isArray(relatedData) && relatedData.length) { + def.setLocalField(record, relatedData[0]); } }); }); @@ -411,7 +745,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @return {*} */ makeBelongsToForeignKey: function makeBelongsToForeignKey(Resource, def, record) { - return DSUtils.get(record, def.localKey); + return def.getForeignKey(record); }, @@ -422,36 +756,36 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @method * @return {Promise} */ - loadBelongsTo: function loadBelongsTo(Resource, def, records, __options) { + loadBelongsTo: function loadBelongsTo(mapper, def, records, __opts) { var self = this; - var relationDef = Resource.getResource(def.relation); + var relationDef = def.getRelation(); - if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + if (isObject(records) && !isArray(records)) { var _ret = function () { var record = records; return { - v: self.find(relationDef, self.makeBelongsToForeignKey(Resource, def, record), __options).then(function (relatedItem) { - DSUtils.set(record, def.localField, relatedItem); + v: self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) { + def.setLocalField(record, relatedItem); }) }; }(); if ((typeof _ret === 'undefined' ? 'undefined' : babelHelpers.typeof(_ret)) === "object") return _ret.v; } else { - var _keys = records.map(function (record) { - return self.makeBelongsToForeignKey(Resource, def, record); + var keys = records.map(function (record) { + return self.makeBelongsToForeignKey(mapper, def, record); }).filter(function (key) { return key; }); return self.findAll(relationDef, { where: babelHelpers.defineProperty({}, relationDef.idAttribute, { - 'in': _keys + 'in': keys }) - }, __options).then(function (relatedItems) { + }, __opts).then(function (relatedItems) { records.forEach(function (record) { relatedItems.forEach(function (relatedItem) { - if (relatedItem[relationDef.idAttribute] === record[def.localKey]) { - DSUtils.set(record, def.localField, relatedItem); + if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) { + def.setLocalField(record, relatedItem); } }); }); @@ -465,105 +799,105 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * * @name RethinkDBAdapter#find * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to retrieve. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO * @param {string[]} [opts.with=[]] TODO * @return {Promise} */ - find: function find(Resource, id, opts) { + find: function find(mapper, id, opts) { var self = this; + var record = undefined, + op = undefined; opts || (opts = {}); opts.with || (opts.with = []); - var instance = undefined; - var table = Resource.table || underscore(Resource.name); - var relationList = Resource.relationList || []; + var table = mapper.table || underscore(mapper.name); + var relationList = mapper.relationList || []; var tasks = [self.waitForTable(table, opts)]; relationList.forEach(function (def) { var relationName = def.relation; - var relationDef = Resource.getResource(relationName); - if (!relationDef) { - throw new JSData.DSErrors.NER(relationName); - } else if (!opts.with || !contains(opts.with, relationName)) { + var relationDef = def.getRelation(); + if (!opts.with || opts.with.indexOf(relationName) === -1) { return; } - if (def.foreignKey) { - tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts)); - } else if (def.localKey) { - tasks.push(self.waitForIndex(Resource.table || underscore(Resource.name), def.localKey, opts)); + if (def.foreignKey && def.type !== 'belongsTo') { + if (def.type === 'belongsTo') { + tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts)); + } else { + tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts)); + } } }); - return DSUtils.Promise.all(tasks).then(function () { - return self.selectTable(Resource, opts).get(id).run(); - }).then(function (_instance) { - if (!_instance) { - throw new Error('Not Found!'); + return Promise.all(tasks).then(function () { + // beforeFind lifecycle hook + op = opts.op = 'beforeFind'; + return resolve(self[op](mapper, id, opts)).then(function () { + op = opts.op = 'find'; + self.dbg(op, id, opts); + return self.selectTable(mapper, opts).get(id).run(); + }); + }).then(function (_record) { + if (!_record) { + return; } - instance = _instance; + record = _record; var tasks = []; - relationList.forEach(function (def) { - var relationName = def.relation; - var relationDef = Resource.getResource(relationName); - var containedName = null; - if (opts.with.indexOf(relationName) !== -1) { - containedName = relationName; - } else if (opts.with.indexOf(def.localField) !== -1) { - containedName = def.localField; - } - if (containedName) { - (function () { - var __options = DSUtils.deepMixIn({}, opts.orig ? opts.orig() : opts); - __options.with = opts.with.slice(); - __options = DSUtils._(relationDef, __options); - DSUtils.remove(__options.with, containedName); - __options.with.forEach(function (relation, i) { - if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { - __options.with[i] = relation.substr(containedName.length + 1); - } else { - __options.with[i] = ''; - } - }); - - var task = undefined; - - if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { - if (def.type === 'hasOne') { - task = self.loadHasOne(Resource, def, instance, __options); - } else { - task = self.loadHasMany(Resource, def, instance, __options); - } - } else if (def.type === 'hasMany' && def.localKeys) { - var localKeys = []; - var itemKeys = instance[def.localKeys] || []; - itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys); - localKeys = localKeys.concat(itemKeys || []); - task = self.findAll(Resource.getResource(relationName), { - where: babelHelpers.defineProperty({}, relationDef.idAttribute, { - 'in': unique(localKeys).filter(function (x) { - return x; - }) - }) - }, __options).then(function (relatedItems) { - DSUtils.set(instance, def.localField, relatedItems); - return relatedItems; - }); - } else if (def.type === 'belongsTo' || def.type === 'hasOne' && def.localKey) { - task = self.loadBelongsTo(Resource, def, instance, __options); - } + forEachRelation(mapper, opts, function (def, __opts) { + var relatedMapper = def.getRelation(); + var task = undefined; - if (task) { - tasks.push(task); - } - })(); + if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { + if (def.type === 'hasOne') { + task = self.loadHasOne(mapper, def, record, __opts); + } else { + task = self.loadHasMany(mapper, def, record, __opts); + } + } else if (def.type === 'hasMany' && def.localKeys) { + var localKeys = []; + var itemKeys = get(record, def.localKeys) || []; + itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys); + localKeys = localKeys.concat(itemKeys); + task = self.findAll(relatedMapper, { + where: babelHelpers.defineProperty({}, relatedMapper.idAttribute, { + 'in': unique(localKeys).filter(function (x) { + return x; + }) + }) + }, __opts).then(function (relatedItems) { + def.setLocalField(record, relatedItems); + }); + } else if (def.type === 'hasMany' && def.foreignKeys) { + task = self.findAll(relatedMapper, { + where: babelHelpers.defineProperty({}, def.foreignKeys, { + 'contains': get(record, mapper.idAttribute) + }) + }, __opts).then(function (relatedItems) { + def.setLocalField(record, relatedItems); + }); + } else if (def.type === 'belongsTo') { + task = self.loadBelongsTo(mapper, def, record, __opts); + } + if (task) { + tasks.push(task); } }); - return DSUtils.Promise.all(tasks); + return Promise.all(tasks); }).then(function () { - return instance; + // afterFind lifecycle hook + op = opts.op = 'afterFind'; + return resolve(self[op](mapper, id, opts, record)).then(function (_record) { + // Allow for re-assignment from lifecycle hook + record = isUndefined(_record) ? record : _record; + return self.getRaw(opts) ? { + data: record, + found: record ? 1 : 0 + } : record; + }); }); }, @@ -573,144 +907,221 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * * @name RethinkDBAdapter#findAll * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {Object} query Selection query. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO * @param {string[]} [opts.with=[]] TODO * @return {Promise} */ - findAll: function findAll(Resource, query, opts) { + findAll: function findAll(mapper, query, opts) { var self = this; opts || (opts = {}); opts.with || (opts.with = []); - var items = null; - var table = Resource.table || underscore(Resource.name); - var relationList = Resource.relationList || []; + var records = []; + var op = undefined; + var table = mapper.table || underscore(mapper.name); + var relationList = mapper.relationList || []; var tasks = [self.waitForTable(table, opts)]; relationList.forEach(function (def) { var relationName = def.relation; - var relationDef = Resource.getResource(relationName); - if (!relationDef) { - throw new JSData.DSErrors.NER(relationName); - } else if (!opts.with || !contains(opts.with, relationName)) { + var relationDef = def.getRelation(); + if (!opts.with || opts.with.indexOf(relationName) === -1) { return; } - if (def.foreignKey) { - tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts)); - } else if (def.localKey) { - tasks.push(self.waitForIndex(Resource.table || underscore(Resource.name), def.localKey, opts)); + if (def.foreignKey && def.type !== 'belongsTo') { + if (def.type === 'belongsTo') { + tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts)); + } else { + tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts)); + } } }); - return DSUtils.Promise.all(tasks).then(function () { - return self.filterSequence(self.selectTable(Resource, opts), query).run(); - }).then(function (_items) { - items = _items; + return Promise.all(tasks).then(function () { + // beforeFindAll lifecycle hook + op = opts.op = 'beforeFindAll'; + return resolve(self[op](mapper, query, opts)); + }).then(function () { + op = opts.op = 'findAll'; + self.dbg(op, query, opts); + return self.filterSequence(self.selectTable(mapper, opts), query).run(); + }).then(function (_records) { + records = _records; var tasks = []; - var relationList = Resource.relationList || []; - relationList.forEach(function (def) { - var relationName = def.relation; - var relationDef = Resource.getResource(relationName); - var containedName = null; - if (opts.with.indexOf(relationName) !== -1) { - containedName = relationName; - } else if (opts.with.indexOf(def.localField) !== -1) { - containedName = def.localField; - } - if (containedName) { + forEachRelation(mapper, opts, function (def, __opts) { + var relatedMapper = def.getRelation(); + var idAttribute = mapper.idAttribute; + var task = undefined; + if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { + if (def.type === 'hasMany') { + task = self.loadHasMany(mapper, def, records, __opts); + } else { + task = self.loadHasOne(mapper, def, records, __opts); + } + } else if (def.type === 'hasMany' && def.localKeys) { (function () { - var __options = DSUtils.deepMixIn({}, opts.orig ? opts.orig() : opts); - __options.with = opts.with.slice(); - __options = DSUtils._(relationDef, __options); - DSUtils.remove(__options.with, containedName); - __options.with.forEach(function (relation, i) { - if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { - __options.with[i] = relation.substr(containedName.length + 1); - } else { - __options.with[i] = ''; - } + var localKeys = []; + records.forEach(function (item) { + var itemKeys = item[def.localKeys] || []; + itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys); + localKeys = localKeys.concat(itemKeys); }); - - var task = undefined; - - if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { - if (def.type === 'hasMany') { - task = self.loadHasMany(Resource, def, items, __options); - } else { - task = self.loadHasOne(Resource, def, items, __options); - } - } else if (def.type === 'hasMany' && def.localKeys) { - (function () { - var localKeys = []; - items.forEach(function (item) { - var itemKeys = item[def.localKeys] || []; - itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : Object.keys(itemKeys); - localKeys = localKeys.concat(itemKeys || []); - }); - task = self.findAll(Resource.getResource(relationName), { - where: babelHelpers.defineProperty({}, relationDef.idAttribute, { - 'in': unique(localKeys).filter(function (x) { - return x; - }) - }) - }, __options).then(function (relatedItems) { - items.forEach(function (item) { - var attached = []; - var itemKeys = item[def.localKeys] || []; - itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys); - relatedItems.forEach(function (relatedItem) { - if (itemKeys && itemKeys.indexOf(relatedItem[relationDef.idAttribute]) !== -1) { - attached.push(relatedItem); - } - }); - DSUtils.set(item, def.localField, attached); - }); - return relatedItems; + task = self.findAll(relatedMapper, { + where: babelHelpers.defineProperty({}, relatedMapper.idAttribute, { + 'in': unique(localKeys).filter(function (x) { + return x; + }) + }) + }, __opts).then(function (relatedItems) { + records.forEach(function (item) { + var attached = []; + var itemKeys = get(item, def.localKeys) || []; + itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys); + relatedItems.forEach(function (relatedItem) { + if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) { + attached.push(relatedItem); + } }); - })(); - } else if (def.type === 'belongsTo' || def.type === 'hasOne' && def.localKey) { - task = self.loadBelongsTo(Resource, def, items, __options); - } - - if (task) { - tasks.push(task); - } + def.setLocalField(item, attached); + }); + return relatedItems; + }); })(); + } else if (def.type === 'hasMany' && def.foreignKeys) { + task = self.findAll(relatedMapper, { + where: babelHelpers.defineProperty({}, def.foreignKeys, { + 'isectNotEmpty': records.map(function (record) { + return get(record, idAttribute); + }) + }) + }, __opts).then(function (relatedItems) { + var foreignKeysField = def.foreignKeys; + records.forEach(function (record) { + var _relatedItems = []; + var id = get(record, idAttribute); + relatedItems.forEach(function (relatedItem) { + var foreignKeys = get(relatedItems, foreignKeysField) || []; + if (foreignKeys.indexOf(id) !== -1) { + _relatedItems.push(relatedItem); + } + }); + def.setLocalField(record, _relatedItems); + }); + }); + } else if (def.type === 'belongsTo') { + task = self.loadBelongsTo(mapper, def, records, __opts); + } + if (task) { + tasks.push(task); } }); - return DSUtils.Promise.all(tasks); + return Promise.all(tasks); }).then(function () { - return items; + // afterFindAll lifecycle hook + op = opts.op = 'afterFindAll'; + return resolve(self[op](mapper, query, opts, records)).then(function (_records) { + // Allow for re-assignment from lifecycle hook + records = isUndefined(_records) ? records : _records; + return self.getRaw(opts) ? { + data: records, + found: records.length + } : records; + }); }); }, + /** + * TODO + * + * @name RethinkDBAdapter#getRaw + * @method + */ + getRaw: function getRaw(opts) { + opts || (opts = {}); + return !!(isUndefined(opts.raw) ? this.raw : opts.raw); + }, + + + /** + * TODO + * + * @name RethinkDBAdapter#log + * @method + */ + log: function log(level) { + for (var _len4 = arguments.length, args = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { + args[_key4 - 1] = arguments[_key4]; + } + + if (level && !args.length) { + args.push(level); + level = 'debug'; + } + if (level === 'debug' && !this.debug) { + return; + } + var prefix = level.toUpperCase() + ': (RethinkDBAdapter)'; + if (console[level]) { + var _console; + + (_console = console)[level].apply(_console, [prefix].concat(args)); + } else { + var _console2; + + (_console2 = console).log.apply(_console2, [prefix].concat(args)); + } + }, + + /** * Apply the given update to the record with the specified primary key. * * @name RethinkDBAdapter#update * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {(string|number)} id The primary key of the record to be updated. * @param {Object} props The update to apply to the record. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO * @return {Promise} */ - update: function update(resourceConfig, id, attrs, options) { - var _this = this; - - attrs = removeCircular(omit(attrs, resourceConfig.relationFields || [])); - options = options || {}; - return this.waitForTable(resourceConfig.table || underscore(resourceConfig.name), options).then(function () { - return _this.r.db(options.db || _this.defaults.db).table(resourceConfig.table || underscore(resourceConfig.name)).get(id).update(attrs, { returnChanges: true }).run(); + update: function update(mapper, id, props, opts) { + var self = this; + props || (props = {}); + opts || (opts = {}); + var op = undefined; + + return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + // beforeUpdate lifecycle hook + op = opts.op = 'beforeUpdate'; + return resolve(self[op](mapper, id, props, opts)); + }).then(function (_props) { + // Allow for re-assignment from lifecycle hook + _props = isUndefined(_props) ? props : _props; + return self.selectTable(mapper, opts).get(id).update(_props, { returnChanges: true }).run(); }).then(function (cursor) { - _this._handleErrors(cursor); - if (cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { - return cursor.changes[0].new_val; + var record = undefined; + self._handleErrors(cursor); + if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { + record = cursor.changes[0].new_val; } else { - return _this.selectTable(resourceConfig, options).get(id).run(); + throw new Error('Not Found'); } + + // afterUpdate lifecycle hook + op = opts.op = 'afterUpdate'; + return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) { + // Allow for re-assignment from lifecycle hook + record = isUndefined(_record) ? record : _record; + var result = {}; + fillIn(result, cursor); + result.data = record; + result.updated = record ? 1 : 0; + return self.getRaw(opts) ? result : result.data; + }); }); }, @@ -720,68 +1131,132 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * * @name RethinkDBAdapter#updateAll * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {Object} props The update to apply to the selected records. * @param {Object} [query] Selection query. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO * @return {Promise} */ - updateAll: function updateAll(resourceConfig, attrs, params, options) { - var _this2 = this; - - attrs = removeCircular(omit(attrs, resourceConfig.relationFields || [])); - options = options || {}; - params = params || {}; - return this.waitForTable(resourceConfig.table || underscore(resourceConfig.name), options).then(function () { - return _this2.filterSequence(_this2.selectTable(resourceConfig, options), params).update(attrs, { returnChanges: true }).run(); + updateAll: function updateAll(mapper, props, query, opts) { + var self = this; + props || (props = {}); + query || (query = {}); + opts || (opts = {}); + var op = undefined; + + return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + // beforeUpdateAll lifecycle hook + op = opts.op = 'beforeUpdateAll'; + return resolve(self[op](mapper, props, query, opts)); + }).then(function (_props) { + // Allow for re-assignment from lifecycle hook + _props = isUndefined(_props) ? props : _props; + return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, { returnChanges: true }).run(); }).then(function (cursor) { - _this2._handleErrors(cursor); + var records = []; + self._handleErrors(cursor); if (cursor && cursor.changes && cursor.changes.length) { - var _ret5 = function () { - var items = []; - cursor.changes.forEach(function (change) { - return items.push(change.new_val); - }); - return { - v: items - }; - }(); + records = cursor.changes.map(function (change) { + return change.new_val; + }); + } + // afterUpdateAll lifecycle hook + op = opts.op = 'afterUpdateAll'; + return self[op](mapper, props, query, opts, records).then(function (_records) { + // Allow for re-assignment from lifecycle hook + records = isUndefined(_records) ? records : _records; + var result = {}; + fillIn(result, cursor); + result.data = records; + result.updated = records.length; + return self.getRaw(opts) ? result : result.data; + }); + }); + }, - if ((typeof _ret5 === 'undefined' ? 'undefined' : babelHelpers.typeof(_ret5)) === "object") return _ret5.v; - } else { - return _this2.filterSequence(_this2.selectTable(resourceConfig, options), params).run(); + + /** + * Update the given records in a single batch. + * + * @name RethinkDBAdapter#updateMany + * @method + * @param {Object} mapper The mapper. + * @param {Object[]} records The records to update. + * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO + * @return {Promise} + */ + updateMany: function updateMany(mapper, records, opts) { + var self = this; + records || (records = []); + opts || (opts = {}); + var op = undefined; + var idAttribute = mapper.idAttribute; + + records = records.filter(function (record) { + return get(record, idAttribute); + }); + + return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + // beforeUpdateMany lifecycle hook + op = opts.op = 'beforeUpdateMany'; + return resolve(self[op](mapper, records, opts)); + }).then(function (_records) { + // Allow for re-assignment from lifecycle hook + _records = isUndefined(_records) ? records : _records; + return self.selectTable(mapper, opts).insert(_records, { returnChanges: true, conflict: 'update' }).run(); + }).then(function (cursor) { + var updatedRecords = undefined; + self._handleErrors(cursor); + if (cursor && cursor.changes && cursor.changes.length) { + updatedRecords = cursor.changes.map(function (change) { + return change.new_val; + }); } + + // afterUpdateMany lifecycle hook + op = opts.op = 'afterUpdateMany'; + return resolve(self[op](mapper, records, opts, updatedRecords)).then(function (_records) { + // Allow for re-assignment from lifecycle hook + records = isUndefined(_records) ? updatedRecords : _records; + var result = {}; + fillIn(result, cursor); + result.data = records; + result.updated = records.length; + return self.getRaw(opts) ? result : result.data; + }); }); }, waitForTable: function waitForTable(table, options) { - var _this3 = this; + var _this = this; options = options || {}; - var db = options.db || this.defaults.db; + var db = isUndefined(options.db) ? this.db : options.db; return this.waitForDb(options).then(function () { - _this3.tables[db] = _this3.tables[db] || {}; - if (!_this3.tables[db][table]) { - _this3.tables[db][table] = _this3.r.branch(_this3.r.db(db).tableList().contains(table), true, _this3.r.db(db).tableCreate(table)).run(); + _this.tables[db] = _this.tables[db] || {}; + if (!_this.tables[db][table]) { + _this.tables[db][table] = _this.r.branch(_this.r.db(db).tableList().contains(table), true, _this.r.db(db).tableCreate(table)).run(); } - return _this3.tables[db][table]; + return _this.tables[db][table]; }); }, waitForIndex: function waitForIndex(table, index, options) { - var _this4 = this; + var _this2 = this; options = options || {}; - var db = options.db || this.defaults.db; + var db = isUndefined(options.db) ? this.db : options.db; return this.waitForDb(options).then(function () { - return _this4.waitForTable(table, options); + return _this2.waitForTable(table, options); }).then(function () { - _this4.indices[db] = _this4.indices[db] || {}; - _this4.indices[db][table] = _this4.indices[db][table] || {}; - if (!_this4.tables[db][table][index]) { - _this4.tables[db][table][index] = _this4.r.branch(_this4.r.db(db).table(table).indexList().contains(index), true, _this4.r.db(db).table(table).indexCreate(index)).run().then(function () { - return _this4.r.db(db).table(table).indexWait(index).run(); + _this2.indices[db] = _this2.indices[db] || {}; + _this2.indices[db][table] = _this2.indices[db][table] || {}; + if (!_this2.tables[db][table][index]) { + _this2.tables[db][table][index] = _this2.r.branch(_this2.r.db(db).table(table).indexList().contains(index), true, _this2.r.db(db).table(table).indexCreate(index)).run().then(function () { + return _this2.r.db(db).table(table).indexWait(index).run(); }); } - return _this4.tables[db][table][index]; + return _this2.tables[db][table][index]; }); } }); diff --git a/dist/js-data-rethinkdb.js.map b/dist/js-data-rethinkdb.js.map index 3b5792c..45f3e83 100644 --- a/dist/js-data-rethinkdb.js.map +++ b/dist/js-data-rethinkdb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["let rethinkdbdash = require('rethinkdbdash')\nlet JSData = require('js-data')\nlet { DSUtils } = JSData\nlet { upperCase, contains, forOwn, isEmpty, keys, deepMixIn, forEach, isObject, isString, removeCircular, omit } = DSUtils\n\nlet underscore = require('mout/string/underscore')\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nconst addHiddenPropsToTarget = function (target, props) {\n DSUtils.forOwn(props, function (value, key) {\n props[key] = {\n writable: true,\n value\n }\n })\n Object.defineProperties(target, props)\n}\n\nconst fillIn = function (dest, src) {\n DSUtils.forOwn(src, function (value, key) {\n if (!dest.hasOwnProperty(key) || dest[key] === undefined) {\n dest[key] = value\n }\n })\n}\n\nconst unique = function (array) {\n const seen = {}\n const final = []\n array.forEach(function (item) {\n if (item in seen) {\n return\n }\n final.push(item)\n seen[item] = 0\n })\n return final\n}\n\nclass Defaults {\n\n}\n\naddHiddenPropsToTarget(Defaults.prototype, {\n host: 'localhost',\n port: 28015,\n authKey: '',\n db: 'test',\n min: 10,\n max: 50,\n bufferSize: 10\n})\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * import {DS} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new DS()\n * const adapter = new RethinkDBAdapter()\n * store.registerAdapter('rethinkdb', adapter, { 'default': true })\n *\n * @class RethinkDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.host='localhost'] TODO\n * @param {number} [opts.port=28015] TODO\n * @param {string} [opts.authKey=''] TODO\n * @param {string} [opts.db='test'] TODO\n * @param {number} [opts.min=10] TODO\n * @param {number} [opts.max=50] TODO\n * @param {number} [opts.bufferSize=10] TODO\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n\n self.defaults = new Defaults()\n deepMixIn(self.defaults, opts)\n fillIn(self, opts)\n self.r = rethinkdbdash(self.defaults)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n\n selectTable (Resource, opts) {\n return this.r.db(opts.db || this.defaults.db).table(Resource.table || underscore(Resource.name))\n },\n\n filterSequence (sequence, params) {\n let r = this.r\n params = params || {}\n params.where = params.where || {}\n params.orderBy = params.orderBy || params.sort\n params.skip = params.skip || params.offset\n\n forEach(keys(params), function (k) {\n let v = params[k]\n if (!contains(reserved, k)) {\n if (isObject(v)) {\n params.where[k] = v\n } else {\n params.where[k] = {\n '==': v\n }\n }\n delete params[k]\n }\n })\n\n let query = sequence\n\n if (!isEmpty(params.where)) {\n query = query.filter((row) => {\n let subQuery\n forOwn(params.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = {'==': criteria}\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '!=' || op === '!==') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '>') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '>=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '<') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '<=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === 'isectEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === 'isectNotEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === 'in') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === 'notIn') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === '|==' || op === '|===') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '|!=' || op === '|!==') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '|>') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '|>=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '|<') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '|<=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === '|isectEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === '|isectNotEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === '|in') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === '|notIn') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n }\n })\n })\n return subQuery\n })\n }\n\n if (params.orderBy) {\n if (isString(params.orderBy)) {\n params.orderBy = [\n [params.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < params.orderBy.length; i++) {\n if (isString(params.orderBy[i])) {\n params.orderBy[i] = [params.orderBy[i], 'asc']\n }\n query = upperCase(params.orderBy[i][1]) === 'DESC' ? query.orderBy(r.desc(params.orderBy[i][0])) : query.orderBy(params.orderBy[i][0])\n }\n }\n\n if (params.skip) {\n query = query.skip(+params.skip)\n }\n\n if (params.limit) {\n query = query.limit(+params.limit)\n }\n\n return query\n },\n\n waitForDb (opts) {\n const self = this\n opts = opts || {}\n let db = opts.db || self.defaults.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} Resource The Resource.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n create (Resource, props, opts) {\n const self = this\n props = removeCircular(omit(props, Resource.relationFields || []))\n opts || (opts = {})\n\n return self.waitForTable(Resource.table || underscore(Resource.name), opts).then(function () {\n return self.selectTable(Resource, opts).insert(props, {returnChanges: true}).run()\n }).then(function (cursor) {\n self._handleErrors(cursor)\n return cursor.changes[0].new_val\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} Resource The Resource.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n destroy (Resource, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.waitForTable(Resource.table || underscore(Resource.name), opts).then(function () {\n return self.selectTable(Resource, opts).get(id).delete().run()\n }).then(function () {\n return undefined\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} Resource the Resource.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n destroyAll (Resource, query, opts) {\n const self = this\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(Resource.table || underscore(Resource.name), opts).then(function () {\n return self.filterSequence(self.selectTable(Resource, opts), query).delete().run()\n }).then(function () {\n return undefined\n })\n },\n\n /**\n * TODO\n *\n * There may be reasons why you may want to override this method, like when\n * the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name RethinkDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (Resource, def, record) {\n return DSUtils.get(record, Resource.idAttribute)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (Resource, def, records, __options) {\n const self = this\n let singular = false\n\n if (DSUtils.isObject(records) && !DSUtils.isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(Resource, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(Resource.getResource(def.relation), query, __options).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (DSUtils.get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n DSUtils.set(record, def.localField, attached)\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (Resource, def, records, __options) {\n if (DSUtils.isObject(records) && !DSUtils.isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(Resource, def, records, __options).then(function () {\n records.forEach(function (record) {\n const relatedData = DSUtils.get(record, def.localField)\n if (DSUtils.isArray(relatedData) && relatedData.length) {\n DSUtils.set(record, def.localField, relatedData[0])\n }\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (Resource, def, record) {\n return DSUtils.get(record, def.localKey)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (Resource, def, records, __options) {\n const self = this\n const relationDef = Resource.getResource(def.relation)\n\n if (DSUtils.isObject(records) && !DSUtils.isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(Resource, def, record), __options).then(function (relatedItem) {\n DSUtils.set(record, def.localField, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(Resource, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __options).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.localKey]) {\n DSUtils.set(record, def.localField, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} Resource The Resource.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {string[]} [opts.with=[]] TODO\n * @return {Promise}\n */\n find (Resource, id, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let instance\n const table = Resource.table || underscore(Resource.name)\n const relationList = Resource.relationList || []\n let tasks = [self.waitForTable(table, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = Resource.getResource(relationName)\n if (!relationDef) {\n throw new JSData.DSErrors.NER(relationName)\n } else if (!opts.with || !contains(opts.with, relationName)) {\n return\n }\n if (def.foreignKey) {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n } else if (def.localKey) {\n tasks.push(self.waitForIndex(Resource.table || underscore(Resource.name), def.localKey, opts))\n }\n })\n return DSUtils.Promise.all(tasks).then(function () {\n return self.selectTable(Resource, opts).get(id).run()\n }).then(function (_instance) {\n if (!_instance) {\n throw new Error('Not Found!')\n }\n instance = _instance\n let tasks = []\n\n relationList.forEach(function (def) {\n let relationName = def.relation\n let relationDef = Resource.getResource(relationName)\n let containedName = null\n if (opts.with.indexOf(relationName) !== -1) {\n containedName = relationName\n } else if (opts.with.indexOf(def.localField) !== -1) {\n containedName = def.localField\n }\n if (containedName) {\n let __options = DSUtils.deepMixIn({}, opts.orig ? opts.orig() : opts)\n __options.with = opts.with.slice()\n __options = DSUtils._(relationDef, __options)\n DSUtils.remove(__options.with, containedName)\n __options.with.forEach(function (relation, i) {\n if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') {\n __options.with[i] = relation.substr(containedName.length + 1)\n } else {\n __options.with[i] = ''\n }\n })\n\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(Resource, def, instance, __options)\n } else {\n task = self.loadHasMany(Resource, def, instance, __options)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = instance[def.localKeys] || []\n itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys || [])\n task = self.findAll(Resource.getResource(relationName), {\n where: {\n [relationDef.idAttribute]: {\n 'in': unique(localKeys).filter((x) => x)\n }\n }\n }, __options).then(function (relatedItems) {\n DSUtils.set(instance, def.localField, relatedItems)\n return relatedItems\n })\n } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) {\n task = self.loadBelongsTo(Resource, def, instance, __options)\n }\n\n if (task) {\n tasks.push(task)\n }\n }\n })\n\n return DSUtils.Promise.all(tasks)\n }).then(function () {\n return instance\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} Resource The Resource.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {string[]} [opts.with=[]] TODO\n * @return {Promise}\n */\n findAll (Resource, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let items = null\n const table = Resource.table || underscore(Resource.name)\n const relationList = Resource.relationList || []\n let tasks = [self.waitForTable(table, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = Resource.getResource(relationName)\n if (!relationDef) {\n throw new JSData.DSErrors.NER(relationName)\n } else if (!opts.with || !contains(opts.with, relationName)) {\n return\n }\n if (def.foreignKey) {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n } else if (def.localKey) {\n tasks.push(self.waitForIndex(Resource.table || underscore(Resource.name), def.localKey, opts))\n }\n })\n return DSUtils.Promise.all(tasks).then(function () {\n return self.filterSequence(self.selectTable(Resource, opts), query).run()\n }).then(function (_items) {\n items = _items\n let tasks = []\n const relationList = Resource.relationList || []\n relationList.forEach(function (def) {\n let relationName = def.relation\n let relationDef = Resource.getResource(relationName)\n let containedName = null\n if (opts.with.indexOf(relationName) !== -1) {\n containedName = relationName\n } else if (opts.with.indexOf(def.localField) !== -1) {\n containedName = def.localField\n }\n if (containedName) {\n let __options = DSUtils.deepMixIn({}, opts.orig ? opts.orig() : opts)\n __options.with = opts.with.slice()\n __options = DSUtils._(relationDef, __options)\n DSUtils.remove(__options.with, containedName)\n __options.with.forEach(function (relation, i) {\n if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') {\n __options.with[i] = relation.substr(containedName.length + 1)\n } else {\n __options.with[i] = ''\n }\n })\n\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(Resource, def, items, __options)\n } else {\n task = self.loadHasOne(Resource, def, items, __options)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n items.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys || [])\n })\n task = self.findAll(Resource.getResource(relationName), {\n where: {\n [relationDef.idAttribute]: {\n 'in': unique(localKeys).filter((x) => x)\n }\n }\n }, __options).then(function (relatedItems) {\n items.forEach(function (item) {\n let attached = []\n let itemKeys = item[def.localKeys] || []\n itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relationDef.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n DSUtils.set(item, def.localField, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) {\n task = self.loadBelongsTo(Resource, def, items, __options)\n }\n\n if (task) {\n tasks.push(task)\n }\n }\n })\n return DSUtils.Promise.all(tasks)\n }).then(function () {\n return items\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} Resource The Resource.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n update (resourceConfig, id, attrs, options) {\n attrs = removeCircular(omit(attrs, resourceConfig.relationFields || []))\n options = options || {}\n return this.waitForTable(resourceConfig.table || underscore(resourceConfig.name), options).then(() => {\n return this.r.db(options.db || this.defaults.db).table(resourceConfig.table || underscore(resourceConfig.name)).get(id).update(attrs, {returnChanges: true}).run()\n }).then((cursor) => {\n this._handleErrors(cursor)\n if (cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n return cursor.changes[0].new_val\n } else {\n return this.selectTable(resourceConfig, options).get(id).run()\n }\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} Resource The Resource.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @return {Promise}\n */\n updateAll (resourceConfig, attrs, params, options) {\n attrs = removeCircular(omit(attrs, resourceConfig.relationFields || []))\n options = options || {}\n params = params || {}\n return this.waitForTable(resourceConfig.table || underscore(resourceConfig.name), options).then(() => {\n return this.filterSequence(this.selectTable(resourceConfig, options), params).update(attrs, {returnChanges: true}).run()\n }).then((cursor) => {\n this._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n let items = []\n cursor.changes.forEach((change) => items.push(change.new_val))\n return items\n } else {\n return this.filterSequence(this.selectTable(resourceConfig, options), params).run()\n }\n })\n },\n\n waitForTable (table, options) {\n options = options || {}\n let db = options.db || this.defaults.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = options.db || this.defaults.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["let rethinkdbdash = require('rethinkdbdash')\nimport {utils} from 'js-data'\nconst {\n addHiddenPropsToTarget,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n resolve\n} = utils\n\nconst underscore = require('mout/string/underscore')\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nconst unique = function (array) {\n const seen = {}\n const final = []\n array.forEach(function (item) {\n if (item in seen) {\n return\n }\n final.push(item)\n seen[item] = 0\n })\n return final\n}\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst DEFAULTS = {\n /**\n * TODO\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#returnDeletedIds\n * @type {boolean}\n * @default false\n */\n returnDeletedIds: false\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * import {DS} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new DS()\n * const adapter = new RethinkDBAdapter()\n * store.registerAdapter('rethinkdb', adapter, { 'default': true })\n *\n * @class RethinkDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.host='localhost'] TODO\n * @param {number} [opts.port=28015] TODO\n * @param {string} [opts.authKey=''] TODO\n * @param {string} [opts.db='test'] TODO\n * @param {number} [opts.min=10] TODO\n * @param {number} [opts.max=50] TODO\n * @param {number} [opts.bufferSize=10] TODO\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n /**\n * @name RethinkDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name RethinkDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (Resource, opts) {\n return this.selectDb(opts).table(Resource.table || underscore(Resource.name))\n },\n\n filterSequence (sequence, params) {\n let r = this.r\n params = params || {}\n params.where = params.where || {}\n params.orderBy = params.orderBy || params.sort\n params.skip = params.skip || params.offset\n\n Object.keys(params).forEach(function (k) {\n let v = params[k]\n if (reserved.indexOf(k) === -1) {\n if (isObject(v)) {\n params.where[k] = v\n } else {\n params.where[k] = {\n '==': v\n }\n }\n delete params[k]\n }\n })\n\n let query = sequence\n\n if (Object.keys(params.where).length !== 0) {\n query = query.filter(function (row) {\n let subQuery\n forOwn(params.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '!=' || op === '!==') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '>') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '>=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '<') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '<=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === 'isectEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === 'isectNotEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === 'in') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === 'notIn') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === 'contains') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v)) : row(field).default([]).contains(v)\n } else if (op === 'notContains') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not()\n } else if (op === '|==' || op === '|===') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '|!=' || op === '|!==') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '|>') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '|>=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '|<') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '|<=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === '|isectEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === '|isectNotEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === '|in') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === '|notIn') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === '|contains') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v)) : row(field).default([]).contains(v)\n } else if (op === '|notContains') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not()\n }\n })\n })\n return subQuery || true\n })\n }\n\n if (params.orderBy) {\n if (isString(params.orderBy)) {\n params.orderBy = [\n [params.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < params.orderBy.length; i++) {\n if (isString(params.orderBy[i])) {\n params.orderBy[i] = [params.orderBy[i], 'asc']\n }\n query = (params.orderBy[i][1] || '').toUpperCase() === 'DESC' ? query.orderBy(r.desc(params.orderBy[i][0])) : query.orderBy(params.orderBy[i][0])\n }\n }\n\n if (params.skip) {\n query = query.skip(+params.skip)\n }\n\n if (params.limit) {\n query = query.limit(+params.limit)\n }\n\n return query\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.selectTable(mapper, opts).insert(_props, { returnChanges: true }).run()\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return self[op](mapper, props, opts, record).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.created = record ? 1 : 0\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.selectTable(mapper, opts).insert(_props, { returnChanges: true }).run()\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return self[op](mapper, props, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.created = records.length\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @param {boolean} [opts.returnDeletedIds=false] Whether to return the\n * primary keys of any deleted records.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n const returnDeletedIds = isUndefined(opts.returnDeletedIds) ? self.returnDeletedIds : !!opts.returnDeletedIds\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete().run()\n }).then(function (cursor) {\n let deleted = 0\n if (cursor && cursor.deleted) {\n deleted = cursor.deleted\n }\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, deleted ? id : undefined)).then(function (_id) {\n // Allow for re-assignment from lifecycle hook\n id = isUndefined(_id) && returnDeletedIds ? id : _id\n const result = {}\n fillIn(result, cursor)\n result.data = deleted ? id : undefined\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @param {boolean} [opts.returnDeletedIds=false] Whether to return the\n * primary keys of any deleted records.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n const idAttribute = mapper.idAttribute\n let op\n query || (query = {})\n opts || (opts = {})\n const returnDeletedIds = isUndefined(opts.returnDeletedIds) ? self.returnDeletedIds : !!opts.returnDeletedIds\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete({ returnChanges: returnDeletedIds })\n .merge(function (cursor) {\n return {\n changes: cursor('changes').default([]).map(function (record) {\n return record('old_val').default({})(idAttribute).default({})\n }).filter(function (id) {\n return id\n })\n }\n })\n .run()\n }).then(function (cursor) {\n let deletedIds\n if (cursor && cursor.changes && returnDeletedIds) {\n deletedIds = cursor.changes\n delete cursor.changes\n }\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, deletedIds)).then(function (_deletedIds) {\n // Allow for re-assignment from lifecycle hook\n deletedIds = isUndefined(_deletedIds) ? deletedIds : _deletedIds\n const result = {}\n fillIn(result, cursor)\n result.data = deletedIds\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * TODO\n *\n * There may be reasons why you may want to override this method, like when\n * the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name RethinkDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (Resource, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (Resource, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(Resource, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (Resource, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(Resource, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (Resource, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @param {string[]} [opts.with=[]] TODO\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const table = mapper.table || underscore(mapper.name)\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(table, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts)).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run()\n })\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n return self.getRaw(opts) ? {\n data: record,\n found: record ? 1 : 0\n } : record\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @param {string[]} [opts.with=[]] TODO\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const table = mapper.table || underscore(mapper.name)\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(table, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run()\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, records)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n return self.getRaw(opts) ? {\n data: records,\n found: records.length\n } : records\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#getRaw\n * @method\n */\n getRaw (opts) {\n opts || (opts = {})\n return !!(isUndefined(opts.raw) ? this.raw : opts.raw)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (RethinkDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.selectTable(mapper, opts).get(id).update(_props, { returnChanges: true }).run()\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = record ? 1 : 0\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, { returnChanges: true }).run()\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return self[op](mapper, props, query, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n return self.selectTable(mapper, opts).insert(_records, { returnChanges: true, conflict: 'update' }).run()\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, updatedRecords)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? updatedRecords : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n waitForTable (table, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n"],"names":["utils"],"mappings":"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"} \ No newline at end of file diff --git a/mocha.start.js b/mocha.start.js index 27a19fa..da96b9c 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -11,7 +11,7 @@ var RethinkDBAdapter = require('./') TestRunner.init({ debug: false, - DS: JSData.DS, + JSData: JSData, Adapter: RethinkDBAdapter, adapterConfig: {}, storeConfig: { @@ -21,15 +21,9 @@ TestRunner.init({ log: false, debug: false }, - features: [], - methods: [ - 'create', - 'destroy', - 'destroyAll', - 'find', - 'findAll', - 'update', - 'updateAll' + features: [ + 'findHasManyLocalKeys', + 'findHasManyForeignKeys' ] }) diff --git a/package.json b/package.json index ed11011..3fc7f91 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-rethinkdb", "description": "RethinkDB adapter for js-data.", - "version": "2.2.0", + "version": "3.0.0-alpha.1", "homepage": "https://github.com/js-data/js-data-rethinkdb", "repository": { "type": "git", @@ -36,8 +36,8 @@ "doc": "jsdoc -c conf.json src && node scripts/cleanup.js", "bundle": "rollup -c rollup.config.js -f cjs -o dist/js-data-rethinkdb.js -m dist/js-data-rethinkdb.js.map src/index.js", "lint": "standard src/index.js mocha.start.js test/**/*.js", - "mocha": "mocha -t 20000 -R dot mocha.start.js test/**/*.js", - "cover": "istanbul cover --hook-run-in-context node_modules/mocha/bin/_mocha -- -t 20000 -R dot mocha.start.js test/**/*.js", + "mocha": "mocha -t 20000 -R dot -r source-map-support/register mocha.start.js test/**/*.js", + "cover": "istanbul cover --hook-run-in-context node_modules/mocha/bin/_mocha -- -t 20000 -R dot -r source-map-support/register mocha.start.js test/**/*.js", "test": "npm run lint && npm run bundle && npm run cover", "release": "npm test && npm run doc && node scripts/authors.js", "ci": "npm run test && cat coverage/lcov.info | coveralls || true && cat ./coverage/lcov.info | codacy-coverage || true" @@ -46,7 +46,7 @@ "mout": "0.11.1" }, "peerDependencies": { - "js-data": ">=2.0.0 <3", + "js-data": "^3.0.0-alpha.15", "rethinkdbdash": ">=1.15.0" }, "devDependencies": { @@ -62,7 +62,7 @@ "coveralls": "2.11.6", "ink-docstrap": "1.1.2", "istanbul": "0.4.2", - "js-data-adapter-tests": "1.5.0", + "js-data-adapter-tests": "^2.0.0-alpha.6", "jsdoc": "3.4.0", "mocha": "2.4.5", "rollup": "0.25.4", diff --git a/src/index.js b/src/index.js index f83bd60..63d7fe5 100644 --- a/src/index.js +++ b/src/index.js @@ -1,9 +1,19 @@ let rethinkdbdash = require('rethinkdbdash') -let JSData = require('js-data') -let { DSUtils } = JSData -let { upperCase, contains, forOwn, isEmpty, keys, deepMixIn, forEach, isObject, isString, removeCircular, omit } = DSUtils +import {utils} from 'js-data' +const { + addHiddenPropsToTarget, + fillIn, + forEachRelation, + forOwn, + get, + isArray, + isObject, + isString, + isUndefined, + resolve +} = utils -let underscore = require('mout/string/underscore') +const underscore = require('mout/string/underscore') const reserved = [ 'orderBy', @@ -14,24 +24,6 @@ const reserved = [ 'where' ] -const addHiddenPropsToTarget = function (target, props) { - DSUtils.forOwn(props, function (value, key) { - props[key] = { - writable: true, - value - } - }) - Object.defineProperties(target, props) -} - -const fillIn = function (dest, src) { - DSUtils.forOwn(src, function (value, key) { - if (!dest.hasOwnProperty(key) || dest[key] === undefined) { - dest[key] = value - } - }) -} - const unique = function (array) { const seen = {} const final = [] @@ -45,19 +37,110 @@ const unique = function (array) { return final } -class Defaults { +const noop = function (...args) { + const self = this + const opts = args[args.length - 1] + self.dbg(opts.op, ...args) + return resolve() +} +const noop2 = function (...args) { + const self = this + const opts = args[args.length - 2] + self.dbg(opts.op, ...args) + return resolve() } -addHiddenPropsToTarget(Defaults.prototype, { - host: 'localhost', - port: 28015, +const DEFAULTS = { + /** + * TODO + * + * @name RethinkDBAdapter#authKey + * @type {string} + */ authKey: '', + + /** + * TODO + * + * @name RethinkDBAdapter#bufferSize + * @type {number} + * @default 10 + */ + bufferSize: 10, + + /** + * TODO + * + * @name RethinkDBAdapter#db + * @type {string} + * @default "test" + */ db: 'test', + + /** + * TODO + * + * @name RethinkDBAdapter#debug + * @type {boolean} + * @default false + */ + debug: false, + + /** + * TODO + * + * @name RethinkDBAdapter#host + * @type {string} + * @default "localhost" + */ + host: 'localhost', + + /** + * TODO + * + * @name RethinkDBAdapter#min + * @type {number} + * @default 10 + */ min: 10, + + /** + * TODO + * + * @name RethinkDBAdapter#max + * @type {number} + * @default 50 + */ max: 50, - bufferSize: 10 -}) + + /** + * TODO + * + * @name RethinkDBAdapter#port + * @type {number} + * @default 10 + */ + port: 28015, + + /** + * TODO + * + * @name RethinkDBAdapter#raw + * @type {boolean} + * @default false + */ + raw: false, + + /** + * TODO + * + * @name RethinkDBAdapter#returnDeletedIds + * @type {boolean} + * @default false + */ + returnDeletedIds: false +} /** * RethinkDBAdapter class. @@ -81,11 +164,10 @@ addHiddenPropsToTarget(Defaults.prototype, { */ export default function RethinkDBAdapter (opts) { const self = this - - self.defaults = new Defaults() - deepMixIn(self.defaults, opts) + opts || (opts = {}) + fillIn(opts, DEFAULTS) fillIn(self, opts) - self.r = rethinkdbdash(self.defaults) + self.r = rethinkdbdash(opts) self.databases = {} self.tables = {} self.indices = {} @@ -100,9 +182,128 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { throw new Error('Unknown RethinkDB Error') } }, + /** + * @name RethinkDBAdapter#afterCreate + * @method + */ + afterCreate: noop2, + + /** + * @name RethinkDBAdapter#afterCreateMany + * @method + */ + afterCreateMany: noop2, + + /** + * @name RethinkDBAdapter#afterDestroy + * @method + */ + afterDestroy: noop2, + + /** + * @name RethinkDBAdapter#afterDestroyAll + * @method + */ + afterDestroyAll: noop2, + + /** + * @name RethinkDBAdapter#afterFind + * @method + */ + afterFind: noop2, + + /** + * @name RethinkDBAdapter#afterFindAll + * @method + */ + afterFindAll: noop2, + + /** + * @name RethinkDBAdapter#afterUpdate + * @method + */ + afterUpdate: noop2, + + /** + * @name RethinkDBAdapter#afterUpdateAll + * @method + */ + afterUpdateAll: noop2, + + /** + * @name RethinkDBAdapter#afterUpdateMany + * @method + */ + afterUpdateMany: noop2, + + /** + * @name RethinkDBAdapter#beforeCreate + * @method + */ + beforeCreate: noop, + + /** + * @name RethinkDBAdapter#beforeCreateMany + * @method + */ + beforeCreateMany: noop, + + /** + * @name RethinkDBAdapter#beforeDestroy + * @method + */ + beforeDestroy: noop, + + /** + * @name RethinkDBAdapter#beforeDestroyAll + * @method + */ + beforeDestroyAll: noop, + + /** + * @name RethinkDBAdapter#beforeFind + * @method + */ + beforeFind: noop, + + /** + * @name RethinkDBAdapter#beforeFindAll + * @method + */ + beforeFindAll: noop, + + /** + * @name RethinkDBAdapter#beforeUpdate + * @method + */ + beforeUpdate: noop, + + /** + * @name RethinkDBAdapter#beforeUpdateAll + * @method + */ + beforeUpdateAll: noop, + + /** + * @name RethinkDBAdapter#beforeUpdateMany + * @method + */ + beforeUpdateMany: noop, + + /** + * @name RethinkDBAdapter#dbg + * @method + */ + dbg (...args) { + this.log('debug', ...args) + }, + + selectDb (opts) { + return this.r.db(isUndefined(opts.db) ? this.db : opts.db) + }, selectTable (Resource, opts) { - return this.r.db(opts.db || this.defaults.db).table(Resource.table || underscore(Resource.name)) + return this.selectDb(opts).table(Resource.table || underscore(Resource.name)) }, filterSequence (sequence, params) { @@ -112,9 +313,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { params.orderBy = params.orderBy || params.sort params.skip = params.skip || params.offset - forEach(keys(params), function (k) { + Object.keys(params).forEach(function (k) { let v = params[k] - if (!contains(reserved, k)) { + if (reserved.indexOf(k) === -1) { if (isObject(v)) { params.where[k] = v } else { @@ -128,12 +329,12 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { let query = sequence - if (!isEmpty(params.where)) { - query = query.filter((row) => { + if (Object.keys(params.where).length !== 0) { + query = query.filter(function (row) { let subQuery forOwn(params.where, function (criteria, field) { if (!isObject(criteria)) { - criteria = {'==': criteria} + criteria = { '==': criteria } } forOwn(criteria, function (v, op) { if (op === '==' || op === '===') { @@ -156,6 +357,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null)) } else if (op === 'notIn') { subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not() + } else if (op === 'contains') { + subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v)) : row(field).default([]).contains(v) + } else if (op === 'notContains') { + subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not() } else if (op === '|==' || op === '|===') { subQuery = subQuery ? subQuery.or(row(field).default(null).eq(v)) : row(field).default(null).eq(v) } else if (op === '|!=' || op === '|!==') { @@ -176,10 +381,14 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null)) } else if (op === '|notIn') { subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not() + } else if (op === '|contains') { + subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v)) : row(field).default([]).contains(v) + } else if (op === '|notContains') { + subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not() } }) }) - return subQuery + return subQuery || true }) } @@ -193,7 +402,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { if (isString(params.orderBy[i])) { params.orderBy[i] = [params.orderBy[i], 'asc'] } - query = upperCase(params.orderBy[i][1]) === 'DESC' ? query.orderBy(r.desc(params.orderBy[i][0])) : query.orderBy(params.orderBy[i][0]) + query = (params.orderBy[i][1] || '').toUpperCase() === 'DESC' ? query.orderBy(r.desc(params.orderBy[i][0])) : query.orderBy(params.orderBy[i][0]) } } @@ -210,8 +419,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { waitForDb (opts) { const self = this - opts = opts || {} - let db = opts.db || self.defaults.db + opts || (opts = {}) + const db = isUndefined(opts.db) ? self.db : opts.db if (!self.databases[db]) { self.databases[db] = self.r.branch( self.r.dbList().contains(db), @@ -227,21 +436,90 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * * @name RethinkDBAdapter#create * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {Object} props The record to be created. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO * @return {Promise} */ - create (Resource, props, opts) { + create (mapper, props, opts) { const self = this - props = removeCircular(omit(props, Resource.relationFields || [])) + let op + props || (props = {}) opts || (opts = {}) - return self.waitForTable(Resource.table || underscore(Resource.name), opts).then(function () { - return self.selectTable(Resource, opts).insert(props, {returnChanges: true}).run() + return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + // beforeCreate lifecycle hook + op = opts.op = 'beforeCreate' + return resolve(self[op](mapper, props, opts)) + }).then(function (_props) { + // Allow for re-assignment from lifecycle hook + _props = isUndefined(_props) ? props : _props + return self.selectTable(mapper, opts).insert(_props, { returnChanges: true }).run() }).then(function (cursor) { self._handleErrors(cursor) - return cursor.changes[0].new_val + let record + if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { + record = cursor.changes[0].new_val + } + // afterCreate lifecycle hook + op = opts.op = 'afterCreate' + return self[op](mapper, props, opts, record).then(function (_record) { + // Allow for re-assignment from lifecycle hook + record = isUndefined(_record) ? record : _record + const result = {} + fillIn(result, cursor) + result.data = record + result.created = record ? 1 : 0 + return self.getRaw(opts) ? result : result.data + }) + }) + }, + + /** + * Create multiple records in a single batch. + * + * @name RethinkDBAdapter#createMany + * @method + * @param {Object} mapper The mapper. + * @param {Object} props The records to be created. + * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO + * @return {Promise} + */ + createMany (mapper, props, opts) { + const self = this + let op + props || (props = {}) + opts || (opts = {}) + + return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + // beforeCreateMany lifecycle hook + op = opts.op = 'beforeCreateMany' + return resolve(self[op](mapper, props, opts)) + }).then(function (_props) { + // Allow for re-assignment from lifecycle hook + _props = isUndefined(_props) ? props : _props + return self.selectTable(mapper, opts).insert(_props, { returnChanges: true }).run() + }).then(function (cursor) { + self._handleErrors(cursor) + let records = [] + if (cursor && cursor.changes && cursor.changes.length && cursor.changes) { + records = cursor.changes.map(function (change) { + return change.new_val + }) + } + // afterCreateMany lifecycle hook + op = opts.op = 'afterCreateMany' + return self[op](mapper, props, opts, records).then(function (_records) { + // Allow for re-assignment from lifecycle hook + records = isUndefined(_records) ? records : _records + const result = {} + fillIn(result, cursor) + result.data = records + result.created = records.length + return self.getRaw(opts) ? result : result.data + }) }) }, @@ -250,19 +528,43 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * * @name RethinkDBAdapter#destroy * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to destroy. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO + * @param {boolean} [opts.returnDeletedIds=false] Whether to return the + * primary keys of any deleted records. * @return {Promise} */ - destroy (Resource, id, opts) { + destroy (mapper, id, opts) { const self = this + let op opts || (opts = {}) + const returnDeletedIds = isUndefined(opts.returnDeletedIds) ? self.returnDeletedIds : !!opts.returnDeletedIds - return self.waitForTable(Resource.table || underscore(Resource.name), opts).then(function () { - return self.selectTable(Resource, opts).get(id).delete().run() + return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + // beforeDestroy lifecycle hook + op = opts.op = 'beforeDestroy' + return resolve(self[op](mapper, id, opts)) }).then(function () { - return undefined + op = opts.op = 'destroy' + self.dbg(op, id, opts) + return self.selectTable(mapper, opts).get(id).delete().run() + }).then(function (cursor) { + let deleted = 0 + if (cursor && cursor.deleted) { + deleted = cursor.deleted + } + // afterDestroy lifecycle hook + op = opts.op = 'afterDestroy' + return resolve(self[op](mapper, id, opts, deleted ? id : undefined)).then(function (_id) { + // Allow for re-assignment from lifecycle hook + id = isUndefined(_id) && returnDeletedIds ? id : _id + const result = {} + fillIn(result, cursor) + result.data = deleted ? id : undefined + return self.getRaw(opts) ? result : result.data + }) }) }, @@ -271,20 +573,58 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * * @name RethinkDBAdapter#destroyAll * @method - * @param {Object} Resource the Resource. + * @param {Object} mapper the mapper. * @param {Object} [query] Selection query. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO + * @param {boolean} [opts.returnDeletedIds=false] Whether to return the + * primary keys of any deleted records. * @return {Promise} */ - destroyAll (Resource, query, opts) { + destroyAll (mapper, query, opts) { const self = this + const idAttribute = mapper.idAttribute + let op query || (query = {}) opts || (opts = {}) + const returnDeletedIds = isUndefined(opts.returnDeletedIds) ? self.returnDeletedIds : !!opts.returnDeletedIds - return self.waitForTable(Resource.table || underscore(Resource.name), opts).then(function () { - return self.filterSequence(self.selectTable(Resource, opts), query).delete().run() + return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + // beforeDestroyAll lifecycle hook + op = opts.op = 'beforeDestroyAll' + return resolve(self[op](mapper, query, opts)) }).then(function () { - return undefined + op = opts.op = 'destroyAll' + self.dbg(op, query, opts) + return self + .filterSequence(self.selectTable(mapper, opts), query) + .delete({ returnChanges: returnDeletedIds }) + .merge(function (cursor) { + return { + changes: cursor('changes').default([]).map(function (record) { + return record('old_val').default({})(idAttribute).default({}) + }).filter(function (id) { + return id + }) + } + }) + .run() + }).then(function (cursor) { + let deletedIds + if (cursor && cursor.changes && returnDeletedIds) { + deletedIds = cursor.changes + delete cursor.changes + } + // afterDestroyAll lifecycle hook + op = opts.op = 'afterDestroyAll' + return resolve(self[op](mapper, query, opts, deletedIds)).then(function (_deletedIds) { + // Allow for re-assignment from lifecycle hook + deletedIds = isUndefined(_deletedIds) ? deletedIds : _deletedIds + const result = {} + fillIn(result, cursor) + result.data = deletedIds + return self.getRaw(opts) ? result : result.data + }) }) }, @@ -299,7 +639,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @return {*} */ makeHasManyForeignKey (Resource, def, record) { - return DSUtils.get(record, Resource.idAttribute) + return def.getForeignKey(record) }, /** @@ -309,11 +649,11 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @method * @return {Promise} */ - loadHasMany (Resource, def, records, __options) { + loadHasMany (Resource, def, records, __opts) { const self = this let singular = false - if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + if (isObject(records) && !isArray(records)) { singular = true records = [records] } @@ -330,7 +670,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return id }) } - return self.findAll(Resource.getResource(def.relation), query, __options).then(function (relatedItems) { + return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) { records.forEach(function (record) { let attached = [] // avoid unneccesary iteration when we only have one record @@ -338,12 +678,12 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { attached = relatedItems } else { relatedItems.forEach(function (relatedItem) { - if (DSUtils.get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) { + if (get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) { attached.push(relatedItem) } }) } - DSUtils.set(record, def.localField, attached) + def.setLocalField(record, attached) }) }) }, @@ -355,15 +695,15 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @method * @return {Promise} */ - loadHasOne (Resource, def, records, __options) { - if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + loadHasOne (Resource, def, records, __opts) { + if (isObject(records) && !isArray(records)) { records = [records] } - return this.loadHasMany(Resource, def, records, __options).then(function () { + return this.loadHasMany(Resource, def, records, __opts).then(function () { records.forEach(function (record) { - const relatedData = DSUtils.get(record, def.localField) - if (DSUtils.isArray(relatedData) && relatedData.length) { - DSUtils.set(record, def.localField, relatedData[0]) + const relatedData = def.getLocalField(record) + if (isArray(relatedData) && relatedData.length) { + def.setLocalField(record, relatedData[0]) } }) }) @@ -377,7 +717,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @return {*} */ makeBelongsToForeignKey (Resource, def, record) { - return DSUtils.get(record, def.localKey) + return def.getForeignKey(record) }, /** @@ -387,18 +727,18 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @method * @return {Promise} */ - loadBelongsTo (Resource, def, records, __options) { + loadBelongsTo (mapper, def, records, __opts) { const self = this - const relationDef = Resource.getResource(def.relation) + const relationDef = def.getRelation() - if (DSUtils.isObject(records) && !DSUtils.isArray(records)) { + if (isObject(records) && !isArray(records)) { const record = records - return self.find(relationDef, self.makeBelongsToForeignKey(Resource, def, record), __options).then(function (relatedItem) { - DSUtils.set(record, def.localField, relatedItem) + return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) { + def.setLocalField(record, relatedItem) }) } else { const keys = records.map(function (record) { - return self.makeBelongsToForeignKey(Resource, def, record) + return self.makeBelongsToForeignKey(mapper, def, record) }).filter(function (key) { return key }) @@ -408,11 +748,11 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { 'in': keys } } - }, __options).then(function (relatedItems) { + }, __opts).then(function (relatedItems) { records.forEach(function (record) { relatedItems.forEach(function (relatedItem) { - if (relatedItem[relationDef.idAttribute] === record[def.localKey]) { - DSUtils.set(record, def.localField, relatedItem) + if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) { + def.setLocalField(record, relatedItem) } }) }) @@ -425,103 +765,106 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * * @name RethinkDBAdapter#find * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to retrieve. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO * @param {string[]} [opts.with=[]] TODO * @return {Promise} */ - find (Resource, id, opts) { + find (mapper, id, opts) { const self = this + let record, op opts || (opts = {}) opts.with || (opts.with = []) - let instance - const table = Resource.table || underscore(Resource.name) - const relationList = Resource.relationList || [] + const table = mapper.table || underscore(mapper.name) + const relationList = mapper.relationList || [] let tasks = [self.waitForTable(table, opts)] relationList.forEach(function (def) { const relationName = def.relation - const relationDef = Resource.getResource(relationName) - if (!relationDef) { - throw new JSData.DSErrors.NER(relationName) - } else if (!opts.with || !contains(opts.with, relationName)) { + const relationDef = def.getRelation() + if (!opts.with || opts.with.indexOf(relationName) === -1) { return } - if (def.foreignKey) { - tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts)) - } else if (def.localKey) { - tasks.push(self.waitForIndex(Resource.table || underscore(Resource.name), def.localKey, opts)) + if (def.foreignKey && def.type !== 'belongsTo') { + if (def.type === 'belongsTo') { + tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts)) + } else { + tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts)) + } } }) - return DSUtils.Promise.all(tasks).then(function () { - return self.selectTable(Resource, opts).get(id).run() - }).then(function (_instance) { - if (!_instance) { - throw new Error('Not Found!') + return Promise.all(tasks).then(function () { + // beforeFind lifecycle hook + op = opts.op = 'beforeFind' + return resolve(self[op](mapper, id, opts)).then(function () { + op = opts.op = 'find' + self.dbg(op, id, opts) + return self.selectTable(mapper, opts).get(id).run() + }) + }).then(function (_record) { + if (!_record) { + return } - instance = _instance - let tasks = [] - - relationList.forEach(function (def) { - let relationName = def.relation - let relationDef = Resource.getResource(relationName) - let containedName = null - if (opts.with.indexOf(relationName) !== -1) { - containedName = relationName - } else if (opts.with.indexOf(def.localField) !== -1) { - containedName = def.localField - } - if (containedName) { - let __options = DSUtils.deepMixIn({}, opts.orig ? opts.orig() : opts) - __options.with = opts.with.slice() - __options = DSUtils._(relationDef, __options) - DSUtils.remove(__options.with, containedName) - __options.with.forEach(function (relation, i) { - if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { - __options.with[i] = relation.substr(containedName.length + 1) - } else { - __options.with[i] = '' - } - }) + record = _record + const tasks = [] - let task + forEachRelation(mapper, opts, function (def, __opts) { + const relatedMapper = def.getRelation() + let task - if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { - if (def.type === 'hasOne') { - task = self.loadHasOne(Resource, def, instance, __options) - } else { - task = self.loadHasMany(Resource, def, instance, __options) + if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { + if (def.type === 'hasOne') { + task = self.loadHasOne(mapper, def, record, __opts) + } else { + task = self.loadHasMany(mapper, def, record, __opts) + } + } else if (def.type === 'hasMany' && def.localKeys) { + let localKeys = [] + let itemKeys = get(record, def.localKeys) || [] + itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys) + localKeys = localKeys.concat(itemKeys) + task = self.findAll(relatedMapper, { + where: { + [relatedMapper.idAttribute]: { + 'in': unique(localKeys).filter(function (x) { return x }) + } } - } else if (def.type === 'hasMany' && def.localKeys) { - let localKeys = [] - let itemKeys = instance[def.localKeys] || [] - itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys) - localKeys = localKeys.concat(itemKeys || []) - task = self.findAll(Resource.getResource(relationName), { - where: { - [relationDef.idAttribute]: { - 'in': unique(localKeys).filter((x) => x) - } + }, __opts).then(function (relatedItems) { + def.setLocalField(record, relatedItems) + }) + } else if (def.type === 'hasMany' && def.foreignKeys) { + task = self.findAll(relatedMapper, { + where: { + [def.foreignKeys]: { + 'contains': get(record, mapper.idAttribute) } - }, __options).then(function (relatedItems) { - DSUtils.set(instance, def.localField, relatedItems) - return relatedItems - }) - } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) { - task = self.loadBelongsTo(Resource, def, instance, __options) - } - - if (task) { - tasks.push(task) - } + } + }, __opts).then(function (relatedItems) { + def.setLocalField(record, relatedItems) + }) + } else if (def.type === 'belongsTo') { + task = self.loadBelongsTo(mapper, def, record, __opts) + } + if (task) { + tasks.push(task) } }) - return DSUtils.Promise.all(tasks) + return Promise.all(tasks) }).then(function () { - return instance + // afterFind lifecycle hook + op = opts.op = 'afterFind' + return resolve(self[op](mapper, id, opts, record)).then(function (_record) { + // Allow for re-assignment from lifecycle hook + record = isUndefined(_record) ? record : _record + return self.getRaw(opts) ? { + data: record, + found: record ? 1 : 0 + } : record + }) }) }, @@ -530,137 +873,210 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * * @name RethinkDBAdapter#findAll * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {Object} query Selection query. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO * @param {string[]} [opts.with=[]] TODO * @return {Promise} */ - findAll (Resource, query, opts) { + findAll (mapper, query, opts) { const self = this opts || (opts = {}) opts.with || (opts.with = []) - let items = null - const table = Resource.table || underscore(Resource.name) - const relationList = Resource.relationList || [] + let records = [] + let op + const table = mapper.table || underscore(mapper.name) + const relationList = mapper.relationList || [] let tasks = [self.waitForTable(table, opts)] relationList.forEach(function (def) { const relationName = def.relation - const relationDef = Resource.getResource(relationName) - if (!relationDef) { - throw new JSData.DSErrors.NER(relationName) - } else if (!opts.with || !contains(opts.with, relationName)) { + const relationDef = def.getRelation() + if (!opts.with || opts.with.indexOf(relationName) === -1) { return } - if (def.foreignKey) { - tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts)) - } else if (def.localKey) { - tasks.push(self.waitForIndex(Resource.table || underscore(Resource.name), def.localKey, opts)) + if (def.foreignKey && def.type !== 'belongsTo') { + if (def.type === 'belongsTo') { + tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts)) + } else { + tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts)) + } } }) - return DSUtils.Promise.all(tasks).then(function () { - return self.filterSequence(self.selectTable(Resource, opts), query).run() - }).then(function (_items) { - items = _items - let tasks = [] - const relationList = Resource.relationList || [] - relationList.forEach(function (def) { - let relationName = def.relation - let relationDef = Resource.getResource(relationName) - let containedName = null - if (opts.with.indexOf(relationName) !== -1) { - containedName = relationName - } else if (opts.with.indexOf(def.localField) !== -1) { - containedName = def.localField - } - if (containedName) { - let __options = DSUtils.deepMixIn({}, opts.orig ? opts.orig() : opts) - __options.with = opts.with.slice() - __options = DSUtils._(relationDef, __options) - DSUtils.remove(__options.with, containedName) - __options.with.forEach(function (relation, i) { - if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') { - __options.with[i] = relation.substr(containedName.length + 1) - } else { - __options.with[i] = '' - } + return Promise.all(tasks).then(function () { + // beforeFindAll lifecycle hook + op = opts.op = 'beforeFindAll' + return resolve(self[op](mapper, query, opts)) + }).then(function () { + op = opts.op = 'findAll' + self.dbg(op, query, opts) + return self.filterSequence(self.selectTable(mapper, opts), query).run() + }).then(function (_records) { + records = _records + const tasks = [] + forEachRelation(mapper, opts, function (def, __opts) { + const relatedMapper = def.getRelation() + const idAttribute = mapper.idAttribute + let task + if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { + if (def.type === 'hasMany') { + task = self.loadHasMany(mapper, def, records, __opts) + } else { + task = self.loadHasOne(mapper, def, records, __opts) + } + } else if (def.type === 'hasMany' && def.localKeys) { + let localKeys = [] + records.forEach(function (item) { + let itemKeys = item[def.localKeys] || [] + itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys) + localKeys = localKeys.concat(itemKeys) }) - - let task - - if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { - if (def.type === 'hasMany') { - task = self.loadHasMany(Resource, def, items, __options) - } else { - task = self.loadHasOne(Resource, def, items, __options) + task = self.findAll(relatedMapper, { + where: { + [relatedMapper.idAttribute]: { + 'in': unique(localKeys).filter(function (x) { return x }) + } } - } else if (def.type === 'hasMany' && def.localKeys) { - let localKeys = [] - items.forEach(function (item) { - let itemKeys = item[def.localKeys] || [] - itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : Object.keys(itemKeys) - localKeys = localKeys.concat(itemKeys || []) - }) - task = self.findAll(Resource.getResource(relationName), { - where: { - [relationDef.idAttribute]: { - 'in': unique(localKeys).filter((x) => x) + }, __opts).then(function (relatedItems) { + records.forEach(function (item) { + let attached = [] + let itemKeys = get(item, def.localKeys) || [] + itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys) + relatedItems.forEach(function (relatedItem) { + if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) { + attached.push(relatedItem) } - } - }, __options).then(function (relatedItems) { - items.forEach(function (item) { - let attached = [] - let itemKeys = item[def.localKeys] || [] - itemKeys = DSUtils.isArray(itemKeys) ? itemKeys : DSUtils.keys(itemKeys) - relatedItems.forEach(function (relatedItem) { - if (itemKeys && itemKeys.indexOf(relatedItem[relationDef.idAttribute]) !== -1) { - attached.push(relatedItem) - } + }) + def.setLocalField(item, attached) + }) + return relatedItems + }) + } else if (def.type === 'hasMany' && def.foreignKeys) { + task = self.findAll(relatedMapper, { + where: { + [def.foreignKeys]: { + 'isectNotEmpty': records.map(function (record) { + return get(record, idAttribute) }) - DSUtils.set(item, def.localField, attached) + } + } + }, __opts).then(function (relatedItems) { + const foreignKeysField = def.foreignKeys + records.forEach(function (record) { + const _relatedItems = [] + const id = get(record, idAttribute) + relatedItems.forEach(function (relatedItem) { + const foreignKeys = get(relatedItems, foreignKeysField) || [] + if (foreignKeys.indexOf(id) !== -1) { + _relatedItems.push(relatedItem) + } }) - return relatedItems + def.setLocalField(record, _relatedItems) }) - } else if (def.type === 'belongsTo' || (def.type === 'hasOne' && def.localKey)) { - task = self.loadBelongsTo(Resource, def, items, __options) - } - - if (task) { - tasks.push(task) - } + }) + } else if (def.type === 'belongsTo') { + task = self.loadBelongsTo(mapper, def, records, __opts) + } + if (task) { + tasks.push(task) } }) - return DSUtils.Promise.all(tasks) + return Promise.all(tasks) }).then(function () { - return items + // afterFindAll lifecycle hook + op = opts.op = 'afterFindAll' + return resolve(self[op](mapper, query, opts, records)).then(function (_records) { + // Allow for re-assignment from lifecycle hook + records = isUndefined(_records) ? records : _records + return self.getRaw(opts) ? { + data: records, + found: records.length + } : records + }) }) }, + /** + * TODO + * + * @name RethinkDBAdapter#getRaw + * @method + */ + getRaw (opts) { + opts || (opts = {}) + return !!(isUndefined(opts.raw) ? this.raw : opts.raw) + }, + + /** + * TODO + * + * @name RethinkDBAdapter#log + * @method + */ + log (level, ...args) { + if (level && !args.length) { + args.push(level) + level = 'debug' + } + if (level === 'debug' && !this.debug) { + return + } + const prefix = `${level.toUpperCase()}: (RethinkDBAdapter)` + if (console[level]) { + console[level](prefix, ...args) + } else { + console.log(prefix, ...args) + } + }, + /** * Apply the given update to the record with the specified primary key. * * @name RethinkDBAdapter#update * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {(string|number)} id The primary key of the record to be updated. * @param {Object} props The update to apply to the record. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO * @return {Promise} */ - update (resourceConfig, id, attrs, options) { - attrs = removeCircular(omit(attrs, resourceConfig.relationFields || [])) - options = options || {} - return this.waitForTable(resourceConfig.table || underscore(resourceConfig.name), options).then(() => { - return this.r.db(options.db || this.defaults.db).table(resourceConfig.table || underscore(resourceConfig.name)).get(id).update(attrs, {returnChanges: true}).run() - }).then((cursor) => { - this._handleErrors(cursor) - if (cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { - return cursor.changes[0].new_val + update (mapper, id, props, opts) { + const self = this + props || (props = {}) + opts || (opts = {}) + let op + + return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + // beforeUpdate lifecycle hook + op = opts.op = 'beforeUpdate' + return resolve(self[op](mapper, id, props, opts)) + }).then(function (_props) { + // Allow for re-assignment from lifecycle hook + _props = isUndefined(_props) ? props : _props + return self.selectTable(mapper, opts).get(id).update(_props, { returnChanges: true }).run() + }).then(function (cursor) { + let record + self._handleErrors(cursor) + if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { + record = cursor.changes[0].new_val } else { - return this.selectTable(resourceConfig, options).get(id).run() + throw new Error('Not Found') } + + // afterUpdate lifecycle hook + op = opts.op = 'afterUpdate' + return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) { + // Allow for re-assignment from lifecycle hook + record = isUndefined(_record) ? record : _record + const result = {} + fillIn(result, cursor) + result.data = record + result.updated = record ? 1 : 0 + return self.getRaw(opts) ? result : result.data + }) }) }, @@ -669,33 +1085,102 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * * @name RethinkDBAdapter#updateAll * @method - * @param {Object} Resource The Resource. + * @param {Object} mapper The mapper. * @param {Object} props The update to apply to the selected records. * @param {Object} [query] Selection query. * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO * @return {Promise} */ - updateAll (resourceConfig, attrs, params, options) { - attrs = removeCircular(omit(attrs, resourceConfig.relationFields || [])) - options = options || {} - params = params || {} - return this.waitForTable(resourceConfig.table || underscore(resourceConfig.name), options).then(() => { - return this.filterSequence(this.selectTable(resourceConfig, options), params).update(attrs, {returnChanges: true}).run() - }).then((cursor) => { - this._handleErrors(cursor) + updateAll (mapper, props, query, opts) { + const self = this + props || (props = {}) + query || (query = {}) + opts || (opts = {}) + let op + + return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + // beforeUpdateAll lifecycle hook + op = opts.op = 'beforeUpdateAll' + return resolve(self[op](mapper, props, query, opts)) + }).then(function (_props) { + // Allow for re-assignment from lifecycle hook + _props = isUndefined(_props) ? props : _props + return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, { returnChanges: true }).run() + }).then(function (cursor) { + let records = [] + self._handleErrors(cursor) if (cursor && cursor.changes && cursor.changes.length) { - let items = [] - cursor.changes.forEach((change) => items.push(change.new_val)) - return items - } else { - return this.filterSequence(this.selectTable(resourceConfig, options), params).run() + records = cursor.changes.map(function (change) { return change.new_val }) + } + // afterUpdateAll lifecycle hook + op = opts.op = 'afterUpdateAll' + return self[op](mapper, props, query, opts, records).then(function (_records) { + // Allow for re-assignment from lifecycle hook + records = isUndefined(_records) ? records : _records + const result = {} + fillIn(result, cursor) + result.data = records + result.updated = records.length + return self.getRaw(opts) ? result : result.data + }) + }) + }, + + /** + * Update the given records in a single batch. + * + * @name RethinkDBAdapter#updateMany + * @method + * @param {Object} mapper The mapper. + * @param {Object[]} records The records to update. + * @param {Object} [opts] Configuration options. + * @param {boolean} [opts.raw=false] TODO + * @return {Promise} + */ + updateMany (mapper, records, opts) { + const self = this + records || (records = []) + opts || (opts = {}) + let op + const idAttribute = mapper.idAttribute + + records = records.filter(function (record) { + return get(record, idAttribute) + }) + + return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + // beforeUpdateMany lifecycle hook + op = opts.op = 'beforeUpdateMany' + return resolve(self[op](mapper, records, opts)) + }).then(function (_records) { + // Allow for re-assignment from lifecycle hook + _records = isUndefined(_records) ? records : _records + return self.selectTable(mapper, opts).insert(_records, { returnChanges: true, conflict: 'update' }).run() + }).then(function (cursor) { + let updatedRecords + self._handleErrors(cursor) + if (cursor && cursor.changes && cursor.changes.length) { + updatedRecords = cursor.changes.map(function (change) { return change.new_val }) } + + // afterUpdateMany lifecycle hook + op = opts.op = 'afterUpdateMany' + return resolve(self[op](mapper, records, opts, updatedRecords)).then(function (_records) { + // Allow for re-assignment from lifecycle hook + records = isUndefined(_records) ? updatedRecords : _records + const result = {} + fillIn(result, cursor) + result.data = records + result.updated = records.length + return self.getRaw(opts) ? result : result.data + }) }) }, waitForTable (table, options) { options = options || {} - let db = options.db || this.defaults.db + let db = isUndefined(options.db) ? this.db : options.db return this.waitForDb(options).then(() => { this.tables[db] = this.tables[db] || {} if (!this.tables[db][table]) { @@ -707,7 +1192,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { waitForIndex (table, index, options) { options = options || {} - let db = options.db || this.defaults.db + let db = isUndefined(options.db) ? this.db : options.db return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => { this.indices[db] = this.indices[db] || {} this.indices[db][table] = this.indices[db][table] || {} From be2e613df1f99ca47af098ebba6cdef8901892f0 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Fri, 26 Feb 2016 11:39:37 -0800 Subject: [PATCH 02/27] Update readme --- README.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index c042bea..2ee7c09 100644 --- a/README.md +++ b/README.md @@ -28,18 +28,16 @@ To get started, visit __[http://js-data.io](http://www.js-data.io)__. `npm install --save js-data js-data-rethinkdb`. ```js -var JSData = require('js-data'); -var RethinkDBAdapter = require('js-data-rethinkdb'); +import {Container} from 'js-data' +import RethinkDBAdapter from 'js-data-rethinkdb' -var store = new JSData.DS(); -var adapter = new RethinkDBAdapter(); +const store = new Container() +const adapter = new RethinkDBAdapter() // "store" will now use the RethinkDB adapter for all async operations store.registerAdapter('rethinkdb', adapter, { default: true }); -var User = store.defineResource({ - name: 'user' -}); +store.defineMapper('user'); ``` ## Example App From 6b6ed721cb008177e7822037fb98bb5715812043 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Fri, 26 Feb 2016 11:41:37 -0800 Subject: [PATCH 03/27] Fix devDependency --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3fc7f91..8221668 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "coveralls": "2.11.6", "ink-docstrap": "1.1.2", "istanbul": "0.4.2", - "js-data-adapter-tests": "^2.0.0-alpha.6", + "js-data-adapter-tests": "^2.0.0-alpha.7", "jsdoc": "3.4.0", "mocha": "2.4.5", "rollup": "0.25.4", From 9ab69c336aa34e2c5e52bc42179458431ffc3d5d Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Fri, 26 Feb 2016 16:55:38 -0800 Subject: [PATCH 04/27] 3.0.0-alpha.2 --- CHANGELOG.md | 5 +++++ CONTRIBUTORS | 2 +- dist/js-data-rethinkdb.js | 6 +++--- dist/js-data-rethinkdb.js.map | 2 +- package.json | 4 ++-- src/index.js | 6 +++--- 6 files changed, 15 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec18cda..be11183 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +##### 3.0.0-alpha.2 - 26 February 2016 + +###### Backwards compatible bug fixes +- Fixed edge case with returnDeletedIds + ##### 3.0.0-alpha.1 - 26 February 2016 ###### Breaking API changes diff --git a/CONTRIBUTORS b/CONTRIBUTORS index efe33cf..d7f1f97 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -5,5 +5,5 @@ # Names should be added to this file as: # [commit count] Name 1 InternalFX - 39 Jason Dobry + 43 Jason Dobry 2 Ollie Relph diff --git a/dist/js-data-rethinkdb.js b/dist/js-data-rethinkdb.js index 19c95a0..b35a8b5 100644 --- a/dist/js-data-rethinkdb.js +++ b/dist/js-data-rethinkdb.js @@ -579,17 +579,17 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return self.selectTable(mapper, opts).get(id).delete().run(); }).then(function (cursor) { var deleted = 0; - if (cursor && cursor.deleted) { + if (cursor && cursor.deleted && returnDeletedIds) { deleted = cursor.deleted; } // afterDestroy lifecycle hook op = opts.op = 'afterDestroy'; return resolve(self[op](mapper, id, opts, deleted ? id : undefined)).then(function (_id) { // Allow for re-assignment from lifecycle hook - id = isUndefined(_id) && returnDeletedIds ? id : _id; + id = isUndefined(_id) && deleted ? id : _id; var result = {}; fillIn(result, cursor); - result.data = deleted ? id : undefined; + result.data = id; return self.getRaw(opts) ? result : result.data; }); }); diff --git a/dist/js-data-rethinkdb.js.map b/dist/js-data-rethinkdb.js.map index 45f3e83..c92bfc1 100644 --- a/dist/js-data-rethinkdb.js.map +++ b/dist/js-data-rethinkdb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["let rethinkdbdash = require('rethinkdbdash')\nimport {utils} from 'js-data'\nconst {\n addHiddenPropsToTarget,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n resolve\n} = utils\n\nconst underscore = require('mout/string/underscore')\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nconst unique = function (array) {\n const seen = {}\n const final = []\n array.forEach(function (item) {\n if (item in seen) {\n return\n }\n final.push(item)\n seen[item] = 0\n })\n return final\n}\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst DEFAULTS = {\n /**\n * TODO\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#returnDeletedIds\n * @type {boolean}\n * @default false\n */\n returnDeletedIds: false\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * import {DS} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new DS()\n * const adapter = new RethinkDBAdapter()\n * store.registerAdapter('rethinkdb', adapter, { 'default': true })\n *\n * @class RethinkDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.host='localhost'] TODO\n * @param {number} [opts.port=28015] TODO\n * @param {string} [opts.authKey=''] TODO\n * @param {string} [opts.db='test'] TODO\n * @param {number} [opts.min=10] TODO\n * @param {number} [opts.max=50] TODO\n * @param {number} [opts.bufferSize=10] TODO\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n /**\n * @name RethinkDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name RethinkDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (Resource, opts) {\n return this.selectDb(opts).table(Resource.table || underscore(Resource.name))\n },\n\n filterSequence (sequence, params) {\n let r = this.r\n params = params || {}\n params.where = params.where || {}\n params.orderBy = params.orderBy || params.sort\n params.skip = params.skip || params.offset\n\n Object.keys(params).forEach(function (k) {\n let v = params[k]\n if (reserved.indexOf(k) === -1) {\n if (isObject(v)) {\n params.where[k] = v\n } else {\n params.where[k] = {\n '==': v\n }\n }\n delete params[k]\n }\n })\n\n let query = sequence\n\n if (Object.keys(params.where).length !== 0) {\n query = query.filter(function (row) {\n let subQuery\n forOwn(params.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '!=' || op === '!==') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '>') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '>=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '<') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '<=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === 'isectEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === 'isectNotEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === 'in') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === 'notIn') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === 'contains') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v)) : row(field).default([]).contains(v)\n } else if (op === 'notContains') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not()\n } else if (op === '|==' || op === '|===') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '|!=' || op === '|!==') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '|>') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '|>=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '|<') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '|<=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === '|isectEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === '|isectNotEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === '|in') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === '|notIn') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === '|contains') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v)) : row(field).default([]).contains(v)\n } else if (op === '|notContains') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not()\n }\n })\n })\n return subQuery || true\n })\n }\n\n if (params.orderBy) {\n if (isString(params.orderBy)) {\n params.orderBy = [\n [params.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < params.orderBy.length; i++) {\n if (isString(params.orderBy[i])) {\n params.orderBy[i] = [params.orderBy[i], 'asc']\n }\n query = (params.orderBy[i][1] || '').toUpperCase() === 'DESC' ? query.orderBy(r.desc(params.orderBy[i][0])) : query.orderBy(params.orderBy[i][0])\n }\n }\n\n if (params.skip) {\n query = query.skip(+params.skip)\n }\n\n if (params.limit) {\n query = query.limit(+params.limit)\n }\n\n return query\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.selectTable(mapper, opts).insert(_props, { returnChanges: true }).run()\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return self[op](mapper, props, opts, record).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.created = record ? 1 : 0\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.selectTable(mapper, opts).insert(_props, { returnChanges: true }).run()\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return self[op](mapper, props, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.created = records.length\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @param {boolean} [opts.returnDeletedIds=false] Whether to return the\n * primary keys of any deleted records.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n const returnDeletedIds = isUndefined(opts.returnDeletedIds) ? self.returnDeletedIds : !!opts.returnDeletedIds\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete().run()\n }).then(function (cursor) {\n let deleted = 0\n if (cursor && cursor.deleted) {\n deleted = cursor.deleted\n }\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, deleted ? id : undefined)).then(function (_id) {\n // Allow for re-assignment from lifecycle hook\n id = isUndefined(_id) && returnDeletedIds ? id : _id\n const result = {}\n fillIn(result, cursor)\n result.data = deleted ? id : undefined\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @param {boolean} [opts.returnDeletedIds=false] Whether to return the\n * primary keys of any deleted records.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n const idAttribute = mapper.idAttribute\n let op\n query || (query = {})\n opts || (opts = {})\n const returnDeletedIds = isUndefined(opts.returnDeletedIds) ? self.returnDeletedIds : !!opts.returnDeletedIds\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete({ returnChanges: returnDeletedIds })\n .merge(function (cursor) {\n return {\n changes: cursor('changes').default([]).map(function (record) {\n return record('old_val').default({})(idAttribute).default({})\n }).filter(function (id) {\n return id\n })\n }\n })\n .run()\n }).then(function (cursor) {\n let deletedIds\n if (cursor && cursor.changes && returnDeletedIds) {\n deletedIds = cursor.changes\n delete cursor.changes\n }\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, deletedIds)).then(function (_deletedIds) {\n // Allow for re-assignment from lifecycle hook\n deletedIds = isUndefined(_deletedIds) ? deletedIds : _deletedIds\n const result = {}\n fillIn(result, cursor)\n result.data = deletedIds\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * TODO\n *\n * There may be reasons why you may want to override this method, like when\n * the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name RethinkDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (Resource, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (Resource, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(Resource, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (Resource, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(Resource, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (Resource, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @param {string[]} [opts.with=[]] TODO\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const table = mapper.table || underscore(mapper.name)\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(table, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts)).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run()\n })\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n return self.getRaw(opts) ? {\n data: record,\n found: record ? 1 : 0\n } : record\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @param {string[]} [opts.with=[]] TODO\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const table = mapper.table || underscore(mapper.name)\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(table, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run()\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, records)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n return self.getRaw(opts) ? {\n data: records,\n found: records.length\n } : records\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#getRaw\n * @method\n */\n getRaw (opts) {\n opts || (opts = {})\n return !!(isUndefined(opts.raw) ? this.raw : opts.raw)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (RethinkDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.selectTable(mapper, opts).get(id).update(_props, { returnChanges: true }).run()\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = record ? 1 : 0\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, { returnChanges: true }).run()\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return self[op](mapper, props, query, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n return self.selectTable(mapper, opts).insert(_records, { returnChanges: true, conflict: 'update' }).run()\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, updatedRecords)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? updatedRecords : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n waitForTable (table, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n"],"names":["utils"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["let rethinkdbdash = require('rethinkdbdash')\nimport {utils} from 'js-data'\nconst {\n addHiddenPropsToTarget,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n resolve\n} = utils\n\nconst underscore = require('mout/string/underscore')\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nconst unique = function (array) {\n const seen = {}\n const final = []\n array.forEach(function (item) {\n if (item in seen) {\n return\n }\n final.push(item)\n seen[item] = 0\n })\n return final\n}\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst DEFAULTS = {\n /**\n * TODO\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#returnDeletedIds\n * @type {boolean}\n * @default false\n */\n returnDeletedIds: false\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * import {DS} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new DS()\n * const adapter = new RethinkDBAdapter()\n * store.registerAdapter('rethinkdb', adapter, { 'default': true })\n *\n * @class RethinkDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.host='localhost'] TODO\n * @param {number} [opts.port=28015] TODO\n * @param {string} [opts.authKey=''] TODO\n * @param {string} [opts.db='test'] TODO\n * @param {number} [opts.min=10] TODO\n * @param {number} [opts.max=50] TODO\n * @param {number} [opts.bufferSize=10] TODO\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n /**\n * @name RethinkDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name RethinkDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (Resource, opts) {\n return this.selectDb(opts).table(Resource.table || underscore(Resource.name))\n },\n\n filterSequence (sequence, params) {\n let r = this.r\n params = params || {}\n params.where = params.where || {}\n params.orderBy = params.orderBy || params.sort\n params.skip = params.skip || params.offset\n\n Object.keys(params).forEach(function (k) {\n let v = params[k]\n if (reserved.indexOf(k) === -1) {\n if (isObject(v)) {\n params.where[k] = v\n } else {\n params.where[k] = {\n '==': v\n }\n }\n delete params[k]\n }\n })\n\n let query = sequence\n\n if (Object.keys(params.where).length !== 0) {\n query = query.filter(function (row) {\n let subQuery\n forOwn(params.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '!=' || op === '!==') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '>') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '>=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '<') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '<=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === 'isectEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === 'isectNotEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === 'in') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === 'notIn') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === 'contains') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v)) : row(field).default([]).contains(v)\n } else if (op === 'notContains') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not()\n } else if (op === '|==' || op === '|===') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '|!=' || op === '|!==') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '|>') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '|>=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '|<') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '|<=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === '|isectEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === '|isectNotEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === '|in') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === '|notIn') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === '|contains') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v)) : row(field).default([]).contains(v)\n } else if (op === '|notContains') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not()\n }\n })\n })\n return subQuery || true\n })\n }\n\n if (params.orderBy) {\n if (isString(params.orderBy)) {\n params.orderBy = [\n [params.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < params.orderBy.length; i++) {\n if (isString(params.orderBy[i])) {\n params.orderBy[i] = [params.orderBy[i], 'asc']\n }\n query = (params.orderBy[i][1] || '').toUpperCase() === 'DESC' ? query.orderBy(r.desc(params.orderBy[i][0])) : query.orderBy(params.orderBy[i][0])\n }\n }\n\n if (params.skip) {\n query = query.skip(+params.skip)\n }\n\n if (params.limit) {\n query = query.limit(+params.limit)\n }\n\n return query\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.selectTable(mapper, opts).insert(_props, { returnChanges: true }).run()\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return self[op](mapper, props, opts, record).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.created = record ? 1 : 0\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.selectTable(mapper, opts).insert(_props, { returnChanges: true }).run()\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return self[op](mapper, props, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.created = records.length\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @param {boolean} [opts.returnDeletedIds=false] Whether to return the\n * primary keys of any deleted records.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n const returnDeletedIds = isUndefined(opts.returnDeletedIds) ? self.returnDeletedIds : !!opts.returnDeletedIds\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete().run()\n }).then(function (cursor) {\n let deleted = 0\n if (cursor && cursor.deleted && returnDeletedIds) {\n deleted = cursor.deleted\n }\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, deleted ? id : undefined)).then(function (_id) {\n // Allow for re-assignment from lifecycle hook\n id = isUndefined(_id) && deleted ? id : _id\n const result = {}\n fillIn(result, cursor)\n result.data = id\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @param {boolean} [opts.returnDeletedIds=false] Whether to return the\n * primary keys of any deleted records.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n const idAttribute = mapper.idAttribute\n let op\n query || (query = {})\n opts || (opts = {})\n const returnDeletedIds = isUndefined(opts.returnDeletedIds) ? self.returnDeletedIds : !!opts.returnDeletedIds\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete({ returnChanges: returnDeletedIds })\n .merge(function (cursor) {\n return {\n changes: cursor('changes').default([]).map(function (record) {\n return record('old_val').default({})(idAttribute).default({})\n }).filter(function (id) {\n return id\n })\n }\n })\n .run()\n }).then(function (cursor) {\n let deletedIds\n if (cursor && cursor.changes && returnDeletedIds) {\n deletedIds = cursor.changes\n delete cursor.changes\n }\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, deletedIds)).then(function (_deletedIds) {\n // Allow for re-assignment from lifecycle hook\n deletedIds = isUndefined(_deletedIds) ? deletedIds : _deletedIds\n const result = {}\n fillIn(result, cursor)\n result.data = deletedIds\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * TODO\n *\n * There may be reasons why you may want to override this method, like when\n * the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name RethinkDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (Resource, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (Resource, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(Resource, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (Resource, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(Resource, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (Resource, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @param {string[]} [opts.with=[]] TODO\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const table = mapper.table || underscore(mapper.name)\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(table, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts)).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run()\n })\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n return self.getRaw(opts) ? {\n data: record,\n found: record ? 1 : 0\n } : record\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @param {string[]} [opts.with=[]] TODO\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const table = mapper.table || underscore(mapper.name)\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(table, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run()\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, records)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n return self.getRaw(opts) ? {\n data: records,\n found: records.length\n } : records\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#getRaw\n * @method\n */\n getRaw (opts) {\n opts || (opts = {})\n return !!(isUndefined(opts.raw) ? this.raw : opts.raw)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (RethinkDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.selectTable(mapper, opts).get(id).update(_props, { returnChanges: true }).run()\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = record ? 1 : 0\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, { returnChanges: true }).run()\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return self[op](mapper, props, query, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n return self.selectTable(mapper, opts).insert(_records, { returnChanges: true, conflict: 'update' }).run()\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, updatedRecords)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? updatedRecords : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n waitForTable (table, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n"],"names":["utils"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 8221668..c830892 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-rethinkdb", "description": "RethinkDB adapter for js-data.", - "version": "3.0.0-alpha.1", + "version": "3.0.0-alpha.2", "homepage": "https://github.com/js-data/js-data-rethinkdb", "repository": { "type": "git", @@ -59,7 +59,7 @@ "babel-preset-stage-0": "6.5.0", "chai": "3.5.0", "codacy-coverage": "1.1.3", - "coveralls": "2.11.6", + "coveralls": "2.11.8", "ink-docstrap": "1.1.2", "istanbul": "0.4.2", "js-data-adapter-tests": "^2.0.0-alpha.7", diff --git a/src/index.js b/src/index.js index 63d7fe5..cffd568 100644 --- a/src/index.js +++ b/src/index.js @@ -552,17 +552,17 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return self.selectTable(mapper, opts).get(id).delete().run() }).then(function (cursor) { let deleted = 0 - if (cursor && cursor.deleted) { + if (cursor && cursor.deleted && returnDeletedIds) { deleted = cursor.deleted } // afterDestroy lifecycle hook op = opts.op = 'afterDestroy' return resolve(self[op](mapper, id, opts, deleted ? id : undefined)).then(function (_id) { // Allow for re-assignment from lifecycle hook - id = isUndefined(_id) && returnDeletedIds ? id : _id + id = isUndefined(_id) && deleted ? id : _id const result = {} fillIn(result, cursor) - result.data = deleted ? id : undefined + result.data = id return self.getRaw(opts) ? result : result.data }) }) From 2ca22fe152f6c457007a7ad803fb71c89779adda Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Fri, 26 Feb 2016 21:52:55 -0800 Subject: [PATCH 05/27] 3.0.0-alpha.3 --- CHANGELOG.md | 6 + CONTRIBUTORS | 2 +- README.md | 20 ++- dist/js-data-rethinkdb.js | 291 ++++++++++++++++++++------------- dist/js-data-rethinkdb.js.map | 2 +- mocha.start.js | 2 +- package.json | 12 +- src/index.js | 293 +++++++++++++++++++++------------- 8 files changed, 391 insertions(+), 237 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be11183..3538ce0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +##### 3.0.0-alpha.3 - 26 February 2016 + +###### Backwards compatible API changes +- Removed returnDeletedIds option +- Added insertOpts, updateOpts, deleteOpts, and runOpts options + ##### 3.0.0-alpha.2 - 26 February 2016 ###### Backwards compatible bug fixes diff --git a/CONTRIBUTORS b/CONTRIBUTORS index d7f1f97..8ea5f2b 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -5,5 +5,5 @@ # Names should be added to this file as: # [commit count] Name 1 InternalFX - 43 Jason Dobry + 44 Jason Dobry 2 Ollie Relph diff --git a/README.md b/README.md index 2ee7c09..19d3a30 100644 --- a/README.md +++ b/README.md @@ -28,16 +28,30 @@ To get started, visit __[http://js-data.io](http://www.js-data.io)__. `npm install --save js-data js-data-rethinkdb`. ```js +// Use Container instead of DataStore on the server import {Container} from 'js-data' import RethinkDBAdapter from 'js-data-rethinkdb' +// Create a store to hold your Mappers const store = new Container() + +// Create an instance of RethinkDBAdapter with default settings const adapter = new RethinkDBAdapter() -// "store" will now use the RethinkDB adapter for all async operations -store.registerAdapter('rethinkdb', adapter, { default: true }); +// Mappers in "store" will use the RethinkDB adapter by default +store.registerAdapter('rethinkdb', adapter, { default: true }) + +// Create a Mapper that maps to a "user" table +store.defineMapper('user') +``` -store.defineMapper('user'); +```js +async function findAllAdminUsers () { + // Find all users where "user.role" == "admin" + return await store.findAll('user', { + role: 'admin' + }) +} ``` ## Example App diff --git a/dist/js-data-rethinkdb.js b/dist/js-data-rethinkdb.js index b35a8b5..f37794e 100644 --- a/dist/js-data-rethinkdb.js +++ b/dist/js-data-rethinkdb.js @@ -1,6 +1,10 @@ 'use strict'; +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + var jsData = require('js-data'); +var rethinkdbdash = _interopDefault(require('rethinkdbdash')); +var underscore = _interopDefault(require('mout/string/underscore')); var babelHelpers = {}; babelHelpers.typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { @@ -26,7 +30,6 @@ babelHelpers.defineProperty = function (obj, key, value) { babelHelpers; -var rethinkdbdash = require('rethinkdbdash'); var addHiddenPropsToTarget = jsData.utils.addHiddenPropsToTarget; var fillIn = jsData.utils.fillIn; var forEachRelation = jsData.utils.forEachRelation; @@ -39,8 +42,6 @@ var isUndefined = jsData.utils.isUndefined; var resolve = jsData.utils.resolve; -var underscore = require('mout/string/underscore'); - var reserved = ['orderBy', 'sort', 'limit', 'offset', 'skip', 'where']; var unique = function unique(array) { @@ -82,7 +83,7 @@ var noop2 = function noop2() { var DEFAULTS = { /** - * TODO + * RethinkDB authorization key. * * @name RethinkDBAdapter#authKey * @type {string} @@ -90,7 +91,7 @@ var DEFAULTS = { authKey: '', /** - * TODO + * Buffer size for connection pool. * * @name RethinkDBAdapter#bufferSize * @type {number} @@ -99,7 +100,7 @@ var DEFAULTS = { bufferSize: 10, /** - * TODO + * Default database. * * @name RethinkDBAdapter#db * @type {string} @@ -108,7 +109,7 @@ var DEFAULTS = { db: 'test', /** - * TODO + * Whether to log debugging information. * * @name RethinkDBAdapter#debug * @type {boolean} @@ -117,7 +118,7 @@ var DEFAULTS = { debug: false, /** - * TODO + * RethinkDB host. * * @name RethinkDBAdapter#host * @type {string} @@ -126,7 +127,7 @@ var DEFAULTS = { host: 'localhost', /** - * TODO + * Minimum connections in pool. * * @name RethinkDBAdapter#min * @type {number} @@ -135,7 +136,7 @@ var DEFAULTS = { min: 10, /** - * TODO + * Maximum connections in pool. * * @name RethinkDBAdapter#max * @type {number} @@ -144,7 +145,7 @@ var DEFAULTS = { max: 50, /** - * TODO + * RethinkDB port. * * @name RethinkDBAdapter#port * @type {number} @@ -153,49 +154,106 @@ var DEFAULTS = { port: 28015, /** - * TODO + * Whether to return a more detailed response object. * * @name RethinkDBAdapter#raw * @type {boolean} * @default false */ - raw: false, - - /** - * TODO - * - * @name RethinkDBAdapter#returnDeletedIds - * @type {boolean} - * @default false - */ - returnDeletedIds: false + raw: false }; +var INSERT_OPTS_DEFAULTS = {}; +var UPDATE_OPTS_DEFAULTS = {}; +var DELETE_OPTS_DEFAULTS = {}; +var RUN_OPTS_DEFAULTS = {}; + /** * RethinkDBAdapter class. * * @example - * import {DS} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new DS() - * const adapter = new RethinkDBAdapter() - * store.registerAdapter('rethinkdb', adapter, { 'default': true }) + * // Use Container instead of DataStore on the server + * import {Container} from 'js-data' + * import RethinkdbDBAdapter from 'js-data-rethinkdb' + * + * // Create a store to hold your Mappers + * const store = new Container() + * + * // Create an instance of RethinkdbDBAdapter with default settings + * const adapter = new RethinkdbDBAdapter() + * + * // Mappers in "store" will use the RethinkDB adapter by default + * store.registerAdapter('rethinkdb', adapter, { default: true }) + * + * // Create a Mapper that maps to a "user" table + * store.defineMapper('user') * * @class RethinkDBAdapter * @param {Object} [opts] Configuration opts. - * @param {string} [opts.host='localhost'] TODO - * @param {number} [opts.port=28015] TODO - * @param {string} [opts.authKey=''] TODO - * @param {string} [opts.db='test'] TODO - * @param {number} [opts.min=10] TODO - * @param {number} [opts.max=50] TODO - * @param {number} [opts.bufferSize=10] TODO + * @param {string} [opts.authKey=""] RethinkDB authorization key. + * @param {number} [opts.bufferSize=10] Buffer size for connection pool. + * @param {string} [opts.db="test"] Default database. + * @param {boolean} [opts.debug=false] Whether to log debugging information. + * @param {string} [opts.host="localhost"] RethinkDB host. + * @param {number} [opts.max=50] Maximum connections in pool. + * @param {number} [opts.min=10] Minimum connections in pool. + * @param {number} [opts.port=28015] RethinkDB port. + * @param {boolean} [opts.raw=false] Whether to return detailed result objects + * instead of just record data. */ function RethinkDBAdapter(opts) { var self = this; opts || (opts = {}); fillIn(opts, DEFAULTS); fillIn(self, opts); + + /** + * Default options to pass to r#insert. + * + * @name RethinkDBAdapter#insertOpts + * @type {Object} + * @default {} + */ + self.insertOpts || (self.insertOpts = {}); + fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS); + + /** + * Default options to pass to r#update. + * + * @name RethinkDBAdapter#updateOpts + * @type {Object} + * @default {} + */ + self.updateOpts || (self.updateOpts = {}); + fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS); + + /** + * Default options to pass to r#delete. + * + * @name RethinkDBAdapter#deleteOpts + * @type {Object} + * @default {} + */ + self.deleteOpts || (self.deleteOpts = {}); + fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS); + + /** + * Default options to pass to r#run. + * + * @name RethinkDBAdapter#runOpts + * @type {Object} + * @default {} + */ + self.runOpts || (self.runOpts = {}); + fillIn(self.runOpts, RUN_OPTS_DEFAULTS); + + /** + * The rethinkdbdash instance used by this adapter. Use this directly when you + * need to write custom queries. + * + * @name RethinkDBAdapter#r + * @type {Object} + */ self.r = rethinkdbdash(opts); self.databases = {}; self.tables = {}; @@ -464,7 +522,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} mapper The mapper. * @param {Object} props The record to be created. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO + * @param {Object} [opts.insertOpts] Options to pass to r#insert. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @return {Promise} */ create: function create(mapper, props, opts) { @@ -473,14 +534,16 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { props || (props = {}); opts || (opts = {}); - return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + return self.waitForTable(mapper, opts).then(function () { // beforeCreate lifecycle hook op = opts.op = 'beforeCreate'; return resolve(self[op](mapper, props, opts)); }).then(function (_props) { // Allow for re-assignment from lifecycle hook _props = isUndefined(_props) ? props : _props; - return self.selectTable(mapper, opts).insert(_props, { returnChanges: true }).run(); + var insertOpts = self.getOpt('insertOpts', opts); + insertOpts.returnChanges = true; + return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { self._handleErrors(cursor); var record = undefined; @@ -496,7 +559,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { fillIn(result, cursor); result.data = record; result.created = record ? 1 : 0; - return self.getRaw(opts) ? result : result.data; + return self.getOpt('raw', opts) ? result : result.data; }); }); }, @@ -510,7 +573,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} mapper The mapper. * @param {Object} props The records to be created. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO + * @param {Object} [opts.insertOpts] Options to pass to r#insert. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @return {Promise} */ createMany: function createMany(mapper, props, opts) { @@ -519,14 +585,16 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { props || (props = {}); opts || (opts = {}); - return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + return self.waitForTable(mapper, opts).then(function () { // beforeCreateMany lifecycle hook op = opts.op = 'beforeCreateMany'; return resolve(self[op](mapper, props, opts)); }).then(function (_props) { // Allow for re-assignment from lifecycle hook _props = isUndefined(_props) ? props : _props; - return self.selectTable(mapper, opts).insert(_props, { returnChanges: true }).run(); + var insertOpts = self.getOpt('insertOpts', opts); + insertOpts.returnChanges = true; + return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { self._handleErrors(cursor); var records = []; @@ -544,7 +612,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { fillIn(result, cursor); result.data = records; result.created = records.length; - return self.getRaw(opts) ? result : result.data; + return self.getOpt('raw', opts) ? result : result.data; }); }); }, @@ -558,40 +626,34 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to destroy. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO - * @param {boolean} [opts.returnDeletedIds=false] Whether to return the - * primary keys of any deleted records. + * @param {Object} [opts.deleteOpts] Options to pass to r#delete. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @return {Promise} */ destroy: function destroy(mapper, id, opts) { var self = this; var op = undefined; opts || (opts = {}); - var returnDeletedIds = isUndefined(opts.returnDeletedIds) ? self.returnDeletedIds : !!opts.returnDeletedIds; - return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + return self.waitForTable(mapper, opts).then(function () { // beforeDestroy lifecycle hook op = opts.op = 'beforeDestroy'; return resolve(self[op](mapper, id, opts)); }).then(function () { op = opts.op = 'destroy'; self.dbg(op, id, opts); - return self.selectTable(mapper, opts).get(id).delete().run(); + return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { - var deleted = 0; - if (cursor && cursor.deleted && returnDeletedIds) { - deleted = cursor.deleted; - } // afterDestroy lifecycle hook op = opts.op = 'afterDestroy'; - return resolve(self[op](mapper, id, opts, deleted ? id : undefined)).then(function (_id) { + return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) { // Allow for re-assignment from lifecycle hook - id = isUndefined(_id) && deleted ? id : _id; - var result = {}; - fillIn(result, cursor); - result.data = id; - return self.getRaw(opts) ? result : result.data; + return isUndefined(_cursor) ? cursor : _cursor; }); + }).then(function (cursor) { + return self.getOpt('raw', opts) ? cursor : undefined; }); }, @@ -604,51 +666,35 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} mapper the mapper. * @param {Object} [query] Selection query. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO - * @param {boolean} [opts.returnDeletedIds=false] Whether to return the - * primary keys of any deleted records. + * @param {Object} [opts.deleteOpts] Options to pass to r#delete. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @return {Promise} */ destroyAll: function destroyAll(mapper, query, opts) { var self = this; - var idAttribute = mapper.idAttribute; var op = undefined; query || (query = {}); opts || (opts = {}); - var returnDeletedIds = isUndefined(opts.returnDeletedIds) ? self.returnDeletedIds : !!opts.returnDeletedIds; - return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + return self.waitForTable(mapper, opts).then(function () { // beforeDestroyAll lifecycle hook op = opts.op = 'beforeDestroyAll'; return resolve(self[op](mapper, query, opts)); }).then(function () { op = opts.op = 'destroyAll'; self.dbg(op, query, opts); - return self.filterSequence(self.selectTable(mapper, opts), query).delete({ returnChanges: returnDeletedIds }).merge(function (cursor) { - return { - changes: cursor('changes').default([]).map(function (record) { - return record('old_val').default({})(idAttribute).default({}); - }).filter(function (id) { - return id; - }) - }; - }).run(); + return self.filterSequence(self.selectTable(mapper, opts), query).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { - var deletedIds = undefined; - if (cursor && cursor.changes && returnDeletedIds) { - deletedIds = cursor.changes; - delete cursor.changes; - } // afterDestroyAll lifecycle hook op = opts.op = 'afterDestroyAll'; - return resolve(self[op](mapper, query, opts, deletedIds)).then(function (_deletedIds) { + return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) { // Allow for re-assignment from lifecycle hook - deletedIds = isUndefined(_deletedIds) ? deletedIds : _deletedIds; - var result = {}; - fillIn(result, cursor); - result.data = deletedIds; - return self.getRaw(opts) ? result : result.data; + return isUndefined(_cursor) ? cursor : _cursor; }); + }).then(function (cursor) { + return self.getOpt('raw', opts) ? cursor : undefined; }); }, @@ -802,7 +848,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to retrieve. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @param {string[]} [opts.with=[]] TODO * @return {Promise} */ @@ -813,9 +861,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { opts || (opts = {}); opts.with || (opts.with = []); - var table = mapper.table || underscore(mapper.name); var relationList = mapper.relationList || []; - var tasks = [self.waitForTable(table, opts)]; + var tasks = [self.waitForTable(mapper, opts)]; relationList.forEach(function (def) { var relationName = def.relation; @@ -837,7 +884,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return resolve(self[op](mapper, id, opts)).then(function () { op = opts.op = 'find'; self.dbg(op, id, opts); - return self.selectTable(mapper, opts).get(id).run(); + return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts)); }); }).then(function (_record) { if (!_record) { @@ -893,7 +940,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return resolve(self[op](mapper, id, opts, record)).then(function (_record) { // Allow for re-assignment from lifecycle hook record = isUndefined(_record) ? record : _record; - return self.getRaw(opts) ? { + return self.getOpt('raw', opts) ? { data: record, found: record ? 1 : 0 } : record; @@ -910,7 +957,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} mapper The mapper. * @param {Object} query Selection query. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @param {string[]} [opts.with=[]] TODO * @return {Promise} */ @@ -921,9 +970,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { var records = []; var op = undefined; - var table = mapper.table || underscore(mapper.name); var relationList = mapper.relationList || []; - var tasks = [self.waitForTable(table, opts)]; + var tasks = [self.waitForTable(mapper, opts)]; relationList.forEach(function (def) { var relationName = def.relation; @@ -946,7 +994,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }).then(function () { op = opts.op = 'findAll'; self.dbg(op, query, opts); - return self.filterSequence(self.selectTable(mapper, opts), query).run(); + return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts)); }).then(function (_records) { records = _records; var tasks = []; @@ -1024,7 +1072,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return resolve(self[op](mapper, query, opts, records)).then(function (_records) { // Allow for re-assignment from lifecycle hook records = isUndefined(_records) ? records : _records; - return self.getRaw(opts) ? { + return self.getOpt('raw', opts) ? { data: records, found: records.length } : records; @@ -1034,14 +1082,18 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { /** - * TODO + * Resolve the value of the specified option based on the given options and + * this adapter's settings. * - * @name RethinkDBAdapter#getRaw + * @name RethinkDBAdapter#getOpt * @method + * @param {string} opt The name of the option. + * @param {Object} [opts] Configuration options. + * @return {*} The value of the specified option. */ - getRaw: function getRaw(opts) { + getOpt: function getOpt(opt, opts) { opts || (opts = {}); - return !!(isUndefined(opts.raw) ? this.raw : opts.raw); + return isUndefined(opts[opt]) ? this[opt] : opts[opt]; }, @@ -1085,7 +1137,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {(string|number)} id The primary key of the record to be updated. * @param {Object} props The update to apply to the record. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO + * @param {Object} [opts.updateOpts] Options to pass to r#update. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @return {Promise} */ update: function update(mapper, id, props, opts) { @@ -1094,14 +1149,16 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { opts || (opts = {}); var op = undefined; - return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + return self.waitForTable(mapper, opts).then(function () { // beforeUpdate lifecycle hook op = opts.op = 'beforeUpdate'; return resolve(self[op](mapper, id, props, opts)); }).then(function (_props) { // Allow for re-assignment from lifecycle hook _props = isUndefined(_props) ? props : _props; - return self.selectTable(mapper, opts).get(id).update(_props, { returnChanges: true }).run(); + var updateOpts = self.getOpt('updateOpts', opts); + updateOpts.returnChanges = true; + return self.selectTable(mapper, opts).get(id).update(_props, updateOpts).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { var record = undefined; self._handleErrors(cursor); @@ -1120,7 +1177,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { fillIn(result, cursor); result.data = record; result.updated = record ? 1 : 0; - return self.getRaw(opts) ? result : result.data; + return self.getOpt('raw', opts) ? result : result.data; }); }); }, @@ -1135,7 +1192,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} props The update to apply to the selected records. * @param {Object} [query] Selection query. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO + * @param {Object} [opts.updateOpts] Options to pass to r#update. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @return {Promise} */ updateAll: function updateAll(mapper, props, query, opts) { @@ -1145,14 +1205,16 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { opts || (opts = {}); var op = undefined; - return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + return self.waitForTable(mapper, opts).then(function () { // beforeUpdateAll lifecycle hook op = opts.op = 'beforeUpdateAll'; return resolve(self[op](mapper, props, query, opts)); }).then(function (_props) { // Allow for re-assignment from lifecycle hook _props = isUndefined(_props) ? props : _props; - return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, { returnChanges: true }).run(); + var updateOpts = self.getOpt('updateOpts', opts); + updateOpts.returnChanges = true; + return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, updateOpts).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { var records = []; self._handleErrors(cursor); @@ -1170,7 +1232,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { fillIn(result, cursor); result.data = records; result.updated = records.length; - return self.getRaw(opts) ? result : result.data; + return self.getOpt('raw', opts) ? result : result.data; }); }); }, @@ -1184,7 +1246,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} mapper The mapper. * @param {Object[]} records The records to update. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO + * @param {Object} [opts.insertOpts] Options to pass to r#insert. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @return {Promise} */ updateMany: function updateMany(mapper, records, opts) { @@ -1198,14 +1263,17 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return get(record, idAttribute); }); - return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + return self.waitForTable(mapper, opts).then(function () { // beforeUpdateMany lifecycle hook op = opts.op = 'beforeUpdateMany'; return resolve(self[op](mapper, records, opts)); }).then(function (_records) { // Allow for re-assignment from lifecycle hook _records = isUndefined(_records) ? records : _records; - return self.selectTable(mapper, opts).insert(_records, { returnChanges: true, conflict: 'update' }).run(); + var insertOpts = self.getOpt('insertOpts', opts); + insertOpts.returnChanges = true; + insertOpts.conflict = 'update'; + return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { var updatedRecords = undefined; self._handleErrors(cursor); @@ -1224,13 +1292,14 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { fillIn(result, cursor); result.data = records; result.updated = records.length; - return self.getRaw(opts) ? result : result.data; + return self.getOpt('raw', opts) ? result : result.data; }); }); }, - waitForTable: function waitForTable(table, options) { + waitForTable: function waitForTable(mapper, options) { var _this = this; + var table = isString(mapper) ? mapper : mapper.table || underscore(mapper.name); options = options || {}; var db = isUndefined(options.db) ? this.db : options.db; return this.waitForDb(options).then(function () { diff --git a/dist/js-data-rethinkdb.js.map b/dist/js-data-rethinkdb.js.map index c92bfc1..ef32c8c 100644 --- a/dist/js-data-rethinkdb.js.map +++ b/dist/js-data-rethinkdb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["let rethinkdbdash = require('rethinkdbdash')\nimport {utils} from 'js-data'\nconst {\n addHiddenPropsToTarget,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n resolve\n} = utils\n\nconst underscore = require('mout/string/underscore')\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nconst unique = function (array) {\n const seen = {}\n const final = []\n array.forEach(function (item) {\n if (item in seen) {\n return\n }\n final.push(item)\n seen[item] = 0\n })\n return final\n}\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst DEFAULTS = {\n /**\n * TODO\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false,\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#returnDeletedIds\n * @type {boolean}\n * @default false\n */\n returnDeletedIds: false\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * import {DS} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new DS()\n * const adapter = new RethinkDBAdapter()\n * store.registerAdapter('rethinkdb', adapter, { 'default': true })\n *\n * @class RethinkDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.host='localhost'] TODO\n * @param {number} [opts.port=28015] TODO\n * @param {string} [opts.authKey=''] TODO\n * @param {string} [opts.db='test'] TODO\n * @param {number} [opts.min=10] TODO\n * @param {number} [opts.max=50] TODO\n * @param {number} [opts.bufferSize=10] TODO\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n /**\n * @name RethinkDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name RethinkDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (Resource, opts) {\n return this.selectDb(opts).table(Resource.table || underscore(Resource.name))\n },\n\n filterSequence (sequence, params) {\n let r = this.r\n params = params || {}\n params.where = params.where || {}\n params.orderBy = params.orderBy || params.sort\n params.skip = params.skip || params.offset\n\n Object.keys(params).forEach(function (k) {\n let v = params[k]\n if (reserved.indexOf(k) === -1) {\n if (isObject(v)) {\n params.where[k] = v\n } else {\n params.where[k] = {\n '==': v\n }\n }\n delete params[k]\n }\n })\n\n let query = sequence\n\n if (Object.keys(params.where).length !== 0) {\n query = query.filter(function (row) {\n let subQuery\n forOwn(params.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '!=' || op === '!==') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '>') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '>=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '<') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '<=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === 'isectEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === 'isectNotEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === 'in') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === 'notIn') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === 'contains') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v)) : row(field).default([]).contains(v)\n } else if (op === 'notContains') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not()\n } else if (op === '|==' || op === '|===') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '|!=' || op === '|!==') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '|>') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '|>=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '|<') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '|<=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === '|isectEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === '|isectNotEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === '|in') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === '|notIn') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === '|contains') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v)) : row(field).default([]).contains(v)\n } else if (op === '|notContains') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not()\n }\n })\n })\n return subQuery || true\n })\n }\n\n if (params.orderBy) {\n if (isString(params.orderBy)) {\n params.orderBy = [\n [params.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < params.orderBy.length; i++) {\n if (isString(params.orderBy[i])) {\n params.orderBy[i] = [params.orderBy[i], 'asc']\n }\n query = (params.orderBy[i][1] || '').toUpperCase() === 'DESC' ? query.orderBy(r.desc(params.orderBy[i][0])) : query.orderBy(params.orderBy[i][0])\n }\n }\n\n if (params.skip) {\n query = query.skip(+params.skip)\n }\n\n if (params.limit) {\n query = query.limit(+params.limit)\n }\n\n return query\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.selectTable(mapper, opts).insert(_props, { returnChanges: true }).run()\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return self[op](mapper, props, opts, record).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.created = record ? 1 : 0\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.selectTable(mapper, opts).insert(_props, { returnChanges: true }).run()\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return self[op](mapper, props, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.created = records.length\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @param {boolean} [opts.returnDeletedIds=false] Whether to return the\n * primary keys of any deleted records.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n const returnDeletedIds = isUndefined(opts.returnDeletedIds) ? self.returnDeletedIds : !!opts.returnDeletedIds\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete().run()\n }).then(function (cursor) {\n let deleted = 0\n if (cursor && cursor.deleted && returnDeletedIds) {\n deleted = cursor.deleted\n }\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, deleted ? id : undefined)).then(function (_id) {\n // Allow for re-assignment from lifecycle hook\n id = isUndefined(_id) && deleted ? id : _id\n const result = {}\n fillIn(result, cursor)\n result.data = id\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @param {boolean} [opts.returnDeletedIds=false] Whether to return the\n * primary keys of any deleted records.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n const idAttribute = mapper.idAttribute\n let op\n query || (query = {})\n opts || (opts = {})\n const returnDeletedIds = isUndefined(opts.returnDeletedIds) ? self.returnDeletedIds : !!opts.returnDeletedIds\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete({ returnChanges: returnDeletedIds })\n .merge(function (cursor) {\n return {\n changes: cursor('changes').default([]).map(function (record) {\n return record('old_val').default({})(idAttribute).default({})\n }).filter(function (id) {\n return id\n })\n }\n })\n .run()\n }).then(function (cursor) {\n let deletedIds\n if (cursor && cursor.changes && returnDeletedIds) {\n deletedIds = cursor.changes\n delete cursor.changes\n }\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, deletedIds)).then(function (_deletedIds) {\n // Allow for re-assignment from lifecycle hook\n deletedIds = isUndefined(_deletedIds) ? deletedIds : _deletedIds\n const result = {}\n fillIn(result, cursor)\n result.data = deletedIds\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * TODO\n *\n * There may be reasons why you may want to override this method, like when\n * the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name RethinkDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (Resource, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (Resource, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(Resource, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (Resource, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(Resource, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (Resource, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @param {string[]} [opts.with=[]] TODO\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const table = mapper.table || underscore(mapper.name)\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(table, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts)).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run()\n })\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n return self.getRaw(opts) ? {\n data: record,\n found: record ? 1 : 0\n } : record\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @param {string[]} [opts.with=[]] TODO\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const table = mapper.table || underscore(mapper.name)\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(table, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run()\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, records)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n return self.getRaw(opts) ? {\n data: records,\n found: records.length\n } : records\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#getRaw\n * @method\n */\n getRaw (opts) {\n opts || (opts = {})\n return !!(isUndefined(opts.raw) ? this.raw : opts.raw)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (RethinkDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.selectTable(mapper, opts).get(id).update(_props, { returnChanges: true }).run()\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = record ? 1 : 0\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, { returnChanges: true }).run()\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return self[op](mapper, props, query, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] TODO\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n return self.selectTable(mapper, opts).insert(_records, { returnChanges: true, conflict: 'update' }).run()\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, updatedRecords)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? updatedRecords : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getRaw(opts) ? result : result.data\n })\n })\n },\n\n waitForTable (table, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n"],"names":["utils"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\n\nconst {\n addHiddenPropsToTarget,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n resolve\n} = utils\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nconst unique = function (array) {\n const seen = {}\n const final = []\n array.forEach(function (item) {\n if (item in seen) {\n return\n }\n final.push(item)\n seen[item] = 0\n })\n return final\n}\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * Whether to log debugging information.\n *\n * @name RethinkDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015,\n\n /**\n * Whether to return a more detailed response object.\n *\n * @name RethinkDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return detailed result objects\n * instead of just record data.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n /**\n * @name RethinkDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name RethinkDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (Resource, opts) {\n return this.selectDb(opts).table(Resource.table || underscore(Resource.name))\n },\n\n filterSequence (sequence, params) {\n let r = this.r\n params = params || {}\n params.where = params.where || {}\n params.orderBy = params.orderBy || params.sort\n params.skip = params.skip || params.offset\n\n Object.keys(params).forEach(function (k) {\n let v = params[k]\n if (reserved.indexOf(k) === -1) {\n if (isObject(v)) {\n params.where[k] = v\n } else {\n params.where[k] = {\n '==': v\n }\n }\n delete params[k]\n }\n })\n\n let query = sequence\n\n if (Object.keys(params.where).length !== 0) {\n query = query.filter(function (row) {\n let subQuery\n forOwn(params.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '!=' || op === '!==') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '>') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '>=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '<') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '<=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === 'isectEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === 'isectNotEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === 'in') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === 'notIn') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === 'contains') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v)) : row(field).default([]).contains(v)\n } else if (op === 'notContains') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not()\n } else if (op === '|==' || op === '|===') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '|!=' || op === '|!==') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '|>') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '|>=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '|<') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '|<=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === '|isectEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === '|isectNotEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === '|in') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === '|notIn') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === '|contains') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v)) : row(field).default([]).contains(v)\n } else if (op === '|notContains') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not()\n }\n })\n })\n return subQuery || true\n })\n }\n\n if (params.orderBy) {\n if (isString(params.orderBy)) {\n params.orderBy = [\n [params.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < params.orderBy.length; i++) {\n if (isString(params.orderBy[i])) {\n params.orderBy[i] = [params.orderBy[i], 'asc']\n }\n query = (params.orderBy[i][1] || '').toUpperCase() === 'DESC' ? query.orderBy(r.desc(params.orderBy[i][0])) : query.orderBy(params.orderBy[i][0])\n }\n }\n\n if (params.skip) {\n query = query.skip(+params.skip)\n }\n\n if (params.limit) {\n query = query.limit(+params.limit)\n }\n\n return query\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return self[op](mapper, props, opts, record).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.created = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return self[op](mapper, props, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.created = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * TODO\n *\n * There may be reasons why you may want to override this method, like when\n * the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name RethinkDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (Resource, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (Resource, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(Resource, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (Resource, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(Resource, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (Resource, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] TODO\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts)).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n })\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n return self.getOpt('raw', opts) ? {\n data: record,\n found: record ? 1 : 0\n } : record\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] TODO\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, records)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n return self.getOpt('raw', opts) ? {\n data: records,\n found: records.length\n } : records\n })\n })\n },\n\n /**\n * Resolve the value of the specified option based on the given options and\n * this adapter's settings.\n *\n * @name RethinkDBAdapter#getOpt\n * @method\n * @param {string} opt The name of the option.\n * @param {Object} [opts] Configuration options.\n * @return {*} The value of the specified option.\n */\n getOpt (opt, opts) {\n opts || (opts = {})\n return isUndefined(opts[opt]) ? this[opt] : opts[opt]\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (RethinkDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(_props, updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return self[op](mapper, props, query, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, updatedRecords)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? updatedRecords : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n"],"names":["utils"],"mappings":"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"} \ No newline at end of file diff --git a/mocha.start.js b/mocha.start.js index da96b9c..2fabfc9 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -27,4 +27,4 @@ TestRunner.init({ ] }) -// require('./test/find.test') +require('./test/handleErrors.test') diff --git a/package.json b/package.json index c830892..222613e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-rethinkdb", "description": "RethinkDB adapter for js-data.", - "version": "3.0.0-alpha.2", + "version": "3.0.0-alpha.3", "homepage": "https://github.com/js-data/js-data-rethinkdb", "repository": { "type": "git", @@ -36,9 +36,10 @@ "doc": "jsdoc -c conf.json src && node scripts/cleanup.js", "bundle": "rollup -c rollup.config.js -f cjs -o dist/js-data-rethinkdb.js -m dist/js-data-rethinkdb.js.map src/index.js", "lint": "standard src/index.js mocha.start.js test/**/*.js", - "mocha": "mocha -t 20000 -R dot -r source-map-support/register mocha.start.js test/**/*.js", - "cover": "istanbul cover --hook-run-in-context node_modules/mocha/bin/_mocha -- -t 20000 -R dot -r source-map-support/register mocha.start.js test/**/*.js", - "test": "npm run lint && npm run bundle && npm run cover", + "build": "npm run lint && npm run bundle", + "mocha": "mocha -t 20000 -R dot -r source-map-support/register mocha.start.js", + "cover": "istanbul cover --hook-run-in-context node_modules/mocha/bin/_mocha -- -t 20000 -R dot -r source-map-support/register mocha.start.js", + "test": "npm run build && npm run cover", "release": "npm test && npm run doc && node scripts/authors.js", "ci": "npm run test && cat coverage/lcov.info | coveralls || true && cat ./coverage/lcov.info | codacy-coverage || true" }, @@ -52,11 +53,8 @@ "devDependencies": { "babel-core": "6.5.2", "babel-eslint": "5.0.0", - "babel-plugin-syntax-async-functions": "6.5.0", - "babel-plugin-transform-regenerator": "6.5.2", "babel-polyfill": "6.5.0", "babel-preset-es2015-rollup": "1.1.1", - "babel-preset-stage-0": "6.5.0", "chai": "3.5.0", "codacy-coverage": "1.1.3", "coveralls": "2.11.8", diff --git a/src/index.js b/src/index.js index cffd568..023e27c 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,7 @@ -let rethinkdbdash = require('rethinkdbdash') import {utils} from 'js-data' +import rethinkdbdash from 'rethinkdbdash' +import underscore from 'mout/string/underscore' + const { addHiddenPropsToTarget, fillIn, @@ -13,8 +15,6 @@ const { resolve } = utils -const underscore = require('mout/string/underscore') - const reserved = [ 'orderBy', 'sort', @@ -53,7 +53,7 @@ const noop2 = function (...args) { const DEFAULTS = { /** - * TODO + * RethinkDB authorization key. * * @name RethinkDBAdapter#authKey * @type {string} @@ -61,7 +61,7 @@ const DEFAULTS = { authKey: '', /** - * TODO + * Buffer size for connection pool. * * @name RethinkDBAdapter#bufferSize * @type {number} @@ -70,7 +70,7 @@ const DEFAULTS = { bufferSize: 10, /** - * TODO + * Default database. * * @name RethinkDBAdapter#db * @type {string} @@ -79,7 +79,7 @@ const DEFAULTS = { db: 'test', /** - * TODO + * Whether to log debugging information. * * @name RethinkDBAdapter#debug * @type {boolean} @@ -88,7 +88,7 @@ const DEFAULTS = { debug: false, /** - * TODO + * RethinkDB host. * * @name RethinkDBAdapter#host * @type {string} @@ -97,7 +97,7 @@ const DEFAULTS = { host: 'localhost', /** - * TODO + * Minimum connections in pool. * * @name RethinkDBAdapter#min * @type {number} @@ -106,7 +106,7 @@ const DEFAULTS = { min: 10, /** - * TODO + * Maximum connections in pool. * * @name RethinkDBAdapter#max * @type {number} @@ -115,7 +115,7 @@ const DEFAULTS = { max: 50, /** - * TODO + * RethinkDB port. * * @name RethinkDBAdapter#port * @type {number} @@ -124,49 +124,106 @@ const DEFAULTS = { port: 28015, /** - * TODO + * Whether to return a more detailed response object. * * @name RethinkDBAdapter#raw * @type {boolean} * @default false */ - raw: false, - - /** - * TODO - * - * @name RethinkDBAdapter#returnDeletedIds - * @type {boolean} - * @default false - */ - returnDeletedIds: false + raw: false } +const INSERT_OPTS_DEFAULTS = {} +const UPDATE_OPTS_DEFAULTS = {} +const DELETE_OPTS_DEFAULTS = {} +const RUN_OPTS_DEFAULTS = {} + /** * RethinkDBAdapter class. * * @example - * import {DS} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new DS() - * const adapter = new RethinkDBAdapter() - * store.registerAdapter('rethinkdb', adapter, { 'default': true }) + * // Use Container instead of DataStore on the server + * import {Container} from 'js-data' + * import RethinkdbDBAdapter from 'js-data-rethinkdb' + * + * // Create a store to hold your Mappers + * const store = new Container() + * + * // Create an instance of RethinkdbDBAdapter with default settings + * const adapter = new RethinkdbDBAdapter() + * + * // Mappers in "store" will use the RethinkDB adapter by default + * store.registerAdapter('rethinkdb', adapter, { default: true }) + * + * // Create a Mapper that maps to a "user" table + * store.defineMapper('user') * * @class RethinkDBAdapter * @param {Object} [opts] Configuration opts. - * @param {string} [opts.host='localhost'] TODO - * @param {number} [opts.port=28015] TODO - * @param {string} [opts.authKey=''] TODO - * @param {string} [opts.db='test'] TODO - * @param {number} [opts.min=10] TODO - * @param {number} [opts.max=50] TODO - * @param {number} [opts.bufferSize=10] TODO + * @param {string} [opts.authKey=""] RethinkDB authorization key. + * @param {number} [opts.bufferSize=10] Buffer size for connection pool. + * @param {string} [opts.db="test"] Default database. + * @param {boolean} [opts.debug=false] Whether to log debugging information. + * @param {string} [opts.host="localhost"] RethinkDB host. + * @param {number} [opts.max=50] Maximum connections in pool. + * @param {number} [opts.min=10] Minimum connections in pool. + * @param {number} [opts.port=28015] RethinkDB port. + * @param {boolean} [opts.raw=false] Whether to return detailed result objects + * instead of just record data. */ export default function RethinkDBAdapter (opts) { const self = this opts || (opts = {}) fillIn(opts, DEFAULTS) fillIn(self, opts) + + /** + * Default options to pass to r#insert. + * + * @name RethinkDBAdapter#insertOpts + * @type {Object} + * @default {} + */ + self.insertOpts || (self.insertOpts = {}) + fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS) + + /** + * Default options to pass to r#update. + * + * @name RethinkDBAdapter#updateOpts + * @type {Object} + * @default {} + */ + self.updateOpts || (self.updateOpts = {}) + fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS) + + /** + * Default options to pass to r#delete. + * + * @name RethinkDBAdapter#deleteOpts + * @type {Object} + * @default {} + */ + self.deleteOpts || (self.deleteOpts = {}) + fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS) + + /** + * Default options to pass to r#run. + * + * @name RethinkDBAdapter#runOpts + * @type {Object} + * @default {} + */ + self.runOpts || (self.runOpts = {}) + fillIn(self.runOpts, RUN_OPTS_DEFAULTS) + + /** + * The rethinkdbdash instance used by this adapter. Use this directly when you + * need to write custom queries. + * + * @name RethinkDBAdapter#r + * @type {Object} + */ self.r = rethinkdbdash(opts) self.databases = {} self.tables = {} @@ -439,7 +496,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} mapper The mapper. * @param {Object} props The record to be created. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO + * @param {Object} [opts.insertOpts] Options to pass to r#insert. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @return {Promise} */ create (mapper, props, opts) { @@ -448,14 +508,16 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { props || (props = {}) opts || (opts = {}) - return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + return self.waitForTable(mapper, opts).then(function () { // beforeCreate lifecycle hook op = opts.op = 'beforeCreate' return resolve(self[op](mapper, props, opts)) }).then(function (_props) { // Allow for re-assignment from lifecycle hook _props = isUndefined(_props) ? props : _props - return self.selectTable(mapper, opts).insert(_props, { returnChanges: true }).run() + const insertOpts = self.getOpt('insertOpts', opts) + insertOpts.returnChanges = true + return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts)) }).then(function (cursor) { self._handleErrors(cursor) let record @@ -471,7 +533,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { fillIn(result, cursor) result.data = record result.created = record ? 1 : 0 - return self.getRaw(opts) ? result : result.data + return self.getOpt('raw', opts) ? result : result.data }) }) }, @@ -484,7 +546,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} mapper The mapper. * @param {Object} props The records to be created. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO + * @param {Object} [opts.insertOpts] Options to pass to r#insert. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @return {Promise} */ createMany (mapper, props, opts) { @@ -493,14 +558,16 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { props || (props = {}) opts || (opts = {}) - return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + return self.waitForTable(mapper, opts).then(function () { // beforeCreateMany lifecycle hook op = opts.op = 'beforeCreateMany' return resolve(self[op](mapper, props, opts)) }).then(function (_props) { // Allow for re-assignment from lifecycle hook _props = isUndefined(_props) ? props : _props - return self.selectTable(mapper, opts).insert(_props, { returnChanges: true }).run() + const insertOpts = self.getOpt('insertOpts', opts) + insertOpts.returnChanges = true + return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts)) }).then(function (cursor) { self._handleErrors(cursor) let records = [] @@ -518,7 +585,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { fillIn(result, cursor) result.data = records result.created = records.length - return self.getRaw(opts) ? result : result.data + return self.getOpt('raw', opts) ? result : result.data }) }) }, @@ -531,40 +598,34 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to destroy. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO - * @param {boolean} [opts.returnDeletedIds=false] Whether to return the - * primary keys of any deleted records. + * @param {Object} [opts.deleteOpts] Options to pass to r#delete. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @return {Promise} */ destroy (mapper, id, opts) { const self = this let op opts || (opts = {}) - const returnDeletedIds = isUndefined(opts.returnDeletedIds) ? self.returnDeletedIds : !!opts.returnDeletedIds - return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + return self.waitForTable(mapper, opts).then(function () { // beforeDestroy lifecycle hook op = opts.op = 'beforeDestroy' return resolve(self[op](mapper, id, opts)) }).then(function () { op = opts.op = 'destroy' self.dbg(op, id, opts) - return self.selectTable(mapper, opts).get(id).delete().run() + return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)) }).then(function (cursor) { - let deleted = 0 - if (cursor && cursor.deleted && returnDeletedIds) { - deleted = cursor.deleted - } // afterDestroy lifecycle hook op = opts.op = 'afterDestroy' - return resolve(self[op](mapper, id, opts, deleted ? id : undefined)).then(function (_id) { + return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) { // Allow for re-assignment from lifecycle hook - id = isUndefined(_id) && deleted ? id : _id - const result = {} - fillIn(result, cursor) - result.data = id - return self.getRaw(opts) ? result : result.data + return isUndefined(_cursor) ? cursor : _cursor }) + }).then(function (cursor) { + return self.getOpt('raw', opts) ? cursor : undefined }) }, @@ -576,20 +637,19 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} mapper the mapper. * @param {Object} [query] Selection query. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO - * @param {boolean} [opts.returnDeletedIds=false] Whether to return the - * primary keys of any deleted records. + * @param {Object} [opts.deleteOpts] Options to pass to r#delete. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @return {Promise} */ destroyAll (mapper, query, opts) { const self = this - const idAttribute = mapper.idAttribute let op query || (query = {}) opts || (opts = {}) - const returnDeletedIds = isUndefined(opts.returnDeletedIds) ? self.returnDeletedIds : !!opts.returnDeletedIds - return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + return self.waitForTable(mapper, opts).then(function () { // beforeDestroyAll lifecycle hook op = opts.op = 'beforeDestroyAll' return resolve(self[op](mapper, query, opts)) @@ -598,33 +658,17 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { self.dbg(op, query, opts) return self .filterSequence(self.selectTable(mapper, opts), query) - .delete({ returnChanges: returnDeletedIds }) - .merge(function (cursor) { - return { - changes: cursor('changes').default([]).map(function (record) { - return record('old_val').default({})(idAttribute).default({}) - }).filter(function (id) { - return id - }) - } - }) - .run() + .delete(self.getOpt('deleteOpts', opts)) + .run(self.getOpt('runOpts', opts)) }).then(function (cursor) { - let deletedIds - if (cursor && cursor.changes && returnDeletedIds) { - deletedIds = cursor.changes - delete cursor.changes - } // afterDestroyAll lifecycle hook op = opts.op = 'afterDestroyAll' - return resolve(self[op](mapper, query, opts, deletedIds)).then(function (_deletedIds) { + return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) { // Allow for re-assignment from lifecycle hook - deletedIds = isUndefined(_deletedIds) ? deletedIds : _deletedIds - const result = {} - fillIn(result, cursor) - result.data = deletedIds - return self.getRaw(opts) ? result : result.data + return isUndefined(_cursor) ? cursor : _cursor }) + }).then(function (cursor) { + return self.getOpt('raw', opts) ? cursor : undefined }) }, @@ -768,7 +812,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} mapper The mapper. * @param {(string|number)} id Primary key of the record to retrieve. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @param {string[]} [opts.with=[]] TODO * @return {Promise} */ @@ -778,9 +824,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { opts || (opts = {}) opts.with || (opts.with = []) - const table = mapper.table || underscore(mapper.name) const relationList = mapper.relationList || [] - let tasks = [self.waitForTable(table, opts)] + let tasks = [self.waitForTable(mapper, opts)] relationList.forEach(function (def) { const relationName = def.relation @@ -802,7 +847,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return resolve(self[op](mapper, id, opts)).then(function () { op = opts.op = 'find' self.dbg(op, id, opts) - return self.selectTable(mapper, opts).get(id).run() + return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts)) }) }).then(function (_record) { if (!_record) { @@ -860,7 +905,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return resolve(self[op](mapper, id, opts, record)).then(function (_record) { // Allow for re-assignment from lifecycle hook record = isUndefined(_record) ? record : _record - return self.getRaw(opts) ? { + return self.getOpt('raw', opts) ? { data: record, found: record ? 1 : 0 } : record @@ -876,7 +921,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} mapper The mapper. * @param {Object} query Selection query. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @param {string[]} [opts.with=[]] TODO * @return {Promise} */ @@ -887,9 +934,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { let records = [] let op - const table = mapper.table || underscore(mapper.name) const relationList = mapper.relationList || [] - let tasks = [self.waitForTable(table, opts)] + let tasks = [self.waitForTable(mapper, opts)] relationList.forEach(function (def) { const relationName = def.relation @@ -912,7 +958,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }).then(function () { op = opts.op = 'findAll' self.dbg(op, query, opts) - return self.filterSequence(self.selectTable(mapper, opts), query).run() + return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts)) }).then(function (_records) { records = _records const tasks = [] @@ -990,7 +1036,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return resolve(self[op](mapper, query, opts, records)).then(function (_records) { // Allow for re-assignment from lifecycle hook records = isUndefined(_records) ? records : _records - return self.getRaw(opts) ? { + return self.getOpt('raw', opts) ? { data: records, found: records.length } : records @@ -999,14 +1045,18 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }, /** - * TODO + * Resolve the value of the specified option based on the given options and + * this adapter's settings. * - * @name RethinkDBAdapter#getRaw + * @name RethinkDBAdapter#getOpt * @method + * @param {string} opt The name of the option. + * @param {Object} [opts] Configuration options. + * @return {*} The value of the specified option. */ - getRaw (opts) { + getOpt (opt, opts) { opts || (opts = {}) - return !!(isUndefined(opts.raw) ? this.raw : opts.raw) + return isUndefined(opts[opt]) ? this[opt] : opts[opt] }, /** @@ -1040,7 +1090,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {(string|number)} id The primary key of the record to be updated. * @param {Object} props The update to apply to the record. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO + * @param {Object} [opts.updateOpts] Options to pass to r#update. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @return {Promise} */ update (mapper, id, props, opts) { @@ -1049,14 +1102,16 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { opts || (opts = {}) let op - return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + return self.waitForTable(mapper, opts).then(function () { // beforeUpdate lifecycle hook op = opts.op = 'beforeUpdate' return resolve(self[op](mapper, id, props, opts)) }).then(function (_props) { // Allow for re-assignment from lifecycle hook _props = isUndefined(_props) ? props : _props - return self.selectTable(mapper, opts).get(id).update(_props, { returnChanges: true }).run() + const updateOpts = self.getOpt('updateOpts', opts) + updateOpts.returnChanges = true + return self.selectTable(mapper, opts).get(id).update(_props, updateOpts).run(self.getOpt('runOpts', opts)) }).then(function (cursor) { let record self._handleErrors(cursor) @@ -1075,7 +1130,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { fillIn(result, cursor) result.data = record result.updated = record ? 1 : 0 - return self.getRaw(opts) ? result : result.data + return self.getOpt('raw', opts) ? result : result.data }) }) }, @@ -1089,7 +1144,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} props The update to apply to the selected records. * @param {Object} [query] Selection query. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO + * @param {Object} [opts.updateOpts] Options to pass to r#update. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @return {Promise} */ updateAll (mapper, props, query, opts) { @@ -1099,14 +1157,16 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { opts || (opts = {}) let op - return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + return self.waitForTable(mapper, opts).then(function () { // beforeUpdateAll lifecycle hook op = opts.op = 'beforeUpdateAll' return resolve(self[op](mapper, props, query, opts)) }).then(function (_props) { // Allow for re-assignment from lifecycle hook _props = isUndefined(_props) ? props : _props - return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, { returnChanges: true }).run() + const updateOpts = self.getOpt('updateOpts', opts) + updateOpts.returnChanges = true + return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, updateOpts).run(self.getOpt('runOpts', opts)) }).then(function (cursor) { let records = [] self._handleErrors(cursor) @@ -1122,7 +1182,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { fillIn(result, cursor) result.data = records result.updated = records.length - return self.getRaw(opts) ? result : result.data + return self.getOpt('raw', opts) ? result : result.data }) }) }, @@ -1135,7 +1195,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} mapper The mapper. * @param {Object[]} records The records to update. * @param {Object} [opts] Configuration options. - * @param {boolean} [opts.raw=false] TODO + * @param {Object} [opts.insertOpts] Options to pass to r#insert. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. * @return {Promise} */ updateMany (mapper, records, opts) { @@ -1149,14 +1212,17 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return get(record, idAttribute) }) - return self.waitForTable(mapper.table || underscore(mapper.name), opts).then(function () { + return self.waitForTable(mapper, opts).then(function () { // beforeUpdateMany lifecycle hook op = opts.op = 'beforeUpdateMany' return resolve(self[op](mapper, records, opts)) }).then(function (_records) { // Allow for re-assignment from lifecycle hook _records = isUndefined(_records) ? records : _records - return self.selectTable(mapper, opts).insert(_records, { returnChanges: true, conflict: 'update' }).run() + const insertOpts = self.getOpt('insertOpts', opts) + insertOpts.returnChanges = true + insertOpts.conflict = 'update' + return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts)) }).then(function (cursor) { let updatedRecords self._handleErrors(cursor) @@ -1173,12 +1239,13 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { fillIn(result, cursor) result.data = records result.updated = records.length - return self.getRaw(opts) ? result : result.data + return self.getOpt('raw', opts) ? result : result.data }) }) }, - waitForTable (table, options) { + waitForTable (mapper, options) { + const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name)) options = options || {} let db = isUndefined(options.db) ? this.db : options.db return this.waitForDb(options).then(() => { From 5457957c5bbc907a4be1a96770367cddd93b0ceb Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Fri, 26 Feb 2016 21:56:47 -0800 Subject: [PATCH 06/27] Fix devDependency --- CONTRIBUTORS | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 8ea5f2b..a05888c 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -5,5 +5,5 @@ # Names should be added to this file as: # [commit count] Name 1 InternalFX - 44 Jason Dobry + 45 Jason Dobry 2 Ollie Relph diff --git a/package.json b/package.json index 222613e..ab8a4e3 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "coveralls": "2.11.8", "ink-docstrap": "1.1.2", "istanbul": "0.4.2", - "js-data-adapter-tests": "^2.0.0-alpha.7", + "js-data-adapter-tests": "^2.0.0-alpha.8", "jsdoc": "3.4.0", "mocha": "2.4.5", "rollup": "0.25.4", From 1ebbfe628ea96a1b42870c59bc8e6e05a1bff42f Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Fri, 26 Feb 2016 21:58:31 -0800 Subject: [PATCH 07/27] Update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 19d3a30..eed4372 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ To get started, visit __[http://js-data.io](http://www.js-data.io)__. * [License](#license) ## Quick Start -`npm install --save js-data js-data-rethinkdb`. +`npm install --save js-data js-data-rethinkdb rethinkdbdash`. ```js // Use Container instead of DataStore on the server From 8bf87a09cb636f584b741f6a43fd74d93df4563a Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Fri, 26 Feb 2016 22:13:17 -0800 Subject: [PATCH 08/27] Flattened some code. --- src/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.js b/src/index.js index 023e27c..cea3f38 100644 --- a/src/index.js +++ b/src/index.js @@ -844,11 +844,11 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return Promise.all(tasks).then(function () { // beforeFind lifecycle hook op = opts.op = 'beforeFind' - return resolve(self[op](mapper, id, opts)).then(function () { + return resolve(self[op](mapper, id, opts)) + }).then(function () { op = opts.op = 'find' self.dbg(op, id, opts) return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts)) - }) }).then(function (_record) { if (!_record) { return From 0a3b8a97ac382d7463077c61126d087fb91186f3 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Fri, 26 Feb 2016 22:23:08 -0800 Subject: [PATCH 09/27] 3.0.0-alpha.4 --- CHANGELOG.md | 5 ++++ CONTRIBUTORS | 2 +- dist/js-data-rethinkdb.js | 44 +++++++++++++++++------------------ dist/js-data-rethinkdb.js.map | 2 +- package.json | 4 ++-- src/index.js | 40 +++++++++++++++---------------- 6 files changed, 51 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3538ce0..ce65eeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +##### 3.0.0-alpha.4 - 26 February 2016 + +###### Other +- Finished JSDoc comments + ##### 3.0.0-alpha.3 - 26 February 2016 ###### Backwards compatible API changes diff --git a/CONTRIBUTORS b/CONTRIBUTORS index a05888c..ab1e598 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -5,5 +5,5 @@ # Names should be added to this file as: # [commit count] Name 1 InternalFX - 45 Jason Dobry + 48 Jason Dobry 2 Ollie Relph diff --git a/dist/js-data-rethinkdb.js b/dist/js-data-rethinkdb.js index f37794e..85a2093 100644 --- a/dist/js-data-rethinkdb.js +++ b/dist/js-data-rethinkdb.js @@ -392,8 +392,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { selectDb: function selectDb(opts) { return this.r.db(isUndefined(opts.db) ? this.db : opts.db); }, - selectTable: function selectTable(Resource, opts) { - return this.selectDb(opts).table(Resource.table || underscore(Resource.name)); + selectTable: function selectTable(mapper, opts) { + return this.selectDb(opts).table(mapper.table || underscore(mapper.name)); }, filterSequence: function filterSequence(sequence, params) { var r = this.r; @@ -700,7 +700,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { /** - * TODO + * Return the foreignKey from the given record for the provided relationship. * * There may be reasons why you may want to override this method, like when * the id of the parent doesn't exactly match up to the key on the child. @@ -709,19 +709,19 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @method * @return {*} */ - makeHasManyForeignKey: function makeHasManyForeignKey(Resource, def, record) { + makeHasManyForeignKey: function makeHasManyForeignKey(mapper, def, record) { return def.getForeignKey(record); }, /** - * TODO + * Load a hasMany relationship. * * @name RethinkDBAdapter#loadHasMany * @method * @return {Promise} */ - loadHasMany: function loadHasMany(Resource, def, records, __opts) { + loadHasMany: function loadHasMany(mapper, def, records, __opts) { var self = this; var singular = false; @@ -730,7 +730,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { records = [records]; } var IDs = records.map(function (record) { - return self.makeHasManyForeignKey(Resource, def, record); + return self.makeHasManyForeignKey(mapper, def, record); }); var query = {}; var criteria = query[def.foreignKey] = {}; @@ -750,7 +750,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { attached = relatedItems; } else { relatedItems.forEach(function (relatedItem) { - if (get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) { + if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) { attached.push(relatedItem); } }); @@ -762,17 +762,17 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { /** - * TODO + * Load a hasOne relationship. * * @name RethinkDBAdapter#loadHasOne * @method * @return {Promise} */ - loadHasOne: function loadHasOne(Resource, def, records, __opts) { + loadHasOne: function loadHasOne(mapper, def, records, __opts) { if (isObject(records) && !isArray(records)) { records = [records]; } - return this.loadHasMany(Resource, def, records, __opts).then(function () { + return this.loadHasMany(mapper, def, records, __opts).then(function () { records.forEach(function (record) { var relatedData = def.getLocalField(record); if (isArray(relatedData) && relatedData.length) { @@ -784,19 +784,19 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { /** - * TODO + * Return the foreignKey from the given record for the provided relationship. * * @name RethinkDBAdapter#makeBelongsToForeignKey * @method * @return {*} */ - makeBelongsToForeignKey: function makeBelongsToForeignKey(Resource, def, record) { + makeBelongsToForeignKey: function makeBelongsToForeignKey(mapper, def, record) { return def.getForeignKey(record); }, /** - * TODO + * Load a belongsTo relationship. * * @name RethinkDBAdapter#loadBelongsTo * @method @@ -851,7 +851,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. * @param {Object} [opts.runOpts] Options to pass to r#run. - * @param {string[]} [opts.with=[]] TODO + * @param {string[]} [opts.with=[]] Relations to eager load. * @return {Promise} */ find: function find(mapper, id, opts) { @@ -881,11 +881,11 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return Promise.all(tasks).then(function () { // beforeFind lifecycle hook op = opts.op = 'beforeFind'; - return resolve(self[op](mapper, id, opts)).then(function () { - op = opts.op = 'find'; - self.dbg(op, id, opts); - return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts)); - }); + return resolve(self[op](mapper, id, opts)); + }).then(function () { + op = opts.op = 'find'; + self.dbg(op, id, opts); + return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts)); }).then(function (_record) { if (!_record) { return; @@ -960,7 +960,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. * @param {Object} [opts.runOpts] Options to pass to r#run. - * @param {string[]} [opts.with=[]] TODO + * @param {string[]} [opts.with=[]] Relations to eager load. * @return {Promise} */ findAll: function findAll(mapper, query, opts) { @@ -1098,7 +1098,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { /** - * TODO + * Logging utility method. * * @name RethinkDBAdapter#log * @method diff --git a/dist/js-data-rethinkdb.js.map b/dist/js-data-rethinkdb.js.map index ef32c8c..0fe30c0 100644 --- a/dist/js-data-rethinkdb.js.map +++ b/dist/js-data-rethinkdb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\n\nconst {\n addHiddenPropsToTarget,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n resolve\n} = utils\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nconst unique = function (array) {\n const seen = {}\n const final = []\n array.forEach(function (item) {\n if (item in seen) {\n return\n }\n final.push(item)\n seen[item] = 0\n })\n return final\n}\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * Whether to log debugging information.\n *\n * @name RethinkDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015,\n\n /**\n * Whether to return a more detailed response object.\n *\n * @name RethinkDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return detailed result objects\n * instead of just record data.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n /**\n * @name RethinkDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name RethinkDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (Resource, opts) {\n return this.selectDb(opts).table(Resource.table || underscore(Resource.name))\n },\n\n filterSequence (sequence, params) {\n let r = this.r\n params = params || {}\n params.where = params.where || {}\n params.orderBy = params.orderBy || params.sort\n params.skip = params.skip || params.offset\n\n Object.keys(params).forEach(function (k) {\n let v = params[k]\n if (reserved.indexOf(k) === -1) {\n if (isObject(v)) {\n params.where[k] = v\n } else {\n params.where[k] = {\n '==': v\n }\n }\n delete params[k]\n }\n })\n\n let query = sequence\n\n if (Object.keys(params.where).length !== 0) {\n query = query.filter(function (row) {\n let subQuery\n forOwn(params.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '!=' || op === '!==') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '>') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '>=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '<') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '<=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === 'isectEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === 'isectNotEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === 'in') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === 'notIn') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === 'contains') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v)) : row(field).default([]).contains(v)\n } else if (op === 'notContains') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not()\n } else if (op === '|==' || op === '|===') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '|!=' || op === '|!==') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '|>') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '|>=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '|<') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '|<=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === '|isectEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === '|isectNotEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === '|in') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === '|notIn') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === '|contains') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v)) : row(field).default([]).contains(v)\n } else if (op === '|notContains') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not()\n }\n })\n })\n return subQuery || true\n })\n }\n\n if (params.orderBy) {\n if (isString(params.orderBy)) {\n params.orderBy = [\n [params.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < params.orderBy.length; i++) {\n if (isString(params.orderBy[i])) {\n params.orderBy[i] = [params.orderBy[i], 'asc']\n }\n query = (params.orderBy[i][1] || '').toUpperCase() === 'DESC' ? query.orderBy(r.desc(params.orderBy[i][0])) : query.orderBy(params.orderBy[i][0])\n }\n }\n\n if (params.skip) {\n query = query.skip(+params.skip)\n }\n\n if (params.limit) {\n query = query.limit(+params.limit)\n }\n\n return query\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return self[op](mapper, props, opts, record).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.created = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return self[op](mapper, props, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.created = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * TODO\n *\n * There may be reasons why you may want to override this method, like when\n * the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name RethinkDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (Resource, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (Resource, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(Resource, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (Resource, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(Resource, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (Resource, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] TODO\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts)).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n })\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n return self.getOpt('raw', opts) ? {\n data: record,\n found: record ? 1 : 0\n } : record\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] TODO\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, records)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n return self.getOpt('raw', opts) ? {\n data: records,\n found: records.length\n } : records\n })\n })\n },\n\n /**\n * Resolve the value of the specified option based on the given options and\n * this adapter's settings.\n *\n * @name RethinkDBAdapter#getOpt\n * @method\n * @param {string} opt The name of the option.\n * @param {Object} [opts] Configuration options.\n * @return {*} The value of the specified option.\n */\n getOpt (opt, opts) {\n opts || (opts = {})\n return isUndefined(opts[opt]) ? this[opt] : opts[opt]\n },\n\n /**\n * TODO\n *\n * @name RethinkDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (RethinkDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(_props, updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return self[op](mapper, props, query, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, updatedRecords)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? updatedRecords : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n"],"names":["utils"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\n\nconst {\n addHiddenPropsToTarget,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n resolve\n} = utils\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nconst unique = function (array) {\n const seen = {}\n const final = []\n array.forEach(function (item) {\n if (item in seen) {\n return\n }\n final.push(item)\n seen[item] = 0\n })\n return final\n}\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * Whether to log debugging information.\n *\n * @name RethinkDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015,\n\n /**\n * Whether to return a more detailed response object.\n *\n * @name RethinkDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return detailed result objects\n * instead of just record data.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n /**\n * @name RethinkDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name RethinkDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n filterSequence (sequence, params) {\n let r = this.r\n params = params || {}\n params.where = params.where || {}\n params.orderBy = params.orderBy || params.sort\n params.skip = params.skip || params.offset\n\n Object.keys(params).forEach(function (k) {\n let v = params[k]\n if (reserved.indexOf(k) === -1) {\n if (isObject(v)) {\n params.where[k] = v\n } else {\n params.where[k] = {\n '==': v\n }\n }\n delete params[k]\n }\n })\n\n let query = sequence\n\n if (Object.keys(params.where).length !== 0) {\n query = query.filter(function (row) {\n let subQuery\n forOwn(params.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '!=' || op === '!==') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '>') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '>=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '<') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '<=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === 'isectEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === 'isectNotEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === 'in') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === 'notIn') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === 'contains') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v)) : row(field).default([]).contains(v)\n } else if (op === 'notContains') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not()\n } else if (op === '|==' || op === '|===') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '|!=' || op === '|!==') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '|>') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '|>=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '|<') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '|<=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === '|isectEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === '|isectNotEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === '|in') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === '|notIn') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === '|contains') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v)) : row(field).default([]).contains(v)\n } else if (op === '|notContains') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not()\n }\n })\n })\n return subQuery || true\n })\n }\n\n if (params.orderBy) {\n if (isString(params.orderBy)) {\n params.orderBy = [\n [params.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < params.orderBy.length; i++) {\n if (isString(params.orderBy[i])) {\n params.orderBy[i] = [params.orderBy[i], 'asc']\n }\n query = (params.orderBy[i][1] || '').toUpperCase() === 'DESC' ? query.orderBy(r.desc(params.orderBy[i][0])) : query.orderBy(params.orderBy[i][0])\n }\n }\n\n if (params.skip) {\n query = query.skip(+params.skip)\n }\n\n if (params.limit) {\n query = query.limit(+params.limit)\n }\n\n return query\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return self[op](mapper, props, opts, record).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.created = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return self[op](mapper, props, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.created = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * There may be reasons why you may want to override this method, like when\n * the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name RethinkDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Load a hasMany relationship.\n *\n * @name RethinkDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (mapper, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(mapper, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * Load a hasOne relationship.\n *\n * @name RethinkDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (mapper, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(mapper, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name RethinkDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Load a belongsTo relationship.\n *\n * @name RethinkDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n return self.getOpt('raw', opts) ? {\n data: record,\n found: record ? 1 : 0\n } : record\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, records)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n return self.getOpt('raw', opts) ? {\n data: records,\n found: records.length\n } : records\n })\n })\n },\n\n /**\n * Resolve the value of the specified option based on the given options and\n * this adapter's settings.\n *\n * @name RethinkDBAdapter#getOpt\n * @method\n * @param {string} opt The name of the option.\n * @param {Object} [opts] Configuration options.\n * @return {*} The value of the specified option.\n */\n getOpt (opt, opts) {\n opts || (opts = {})\n return isUndefined(opts[opt]) ? this[opt] : opts[opt]\n },\n\n /**\n * Logging utility method.\n *\n * @name RethinkDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (RethinkDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(_props, updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return self[op](mapper, props, query, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, updatedRecords)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? updatedRecords : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n"],"names":["utils"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index ab8a4e3..ca6da87 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-rethinkdb", "description": "RethinkDB adapter for js-data.", - "version": "3.0.0-alpha.3", + "version": "3.0.0-alpha.4", "homepage": "https://github.com/js-data/js-data-rethinkdb", "repository": { "type": "git", @@ -60,7 +60,7 @@ "coveralls": "2.11.8", "ink-docstrap": "1.1.2", "istanbul": "0.4.2", - "js-data-adapter-tests": "^2.0.0-alpha.8", + "js-data-adapter-tests": "^2.0.0-alpha.9", "jsdoc": "3.4.0", "mocha": "2.4.5", "rollup": "0.25.4", diff --git a/src/index.js b/src/index.js index cea3f38..277c1e4 100644 --- a/src/index.js +++ b/src/index.js @@ -359,8 +359,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return this.r.db(isUndefined(opts.db) ? this.db : opts.db) }, - selectTable (Resource, opts) { - return this.selectDb(opts).table(Resource.table || underscore(Resource.name)) + selectTable (mapper, opts) { + return this.selectDb(opts).table(mapper.table || underscore(mapper.name)) }, filterSequence (sequence, params) { @@ -673,7 +673,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }, /** - * TODO + * Return the foreignKey from the given record for the provided relationship. * * There may be reasons why you may want to override this method, like when * the id of the parent doesn't exactly match up to the key on the child. @@ -682,18 +682,18 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @method * @return {*} */ - makeHasManyForeignKey (Resource, def, record) { + makeHasManyForeignKey (mapper, def, record) { return def.getForeignKey(record) }, /** - * TODO + * Load a hasMany relationship. * * @name RethinkDBAdapter#loadHasMany * @method * @return {Promise} */ - loadHasMany (Resource, def, records, __opts) { + loadHasMany (mapper, def, records, __opts) { const self = this let singular = false @@ -702,7 +702,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { records = [records] } const IDs = records.map(function (record) { - return self.makeHasManyForeignKey(Resource, def, record) + return self.makeHasManyForeignKey(mapper, def, record) }) const query = {} const criteria = query[def.foreignKey] = {} @@ -722,7 +722,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { attached = relatedItems } else { relatedItems.forEach(function (relatedItem) { - if (get(relatedItem, def.foreignKey) === record[Resource.idAttribute]) { + if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) { attached.push(relatedItem) } }) @@ -733,17 +733,17 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }, /** - * TODO + * Load a hasOne relationship. * * @name RethinkDBAdapter#loadHasOne * @method * @return {Promise} */ - loadHasOne (Resource, def, records, __opts) { + loadHasOne (mapper, def, records, __opts) { if (isObject(records) && !isArray(records)) { records = [records] } - return this.loadHasMany(Resource, def, records, __opts).then(function () { + return this.loadHasMany(mapper, def, records, __opts).then(function () { records.forEach(function (record) { const relatedData = def.getLocalField(record) if (isArray(relatedData) && relatedData.length) { @@ -754,18 +754,18 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }, /** - * TODO + * Return the foreignKey from the given record for the provided relationship. * * @name RethinkDBAdapter#makeBelongsToForeignKey * @method * @return {*} */ - makeBelongsToForeignKey (Resource, def, record) { + makeBelongsToForeignKey (mapper, def, record) { return def.getForeignKey(record) }, /** - * TODO + * Load a belongsTo relationship. * * @name RethinkDBAdapter#loadBelongsTo * @method @@ -815,7 +815,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. * @param {Object} [opts.runOpts] Options to pass to r#run. - * @param {string[]} [opts.with=[]] TODO + * @param {string[]} [opts.with=[]] Relations to eager load. * @return {Promise} */ find (mapper, id, opts) { @@ -846,9 +846,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { op = opts.op = 'beforeFind' return resolve(self[op](mapper, id, opts)) }).then(function () { - op = opts.op = 'find' - self.dbg(op, id, opts) - return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts)) + op = opts.op = 'find' + self.dbg(op, id, opts) + return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts)) }).then(function (_record) { if (!_record) { return @@ -924,7 +924,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. * @param {Object} [opts.runOpts] Options to pass to r#run. - * @param {string[]} [opts.with=[]] TODO + * @param {string[]} [opts.with=[]] Relations to eager load. * @return {Promise} */ findAll (mapper, query, opts) { @@ -1060,7 +1060,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }, /** - * TODO + * Logging utility method. * * @name RethinkDBAdapter#log * @method From 51959eeae67065e8c62198e76829a367c77c712a Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Fri, 26 Feb 2016 22:26:17 -0800 Subject: [PATCH 10/27] Updated jsdoc. --- src/index.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/index.js b/src/index.js index 277c1e4..f816a2c 100644 --- a/src/index.js +++ b/src/index.js @@ -168,8 +168,7 @@ const RUN_OPTS_DEFAULTS = {} * @param {number} [opts.max=50] Maximum connections in pool. * @param {number} [opts.min=10] Minimum connections in pool. * @param {number} [opts.port=28015] RethinkDB port. - * @param {boolean} [opts.raw=false] Whether to return detailed result objects - * instead of just record data. + * @param {boolean} [opts.raw=false] Whether to return a more detailed response object. */ export default function RethinkDBAdapter (opts) { const self = this From 741451c97f2e0e2d26cd70fad50183ff43dbcec6 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 27 Feb 2016 13:20:09 -0800 Subject: [PATCH 11/27] 3.0.0-alpha.5 --- CHANGELOG.md | 8 + CONTRIBUTORS | 2 +- dist/js-data-rethinkdb.js | 293 ++++++++++++++++++++++++---------- dist/js-data-rethinkdb.js.map | 2 +- package.json | 4 +- src/index.js | 289 +++++++++++++++++++++++---------- 6 files changed, 425 insertions(+), 173 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce65eeb..ca49289 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +##### 3.0.0-alpha.5 - 27 February 2016 + +###### Backwards compatible API changes +- Added ability to override query operators used by RethinkDBAdapter#filterSequence. + +###### Other +- Improved JSDoc comments. + ##### 3.0.0-alpha.4 - 26 February 2016 ###### Other diff --git a/CONTRIBUTORS b/CONTRIBUTORS index ab1e598..ed689c2 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -5,5 +5,5 @@ # Names should be added to this file as: # [commit count] Name 1 InternalFX - 48 Jason Dobry + 50 Jason Dobry 2 Ollie Relph diff --git a/dist/js-data-rethinkdb.js b/dist/js-data-rethinkdb.js index 85a2093..a7a14c8 100644 --- a/dist/js-data-rethinkdb.js +++ b/dist/js-data-rethinkdb.js @@ -39,6 +39,7 @@ var isArray = jsData.utils.isArray; var isObject = jsData.utils.isObject; var isString = jsData.utils.isString; var isUndefined = jsData.utils.isUndefined; +var plainCopy = jsData.utils.plainCopy; var resolve = jsData.utils.resolve; @@ -168,6 +169,76 @@ var UPDATE_OPTS_DEFAULTS = {}; var DELETE_OPTS_DEFAULTS = {}; var RUN_OPTS_DEFAULTS = {}; +var equal = function equal(r, row, field, value) { + return row(field).default(null).eq(value); +}; + +var notEqual = function notEqual(r, row, field, value) { + return row(field).default(null).ne(value); +}; + +/** + * Default predicate functions for the filtering operators. + * + * @name RethinkDBAdapter.OPERATORS + * @property {Function} == Equality operator. + * @property {Function} === Same as `==`. + * @property {Function} != Inequality operator. + * @property {Function} !== Same as `!=`. + * @property {Function} > "Greater than" operator. + * @property {Function} >= "Greater than or equal to" operator. + * @property {Function} < "Less than" operator. + * @property {Function} <= "Less than or equal to" operator. + * @property {Function} isectEmpty Operator to test that the intersection + * between two arrays is empty. + * @property {Function} isectNotEmpty Operator to test that the intersection + * between two arrays is NOT empty. + * @property {Function} in Operator to test whether a value is found in the + * provided array. + * @property {Function} notIn Operator to test whether a value is NOT found in + * the provided array. + * @property {Function} contains Operator to test whether an array contains the + * provided value. + * @property {Function} notContains Operator to test whether an array does NOT + * contain the provided value. + */ +var OPERATORS = { + '==': equal, + '===': equal, + '!=': notEqual, + '!==': notEqual, + '>': function _(r, row, field, value) { + return row(field).default(null).gt(value); + }, + '>=': function _(r, row, field, value) { + return row(field).default(null).ge(value); + }, + '<': function _(r, row, field, value) { + return row(field).default(null).lt(value); + }, + '<=': function _(r, row, field, value) { + return row(field).default(null).le(value); + }, + 'isectEmpty': function isectEmpty(r, row, field, value) { + return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0); + }, + 'isectNotEmpty': function isectNotEmpty(r, row, field, value) { + return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0); + }, + 'in': function _in(r, row, field, value) { + return r.expr(value).default(r.expr([])).contains(row(field).default(null)); + }, + 'notIn': function notIn(r, row, field, value) { + return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not(); + }, + 'contains': function contains(r, row, field, value) { + return row(field).default([]).contains(value); + }, + 'notContains': function notContains(r, row, field, value) { + return row(field).default([]).contains(value).not(); + } +}; + /** * RethinkDBAdapter class. * @@ -197,9 +268,10 @@ var RUN_OPTS_DEFAULTS = {}; * @param {string} [opts.host="localhost"] RethinkDB host. * @param {number} [opts.max=50] Maximum connections in pool. * @param {number} [opts.min=10] Minimum connections in pool. + * @param {Object} [opts.operators] Override the default predicate functions for + * specified operators. * @param {number} [opts.port=28015] RethinkDB port. - * @param {boolean} [opts.raw=false] Whether to return detailed result objects - * instead of just record data. + * @param {boolean} [opts.raw=false] Whether to return a more detailed response object. */ function RethinkDBAdapter(opts) { var self = this; @@ -247,6 +319,15 @@ function RethinkDBAdapter(opts) { self.runOpts || (self.runOpts = {}); fillIn(self.runOpts, RUN_OPTS_DEFAULTS); + /** + * Override the default predicate functions for specified operators. + * + * @name RethinkDBAdapter#operators + * @type {Object} + * @default {} + */ + self.operators || (self.operators = {}); + /** * The rethinkdbdash instance used by this adapter. Use this directly when you * need to write custom queries. @@ -395,85 +476,78 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { selectTable: function selectTable(mapper, opts) { return this.selectDb(opts).table(mapper.table || underscore(mapper.name)); }, - filterSequence: function filterSequence(sequence, params) { - var r = this.r; - params = params || {}; - params.where = params.where || {}; - params.orderBy = params.orderBy || params.sort; - params.skip = params.skip || params.offset; - - Object.keys(params).forEach(function (k) { - var v = params[k]; - if (reserved.indexOf(k) === -1) { - if (isObject(v)) { - params.where[k] = v; + + + /** + * Apply the specified selection query to the provided RQL sequence. + * + * @name RethinkDBAdapter#filterSequence + * @method + * @param {Object} mapper The mapper. + * @param {Object} [query] Selection query. + * @param {Object} [query.where] Filtering criteria. + * @param {string|Array} [query.orderBy] Sorting criteria. + * @param {string|Array} [query.sort] Same as `query.sort`. + * @param {number} [query.limit] Limit results. + * @param {number} [query.skip] Offset results. + * @param {number} [query.offset] Same as `query.skip`. + * @param {Object} [opts] Configuration options. + * @param {Object} [opts.operators] Override the default predicate functions + * for specified operators. + */ + filterSequence: function filterSequence(sequence, query, opts) { + var self = this; + var r = self.r; + + query = plainCopy(query || {}); + opts || (opts = {}); + opts.operators || (opts.operators = {}); + query.where || (query.where = {}); + query.orderBy || (query.orderBy = query.sort); + query.orderBy || (query.orderBy = []); + query.skip || (query.skip = query.offset); + + // Transform non-keyword properties to "where" clause configuration + forOwn(query, function (config, keyword) { + if (reserved.indexOf(keyword) === -1) { + if (isObject(config)) { + query.where[keyword] = config; } else { - params.where[k] = { - '==': v + query.where[keyword] = { + '==': config }; } - delete params[k]; + delete query[keyword]; } }); - var query = sequence; + var rql = sequence; - if (Object.keys(params.where).length !== 0) { - query = query.filter(function (row) { + // Filter + if (Object.keys(query.where).length !== 0) { + // Filter sequence using filter function + rql = rql.filter(function (row) { var subQuery = undefined; - forOwn(params.where, function (criteria, field) { + // Apply filter for each field + forOwn(query.where, function (criteria, field) { if (!isObject(criteria)) { criteria = { '==': criteria }; } - forOwn(criteria, function (v, op) { - if (op === '==' || op === '===') { - subQuery = subQuery ? subQuery.and(row(field).default(null).eq(v)) : row(field).default(null).eq(v); - } else if (op === '!=' || op === '!==') { - subQuery = subQuery ? subQuery.and(row(field).default(null).ne(v)) : row(field).default(null).ne(v); - } else if (op === '>') { - subQuery = subQuery ? subQuery.and(row(field).default(null).gt(v)) : row(field).default(null).gt(v); - } else if (op === '>=') { - subQuery = subQuery ? subQuery.and(row(field).default(null).ge(v)) : row(field).default(null).ge(v); - } else if (op === '<') { - subQuery = subQuery ? subQuery.and(row(field).default(null).lt(v)) : row(field).default(null).lt(v); - } else if (op === '<=') { - subQuery = subQuery ? subQuery.and(row(field).default(null).le(v)) : row(field).default(null).le(v); - } else if (op === 'isectEmpty') { - subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0); - } else if (op === 'isectNotEmpty') { - subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0); - } else if (op === 'in') { - subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null)); - } else if (op === 'notIn') { - subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not(); - } else if (op === 'contains') { - subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v)) : row(field).default([]).contains(v); - } else if (op === 'notContains') { - subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not(); - } else if (op === '|==' || op === '|===') { - subQuery = subQuery ? subQuery.or(row(field).default(null).eq(v)) : row(field).default(null).eq(v); - } else if (op === '|!=' || op === '|!==') { - subQuery = subQuery ? subQuery.or(row(field).default(null).ne(v)) : row(field).default(null).ne(v); - } else if (op === '|>') { - subQuery = subQuery ? subQuery.or(row(field).default(null).gt(v)) : row(field).default(null).gt(v); - } else if (op === '|>=') { - subQuery = subQuery ? subQuery.or(row(field).default(null).ge(v)) : row(field).default(null).ge(v); - } else if (op === '|<') { - subQuery = subQuery ? subQuery.or(row(field).default(null).lt(v)) : row(field).default(null).lt(v); - } else if (op === '|<=') { - subQuery = subQuery ? subQuery.or(row(field).default(null).le(v)) : row(field).default(null).le(v); - } else if (op === '|isectEmpty') { - subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0); - } else if (op === '|isectNotEmpty') { - subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0); - } else if (op === '|in') { - subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null)); - } else if (op === '|notIn') { - subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not(); - } else if (op === '|contains') { - subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v)) : row(field).default([]).contains(v); - } else if (op === '|notContains') { - subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not(); + // Apply filter for each operator + forOwn(criteria, function (value, operator) { + var isOr = false; + if (operator && operator[0] === '|') { + operator = operator.substr(1); + isOr = true; + } + var predicateFn = self.getOperator(operator, opts); + if (predicateFn) { + var predicateResult = predicateFn(r, row, field, value); + if (isOr) { + subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult; + } else { + subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult; + } } }); }); @@ -481,27 +555,30 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }); } - if (params.orderBy) { - if (isString(params.orderBy)) { - params.orderBy = [[params.orderBy, 'asc']]; + // Sort + if (query.orderBy) { + if (isString(query.orderBy)) { + query.orderBy = [[query.orderBy, 'asc']]; } - for (var i = 0; i < params.orderBy.length; i++) { - if (isString(params.orderBy[i])) { - params.orderBy[i] = [params.orderBy[i], 'asc']; + for (var i = 0; i < query.orderBy.length; i++) { + if (isString(query.orderBy[i])) { + query.orderBy[i] = [query.orderBy[i], 'asc']; } - query = (params.orderBy[i][1] || '').toUpperCase() === 'DESC' ? query.orderBy(r.desc(params.orderBy[i][0])) : query.orderBy(params.orderBy[i][0]); + rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0]); } } - if (params.skip) { - query = query.skip(+params.skip); + // Offset + if (query.skip) { + rql = rql.skip(+query.skip); } - if (params.limit) { - query = query.limit(+params.limit); + // Limit + if (query.limit) { + rql = rql.limit(+query.limit); } - return query; + return rql; }, waitForDb: function waitForDb(opts) { var self = this; @@ -665,8 +742,16 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @method * @param {Object} mapper the mapper. * @param {Object} [query] Selection query. + * @param {Object} [query.where] Filtering criteria. + * @param {string|Array} [query.orderBy] Sorting criteria. + * @param {string|Array} [query.sort] Same as `query.sort`. + * @param {number} [query.limit] Limit results. + * @param {number} [query.skip] Offset results. + * @param {number} [query.offset] Same as `query.skip`. * @param {Object} [opts] Configuration options. * @param {Object} [opts.deleteOpts] Options to pass to r#delete. + * @param {Object} [opts.operators] Override the default predicate functions + * for specified operators. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. * @param {Object} [opts.runOpts] Options to pass to r#run. @@ -955,8 +1040,16 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @name RethinkDBAdapter#findAll * @method * @param {Object} mapper The mapper. - * @param {Object} query Selection query. + * @param {Object} [query] Selection query. + * @param {Object} [query.where] Filtering criteria. + * @param {string|Array} [query.orderBy] Sorting criteria. + * @param {string|Array} [query.sort] Same as `query.sort`. + * @param {number} [query.limit] Limit results. + * @param {number} [query.skip] Offset results. + * @param {number} [query.offset] Same as `query.skip`. * @param {Object} [opts] Configuration options. + * @param {Object} [opts.operators] Override the default predicate functions + * for specified operators. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. * @param {Object} [opts.runOpts] Options to pass to r#run. @@ -1081,6 +1174,26 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }, + /** + * Resolve the predicate function for the specified operator based on the + * given options and this adapter's settings. + * + * @name RethinkDBAdapter#getOperator + * @method + * @param {string} operator The name of the operator. + * @param {Object} [opts] Configuration options. + * @param {Object} [opts.operators] Override the default predicate functions + * for specified operators. + * @return {*} The predicate function for the specified operator. + */ + getOperator: function getOperator(operator, opts) { + opts || (opts = {}); + opts.operators || (opts.operators = {}); + var ownOps = this.operators || {}; + return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]; + }, + + /** * Resolve the value of the specified option based on the given options and * this adapter's settings. @@ -1093,7 +1206,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ getOpt: function getOpt(opt, opts) { opts || (opts = {}); - return isUndefined(opts[opt]) ? this[opt] : opts[opt]; + return isUndefined(opts[opt]) ? plainCopy(this[opt]) : plainCopy(opts[opt]); }, @@ -1191,11 +1304,19 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} mapper The mapper. * @param {Object} props The update to apply to the selected records. * @param {Object} [query] Selection query. + * @param {Object} [query.where] Filtering criteria. + * @param {string|Array} [query.orderBy] Sorting criteria. + * @param {string|Array} [query.sort] Same as `query.sort`. + * @param {number} [query.limit] Limit results. + * @param {number} [query.skip] Offset results. + * @param {number} [query.offset] Same as `query.skip`. * @param {Object} [opts] Configuration options. - * @param {Object} [opts.updateOpts] Options to pass to r#update. + * @param {Object} [opts.operators] Override the default predicate functions + * for specified operators. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. * @param {Object} [opts.runOpts] Options to pass to r#run. + * @param {Object} [opts.updateOpts] Options to pass to r#update. * @return {Promise} */ updateAll: function updateAll(mapper, props, query, opts) { @@ -1330,5 +1451,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } }); +RethinkDBAdapter.OPERATORS = OPERATORS; + module.exports = RethinkDBAdapter; //# sourceMappingURL=js-data-rethinkdb.js.map \ No newline at end of file diff --git a/dist/js-data-rethinkdb.js.map b/dist/js-data-rethinkdb.js.map index 0fe30c0..0dc19ea 100644 --- a/dist/js-data-rethinkdb.js.map +++ b/dist/js-data-rethinkdb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\n\nconst {\n addHiddenPropsToTarget,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n resolve\n} = utils\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nconst unique = function (array) {\n const seen = {}\n const final = []\n array.forEach(function (item) {\n if (item in seen) {\n return\n }\n final.push(item)\n seen[item] = 0\n })\n return final\n}\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * Whether to log debugging information.\n *\n * @name RethinkDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015,\n\n /**\n * Whether to return a more detailed response object.\n *\n * @name RethinkDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return detailed result objects\n * instead of just record data.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n /**\n * @name RethinkDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name RethinkDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n filterSequence (sequence, params) {\n let r = this.r\n params = params || {}\n params.where = params.where || {}\n params.orderBy = params.orderBy || params.sort\n params.skip = params.skip || params.offset\n\n Object.keys(params).forEach(function (k) {\n let v = params[k]\n if (reserved.indexOf(k) === -1) {\n if (isObject(v)) {\n params.where[k] = v\n } else {\n params.where[k] = {\n '==': v\n }\n }\n delete params[k]\n }\n })\n\n let query = sequence\n\n if (Object.keys(params.where).length !== 0) {\n query = query.filter(function (row) {\n let subQuery\n forOwn(params.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n forOwn(criteria, function (v, op) {\n if (op === '==' || op === '===') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '!=' || op === '!==') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '>') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '>=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '<') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '<=') {\n subQuery = subQuery ? subQuery.and(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === 'isectEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === 'isectNotEmpty') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === 'in') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === 'notIn') {\n subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === 'contains') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v)) : row(field).default([]).contains(v)\n } else if (op === 'notContains') {\n subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not()\n } else if (op === '|==' || op === '|===') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).eq(v)) : row(field).default(null).eq(v)\n } else if (op === '|!=' || op === '|!==') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ne(v)) : row(field).default(null).ne(v)\n } else if (op === '|>') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).gt(v)) : row(field).default(null).gt(v)\n } else if (op === '|>=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).ge(v)) : row(field).default(null).ge(v)\n } else if (op === '|<') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).lt(v)) : row(field).default(null).lt(v)\n } else if (op === '|<=') {\n subQuery = subQuery ? subQuery.or(row(field).default(null).le(v)) : row(field).default(null).le(v)\n } else if (op === '|isectEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)\n } else if (op === '|isectNotEmpty') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)\n } else if (op === '|in') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null))\n } else if (op === '|notIn') {\n subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()\n } else if (op === '|contains') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v)) : row(field).default([]).contains(v)\n } else if (op === '|notContains') {\n subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not()\n }\n })\n })\n return subQuery || true\n })\n }\n\n if (params.orderBy) {\n if (isString(params.orderBy)) {\n params.orderBy = [\n [params.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < params.orderBy.length; i++) {\n if (isString(params.orderBy[i])) {\n params.orderBy[i] = [params.orderBy[i], 'asc']\n }\n query = (params.orderBy[i][1] || '').toUpperCase() === 'DESC' ? query.orderBy(r.desc(params.orderBy[i][0])) : query.orderBy(params.orderBy[i][0])\n }\n }\n\n if (params.skip) {\n query = query.skip(+params.skip)\n }\n\n if (params.limit) {\n query = query.limit(+params.limit)\n }\n\n return query\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return self[op](mapper, props, opts, record).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.created = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return self[op](mapper, props, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.created = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * There may be reasons why you may want to override this method, like when\n * the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name RethinkDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Load a hasMany relationship.\n *\n * @name RethinkDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (mapper, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(mapper, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * Load a hasOne relationship.\n *\n * @name RethinkDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (mapper, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(mapper, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name RethinkDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Load a belongsTo relationship.\n *\n * @name RethinkDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n return self.getOpt('raw', opts) ? {\n data: record,\n found: record ? 1 : 0\n } : record\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} query Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, records)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n return self.getOpt('raw', opts) ? {\n data: records,\n found: records.length\n } : records\n })\n })\n },\n\n /**\n * Resolve the value of the specified option based on the given options and\n * this adapter's settings.\n *\n * @name RethinkDBAdapter#getOpt\n * @method\n * @param {string} opt The name of the option.\n * @param {Object} [opts] Configuration options.\n * @return {*} The value of the specified option.\n */\n getOpt (opt, opts) {\n opts || (opts = {})\n return isUndefined(opts[opt]) ? this[opt] : opts[opt]\n },\n\n /**\n * Logging utility method.\n *\n * @name RethinkDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (RethinkDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(_props, updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return self[op](mapper, props, query, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, updatedRecords)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? updatedRecords : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n"],"names":["utils"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\n\nconst {\n addHiddenPropsToTarget,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n plainCopy,\n resolve\n} = utils\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nconst unique = function (array) {\n const seen = {}\n const final = []\n array.forEach(function (item) {\n if (item in seen) {\n return\n }\n final.push(item)\n seen[item] = 0\n })\n return final\n}\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * Whether to log debugging information.\n *\n * @name RethinkDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015,\n\n /**\n * Whether to return a more detailed response object.\n *\n * @name RethinkDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} === Same as `==`.\n * @property {Function} != Inequality operator.\n * @property {Function} !== Same as `!=`.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n /**\n * @name RethinkDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name RethinkDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return self[op](mapper, props, opts, record).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.created = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return self[op](mapper, props, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.created = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * There may be reasons why you may want to override this method, like when\n * the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name RethinkDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Load a hasMany relationship.\n *\n * @name RethinkDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (mapper, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(mapper, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * Load a hasOne relationship.\n *\n * @name RethinkDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (mapper, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(mapper, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name RethinkDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Load a belongsTo relationship.\n *\n * @name RethinkDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n return self.getOpt('raw', opts) ? {\n data: record,\n found: record ? 1 : 0\n } : record\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, records)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n return self.getOpt('raw', opts) ? {\n data: records,\n found: records.length\n } : records\n })\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Resolve the value of the specified option based on the given options and\n * this adapter's settings.\n *\n * @name RethinkDBAdapter#getOpt\n * @method\n * @param {string} opt The name of the option.\n * @param {Object} [opts] Configuration options.\n * @return {*} The value of the specified option.\n */\n getOpt (opt, opts) {\n opts || (opts = {})\n return isUndefined(opts[opt]) ? plainCopy(this[opt]) : plainCopy(opts[opt])\n },\n\n /**\n * Logging utility method.\n *\n * @name RethinkDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (RethinkDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(_props, updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return self[op](mapper, props, query, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, updatedRecords)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? updatedRecords : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n"],"names":["utils"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAKE,yBAWEA,aAXF;IACA,SAUEA,aAVF;IACA,kBASEA,aATF;IACA,SAQEA,aARF;IACA,MAOEA,aAPF;IACA,UAMEA,aANF;IACA,WAKEA,aALF;IACA,WAIEA,aAJF;IACA,cAGEA,aAHF;IACA,YAEEA,aAFF;IACA,UACEA,aADF;;;AAGF,IAAM,WAAW,CACf,SADe,EAEf,MAFe,EAGf,OAHe,EAIf,QAJe,EAKf,MALe,EAMf,OANe,CAAX;;AASN,IAAM,SAAS,SAAT,MAAS,CAAU,KAAV,EAAiB;MACxB,OAAO,EAAP,CADwB;MAExB,QAAQ,EAAR,CAFwB;QAGxB,OAAN,CAAc,UAAU,IAAV,EAAgB;QACxB,QAAQ,IAAR,EAAc;aAAA;KAAlB;UAGM,IAAN,CAAW,IAAX,EAJ4B;SAKvB,IAAL,IAAa,CAAb,CAL4B;GAAhB,CAAd,CAH8B;SAUvB,KAAP,CAV8B;CAAjB;;AAaf,IAAM,OAAO,SAAP,IAAO,GAAmB;MACxB,OAAO,IAAP,CADwB;;oCAAN;;GAAM;;MAExB,OAAO,KAAK,KAAK,MAAL,GAAc,CAAd,CAAZ,CAFwB;OAGzB,GAAL,cAAS,KAAK,EAAL,SAAY,KAArB,EAH8B;SAIvB,SAAP,CAJ8B;CAAnB;;AAOb,IAAM,QAAQ,SAAR,KAAQ,GAAmB;MACzB,OAAO,IAAP,CADyB;;qCAAN;;GAAM;;MAEzB,OAAO,KAAK,KAAK,MAAL,GAAc,CAAd,CAAZ,CAFyB;OAG1B,GAAL,cAAS,KAAK,EAAL,SAAY,KAArB,EAH+B;SAIxB,SAAP,CAJ+B;CAAnB;;AAOd,IAAM,WAAW;;;;;;;WAON,EAAT;;;;;;;;;cASY,EAAZ;;;;;;;;;MASI,MAAJ;;;;;;;;;SASO,KAAP;;;;;;;;;QASM,WAAN;;;;;;;;;OASK,EAAL;;;;;;;;;OASK,EAAL;;;;;;;;;QASM,KAAN;;;;;;;;;OASK,KAAL;CA/EI;;AAkFN,IAAM,uBAAuB,EAAvB;AACN,IAAM,uBAAuB,EAAvB;AACN,IAAM,uBAAuB,EAAvB;AACN,IAAM,oBAAoB,EAApB;;AAEN,IAAM,QAAQ,SAAR,KAAQ,CAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;SACrC,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CAD4C;CAAhC;;AAId,IAAM,WAAW,SAAX,QAAW,CAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;SACxC,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CAD+C;CAAhC;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BjB,IAAM,YAAY;QACV,KAAN;SACO,KAAP;QACM,QAAN;SACO,QAAP;OACK,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC5B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADmC;GAAhC;QAGC,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC7B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADoC;GAAhC;OAGD,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC5B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADmC;GAAhC;QAGC,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC7B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADoC;GAAhC;gBAGQ,oBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACrC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,eAAvB,CAAuC,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAtB,CAAvC,EAAkE,KAAlE,GAA0E,EAA1E,CAA6E,CAA7E,CAAP,CAD4C;GAAhC;mBAGG,uBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACxC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,eAAvB,CAAuC,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAtB,CAAvC,EAAkE,KAAlE,GAA0E,EAA1E,CAA6E,CAA7E,CAAP,CAD+C;GAAhC;QAGX,aAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC7B,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAE,IAAF,CAAO,EAAP,CAAtB,EAAkC,QAAlC,CAA2C,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,CAA3C,CAAP,CADoC;GAAhC;WAGG,eAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAChC,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAE,IAAF,CAAO,EAAP,CAAtB,EAAkC,QAAlC,CAA2C,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,CAA3C,EAAqE,GAArE,EAAP,CADuC;GAAhC;cAGG,kBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACnC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,QAAvB,CAAgC,KAAhC,CAAP,CAD0C;GAAhC;iBAGG,qBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACtC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,QAAvB,CAAgC,KAAhC,EAAuC,GAAvC,EAAP,CAD6C;GAAhC;CAhCX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuEN,AAAe,SAAS,gBAAT,CAA2B,IAA3B,EAAiC;MACxC,OAAO,IAAP,CADwC;WAErC,OAAO,EAAP,CAAT,CAF8C;SAGvC,IAAP,EAAa,QAAb,EAH8C;SAIvC,IAAP,EAAa,IAAb;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAb8C;SAcvC,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAvB8C;SAwBvC,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAjC8C;SAkCvC,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,OAAL,KAAiB,KAAK,OAAL,GAAe,EAAf,CAAjB,CA3C8C;SA4CvC,KAAK,OAAL,EAAc,iBAArB;;;;;;;;;MASA,CAAK,SAAL,KAAmB,KAAK,SAAL,GAAiB,EAAjB,CAAnB;;;;;;;;;MASA,CAAK,CAAL,GAAS,cAAc,IAAd,CAAT,CA9D8C;OA+DzC,SAAL,GAAiB,EAAjB,CA/D8C;OAgEzC,MAAL,GAAc,EAAd,CAhE8C;OAiEzC,OAAL,GAAe,EAAf,CAjE8C;CAAjC;;AAoEf,uBAAuB,iBAAiB,SAAjB,EAA4B;wCAClC,QAAQ;QACjB,UAAU,OAAO,MAAP,GAAgB,CAAhB,EAAmB;UAC3B,OAAO,WAAP,EAAoB;cAChB,IAAI,KAAJ,CAAU,OAAO,WAAP,CAAhB,CADsB;OAAxB;YAGM,IAAI,KAAJ,CAAU,yBAAV,CAAN,CAJ+B;KAAjC;GAF+C;;;;;;eAapC,KAAb;;;;;;mBAMiB,KAAjB;;;;;;gBAMc,KAAd;;;;;;mBAMiB,KAAjB;;;;;;aAMW,KAAX;;;;;;gBAMc,KAAd;;;;;;eAMa,KAAb;;;;;;kBAMgB,KAAhB;;;;;;mBAMiB,KAAjB;;;;;;gBAMc,IAAd;;;;;;oBAMkB,IAAlB;;;;;;iBAMe,IAAf;;;;;;oBAMkB,IAAlB;;;;;;cAMY,IAAZ;;;;;;iBAMe,IAAf;;;;;;gBAMc,IAAd;;;;;;mBAMiB,IAAjB;;;;;;oBAMkB,IAAlB;;;;;;sBAMc;uCAAN;;KAAM;;SACP,GAAL,cAAS,gBAAY,KAArB,EADY;GAzHmC;8BA6HvC,MAAM;WACP,KAAK,CAAL,CAAO,EAAP,CAAU,YAAY,KAAK,EAAL,CAAZ,GAAuB,KAAK,EAAL,GAAU,KAAK,EAAL,CAAlD,CADc;GA7HiC;oCAiIpC,QAAQ,MAAM;WAClB,KAAK,QAAL,CAAc,IAAd,EAAoB,KAApB,CAA0B,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAAjC,CADyB;GAjIsB;;;;;;;;;;;;;;;;;;;;0CAsJjC,UAAU,OAAO,MAAM;QAC/B,OAAO,IAAP,CAD+B;QAE/B,IAAI,KAAK,CAAL,CAF2B;;YAI7B,UAAU,SAAS,EAAT,CAAlB,CAJqC;aAK5B,OAAO,EAAP,CAAT,CALqC;SAMhC,SAAL,KAAmB,KAAK,SAAL,GAAiB,EAAjB,CAAnB,CANqC;UAO/B,KAAN,KAAgB,MAAM,KAAN,GAAc,EAAd,CAAhB,CAPqC;UAQ/B,OAAN,KAAkB,MAAM,OAAN,GAAgB,MAAM,IAAN,CAAlC,CARqC;UAS/B,OAAN,KAAkB,MAAM,OAAN,GAAgB,EAAhB,CAAlB,CATqC;UAU/B,IAAN,KAAe,MAAM,IAAN,GAAa,MAAM,MAAN,CAA5B;;;UAGA,CAAO,KAAP,EAAc,UAAU,MAAV,EAAkB,OAAlB,EAA2B;UACnC,SAAS,OAAT,CAAiB,OAAjB,MAA8B,CAAC,CAAD,EAAI;YAChC,SAAS,MAAT,CAAJ,EAAsB;gBACd,KAAN,CAAY,OAAZ,IAAuB,MAAvB,CADoB;SAAtB,MAEO;gBACC,KAAN,CAAY,OAAZ,IAAuB;kBACf,MAAN;WADF,CADK;SAFP;eAOO,MAAM,OAAN,CAAP,CARoC;OAAtC;KADY,CAAd,CAbqC;;QA0BjC,MAAM,QAAN;;;QAGA,OAAO,IAAP,CAAY,MAAM,KAAN,CAAZ,CAAyB,MAAzB,KAAoC,CAApC,EAAuC;;YAEnC,IAAI,MAAJ,CAAW,UAAU,GAAV,EAAe;YAC1B,oBAAJ;;cAEA,CAAO,MAAM,KAAN,EAAa,UAAU,QAAV,EAAoB,KAApB,EAA2B;cACzC,CAAC,SAAS,QAAT,CAAD,EAAqB;uBACZ,EAAE,MAAM,QAAN,EAAb,CADuB;WAAzB;;gBAIA,CAAO,QAAP,EAAiB,UAAU,KAAV,EAAiB,QAAjB,EAA2B;gBACtC,OAAO,KAAP,CADsC;gBAEtC,YAAY,SAAS,CAAT,MAAgB,GAAhB,EAAqB;yBACxB,SAAS,MAAT,CAAgB,CAAhB,CAAX,CADmC;qBAE5B,IAAP,CAFmC;aAArC;gBAII,cAAc,KAAK,WAAL,CAAiB,QAAjB,EAA2B,IAA3B,CAAd,CANsC;gBAOtC,WAAJ,EAAiB;kBACT,kBAAkB,YAAY,CAAZ,EAAe,GAAf,EAAoB,KAApB,EAA2B,KAA3B,CAAlB,CADS;kBAEX,IAAJ,EAAU;2BACG,WAAW,SAAS,EAAT,CAAY,eAAZ,CAAX,GAA0C,eAA1C,CADH;eAAV,MAEO;2BACM,WAAW,SAAS,GAAT,CAAa,eAAb,CAAX,GAA2C,eAA3C,CADN;eAFP;aAFF;WAPe,CAAjB,CAL6C;SAA3B,CAApB,CAH8B;eAyBvB,YAAY,IAAZ,CAzBuB;OAAf,CAAjB,CAFyC;KAA3C;;;QAgCI,MAAM,OAAN,EAAe;UACb,SAAS,MAAM,OAAN,CAAb,EAA6B;cACrB,OAAN,GAAgB,CACd,CAAC,MAAM,OAAN,EAAe,KAAhB,CADc,CAAhB,CAD2B;OAA7B;WAKK,IAAI,IAAI,CAAJ,EAAO,IAAI,MAAM,OAAN,CAAc,MAAd,EAAsB,GAA1C,EAA+C;YACzC,SAAS,MAAM,OAAN,CAAc,CAAd,CAAT,CAAJ,EAAgC;gBACxB,OAAN,CAAc,CAAd,IAAmB,CAAC,MAAM,OAAN,CAAc,CAAd,CAAD,EAAmB,KAAnB,CAAnB,CAD8B;SAAhC;cAGM,CAAC,MAAM,OAAN,CAAc,CAAd,EAAiB,CAAjB,KAAuB,EAAvB,CAAD,CAA4B,WAA5B,OAA8C,MAA9C,GAAuD,IAAI,OAAJ,CAAY,EAAE,IAAF,CAAO,MAAM,OAAN,CAAc,CAAd,EAAiB,CAAjB,CAAP,CAAZ,CAAvD,GAAkG,IAAI,OAAJ,CAAY,MAAM,OAAN,CAAc,CAAd,EAAiB,CAAjB,CAAZ,CAAlG,CAJuC;OAA/C;KANF;;;QAeI,MAAM,IAAN,EAAY;YACR,IAAI,IAAJ,CAAS,CAAC,MAAM,IAAN,CAAhB,CADc;KAAhB;;;QAKI,MAAM,KAAN,EAAa;YACT,IAAI,KAAJ,CAAU,CAAC,MAAM,KAAN,CAAjB,CADe;KAAjB;;WAIO,GAAP,CArFqC;GAtJU;gCA8OtC,MAAM;QACT,OAAO,IAAP,CADS;aAEN,OAAO,EAAP,CAAT,CAFe;QAGT,KAAK,YAAY,KAAK,EAAL,CAAZ,GAAuB,KAAK,EAAL,GAAU,KAAK,EAAL,CAH7B;QAIX,CAAC,KAAK,SAAL,CAAe,EAAf,CAAD,EAAqB;WAClB,SAAL,CAAe,EAAf,IAAqB,KAAK,CAAL,CAAO,MAAP,CACnB,KAAK,CAAL,CAAO,MAAP,GAAgB,QAAhB,CAAyB,EAAzB,CADmB,EAEnB,IAFmB,EAGnB,KAAK,CAAL,CAAO,QAAP,CAAgB,EAAhB,CAHmB,EAInB,GAJmB,EAArB,CADuB;KAAzB;WAOO,KAAK,SAAL,CAAe,EAAf,CAAP,CAXe;GA9OgC;;;;;;;;;;;;;;;;;0BA0QzC,QAAQ,OAAO,MAAM;QACrB,OAAO,IAAP,CADqB;QAEvB,cAAJ,CAF2B;cAGjB,QAAQ,EAAR,CAAV,CAH2B;aAIlB,OAAO,EAAP,CAAT,CAJ2B;;WAMpB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,cAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,UAAU,MAAV,EAAkB;;eAEf,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAFe;UAGlB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAHkB;iBAIb,aAAX,GAA2B,IAA3B,CAJwB;aAKjB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,MAA/B,CAAsC,MAAtC,EAA8C,UAA9C,EAA0D,GAA1D,CAA8D,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAA9D,CAAP,CALwB;KAAlB,CAJD,CAUJ,IAVI,CAUC,UAAU,MAAV,EAAkB;WACnB,aAAL,CAAmB,MAAnB,EADwB;UAEpB,kBAAJ,CAFwB;UAGpB,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,IAAyB,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,EAA2B;iBACzE,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,CADyE;OAApF;;QAIA,GAAK,KAAK,EAAL,GAAU,aAAV,CAPmB;aAQjB,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,MAA9B,EAAsC,IAAtC,CAA2C,UAAU,OAAV,EAAmB;;iBAE1D,YAAY,OAAZ,IAAuB,MAAvB,GAAgC,OAAhC,CAF0D;YAG7D,SAAS,EAAT,CAH6D;eAI5D,MAAP,EAAe,MAAf,EAJmE;eAK5D,IAAP,GAAc,MAAd,CALmE;eAM5D,OAAP,GAAiB,SAAS,CAAT,GAAa,CAAb,CANkD;eAO5D,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B,MAA3B,GAAoC,OAAO,IAAP,CAPwB;OAAnB,CAAlD,CARwB;KAAlB,CAVR,CAN2B;GA1QoB;;;;;;;;;;;;;;;;;kCA4TrC,QAAQ,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;QAE3B,cAAJ,CAF+B;cAGrB,QAAQ,EAAR,CAAV,CAH+B;aAItB,OAAO,EAAP,CAAT,CAJ+B;;WAMxB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,kBAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,UAAU,MAAV,EAAkB;;eAEf,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAFe;UAGlB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAHkB;iBAIb,aAAX,GAA2B,IAA3B,CAJwB;aAKjB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,MAA/B,CAAsC,MAAtC,EAA8C,UAA9C,EAA0D,GAA1D,CAA8D,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAA9D,CAAP,CALwB;KAAlB,CAJD,CAUJ,IAVI,CAUC,UAAU,MAAV,EAAkB;WACnB,aAAL,CAAmB,MAAnB,EADwB;UAEpB,UAAU,EAAV,CAFoB;UAGpB,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,IAAyB,OAAO,OAAP,EAAgB;kBAC7D,OAAO,OAAP,CAAe,GAAf,CAAmB,UAAU,MAAV,EAAkB;iBACtC,OAAO,OAAP,CADsC;SAAlB,CAA7B,CADuE;OAAzE;;QAMA,GAAK,KAAK,EAAL,GAAU,iBAAV,CATmB;aAUjB,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,OAA9B,EAAuC,IAAvC,CAA4C,UAAU,QAAV,EAAoB;;kBAE3D,YAAY,QAAZ,IAAwB,OAAxB,GAAkC,QAAlC,CAF2D;YAG/D,SAAS,EAAT,CAH+D;eAI9D,MAAP,EAAe,MAAf,EAJqE;eAK9D,IAAP,GAAc,OAAd,CALqE;eAM9D,OAAP,GAAiB,QAAQ,MAAR,CANoD;eAO9D,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B,MAA3B,GAAoC,OAAO,IAAP,CAP0B;OAApB,CAAnD,CAVwB;KAAlB,CAVR,CAN+B;GA5TgB;;;;;;;;;;;;;;;;;4BAgXxC,QAAQ,IAAI,MAAM;QACnB,OAAO,IAAP,CADmB;QAErB,cAAJ,CAFyB;aAGhB,OAAO,EAAP,CAAT,CAHyB;;WAKlB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,eAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,YAAY;WACb,KAAK,EAAL,GAAU,SAAV,CADa;WAEb,GAAL,CAAS,EAAT,EAAa,EAAb,EAAiB,IAAjB,EAFkB;aAGX,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,GAA/B,CAAmC,EAAnC,EAAuC,MAAvC,CAA8C,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAA9C,EAA+E,GAA/E,CAAmF,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAAnF,CAAP,CAHkB;KAAZ,CAJD,CAQJ,IARI,CAQC,UAAU,MAAV,EAAkB;;WAEnB,KAAK,EAAL,GAAU,cAAV,CAFmB;aAGjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,EAA2B,MAA3B,CAAR,EAA4C,IAA5C,CAAiD,UAAU,OAAV,EAAmB;;eAElE,YAAY,OAAZ,IAAuB,MAAvB,GAAgC,OAAhC,CAFkE;OAAnB,CAAxD,CAHwB;KAAlB,CARD,CAeJ,IAfI,CAeC,UAAU,MAAV,EAAkB;aACjB,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B,MAA3B,GAAoC,SAApC,CADiB;KAAlB,CAfR,CALyB;GAhXsB;;;;;;;;;;;;;;;;;;;;;;;;;kCA+ZrC,QAAQ,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;QAE3B,cAAJ,CAF+B;cAGrB,QAAQ,EAAR,CAAV,CAH+B;aAItB,OAAO,EAAP,CAAT,CAJ+B;;WAMxB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,kBAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,YAAY;WACb,KAAK,EAAL,GAAU,YAAV,CADa;WAEb,GAAL,CAAS,EAAT,EAAa,KAAb,EAAoB,IAApB,EAFkB;aAGX,KACJ,cADI,CACW,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CADX,EAC2C,KAD3C,EAEJ,MAFI,CAEG,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAFH,EAGJ,GAHI,CAGA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAHA,CAAP,CAHkB;KAAZ,CAJD,CAWJ,IAXI,CAWC,UAAU,MAAV,EAAkB;;WAEnB,KAAK,EAAL,GAAU,iBAAV,CAFmB;aAGjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,MAA9B,CAAR,EAA+C,IAA/C,CAAoD,UAAU,OAAV,EAAmB;;eAErE,YAAY,OAAZ,IAAuB,MAAvB,GAAgC,OAAhC,CAFqE;OAAnB,CAA3D,CAHwB;KAAlB,CAXD,CAkBJ,IAlBI,CAkBC,UAAU,MAAV,EAAkB;aACjB,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B,MAA3B,GAAoC,SAApC,CADiB;KAAlB,CAlBR,CAN+B;GA/ZgB;;;;;;;;;;;;;wDAsc1B,QAAQ,KAAK,QAAQ;WACnC,IAAI,aAAJ,CAAkB,MAAlB,CAAP,CAD0C;GAtcK;;;;;;;;;;oCAidpC,QAAQ,KAAK,SAAS,QAAQ;QACnC,OAAO,IAAP,CADmC;QAErC,WAAW,KAAX,CAFqC;;QAIrC,SAAS,OAAT,KAAqB,CAAC,QAAQ,OAAR,CAAD,EAAmB;iBAC/B,IAAX,CAD0C;gBAEhC,CAAC,OAAD,CAAV,CAF0C;KAA5C;QAIM,MAAM,QAAQ,GAAR,CAAY,UAAU,MAAV,EAAkB;aACjC,KAAK,qBAAL,CAA2B,MAA3B,EAAmC,GAAnC,EAAwC,MAAxC,CAAP,CADwC;KAAlB,CAAlB,CARmC;QAWnC,QAAQ,EAAR,CAXmC;QAYnC,WAAW,MAAM,IAAI,UAAJ,CAAN,GAAwB,EAAxB,CAZwB;QAarC,QAAJ,EAAc;;eAEH,IAAT,IAAiB,IAAI,CAAJ,CAAjB,CAFY;KAAd,MAGO;eACI,IAAT,IAAiB,IAAI,MAAJ,CAAW,UAAU,EAAV,EAAc;eACjC,EAAP,CADwC;OAAd,CAA5B,CADK;KAHP;WAQO,KAAK,OAAL,CAAa,IAAI,WAAJ,EAAb,EAAgC,KAAhC,EAAuC,MAAvC,EAA+C,IAA/C,CAAoD,UAAU,YAAV,EAAwB;cACzE,OAAR,CAAgB,UAAU,MAAV,EAAkB;YAC5B,WAAW,EAAX;;YAEA,QAAJ,EAAc;qBACD,YAAX,CADY;SAAd,MAEO;uBACQ,OAAb,CAAqB,UAAU,WAAV,EAAuB;gBACtC,IAAI,WAAJ,EAAiB,IAAI,UAAJ,CAAjB,KAAqC,OAAO,OAAO,WAAP,CAA5C,EAAiE;uBAC1D,IAAT,CAAc,WAAd,EADmE;aAArE;WADmB,CAArB,CADK;SAFP;YASI,aAAJ,CAAkB,MAAlB,EAA0B,QAA1B,EAZgC;OAAlB,CAAhB,CADiF;KAAxB,CAA3D,CArByC;GAjdM;;;;;;;;;;kCA+frC,QAAQ,KAAK,SAAS,QAAQ;QACpC,SAAS,OAAT,KAAqB,CAAC,QAAQ,OAAR,CAAD,EAAmB;gBAChC,CAAC,OAAD,CAAV,CAD0C;KAA5C;WAGO,KAAK,WAAL,CAAiB,MAAjB,EAAyB,GAAzB,EAA8B,OAA9B,EAAuC,MAAvC,EAA+C,IAA/C,CAAoD,YAAY;cAC7D,OAAR,CAAgB,UAAU,MAAV,EAAkB;YAC1B,cAAc,IAAI,aAAJ,CAAkB,MAAlB,CAAd,CAD0B;YAE5B,QAAQ,WAAR,KAAwB,YAAY,MAAZ,EAAoB;cAC1C,aAAJ,CAAkB,MAAlB,EAA0B,YAAY,CAAZ,CAA1B,EAD8C;SAAhD;OAFc,CAAhB,CADqE;KAAZ,CAA3D,CAJwC;GA/fO;;;;;;;;;;4DAohBxB,QAAQ,KAAK,QAAQ;WACrC,IAAI,aAAJ,CAAkB,MAAlB,CAAP,CAD4C;GAphBG;;;;;;;;;;wCA+hBlC,QAAQ,KAAK,SAAS,QAAQ;QACrC,OAAO,IAAP,CADqC;QAErC,cAAc,IAAI,WAAJ,EAAd,CAFqC;;QAIvC,SAAS,OAAT,KAAqB,CAAC,QAAQ,OAAR,CAAD,EAAmB;;YACpC,SAAS,OAAT;;aACC,KAAK,IAAL,CAAU,WAAV,EAAuB,KAAK,uBAAL,CAA6B,MAA7B,EAAqC,GAArC,EAA0C,MAA1C,CAAvB,EAA0E,MAA1E,EAAkF,IAAlF,CAAuF,UAAU,WAAV,EAAuB;gBAC/G,aAAJ,CAAkB,MAAlB,EAA0B,WAA1B,EADmH;WAAvB;SAA9F;UAF0C;;;KAA5C,MAKO;UACC,OAAO,QAAQ,GAAR,CAAY,UAAU,MAAV,EAAkB;eAClC,KAAK,uBAAL,CAA6B,MAA7B,EAAqC,GAArC,EAA0C,MAA1C,CAAP,CADyC;OAAlB,CAAZ,CAEV,MAFU,CAEH,UAAU,GAAV,EAAe;eAChB,GAAP,CADuB;OAAf,CAFJ,CADD;aAME,KAAK,OAAL,CAAa,WAAb,EAA0B;+CAE5B,YAAY,WAAZ,EAA0B;gBACnB,IAAN;UAFJ;OADK,EAMJ,MANI,EAMI,IANJ,CAMS,UAAU,YAAV,EAAwB;gBAC9B,OAAR,CAAgB,UAAU,MAAV,EAAkB;uBACnB,OAAb,CAAqB,UAAU,WAAV,EAAuB;gBACtC,YAAY,YAAY,WAAZ,CAAZ,KAAyC,OAAO,IAAI,UAAJ,CAAhD,EAAiE;kBAC/D,aAAJ,CAAkB,MAAlB,EAA0B,WAA1B,EADmE;aAArE;WADmB,CAArB,CADgC;SAAlB,CAAhB,CADsC;OAAxB,CANhB,CANK;KALP;GAniB+C;;;;;;;;;;;;;;;;;sBA8kB3C,QAAQ,IAAI,MAAM;QAChB,OAAO,IAAP,CADgB;QAElB,kBAAJ;QAAY,cAAZ,CAFsB;aAGb,OAAO,EAAP,CAAT,CAHsB;SAIjB,IAAL,KAAc,KAAK,IAAL,GAAY,EAAZ,CAAd,CAJsB;;QAMhB,eAAe,OAAO,YAAP,IAAuB,EAAvB,CANC;QAOlB,QAAQ,CAAC,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,CAAD,CAAR,CAPkB;;iBAST,OAAb,CAAqB,UAAU,GAAV,EAAe;UAC5B,eAAe,IAAI,QAAJ,CADa;UAE5B,cAAc,IAAI,WAAJ,EAAd,CAF4B;UAG9B,CAAC,KAAK,IAAL,IAAa,KAAK,IAAL,CAAU,OAAV,CAAkB,YAAlB,MAAoC,CAAC,CAAD,EAAI;eAAA;OAA1D;UAGI,IAAI,UAAJ,IAAkB,IAAI,IAAJ,KAAa,WAAb,EAA0B;YAC1C,IAAI,IAAJ,KAAa,WAAb,EAA0B;gBACtB,IAAN,CAAW,KAAK,YAAL,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,EAAyC,IAAI,UAAJ,EAAgB,IAA3E,CAAX,EAD4B;SAA9B,MAEO;gBACC,IAAN,CAAW,KAAK,YAAL,CAAkB,YAAY,KAAZ,IAAqB,WAAW,YAAY,IAAZ,CAAhC,EAAmD,IAAI,UAAJ,EAAgB,IAArF,CAAX,EADK;SAFP;OADF;KANmB,CAArB,CATsB;WAuBf,QAAQ,GAAR,CAAY,KAAZ,EAAmB,IAAnB,CAAwB,YAAY;;WAEpC,KAAK,EAAL,GAAU,YAAV,CAFoC;aAGlC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,CAAR,CAAP,CAHyC;KAAZ,CAAxB,CAIJ,IAJI,CAIC,YAAY;WACb,KAAK,EAAL,GAAU,MAAV,CADa;WAEb,GAAL,CAAS,EAAT,EAAa,EAAb,EAAiB,IAAjB,EAFkB;aAGX,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,GAA/B,CAAmC,EAAnC,EAAuC,GAAvC,CAA2C,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAA3C,CAAP,CAHkB;KAAZ,CAJD,CAQJ,IARI,CAQC,UAAU,OAAV,EAAmB;UACrB,CAAC,OAAD,EAAU;eAAA;OAAd;eAGS,OAAT,CAJyB;UAKnB,QAAQ,EAAR,CALmB;;sBAOT,MAAhB,EAAwB,IAAxB,EAA8B,UAAU,GAAV,EAAe,MAAf,EAAuB;YAC7C,gBAAgB,IAAI,WAAJ,EAAhB,CAD6C;YAE/C,gBAAJ,CAFmD;;YAI/C,IAAI,UAAJ,KAAmB,IAAI,IAAJ,KAAa,QAAb,IAAyB,IAAI,IAAJ,KAAa,SAAb,CAA5C,EAAqE;cACnE,IAAI,IAAJ,KAAa,QAAb,EAAuB;mBAClB,KAAK,UAAL,CAAgB,MAAhB,EAAwB,GAAxB,EAA6B,MAA7B,EAAqC,MAArC,CAAP,CADyB;WAA3B,MAEO;mBACE,KAAK,WAAL,CAAiB,MAAjB,EAAyB,GAAzB,EAA8B,MAA9B,EAAsC,MAAtC,CAAP,CADK;WAFP;SADF,MAMO,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,SAAJ,EAAe;cAC9C,YAAY,EAAZ,CAD8C;cAE9C,WAAW,IAAI,MAAJ,EAAY,IAAI,SAAJ,CAAZ,IAA8B,EAA9B,CAFmC;qBAGvC,QAAQ,QAAR,IAAoB,QAApB,GAA+B,OAAO,IAAP,CAAY,QAAZ,CAA/B,CAHuC;sBAItC,UAAU,MAAV,CAAiB,QAAjB,CAAZ,CAJkD;iBAK3C,KAAK,OAAL,CAAa,aAAb,EAA4B;mDAE9B,cAAc,WAAd,EAA4B;oBACrB,OAAO,SAAP,EAAkB,MAAlB,CAAyB,UAAU,CAAV,EAAa;uBAAS,CAAP,CAAF;eAAb,CAA/B;cAFJ;WADK,EAMJ,MANI,EAMI,IANJ,CAMS,UAAU,YAAV,EAAwB;gBAClC,aAAJ,CAAkB,MAAlB,EAA0B,YAA1B,EADsC;WAAxB,CANhB,CALkD;SAA7C,MAcA,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,WAAJ,EAAiB;iBAC7C,KAAK,OAAL,CAAa,aAAb,EAA4B;mDAE9B,IAAI,WAAJ,EAAkB;0BACL,IAAI,MAAJ,EAAY,OAAO,WAAP,CAAxB;cAFJ;WADK,EAMJ,MANI,EAMI,IANJ,CAMS,UAAU,YAAV,EAAwB;gBAClC,aAAJ,CAAkB,MAAlB,EAA0B,YAA1B,EADsC;WAAxB,CANhB,CADoD;SAA/C,MAUA,IAAI,IAAI,IAAJ,KAAa,WAAb,EAA0B;iBAC5B,KAAK,aAAL,CAAmB,MAAnB,EAA2B,GAA3B,EAAgC,MAAhC,EAAwC,MAAxC,CAAP,CADmC;SAA9B;YAGH,IAAJ,EAAU;gBACF,IAAN,CAAW,IAAX,EADQ;SAAV;OArC4B,CAA9B,CAPyB;;aAiDlB,QAAQ,GAAR,CAAY,KAAZ,CAAP,CAjDyB;KAAnB,CARD,CA0DJ,IA1DI,CA0DC,YAAY;;WAEb,KAAK,EAAL,GAAU,WAAV,CAFa;aAGX,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,EAA2B,MAA3B,CAAR,EAA4C,IAA5C,CAAiD,UAAU,OAAV,EAAmB;;iBAEhE,YAAY,OAAZ,IAAuB,MAAvB,GAAgC,OAAhC,CAFgE;eAGlE,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B;gBAC1B,MAAN;iBACO,SAAS,CAAT,GAAa,CAAb;SAFF,GAGH,MAHG,CAHkE;OAAnB,CAAxD,CAHkB;KAAZ,CA1DR,CAvBsB;GA9kByB;;;;;;;;;;;;;;;;;;;;;;;;;4BAmsBxC,QAAQ,OAAO,MAAM;QACtB,OAAO,IAAP,CADsB;aAEnB,OAAO,EAAP,CAAT,CAF4B;SAGvB,IAAL,KAAc,KAAK,IAAL,GAAY,EAAZ,CAAd,CAH4B;;QAKxB,UAAU,EAAV,CALwB;QAMxB,cAAJ,CAN4B;QAOtB,eAAe,OAAO,YAAP,IAAuB,EAAvB,CAPO;QAQxB,QAAQ,CAAC,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,CAAD,CAAR,CARwB;;iBAUf,OAAb,CAAqB,UAAU,GAAV,EAAe;UAC5B,eAAe,IAAI,QAAJ,CADa;UAE5B,cAAc,IAAI,WAAJ,EAAd,CAF4B;UAG9B,CAAC,KAAK,IAAL,IAAa,KAAK,IAAL,CAAU,OAAV,CAAkB,YAAlB,MAAoC,CAAC,CAAD,EAAI;eAAA;OAA1D;UAGI,IAAI,UAAJ,IAAkB,IAAI,IAAJ,KAAa,WAAb,EAA0B;YAC1C,IAAI,IAAJ,KAAa,WAAb,EAA0B;gBACtB,IAAN,CAAW,KAAK,YAAL,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,EAAyC,IAAI,UAAJ,EAAgB,IAA3E,CAAX,EAD4B;SAA9B,MAEO;gBACC,IAAN,CAAW,KAAK,YAAL,CAAkB,YAAY,KAAZ,IAAqB,WAAW,YAAY,IAAZ,CAAhC,EAAmD,IAAI,UAAJ,EAAgB,IAArF,CAAX,EADK;SAFP;OADF;KANmB,CAArB,CAV4B;WAwBrB,QAAQ,GAAR,CAAY,KAAZ,EAAmB,IAAnB,CAAwB,YAAY;;WAEpC,KAAK,EAAL,GAAU,eAAV,CAFoC;aAGlC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,CAAP,CAHyC;KAAZ,CAAxB,CAIJ,IAJI,CAIC,YAAY;WACb,KAAK,EAAL,GAAU,SAAV,CADa;WAEb,GAAL,CAAS,EAAT,EAAa,KAAb,EAAoB,IAApB,EAFkB;aAGX,KAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CAApB,EAAoD,KAApD,EAA2D,GAA3D,CAA+D,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAA/D,CAAP,CAHkB;KAAZ,CAJD,CAQJ,IARI,CAQC,UAAU,QAAV,EAAoB;gBAChB,QAAV,CAD0B;UAEpB,QAAQ,EAAR,CAFoB;sBAGV,MAAhB,EAAwB,IAAxB,EAA8B,UAAU,GAAV,EAAe,MAAf,EAAuB;YAC7C,gBAAgB,IAAI,WAAJ,EAAhB,CAD6C;YAE7C,cAAc,OAAO,WAAP,CAF+B;YAG/C,gBAAJ,CAHmD;YAI/C,IAAI,UAAJ,KAAmB,IAAI,IAAJ,KAAa,QAAb,IAAyB,IAAI,IAAJ,KAAa,SAAb,CAA5C,EAAqE;cACnE,IAAI,IAAJ,KAAa,SAAb,EAAwB;mBACnB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,GAAzB,EAA8B,OAA9B,EAAuC,MAAvC,CAAP,CAD0B;WAA5B,MAEO;mBACE,KAAK,UAAL,CAAgB,MAAhB,EAAwB,GAAxB,EAA6B,OAA7B,EAAsC,MAAtC,CAAP,CADK;WAFP;SADF,MAMO,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,SAAJ,EAAe;;gBAC9C,YAAY,EAAZ;oBACI,OAAR,CAAgB,UAAU,IAAV,EAAgB;kBAC1B,WAAW,KAAK,IAAI,SAAJ,CAAL,IAAuB,EAAvB,CADe;yBAEnB,QAAQ,QAAR,IAAoB,QAApB,GAA+B,OAAO,IAAP,CAAY,QAAZ,CAA/B,CAFmB;0BAGlB,UAAU,MAAV,CAAiB,QAAjB,CAAZ,CAH8B;aAAhB,CAAhB;mBAKO,KAAK,OAAL,CAAa,aAAb,EAA4B;qDAE9B,cAAc,WAAd,EAA4B;sBACrB,OAAO,SAAP,EAAkB,MAAlB,CAAyB,UAAU,CAAV,EAAa;yBAAS,CAAP,CAAF;iBAAb,CAA/B;gBAFJ;aADK,EAMJ,MANI,EAMI,IANJ,CAMS,UAAU,YAAV,EAAwB;sBAC9B,OAAR,CAAgB,UAAU,IAAV,EAAgB;oBAC1B,WAAW,EAAX,CAD0B;oBAE1B,WAAW,IAAI,IAAJ,EAAU,IAAI,SAAJ,CAAV,IAA4B,EAA5B,CAFe;2BAGnB,QAAQ,QAAR,IAAoB,QAApB,GAA+B,OAAO,IAAP,CAAY,QAAZ,CAA/B,CAHmB;6BAIjB,OAAb,CAAqB,UAAU,WAAV,EAAuB;sBACtC,YAAY,SAAS,OAAT,CAAiB,YAAY,cAAc,WAAd,CAA7B,MAA6D,CAAC,CAAD,EAAI;6BACtE,IAAT,CAAc,WAAd,EAD+E;mBAAjF;iBADmB,CAArB,CAJ8B;oBAS1B,aAAJ,CAAkB,IAAlB,EAAwB,QAAxB,EAT8B;eAAhB,CAAhB,CADsC;qBAY/B,YAAP,CAZsC;aAAxB,CANhB;eAPkD;SAA7C,MA2BA,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,WAAJ,EAAiB;iBAC7C,KAAK,OAAL,CAAa,aAAb,EAA4B;mDAE9B,IAAI,WAAJ,EAAkB;+BACA,QAAQ,GAAR,CAAY,UAAU,MAAV,EAAkB;uBACtC,IAAI,MAAJ,EAAY,WAAZ,CAAP,CAD6C;eAAlB,CAA7B;cAFJ;WADK,EAQJ,MARI,EAQI,IARJ,CAQS,UAAU,YAAV,EAAwB;gBAChC,mBAAmB,IAAI,WAAJ,CADa;oBAE9B,OAAR,CAAgB,UAAU,MAAV,EAAkB;kBAC1B,gBAAgB,EAAhB,CAD0B;kBAE1B,KAAK,IAAI,MAAJ,EAAY,WAAZ,CAAL,CAF0B;2BAGnB,OAAb,CAAqB,UAAU,WAAV,EAAuB;oBACpC,cAAc,IAAI,YAAJ,EAAkB,gBAAlB,KAAuC,EAAvC,CADsB;oBAEtC,YAAY,OAAZ,CAAoB,EAApB,MAA4B,CAAC,CAAD,EAAI;gCACpB,IAAd,CAAmB,WAAnB,EADkC;iBAApC;eAFmB,CAArB,CAHgC;kBAS5B,aAAJ,CAAkB,MAAlB,EAA0B,aAA1B,EATgC;aAAlB,CAAhB,CAFsC;WAAxB,CARhB,CADoD;SAA/C,MAuBA,IAAI,IAAI,IAAJ,KAAa,WAAb,EAA0B;iBAC5B,KAAK,aAAL,CAAmB,MAAnB,EAA2B,GAA3B,EAAgC,OAAhC,EAAyC,MAAzC,CAAP,CADmC;SAA9B;YAGH,IAAJ,EAAU;gBACF,IAAN,CAAW,IAAX,EADQ;SAAV;OA/D4B,CAA9B,CAH0B;aAsEnB,QAAQ,GAAR,CAAY,KAAZ,CAAP,CAtE0B;KAApB,CARD,CA+EJ,IA/EI,CA+EC,YAAY;;WAEb,KAAK,EAAL,GAAU,cAAV,CAFa;aAGX,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,OAA9B,CAAR,EAAgD,IAAhD,CAAqD,UAAU,QAAV,EAAoB;;kBAEpE,YAAY,QAAZ,IAAwB,OAAxB,GAAkC,QAAlC,CAFoE;eAGvE,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B;gBAC1B,OAAN;iBACO,QAAQ,MAAR;SAFF,GAGH,OAHG,CAHuE;OAApB,CAA5D,CAHkB;KAAZ,CA/ER,CAxB4B;GAnsBmB;;;;;;;;;;;;;;;oCAo0BpC,UAAU,MAAM;aAClB,OAAO,EAAP,CAAT,CAD2B;SAEtB,SAAL,KAAmB,KAAK,SAAL,GAAiB,EAAjB,CAAnB,CAF2B;QAGvB,SAAS,KAAK,SAAL,IAAkB,EAAlB,CAHc;WAIpB,YAAY,KAAK,SAAL,CAAe,QAAf,CAAZ,IAAwC,OAAO,QAAP,KAAoB,UAAU,QAAV,CAApB,GAA0C,KAAK,SAAL,CAAe,QAAf,CAAlF,CAJoB;GAp0BoB;;;;;;;;;;;;;0BAq1BzC,KAAK,MAAM;aACR,OAAO,EAAP,CAAT,CADiB;WAEV,YAAY,KAAK,GAAL,CAAZ,IAAyB,UAAU,KAAK,GAAL,CAAV,CAAzB,GAAgD,UAAU,KAAK,GAAL,CAAV,CAAhD,CAFU;GAr1B8B;;;;;;;;;oBAg2B5C,OAAgB;uCAAN;;KAAM;;QACf,SAAS,CAAC,KAAK,MAAL,EAAa;WACpB,IAAL,CAAU,KAAV,EADyB;cAEjB,OAAR,CAFyB;KAA3B;QAII,UAAU,OAAV,IAAqB,CAAC,KAAK,KAAL,EAAY;aAAA;KAAtC;QAGM,SAAY,MAAM,WAAN,2BAAZ,CARa;QASf,QAAQ,KAAR,CAAJ,EAAoB;;;2BACV,MAAR,kBAAe,eAAW,KAA1B,EADkB;KAApB,MAEO;;;4BACG,GAAR,mBAAY,eAAW,KAAvB,EADK;KAFP;GAz2B+C;;;;;;;;;;;;;;;;;;0BA+3BzC,QAAQ,IAAI,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;cAErB,QAAQ,EAAR,CAAV,CAF+B;aAGtB,OAAO,EAAP,CAAT,CAH+B;QAI3B,cAAJ,CAJ+B;;WAMxB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,cAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,KAArB,EAA4B,IAA5B,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,UAAU,MAAV,EAAkB;;eAEf,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAFe;UAGlB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAHkB;iBAIb,aAAX,GAA2B,IAA3B,CAJwB;aAKjB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,GAA/B,CAAmC,EAAnC,EAAuC,MAAvC,CAA8C,MAA9C,EAAsD,UAAtD,EAAkE,GAAlE,CAAsE,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAAtE,CAAP,CALwB;KAAlB,CAJD,CAUJ,IAVI,CAUC,UAAU,MAAV,EAAkB;UACpB,kBAAJ,CADwB;WAEnB,aAAL,CAAmB,MAAnB,EAFwB;UAGpB,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,IAAyB,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,EAA2B;iBACzE,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,CADyE;OAApF,MAEO;cACC,IAAI,KAAJ,CAAU,WAAV,CAAN,CADK;OAFP;;;QAOA,GAAK,KAAK,EAAL,GAAU,aAAV,CAVmB;aAWjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,KAArB,EAA4B,IAA5B,EAAkC,MAAlC,CAAR,EAAmD,IAAnD,CAAwD,UAAU,OAAV,EAAmB;;iBAEvE,YAAY,OAAZ,IAAuB,MAAvB,GAAgC,OAAhC,CAFuE;YAG1E,SAAS,EAAT,CAH0E;eAIzE,MAAP,EAAe,MAAf,EAJgF;eAKzE,IAAP,GAAc,MAAd,CALgF;eAMzE,OAAP,GAAiB,SAAS,CAAT,GAAa,CAAb,CAN+D;eAOzE,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B,MAA3B,GAAoC,OAAO,IAAP,CAPqC;OAAnB,CAA/D,CAXwB;KAAlB,CAVR,CAN+B;GA/3BgB;;;;;;;;;;;;;;;;;;;;;;;;;;gCA67BtC,QAAQ,OAAO,OAAO,MAAM;QAC/B,OAAO,IAAP,CAD+B;cAE3B,QAAQ,EAAR,CAAV,CAFqC;cAG3B,QAAQ,EAAR,CAAV,CAHqC;aAI5B,OAAO,EAAP,CAAT,CAJqC;QAKjC,cAAJ,CALqC;;WAO9B,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,iBAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,KAAxB,EAA+B,IAA/B,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,UAAU,MAAV,EAAkB;;eAEf,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAFe;UAGlB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAHkB;iBAIb,aAAX,GAA2B,IAA3B,CAJwB;aAKjB,KAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CAApB,EAAoD,KAApD,EAA2D,MAA3D,CAAkE,MAAlE,EAA0E,UAA1E,EAAsF,GAAtF,CAA0F,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAA1F,CAAP,CALwB;KAAlB,CAJD,CAUJ,IAVI,CAUC,UAAU,MAAV,EAAkB;UACpB,UAAU,EAAV,CADoB;WAEnB,aAAL,CAAmB,MAAnB,EAFwB;UAGpB,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,EAAuB;kBAC3C,OAAO,OAAP,CAAe,GAAf,CAAmB,UAAU,MAAV,EAAkB;iBAAS,OAAO,OAAP,CAAT;SAAlB,CAA7B,CADqD;OAAvD;;QAIA,GAAK,KAAK,EAAL,GAAU,gBAAV,CAPmB;aAQjB,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,KAAxB,EAA+B,IAA/B,EAAqC,OAArC,EAA8C,IAA9C,CAAmD,UAAU,QAAV,EAAoB;;kBAElE,YAAY,QAAZ,IAAwB,OAAxB,GAAkC,QAAlC,CAFkE;YAGtE,SAAS,EAAT,CAHsE;eAIrE,MAAP,EAAe,MAAf,EAJ4E;eAKrE,IAAP,GAAc,OAAd,CAL4E;eAMrE,OAAP,GAAiB,QAAQ,MAAR,CAN2D;eAOrE,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B,MAA3B,GAAoC,OAAO,IAAP,CAPiC;OAApB,CAA1D,CARwB;KAAlB,CAVR,CAPqC;GA77BU;;;;;;;;;;;;;;;;;kCAg/BrC,QAAQ,SAAS,MAAM;QAC3B,OAAO,IAAP,CAD2B;gBAErB,UAAU,EAAV,CAAZ,CAFiC;aAGxB,OAAO,EAAP,CAAT,CAHiC;QAI7B,cAAJ,CAJiC;QAK3B,cAAc,OAAO,WAAP,CALa;;cAOvB,QAAQ,MAAR,CAAe,UAAU,MAAV,EAAkB;aAClC,IAAI,MAAJ,EAAY,WAAZ,CAAP,CADyC;KAAlB,CAAzB,CAPiC;;WAW1B,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,kBAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,OAAjB,EAA0B,IAA1B,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,UAAU,QAAV,EAAoB;;iBAEf,YAAY,QAAZ,IAAwB,OAAxB,GAAkC,QAAlC,CAFe;UAGpB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAHoB;iBAIf,aAAX,GAA2B,IAA3B,CAJ0B;iBAKf,QAAX,GAAsB,QAAtB,CAL0B;aAMnB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,MAA/B,CAAsC,QAAtC,EAAgD,UAAhD,EAA4D,GAA5D,CAAgE,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAAhE,CAAP,CAN0B;KAApB,CAJD,CAWJ,IAXI,CAWC,UAAU,MAAV,EAAkB;UACpB,0BAAJ,CADwB;WAEnB,aAAL,CAAmB,MAAnB,EAFwB;UAGpB,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,EAAuB;yBACpC,OAAO,OAAP,CAAe,GAAf,CAAmB,UAAU,MAAV,EAAkB;iBAAS,OAAO,OAAP,CAAT;SAAlB,CAApC,CADqD;OAAvD;;;QAKA,GAAK,KAAK,EAAL,GAAU,iBAAV,CARmB;aASjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,OAAjB,EAA0B,IAA1B,EAAgC,cAAhC,CAAR,EAAyD,IAAzD,CAA8D,UAAU,QAAV,EAAoB;;kBAE7E,YAAY,QAAZ,IAAwB,cAAxB,GAAyC,QAAzC,CAF6E;YAGjF,SAAS,EAAT,CAHiF;eAIhF,MAAP,EAAe,MAAf,EAJuF;eAKhF,IAAP,GAAc,OAAd,CALuF;eAMhF,OAAP,GAAiB,QAAQ,MAAR,CANsE;eAOhF,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B,MAA3B,GAAoC,OAAO,IAAP,CAP4C;OAApB,CAArE,CATwB;KAAlB,CAXR,CAXiC;GAh/Bc;sCA2hCnC,QAAQ,SAAS;;;QACvB,QAAQ,SAAS,MAAT,IAAmB,MAAnB,GAA6B,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CADd;cAEnB,WAAW,EAAX,CAFmB;QAGzB,KAAK,YAAY,QAAQ,EAAR,CAAZ,GAA0B,KAAK,EAAL,GAAU,QAAQ,EAAR,CAHhB;WAItB,KAAK,SAAL,CAAe,OAAf,EAAwB,IAAxB,CAA6B,YAAM;YACnC,MAAL,CAAY,EAAZ,IAAkB,MAAK,MAAL,CAAY,EAAZ,KAAmB,EAAnB,CADsB;UAEpC,CAAC,MAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,CAAD,EAAyB;cACtB,MAAL,CAAY,EAAZ,EAAgB,KAAhB,IAAyB,MAAK,CAAL,CAAO,MAAP,CAAc,MAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,SAAd,GAA0B,QAA1B,CAAmC,KAAnC,CAAd,EAAyD,IAAzD,EAA+D,MAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,WAAd,CAA0B,KAA1B,CAA/D,EAAiG,GAAjG,EAAzB,CAD2B;OAA7B;aAGO,MAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,CAAP,CALwC;KAAN,CAApC,CAJ6B;GA3hCkB;sCAwiCnC,OAAO,OAAO,SAAS;;;cACzB,WAAW,EAAX,CADyB;QAE/B,KAAK,YAAY,QAAQ,EAAR,CAAZ,GAA0B,KAAK,EAAL,GAAU,QAAQ,EAAR,CAFV;WAG5B,KAAK,SAAL,CAAe,OAAf,EAAwB,IAAxB,CAA6B;aAAM,OAAK,YAAL,CAAkB,KAAlB,EAAyB,OAAzB;KAAN,CAA7B,CAAsE,IAAtE,CAA2E,YAAM;aACjF,OAAL,CAAa,EAAb,IAAmB,OAAK,OAAL,CAAa,EAAb,KAAoB,EAApB,CADmE;aAEjF,OAAL,CAAa,EAAb,EAAiB,KAAjB,IAA0B,OAAK,OAAL,CAAa,EAAb,EAAiB,KAAjB,KAA2B,EAA3B,CAF4D;UAGlF,CAAC,OAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,EAAuB,KAAvB,CAAD,EAAgC;eAC7B,MAAL,CAAY,EAAZ,EAAgB,KAAhB,EAAuB,KAAvB,IAAgC,OAAK,CAAL,CAAO,MAAP,CAAc,OAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,KAAd,CAAoB,KAApB,EAA2B,SAA3B,GAAuC,QAAvC,CAAgD,KAAhD,CAAd,EAAsE,IAAtE,EAA4E,OAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,KAAd,CAAoB,KAApB,EAA2B,WAA3B,CAAuC,KAAvC,CAA5E,EAA2H,GAA3H,GAAiI,IAAjI,CAAsI,YAAM;iBACnK,OAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,KAAd,CAAoB,KAApB,EAA2B,SAA3B,CAAqC,KAArC,EAA4C,GAA5C,EAAP,CAD0K;SAAN,CAAtK,CADkC;OAApC;aAKO,OAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,EAAuB,KAAvB,CAAP,CARsF;KAAN,CAAlF,CAHmC;GAxiCY;CAAnD;;AAwjCA,iBAAiB,SAAjB,GAA6B,SAA7B;;"} \ No newline at end of file diff --git a/package.json b/package.json index ca6da87..bef0df4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-rethinkdb", "description": "RethinkDB adapter for js-data.", - "version": "3.0.0-alpha.4", + "version": "3.0.0-alpha.5", "homepage": "https://github.com/js-data/js-data-rethinkdb", "repository": { "type": "git", @@ -58,7 +58,7 @@ "chai": "3.5.0", "codacy-coverage": "1.1.3", "coveralls": "2.11.8", - "ink-docstrap": "1.1.2", + "ink-docstrap": "1.1.3", "istanbul": "0.4.2", "js-data-adapter-tests": "^2.0.0-alpha.9", "jsdoc": "3.4.0", diff --git a/src/index.js b/src/index.js index f816a2c..f35c5fd 100644 --- a/src/index.js +++ b/src/index.js @@ -12,6 +12,7 @@ const { isObject, isString, isUndefined, + plainCopy, resolve } = utils @@ -138,6 +139,76 @@ const UPDATE_OPTS_DEFAULTS = {} const DELETE_OPTS_DEFAULTS = {} const RUN_OPTS_DEFAULTS = {} +const equal = function (r, row, field, value) { + return row(field).default(null).eq(value) +} + +const notEqual = function (r, row, field, value) { + return row(field).default(null).ne(value) +} + +/** + * Default predicate functions for the filtering operators. + * + * @name RethinkDBAdapter.OPERATORS + * @property {Function} == Equality operator. + * @property {Function} === Same as `==`. + * @property {Function} != Inequality operator. + * @property {Function} !== Same as `!=`. + * @property {Function} > "Greater than" operator. + * @property {Function} >= "Greater than or equal to" operator. + * @property {Function} < "Less than" operator. + * @property {Function} <= "Less than or equal to" operator. + * @property {Function} isectEmpty Operator to test that the intersection + * between two arrays is empty. + * @property {Function} isectNotEmpty Operator to test that the intersection + * between two arrays is NOT empty. + * @property {Function} in Operator to test whether a value is found in the + * provided array. + * @property {Function} notIn Operator to test whether a value is NOT found in + * the provided array. + * @property {Function} contains Operator to test whether an array contains the + * provided value. + * @property {Function} notContains Operator to test whether an array does NOT + * contain the provided value. + */ +const OPERATORS = { + '==': equal, + '===': equal, + '!=': notEqual, + '!==': notEqual, + '>': function (r, row, field, value) { + return row(field).default(null).gt(value) + }, + '>=': function (r, row, field, value) { + return row(field).default(null).ge(value) + }, + '<': function (r, row, field, value) { + return row(field).default(null).lt(value) + }, + '<=': function (r, row, field, value) { + return row(field).default(null).le(value) + }, + 'isectEmpty': function (r, row, field, value) { + return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0) + }, + 'isectNotEmpty': function (r, row, field, value) { + return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0) + }, + 'in': function (r, row, field, value) { + return r.expr(value).default(r.expr([])).contains(row(field).default(null)) + }, + 'notIn': function (r, row, field, value) { + return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not() + }, + 'contains': function (r, row, field, value) { + return row(field).default([]).contains(value) + }, + 'notContains': function (r, row, field, value) { + return row(field).default([]).contains(value).not() + } +} + /** * RethinkDBAdapter class. * @@ -167,6 +238,8 @@ const RUN_OPTS_DEFAULTS = {} * @param {string} [opts.host="localhost"] RethinkDB host. * @param {number} [opts.max=50] Maximum connections in pool. * @param {number} [opts.min=10] Minimum connections in pool. + * @param {Object} [opts.operators] Override the default predicate functions for + * specified operators. * @param {number} [opts.port=28015] RethinkDB port. * @param {boolean} [opts.raw=false] Whether to return a more detailed response object. */ @@ -216,6 +289,15 @@ export default function RethinkDBAdapter (opts) { self.runOpts || (self.runOpts = {}) fillIn(self.runOpts, RUN_OPTS_DEFAULTS) + /** + * Override the default predicate functions for specified operators. + * + * @name RethinkDBAdapter#operators + * @type {Object} + * @default {} + */ + self.operators || (self.operators = {}) + /** * The rethinkdbdash instance used by this adapter. Use this directly when you * need to write custom queries. @@ -362,85 +444,76 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return this.selectDb(opts).table(mapper.table || underscore(mapper.name)) }, - filterSequence (sequence, params) { - let r = this.r - params = params || {} - params.where = params.where || {} - params.orderBy = params.orderBy || params.sort - params.skip = params.skip || params.offset - - Object.keys(params).forEach(function (k) { - let v = params[k] - if (reserved.indexOf(k) === -1) { - if (isObject(v)) { - params.where[k] = v + /** + * Apply the specified selection query to the provided RQL sequence. + * + * @name RethinkDBAdapter#filterSequence + * @method + * @param {Object} mapper The mapper. + * @param {Object} [query] Selection query. + * @param {Object} [query.where] Filtering criteria. + * @param {string|Array} [query.orderBy] Sorting criteria. + * @param {string|Array} [query.sort] Same as `query.sort`. + * @param {number} [query.limit] Limit results. + * @param {number} [query.skip] Offset results. + * @param {number} [query.offset] Same as `query.skip`. + * @param {Object} [opts] Configuration options. + * @param {Object} [opts.operators] Override the default predicate functions + * for specified operators. + */ + filterSequence (sequence, query, opts) { + const self = this + const r = self.r + + query = plainCopy(query || {}) + opts || (opts = {}) + opts.operators || (opts.operators = {}) + query.where || (query.where = {}) + query.orderBy || (query.orderBy = query.sort) + query.orderBy || (query.orderBy = []) + query.skip || (query.skip = query.offset) + + // Transform non-keyword properties to "where" clause configuration + forOwn(query, function (config, keyword) { + if (reserved.indexOf(keyword) === -1) { + if (isObject(config)) { + query.where[keyword] = config } else { - params.where[k] = { - '==': v + query.where[keyword] = { + '==': config } } - delete params[k] + delete query[keyword] } }) - let query = sequence + let rql = sequence - if (Object.keys(params.where).length !== 0) { - query = query.filter(function (row) { + // Filter + if (Object.keys(query.where).length !== 0) { + // Filter sequence using filter function + rql = rql.filter(function (row) { let subQuery - forOwn(params.where, function (criteria, field) { + // Apply filter for each field + forOwn(query.where, function (criteria, field) { if (!isObject(criteria)) { criteria = { '==': criteria } } - forOwn(criteria, function (v, op) { - if (op === '==' || op === '===') { - subQuery = subQuery ? subQuery.and(row(field).default(null).eq(v)) : row(field).default(null).eq(v) - } else if (op === '!=' || op === '!==') { - subQuery = subQuery ? subQuery.and(row(field).default(null).ne(v)) : row(field).default(null).ne(v) - } else if (op === '>') { - subQuery = subQuery ? subQuery.and(row(field).default(null).gt(v)) : row(field).default(null).gt(v) - } else if (op === '>=') { - subQuery = subQuery ? subQuery.and(row(field).default(null).ge(v)) : row(field).default(null).ge(v) - } else if (op === '<') { - subQuery = subQuery ? subQuery.and(row(field).default(null).lt(v)) : row(field).default(null).lt(v) - } else if (op === '<=') { - subQuery = subQuery ? subQuery.and(row(field).default(null).le(v)) : row(field).default(null).le(v) - } else if (op === 'isectEmpty') { - subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0) - } else if (op === 'isectNotEmpty') { - subQuery = subQuery ? subQuery.and(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0) - } else if (op === 'in') { - subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null)) - } else if (op === 'notIn') { - subQuery = subQuery ? subQuery.and(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not() - } else if (op === 'contains') { - subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v)) : row(field).default([]).contains(v) - } else if (op === 'notContains') { - subQuery = subQuery ? subQuery.and(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not() - } else if (op === '|==' || op === '|===') { - subQuery = subQuery ? subQuery.or(row(field).default(null).eq(v)) : row(field).default(null).eq(v) - } else if (op === '|!=' || op === '|!==') { - subQuery = subQuery ? subQuery.or(row(field).default(null).ne(v)) : row(field).default(null).ne(v) - } else if (op === '|>') { - subQuery = subQuery ? subQuery.or(row(field).default(null).gt(v)) : row(field).default(null).gt(v) - } else if (op === '|>=') { - subQuery = subQuery ? subQuery.or(row(field).default(null).ge(v)) : row(field).default(null).ge(v) - } else if (op === '|<') { - subQuery = subQuery ? subQuery.or(row(field).default(null).lt(v)) : row(field).default(null).lt(v) - } else if (op === '|<=') { - subQuery = subQuery ? subQuery.or(row(field).default(null).le(v)) : row(field).default(null).le(v) - } else if (op === '|isectEmpty') { - subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().eq(0) - } else if (op === '|isectNotEmpty') { - subQuery = subQuery ? subQuery.or(row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0)) : row(field).default([]).setIntersection(r.expr(v).default([])).count().ne(0) - } else if (op === '|in') { - subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null))) : r.expr(v).default(r.expr([])).contains(row(field).default(null)) - } else if (op === '|notIn') { - subQuery = subQuery ? subQuery.or(r.expr(v).default(r.expr([])).contains(row(field).default(null)).not()) : r.expr(v).default(r.expr([])).contains(row(field).default(null)).not() - } else if (op === '|contains') { - subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v)) : row(field).default([]).contains(v) - } else if (op === '|notContains') { - subQuery = subQuery ? subQuery.or(row(field).default([]).contains(v).not()) : row(field).default([]).contains(v).not() + // Apply filter for each operator + forOwn(criteria, function (value, operator) { + let isOr = false + if (operator && operator[0] === '|') { + operator = operator.substr(1) + isOr = true + } + let predicateFn = self.getOperator(operator, opts) + if (predicateFn) { + const predicateResult = predicateFn(r, row, field, value) + if (isOr) { + subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult + } else { + subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult + } } }) }) @@ -448,29 +521,32 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }) } - if (params.orderBy) { - if (isString(params.orderBy)) { - params.orderBy = [ - [params.orderBy, 'asc'] + // Sort + if (query.orderBy) { + if (isString(query.orderBy)) { + query.orderBy = [ + [query.orderBy, 'asc'] ] } - for (var i = 0; i < params.orderBy.length; i++) { - if (isString(params.orderBy[i])) { - params.orderBy[i] = [params.orderBy[i], 'asc'] + for (var i = 0; i < query.orderBy.length; i++) { + if (isString(query.orderBy[i])) { + query.orderBy[i] = [query.orderBy[i], 'asc'] } - query = (params.orderBy[i][1] || '').toUpperCase() === 'DESC' ? query.orderBy(r.desc(params.orderBy[i][0])) : query.orderBy(params.orderBy[i][0]) + rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0]) } } - if (params.skip) { - query = query.skip(+params.skip) + // Offset + if (query.skip) { + rql = rql.skip(+query.skip) } - if (params.limit) { - query = query.limit(+params.limit) + // Limit + if (query.limit) { + rql = rql.limit(+query.limit) } - return query + return rql }, waitForDb (opts) { @@ -635,8 +711,16 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @method * @param {Object} mapper the mapper. * @param {Object} [query] Selection query. + * @param {Object} [query.where] Filtering criteria. + * @param {string|Array} [query.orderBy] Sorting criteria. + * @param {string|Array} [query.sort] Same as `query.sort`. + * @param {number} [query.limit] Limit results. + * @param {number} [query.skip] Offset results. + * @param {number} [query.offset] Same as `query.skip`. * @param {Object} [opts] Configuration options. * @param {Object} [opts.deleteOpts] Options to pass to r#delete. + * @param {Object} [opts.operators] Override the default predicate functions + * for specified operators. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. * @param {Object} [opts.runOpts] Options to pass to r#run. @@ -918,8 +1002,16 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @name RethinkDBAdapter#findAll * @method * @param {Object} mapper The mapper. - * @param {Object} query Selection query. + * @param {Object} [query] Selection query. + * @param {Object} [query.where] Filtering criteria. + * @param {string|Array} [query.orderBy] Sorting criteria. + * @param {string|Array} [query.sort] Same as `query.sort`. + * @param {number} [query.limit] Limit results. + * @param {number} [query.skip] Offset results. + * @param {number} [query.offset] Same as `query.skip`. * @param {Object} [opts] Configuration options. + * @param {Object} [opts.operators] Override the default predicate functions + * for specified operators. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. * @param {Object} [opts.runOpts] Options to pass to r#run. @@ -1043,6 +1135,25 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }) }, + /** + * Resolve the predicate function for the specified operator based on the + * given options and this adapter's settings. + * + * @name RethinkDBAdapter#getOperator + * @method + * @param {string} operator The name of the operator. + * @param {Object} [opts] Configuration options. + * @param {Object} [opts.operators] Override the default predicate functions + * for specified operators. + * @return {*} The predicate function for the specified operator. + */ + getOperator (operator, opts) { + opts || (opts = {}) + opts.operators || (opts.operators = {}) + let ownOps = this.operators || {} + return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator] + }, + /** * Resolve the value of the specified option based on the given options and * this adapter's settings. @@ -1055,7 +1166,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ getOpt (opt, opts) { opts || (opts = {}) - return isUndefined(opts[opt]) ? this[opt] : opts[opt] + return isUndefined(opts[opt]) ? plainCopy(this[opt]) : plainCopy(opts[opt]) }, /** @@ -1142,11 +1253,19 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { * @param {Object} mapper The mapper. * @param {Object} props The update to apply to the selected records. * @param {Object} [query] Selection query. + * @param {Object} [query.where] Filtering criteria. + * @param {string|Array} [query.orderBy] Sorting criteria. + * @param {string|Array} [query.sort] Same as `query.sort`. + * @param {number} [query.limit] Limit results. + * @param {number} [query.skip] Offset results. + * @param {number} [query.offset] Same as `query.skip`. * @param {Object} [opts] Configuration options. - * @param {Object} [opts.updateOpts] Options to pass to r#update. + * @param {Object} [opts.operators] Override the default predicate functions + * for specified operators. * @param {boolean} [opts.raw=false] Whether to return a more detailed * response object. * @param {Object} [opts.runOpts] Options to pass to r#run. + * @param {Object} [opts.updateOpts] Options to pass to r#update. * @return {Promise} */ updateAll (mapper, props, query, opts) { @@ -1271,3 +1390,5 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }) } }) + +RethinkDBAdapter.OPERATORS = OPERATORS From cfbeff49299dae7519d8c2bd577274a152cc31cb Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 27 Feb 2016 13:26:50 -0800 Subject: [PATCH 12/27] Fix JSDoc. --- src/index.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/index.js b/src/index.js index f35c5fd..b7d8deb 100644 --- a/src/index.js +++ b/src/index.js @@ -152,9 +152,7 @@ const notEqual = function (r, row, field, value) { * * @name RethinkDBAdapter.OPERATORS * @property {Function} == Equality operator. - * @property {Function} === Same as `==`. * @property {Function} != Inequality operator. - * @property {Function} !== Same as `!=`. * @property {Function} > "Greater than" operator. * @property {Function} >= "Greater than or equal to" operator. * @property {Function} < "Less than" operator. From d4de3bf20e12dc46175254ca1f186883dd3b611f Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 27 Feb 2016 13:47:08 -0800 Subject: [PATCH 13/27] Add analytics to conf.json --- conf.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/conf.json b/conf.json index 6978ce6..f148e9b 100644 --- a/conf.json +++ b/conf.json @@ -18,6 +18,10 @@ "outputSourceFiles": true, "syntaxTheme": "dark", "linenums": true, - "footer": "
Back to js-data.io
" + "footer": "
Back to js-data.io
", + "analytics": { + "ua": "UA-55528236-2", + "domain": "api.js-data.io" + } } } \ No newline at end of file From a6f2b196eef5ba52fd28b10b7168b88d96fcf5e5 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Tue, 1 Mar 2016 09:49:26 -0800 Subject: [PATCH 14/27] 3.0.0-alpha.6 --- CHANGELOG.md | 5 + CONTRIBUTORS | 2 +- dist/js-data-rethinkdb.js | 171 +++++++++++++++++++--------------- dist/js-data-rethinkdb.js.map | 2 +- mocha.start.js | 14 ++- package.json | 17 ++-- rollup.config.js | 4 +- scripts/authors.js | 11 ++- src/index.js | 169 ++++++++++++++++++--------------- 9 files changed, 223 insertions(+), 172 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca49289..578bc4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +##### 3.0.0-alpha.6 - 01 March 2016 + +###### Backwards compatible bug fixes +- Couple of fixes based on the latest js-data-adapter-tests + ##### 3.0.0-alpha.5 - 27 February 2016 ###### Backwards compatible API changes diff --git a/CONTRIBUTORS b/CONTRIBUTORS index ed689c2..df3d290 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -5,5 +5,5 @@ # Names should be added to this file as: # [commit count] Name 1 InternalFX - 50 Jason Dobry + 53 Jason Dobry 2 Ollie Relph diff --git a/dist/js-data-rethinkdb.js b/dist/js-data-rethinkdb.js index a7a14c8..a079937 100644 --- a/dist/js-data-rethinkdb.js +++ b/dist/js-data-rethinkdb.js @@ -5,6 +5,7 @@ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'defau var jsData = require('js-data'); var rethinkdbdash = _interopDefault(require('rethinkdbdash')); var underscore = _interopDefault(require('mout/string/underscore')); +var unique = _interopDefault(require('mout/array/unique')); var babelHelpers = {}; babelHelpers.typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { @@ -45,19 +46,6 @@ var resolve = jsData.utils.resolve; var reserved = ['orderBy', 'sort', 'limit', 'offset', 'skip', 'where']; -var unique = function unique(array) { - var seen = {}; - var final = []; - array.forEach(function (item) { - if (item in seen) { - return; - } - final.push(item); - seen[item] = 0; - }); - return final; -}; - var noop = function noop() { var self = this; @@ -82,6 +70,19 @@ var noop2 = function noop2() { return resolve(); }; +var withoutRelations = function withoutRelations(mapper, props) { + var relationFields = mapper.relationFields || []; + + // Remove relations + var _props = {}; + forOwn(props, function (value, key) { + if (relationFields.indexOf(key) === -1) { + _props[key] = value; + } + }); + return _props; +}; + var DEFAULTS = { /** * RethinkDB authorization key. @@ -182,9 +183,7 @@ var notEqual = function notEqual(r, row, field, value) { * * @name RethinkDBAdapter.OPERATORS * @property {Function} == Equality operator. - * @property {Function} === Same as `==`. * @property {Function} != Inequality operator. - * @property {Function} !== Same as `!=`. * @property {Function} > "Greater than" operator. * @property {Function} >= "Greater than or equal to" operator. * @property {Function} < "Less than" operator. @@ -617,26 +616,27 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return resolve(self[op](mapper, props, opts)); }).then(function (_props) { // Allow for re-assignment from lifecycle hook - _props = isUndefined(_props) ? props : _props; + props = isUndefined(_props) ? props : _props; var insertOpts = self.getOpt('insertOpts', opts); insertOpts.returnChanges = true; - return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts)); + return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { self._handleErrors(cursor); var record = undefined; if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { record = cursor.changes[0].new_val; } + var result = {}; + fillIn(result, cursor); + result.data = record; + result.created = record ? 1 : 0; + result = self.getOpt('raw', opts) ? result : result.data; + // afterCreate lifecycle hook op = opts.op = 'afterCreate'; - return self[op](mapper, props, opts, record).then(function (_record) { + return resolve(self[op](mapper, props, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - record = isUndefined(_record) ? record : _record; - var result = {}; - fillIn(result, cursor); - result.data = record; - result.created = record ? 1 : 0; - return self.getOpt('raw', opts) ? result : result.data; + return isUndefined(_result) ? result : _result; }); }); }, @@ -668,9 +668,12 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return resolve(self[op](mapper, props, opts)); }).then(function (_props) { // Allow for re-assignment from lifecycle hook - _props = isUndefined(_props) ? props : _props; + props = isUndefined(_props) ? props : _props; var insertOpts = self.getOpt('insertOpts', opts); insertOpts.returnChanges = true; + _props = props.map(function (record) { + return withoutRelations(mapper, record); + }); return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { self._handleErrors(cursor); @@ -680,16 +683,17 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return change.new_val; }); } + var result = {}; + fillIn(result, cursor); + result.data = records; + result.created = records.length; + result = self.getOpt('raw', opts) ? result : result.data; + // afterCreateMany lifecycle hook op = opts.op = 'afterCreateMany'; - return self[op](mapper, props, opts, records).then(function (_records) { + return resolve(self[op](mapper, props, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - records = isUndefined(_records) ? records : _records; - var result = {}; - fillIn(result, cursor); - result.data = records; - result.created = records.length; - return self.getOpt('raw', opts) ? result : result.data; + return isUndefined(_result) ? result : _result; }); }); }, @@ -723,14 +727,16 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { self.dbg(op, id, opts); return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { + var result = {}; + fillIn(result, cursor); + result = self.getOpt('raw', opts) ? result : undefined; + // afterDestroy lifecycle hook op = opts.op = 'afterDestroy'; - return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) { + return resolve(self[op](mapper, id, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - return isUndefined(_cursor) ? cursor : _cursor; + return isUndefined(_result) ? result : _result; }); - }).then(function (cursor) { - return self.getOpt('raw', opts) ? cursor : undefined; }); }, @@ -772,14 +778,16 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { self.dbg(op, query, opts); return self.filterSequence(self.selectTable(mapper, opts), query).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { + var result = {}; + fillIn(result, cursor); + result = self.getOpt('raw', opts) ? result : undefined; + // afterDestroyAll lifecycle hook op = opts.op = 'afterDestroyAll'; - return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) { + return resolve(self[op](mapper, query, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - return isUndefined(_cursor) ? cursor : _cursor; + return isUndefined(_result) ? result : _result; }); - }).then(function (cursor) { - return self.getOpt('raw', opts) ? cursor : undefined; }); }, @@ -1020,15 +1028,17 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return Promise.all(tasks); }).then(function () { + var result = { + data: record, + found: record ? 1 : 0 + }; + result = self.getOpt('raw', opts) ? result : result.data; + // afterFind lifecycle hook op = opts.op = 'afterFind'; - return resolve(self[op](mapper, id, opts, record)).then(function (_record) { + return resolve(self[op](mapper, id, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - record = isUndefined(_record) ? record : _record; - return self.getOpt('raw', opts) ? { - data: record, - found: record ? 1 : 0 - } : record; + return isUndefined(_result) ? result : _result; }); }); }, @@ -1160,15 +1170,18 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }); return Promise.all(tasks); }).then(function () { + records || (records = []); + var result = { + data: records, + found: records.length + }; + result = self.getOpt('raw', opts) ? result : result.data; + // afterFindAll lifecycle hook op = opts.op = 'afterFindAll'; - return resolve(self[op](mapper, query, opts, records)).then(function (_records) { + return resolve(self[op](mapper, query, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - records = isUndefined(_records) ? records : _records; - return self.getOpt('raw', opts) ? { - data: records, - found: records.length - } : records; + return isUndefined(_result) ? result : _result; }); }); }, @@ -1268,10 +1281,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return resolve(self[op](mapper, id, props, opts)); }).then(function (_props) { // Allow for re-assignment from lifecycle hook - _props = isUndefined(_props) ? props : _props; + props = isUndefined(_props) ? props : _props; var updateOpts = self.getOpt('updateOpts', opts); updateOpts.returnChanges = true; - return self.selectTable(mapper, opts).get(id).update(_props, updateOpts).run(self.getOpt('runOpts', opts)); + return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { var record = undefined; self._handleErrors(cursor); @@ -1280,17 +1293,17 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } else { throw new Error('Not Found'); } + var result = {}; + fillIn(result, cursor); + result.data = record; + result.updated = 1; + result = self.getOpt('raw', opts) ? result : result.data; // afterUpdate lifecycle hook op = opts.op = 'afterUpdate'; - return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) { + return resolve(self[op](mapper, id, props, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - record = isUndefined(_record) ? record : _record; - var result = {}; - fillIn(result, cursor); - result.data = record; - result.updated = record ? 1 : 0; - return self.getOpt('raw', opts) ? result : result.data; + return isUndefined(_result) ? result : _result; }); }); }, @@ -1332,10 +1345,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return resolve(self[op](mapper, props, query, opts)); }).then(function (_props) { // Allow for re-assignment from lifecycle hook - _props = isUndefined(_props) ? props : _props; + props = isUndefined(_props) ? props : _props; var updateOpts = self.getOpt('updateOpts', opts); updateOpts.returnChanges = true; - return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, updateOpts).run(self.getOpt('runOpts', opts)); + return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { var records = []; self._handleErrors(cursor); @@ -1344,16 +1357,17 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return change.new_val; }); } + var result = {}; + fillIn(result, cursor); + result.data = records; + result.updated = records.length; + result = self.getOpt('raw', opts) ? result : result.data; + // afterUpdateAll lifecycle hook op = opts.op = 'afterUpdateAll'; - return self[op](mapper, props, query, opts, records).then(function (_records) { + return resolve(self[op](mapper, props, query, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - records = isUndefined(_records) ? records : _records; - var result = {}; - fillIn(result, cursor); - result.data = records; - result.updated = records.length; - return self.getOpt('raw', opts) ? result : result.data; + return isUndefined(_result) ? result : _result; }); }); }, @@ -1394,6 +1408,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { var insertOpts = self.getOpt('insertOpts', opts); insertOpts.returnChanges = true; insertOpts.conflict = 'update'; + _records = _records.map(function (record) { + return withoutRelations(mapper, record); + }); return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { var updatedRecords = undefined; @@ -1403,17 +1420,17 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return change.new_val; }); } + var result = {}; + fillIn(result, cursor); + result.data = updatedRecords || []; + result.updated = result.data.length; + result = self.getOpt('raw', opts) ? result : result.data; // afterUpdateMany lifecycle hook op = opts.op = 'afterUpdateMany'; - return resolve(self[op](mapper, records, opts, updatedRecords)).then(function (_records) { + return resolve(self[op](mapper, records, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - records = isUndefined(_records) ? updatedRecords : _records; - var result = {}; - fillIn(result, cursor); - result.data = records; - result.updated = records.length; - return self.getOpt('raw', opts) ? result : result.data; + return isUndefined(_result) ? result : _result; }); }); }, diff --git a/dist/js-data-rethinkdb.js.map b/dist/js-data-rethinkdb.js.map index 0dc19ea..c5ad0cb 100644 --- a/dist/js-data-rethinkdb.js.map +++ b/dist/js-data-rethinkdb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\n\nconst {\n addHiddenPropsToTarget,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n plainCopy,\n resolve\n} = utils\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nconst unique = function (array) {\n const seen = {}\n const final = []\n array.forEach(function (item) {\n if (item in seen) {\n return\n }\n final.push(item)\n seen[item] = 0\n })\n return final\n}\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * Whether to log debugging information.\n *\n * @name RethinkDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015,\n\n /**\n * Whether to return a more detailed response object.\n *\n * @name RethinkDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} === Same as `==`.\n * @property {Function} != Inequality operator.\n * @property {Function} !== Same as `!=`.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n /**\n * @name RethinkDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name RethinkDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return self[op](mapper, props, opts, record).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.created = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return self[op](mapper, props, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.created = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_cursor) ? cursor : _cursor\n })\n }).then(function (cursor) {\n return self.getOpt('raw', opts) ? cursor : undefined\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * There may be reasons why you may want to override this method, like when\n * the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name RethinkDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Load a hasMany relationship.\n *\n * @name RethinkDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (mapper, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(mapper, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * Load a hasOne relationship.\n *\n * @name RethinkDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (mapper, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(mapper, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name RethinkDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Load a belongsTo relationship.\n *\n * @name RethinkDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n return self.getOpt('raw', opts) ? {\n data: record,\n found: record ? 1 : 0\n } : record\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, records)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n return self.getOpt('raw', opts) ? {\n data: records,\n found: records.length\n } : records\n })\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Resolve the value of the specified option based on the given options and\n * this adapter's settings.\n *\n * @name RethinkDBAdapter#getOpt\n * @method\n * @param {string} opt The name of the option.\n * @param {Object} [opts] Configuration options.\n * @return {*} The value of the specified option.\n */\n getOpt (opt, opts) {\n opts || (opts = {})\n return isUndefined(opts[opt]) ? plainCopy(this[opt]) : plainCopy(opts[opt])\n },\n\n /**\n * Logging utility method.\n *\n * @name RethinkDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (RethinkDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(_props, updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) {\n // Allow for re-assignment from lifecycle hook\n record = isUndefined(_record) ? record : _record\n const result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = record ? 1 : 0\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n _props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return self[op](mapper, props, query, opts, records).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? records : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, updatedRecords)).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n records = isUndefined(_records) ? updatedRecords : _records\n const result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n return self.getOpt('raw', opts) ? result : result.data\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n"],"names":["utils"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\nimport unique from 'mout/array/unique'\n\nconst {\n addHiddenPropsToTarget,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n plainCopy,\n resolve\n} = utils\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst withoutRelations = function (mapper, props) {\n const relationFields = mapper.relationFields || []\n\n // Remove relations\n const _props = {}\n forOwn(props, function (value, key) {\n if (relationFields.indexOf(key) === -1) {\n _props[key] = value\n }\n })\n return _props\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * Whether to log debugging information.\n *\n * @name RethinkDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015,\n\n /**\n * Whether to return a more detailed response object.\n *\n * @name RethinkDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n /**\n * @name RethinkDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name RethinkDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n let result = {}\n fillIn(result, cursor)\n result.data = record\n result.created = record ? 1 : 0\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return resolve(self[op](mapper, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n _props = props.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n let result = {}\n fillIn(result, cursor)\n result.data = records\n result.created = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return resolve(self[op](mapper, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = {}\n fillIn(result, cursor)\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = {}\n fillIn(result, cursor)\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * There may be reasons why you may want to override this method, like when\n * the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name RethinkDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Load a hasMany relationship.\n *\n * @name RethinkDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (mapper, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(mapper, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * Load a hasOne relationship.\n *\n * @name RethinkDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (mapper, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(mapper, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name RethinkDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Load a belongsTo relationship.\n *\n * @name RethinkDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n let result = {\n data: record,\n found: record ? 1 : 0\n }\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n records || (records = [])\n let result = {\n data: records,\n found: records.length\n }\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Resolve the value of the specified option based on the given options and\n * this adapter's settings.\n *\n * @name RethinkDBAdapter#getOpt\n * @method\n * @param {string} opt The name of the option.\n * @param {Object} [opts] Configuration options.\n * @return {*} The value of the specified option.\n */\n getOpt (opt, opts) {\n opts || (opts = {})\n return isUndefined(opts[opt]) ? plainCopy(this[opt]) : plainCopy(opts[opt])\n },\n\n /**\n * Logging utility method.\n *\n * @name RethinkDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (RethinkDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n let result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = 1\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return resolve(self[op](mapper, props, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n _records = _records.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = {}\n fillIn(result, cursor)\n result.data = updatedRecords || []\n result.updated = result.data.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n"],"names":["utils"],"mappings":"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"} \ No newline at end of file diff --git a/mocha.start.js b/mocha.start.js index 2fabfc9..333f8be 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -3,17 +3,23 @@ // prepare environment for js-data-adapter-tests require('babel-polyfill') -global.assert = require('chai').assert var JSData = require('js-data') -var TestRunner = require('js-data-adapter-tests') +var JSDataAdapterTests = require('js-data-adapter-tests') var RethinkDBAdapter = require('./') -TestRunner.init({ +global.assert = JSDataAdapterTests.assert +global.sinon = JSDataAdapterTests.sinon + +JSDataAdapterTests.init({ debug: false, JSData: JSData, Adapter: RethinkDBAdapter, - adapterConfig: {}, + adapterConfig: { + min: 1, + max: 5, + bufferSize: 5 + }, storeConfig: { bypassCache: true, linkRelations: false, diff --git a/package.json b/package.json index bef0df4..3211af9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-rethinkdb", "description": "RethinkDB adapter for js-data.", - "version": "3.0.0-alpha.5", + "version": "3.0.0-alpha.6", "homepage": "https://github.com/js-data/js-data-rethinkdb", "repository": { "type": "git", @@ -35,10 +35,10 @@ "scripts": { "doc": "jsdoc -c conf.json src && node scripts/cleanup.js", "bundle": "rollup -c rollup.config.js -f cjs -o dist/js-data-rethinkdb.js -m dist/js-data-rethinkdb.js.map src/index.js", - "lint": "standard src/index.js mocha.start.js test/**/*.js", + "lint": "standard src/index.js mocha.start.js test/**/*.js scripts/**.js", "build": "npm run lint && npm run bundle", - "mocha": "mocha -t 20000 -R dot -r source-map-support/register mocha.start.js", - "cover": "istanbul cover --hook-run-in-context node_modules/mocha/bin/_mocha -- -t 20000 -R dot -r source-map-support/register mocha.start.js", + "mocha": "mocha -t 30000 -R dot -r source-map-support/register mocha.start.js", + "cover": "istanbul cover --hook-run-in-context node_modules/mocha/bin/_mocha -- -t 30000 -R dot -r source-map-support/register mocha.start.js", "test": "npm run build && npm run cover", "release": "npm test && npm run doc && node scripts/authors.js", "ci": "npm run test && cat coverage/lcov.info | coveralls || true && cat ./coverage/lcov.info | codacy-coverage || true" @@ -51,20 +51,21 @@ "rethinkdbdash": ">=1.15.0" }, "devDependencies": { - "babel-core": "6.5.2", + "babel-core": "6.6.0", "babel-eslint": "5.0.0", - "babel-polyfill": "6.5.0", + "babel-polyfill": "6.6.1", "babel-preset-es2015-rollup": "1.1.1", "chai": "3.5.0", "codacy-coverage": "1.1.3", "coveralls": "2.11.8", - "ink-docstrap": "1.1.3", + "ink-docstrap": "1.1.4", "istanbul": "0.4.2", - "js-data-adapter-tests": "^2.0.0-alpha.9", + "js-data-adapter-tests": "^2.0.0-alpha.12", "jsdoc": "3.4.0", "mocha": "2.4.5", "rollup": "0.25.4", "rollup-plugin-babel": "2.4.0", + "sinon": "1.17.3", "source-map-support": "0.4.0", "standard": "6.0.7" } diff --git a/rollup.config.js b/rollup.config.js index 56e61c4..af48aaa 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -2,6 +2,8 @@ var babel = require('rollup-plugin-babel') module.exports = { plugins: [ - babel() + babel({ + exclude: 'node_modules/**' + }) ] } diff --git a/scripts/authors.js b/scripts/authors.js index 82a856d..5ba1712 100644 --- a/scripts/authors.js +++ b/scripts/authors.js @@ -1,16 +1,17 @@ var fs = require('fs') var exec = require('child_process').exec +var path = require('path') console.log('Writing AUTHORS file...') -var authorsFile = fs.readFileSync(__dirname + '/AUTHORS', { +var authorsFile = fs.readFileSync(path.join(__dirname, '/AUTHORS'), { encoding: 'utf-8' }) -var contributorsFile = fs.readFileSync(__dirname + '/CONTRIBUTORS', { +var contributorsFile = fs.readFileSync(path.join(__dirname, '/CONTRIBUTORS'), { encoding: 'utf-8' }) -var tty = process.platform === 'win32' ? 'CON' : '/dev/tty'; +var tty = process.platform === 'win32' ? 'CON' : '/dev/tty' exec('git shortlog -s -e < ' + tty, function (err, stdout, stderr) { if (err) { @@ -27,7 +28,7 @@ exec('git shortlog -s -e < ' + tty, function (err, stdout, stderr) { // Add to or otherwise modify "names" if necessary - fs.writeFileSync(__dirname + '/../AUTHORS', authorsFile + names.join('\n'), { + fs.writeFileSync(path.join(__dirname, '/../AUTHORS'), authorsFile + names.join('\n'), { encoding: 'utf-8' }) console.log('Done!') @@ -37,7 +38,7 @@ exec('git shortlog -s -e < ' + tty, function (err, stdout, stderr) { // Add to or otherwise modify "names" if necessary - fs.writeFileSync(__dirname + '/../CONTRIBUTORS', contributorsFile + names.join('\n'), { + fs.writeFileSync(path.join(__dirname, '/../CONTRIBUTORS'), contributorsFile + names.join('\n'), { encoding: 'utf-8' }) console.log('Done!') diff --git a/src/index.js b/src/index.js index b7d8deb..e5b78ed 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,7 @@ import {utils} from 'js-data' import rethinkdbdash from 'rethinkdbdash' import underscore from 'mout/string/underscore' +import unique from 'mout/array/unique' const { addHiddenPropsToTarget, @@ -25,19 +26,6 @@ const reserved = [ 'where' ] -const unique = function (array) { - const seen = {} - const final = [] - array.forEach(function (item) { - if (item in seen) { - return - } - final.push(item) - seen[item] = 0 - }) - return final -} - const noop = function (...args) { const self = this const opts = args[args.length - 1] @@ -52,6 +40,19 @@ const noop2 = function (...args) { return resolve() } +const withoutRelations = function (mapper, props) { + const relationFields = mapper.relationFields || [] + + // Remove relations + const _props = {} + forOwn(props, function (value, key) { + if (relationFields.indexOf(key) === -1) { + _props[key] = value + } + }) + return _props +} + const DEFAULTS = { /** * RethinkDB authorization key. @@ -587,26 +588,27 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return resolve(self[op](mapper, props, opts)) }).then(function (_props) { // Allow for re-assignment from lifecycle hook - _props = isUndefined(_props) ? props : _props + props = isUndefined(_props) ? props : _props const insertOpts = self.getOpt('insertOpts', opts) insertOpts.returnChanges = true - return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts)) + return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts)) }).then(function (cursor) { self._handleErrors(cursor) let record if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { record = cursor.changes[0].new_val } + let result = {} + fillIn(result, cursor) + result.data = record + result.created = record ? 1 : 0 + result = self.getOpt('raw', opts) ? result : result.data + // afterCreate lifecycle hook op = opts.op = 'afterCreate' - return self[op](mapper, props, opts, record).then(function (_record) { + return resolve(self[op](mapper, props, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - record = isUndefined(_record) ? record : _record - const result = {} - fillIn(result, cursor) - result.data = record - result.created = record ? 1 : 0 - return self.getOpt('raw', opts) ? result : result.data + return isUndefined(_result) ? result : _result }) }) }, @@ -637,9 +639,12 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return resolve(self[op](mapper, props, opts)) }).then(function (_props) { // Allow for re-assignment from lifecycle hook - _props = isUndefined(_props) ? props : _props + props = isUndefined(_props) ? props : _props const insertOpts = self.getOpt('insertOpts', opts) insertOpts.returnChanges = true + _props = props.map(function (record) { + return withoutRelations(mapper, record) + }) return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts)) }).then(function (cursor) { self._handleErrors(cursor) @@ -649,16 +654,17 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return change.new_val }) } + let result = {} + fillIn(result, cursor) + result.data = records + result.created = records.length + result = self.getOpt('raw', opts) ? result : result.data + // afterCreateMany lifecycle hook op = opts.op = 'afterCreateMany' - return self[op](mapper, props, opts, records).then(function (_records) { + return resolve(self[op](mapper, props, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - records = isUndefined(_records) ? records : _records - const result = {} - fillIn(result, cursor) - result.data = records - result.created = records.length - return self.getOpt('raw', opts) ? result : result.data + return isUndefined(_result) ? result : _result }) }) }, @@ -691,14 +697,16 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { self.dbg(op, id, opts) return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)) }).then(function (cursor) { + let result = {} + fillIn(result, cursor) + result = self.getOpt('raw', opts) ? result : undefined + // afterDestroy lifecycle hook op = opts.op = 'afterDestroy' - return resolve(self[op](mapper, id, opts, cursor)).then(function (_cursor) { + return resolve(self[op](mapper, id, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - return isUndefined(_cursor) ? cursor : _cursor + return isUndefined(_result) ? result : _result }) - }).then(function (cursor) { - return self.getOpt('raw', opts) ? cursor : undefined }) }, @@ -742,14 +750,16 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { .delete(self.getOpt('deleteOpts', opts)) .run(self.getOpt('runOpts', opts)) }).then(function (cursor) { + let result = {} + fillIn(result, cursor) + result = self.getOpt('raw', opts) ? result : undefined + // afterDestroyAll lifecycle hook op = opts.op = 'afterDestroyAll' - return resolve(self[op](mapper, query, opts, cursor)).then(function (_cursor) { + return resolve(self[op](mapper, query, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - return isUndefined(_cursor) ? cursor : _cursor + return isUndefined(_result) ? result : _result }) - }).then(function (cursor) { - return self.getOpt('raw', opts) ? cursor : undefined }) }, @@ -981,15 +991,17 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return Promise.all(tasks) }).then(function () { + let result = { + data: record, + found: record ? 1 : 0 + } + result = self.getOpt('raw', opts) ? result : result.data + // afterFind lifecycle hook op = opts.op = 'afterFind' - return resolve(self[op](mapper, id, opts, record)).then(function (_record) { + return resolve(self[op](mapper, id, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - record = isUndefined(_record) ? record : _record - return self.getOpt('raw', opts) ? { - data: record, - found: record ? 1 : 0 - } : record + return isUndefined(_result) ? result : _result }) }) }, @@ -1120,15 +1132,18 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }) return Promise.all(tasks) }).then(function () { + records || (records = []) + let result = { + data: records, + found: records.length + } + result = self.getOpt('raw', opts) ? result : result.data + // afterFindAll lifecycle hook op = opts.op = 'afterFindAll' - return resolve(self[op](mapper, query, opts, records)).then(function (_records) { + return resolve(self[op](mapper, query, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - records = isUndefined(_records) ? records : _records - return self.getOpt('raw', opts) ? { - data: records, - found: records.length - } : records + return isUndefined(_result) ? result : _result }) }) }, @@ -1216,10 +1231,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return resolve(self[op](mapper, id, props, opts)) }).then(function (_props) { // Allow for re-assignment from lifecycle hook - _props = isUndefined(_props) ? props : _props + props = isUndefined(_props) ? props : _props const updateOpts = self.getOpt('updateOpts', opts) updateOpts.returnChanges = true - return self.selectTable(mapper, opts).get(id).update(_props, updateOpts).run(self.getOpt('runOpts', opts)) + return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts)) }).then(function (cursor) { let record self._handleErrors(cursor) @@ -1228,17 +1243,17 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } else { throw new Error('Not Found') } + let result = {} + fillIn(result, cursor) + result.data = record + result.updated = 1 + result = self.getOpt('raw', opts) ? result : result.data // afterUpdate lifecycle hook op = opts.op = 'afterUpdate' - return resolve(self[op](mapper, id, props, opts, record)).then(function (_record) { + return resolve(self[op](mapper, id, props, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - record = isUndefined(_record) ? record : _record - const result = {} - fillIn(result, cursor) - result.data = record - result.updated = record ? 1 : 0 - return self.getOpt('raw', opts) ? result : result.data + return isUndefined(_result) ? result : _result }) }) }, @@ -1279,26 +1294,27 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return resolve(self[op](mapper, props, query, opts)) }).then(function (_props) { // Allow for re-assignment from lifecycle hook - _props = isUndefined(_props) ? props : _props + props = isUndefined(_props) ? props : _props const updateOpts = self.getOpt('updateOpts', opts) updateOpts.returnChanges = true - return self.filterSequence(self.selectTable(mapper, opts), query).update(_props, updateOpts).run(self.getOpt('runOpts', opts)) + return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts)) }).then(function (cursor) { let records = [] self._handleErrors(cursor) if (cursor && cursor.changes && cursor.changes.length) { records = cursor.changes.map(function (change) { return change.new_val }) } + let result = {} + fillIn(result, cursor) + result.data = records + result.updated = records.length + result = self.getOpt('raw', opts) ? result : result.data + // afterUpdateAll lifecycle hook op = opts.op = 'afterUpdateAll' - return self[op](mapper, props, query, opts, records).then(function (_records) { + return resolve(self[op](mapper, props, query, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - records = isUndefined(_records) ? records : _records - const result = {} - fillIn(result, cursor) - result.data = records - result.updated = records.length - return self.getOpt('raw', opts) ? result : result.data + return isUndefined(_result) ? result : _result }) }) }, @@ -1338,6 +1354,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { const insertOpts = self.getOpt('insertOpts', opts) insertOpts.returnChanges = true insertOpts.conflict = 'update' + _records = _records.map(function (record) { + return withoutRelations(mapper, record) + }) return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts)) }).then(function (cursor) { let updatedRecords @@ -1345,17 +1364,17 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { if (cursor && cursor.changes && cursor.changes.length) { updatedRecords = cursor.changes.map(function (change) { return change.new_val }) } + let result = {} + fillIn(result, cursor) + result.data = updatedRecords || [] + result.updated = result.data.length + result = self.getOpt('raw', opts) ? result : result.data // afterUpdateMany lifecycle hook op = opts.op = 'afterUpdateMany' - return resolve(self[op](mapper, records, opts, updatedRecords)).then(function (_records) { + return resolve(self[op](mapper, records, opts, result)).then(function (_result) { // Allow for re-assignment from lifecycle hook - records = isUndefined(_records) ? updatedRecords : _records - const result = {} - fillIn(result, cursor) - result.data = records - result.updated = records.length - return self.getOpt('raw', opts) ? result : result.data + return isUndefined(_result) ? result : _result }) }) }, From 8e48ffd0114cb4652c648b665e6c3a17853d5e00 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Wed, 2 Mar 2016 21:22:57 -0800 Subject: [PATCH 15/27] 3.0.0-alpha.7 --- CHANGELOG.md | 5 +++++ dist/js-data-rethinkdb.js | 14 ++++++++++++++ dist/js-data-rethinkdb.js.map | 2 +- package.json | 6 +++--- src/index.js | 14 ++++++++++++++ 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 578bc4a..5705400 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +##### 3.0.0-alpha.7 - 03 March 2016 + +###### Backwards compatible API changes +- Added RethinkDBAdapter.extend + ##### 3.0.0-alpha.6 - 01 March 2016 ###### Backwards compatible bug fixes diff --git a/dist/js-data-rethinkdb.js b/dist/js-data-rethinkdb.js index a079937..0265c41 100644 --- a/dist/js-data-rethinkdb.js +++ b/dist/js-data-rethinkdb.js @@ -32,6 +32,7 @@ babelHelpers.defineProperty = function (obj, key, value) { babelHelpers; var addHiddenPropsToTarget = jsData.utils.addHiddenPropsToTarget; +var extend = jsData.utils.extend; var fillIn = jsData.utils.fillIn; var forEachRelation = jsData.utils.forEachRelation; var forOwn = jsData.utils.forOwn; @@ -340,6 +341,19 @@ function RethinkDBAdapter(opts) { self.indices = {}; } +/** + * Alternative to ES6 class syntax for extending `RethinkDBAdapter`. + * + * @name RethinkDBAdapter.extend + * @method + * @param {Object} [instanceProps] Properties that will be added to the + * prototype of the subclass. + * @param {Object} [classProps] Properties that will be added as static + * properties to the subclass itself. + * @return {Object} Subclass of `RethinkDBAdapter`. + */ +RethinkDBAdapter.extend = extend; + addHiddenPropsToTarget(RethinkDBAdapter.prototype, { _handleErrors: function _handleErrors(cursor) { if (cursor && cursor.errors > 0) { diff --git a/dist/js-data-rethinkdb.js.map b/dist/js-data-rethinkdb.js.map index c5ad0cb..bbef1bd 100644 --- a/dist/js-data-rethinkdb.js.map +++ b/dist/js-data-rethinkdb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\nimport unique from 'mout/array/unique'\n\nconst {\n addHiddenPropsToTarget,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n plainCopy,\n resolve\n} = utils\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst withoutRelations = function (mapper, props) {\n const relationFields = mapper.relationFields || []\n\n // Remove relations\n const _props = {}\n forOwn(props, function (value, key) {\n if (relationFields.indexOf(key) === -1) {\n _props[key] = value\n }\n })\n return _props\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * Whether to log debugging information.\n *\n * @name RethinkDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015,\n\n /**\n * Whether to return a more detailed response object.\n *\n * @name RethinkDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n /**\n * @name RethinkDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name RethinkDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n let result = {}\n fillIn(result, cursor)\n result.data = record\n result.created = record ? 1 : 0\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return resolve(self[op](mapper, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n _props = props.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n let result = {}\n fillIn(result, cursor)\n result.data = records\n result.created = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return resolve(self[op](mapper, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = {}\n fillIn(result, cursor)\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = {}\n fillIn(result, cursor)\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * There may be reasons why you may want to override this method, like when\n * the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name RethinkDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Load a hasMany relationship.\n *\n * @name RethinkDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (mapper, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(mapper, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * Load a hasOne relationship.\n *\n * @name RethinkDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (mapper, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(mapper, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name RethinkDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Load a belongsTo relationship.\n *\n * @name RethinkDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n let result = {\n data: record,\n found: record ? 1 : 0\n }\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n records || (records = [])\n let result = {\n data: records,\n found: records.length\n }\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Resolve the value of the specified option based on the given options and\n * this adapter's settings.\n *\n * @name RethinkDBAdapter#getOpt\n * @method\n * @param {string} opt The name of the option.\n * @param {Object} [opts] Configuration options.\n * @return {*} The value of the specified option.\n */\n getOpt (opt, opts) {\n opts || (opts = {})\n return isUndefined(opts[opt]) ? plainCopy(this[opt]) : plainCopy(opts[opt])\n },\n\n /**\n * Logging utility method.\n *\n * @name RethinkDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (RethinkDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n let result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = 1\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return resolve(self[op](mapper, props, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n _records = _records.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = {}\n fillIn(result, cursor)\n result.data = updatedRecords || []\n result.updated = result.data.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n"],"names":["utils"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\nimport unique from 'mout/array/unique'\n\nconst {\n addHiddenPropsToTarget,\n extend,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n plainCopy,\n resolve\n} = utils\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst withoutRelations = function (mapper, props) {\n const relationFields = mapper.relationFields || []\n\n // Remove relations\n const _props = {}\n forOwn(props, function (value, key) {\n if (relationFields.indexOf(key) === -1) {\n _props[key] = value\n }\n })\n return _props\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * Whether to log debugging information.\n *\n * @name RethinkDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015,\n\n /**\n * Whether to return a more detailed response object.\n *\n * @name RethinkDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the subclass.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the subclass itself.\n * @return {Object} Subclass of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = extend\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n /**\n * @name RethinkDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name RethinkDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n let result = {}\n fillIn(result, cursor)\n result.data = record\n result.created = record ? 1 : 0\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return resolve(self[op](mapper, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n _props = props.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n let result = {}\n fillIn(result, cursor)\n result.data = records\n result.created = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return resolve(self[op](mapper, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = {}\n fillIn(result, cursor)\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = {}\n fillIn(result, cursor)\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * There may be reasons why you may want to override this method, like when\n * the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name RethinkDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Load a hasMany relationship.\n *\n * @name RethinkDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (mapper, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(mapper, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * Load a hasOne relationship.\n *\n * @name RethinkDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (mapper, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(mapper, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name RethinkDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Load a belongsTo relationship.\n *\n * @name RethinkDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n let result = {\n data: record,\n found: record ? 1 : 0\n }\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n records || (records = [])\n let result = {\n data: records,\n found: records.length\n }\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Resolve the value of the specified option based on the given options and\n * this adapter's settings.\n *\n * @name RethinkDBAdapter#getOpt\n * @method\n * @param {string} opt The name of the option.\n * @param {Object} [opts] Configuration options.\n * @return {*} The value of the specified option.\n */\n getOpt (opt, opts) {\n opts || (opts = {})\n return isUndefined(opts[opt]) ? plainCopy(this[opt]) : plainCopy(opts[opt])\n },\n\n /**\n * Logging utility method.\n *\n * @name RethinkDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (RethinkDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n let result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = 1\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return resolve(self[op](mapper, props, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n _records = _records.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = {}\n fillIn(result, cursor)\n result.data = updatedRecords || []\n result.updated = result.data.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n"],"names":["utils"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 3211af9..e54a648 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-rethinkdb", "description": "RethinkDB adapter for js-data.", - "version": "3.0.0-alpha.6", + "version": "3.0.0-alpha.7", "homepage": "https://github.com/js-data/js-data-rethinkdb", "repository": { "type": "git", @@ -51,7 +51,7 @@ "rethinkdbdash": ">=1.15.0" }, "devDependencies": { - "babel-core": "6.6.0", + "babel-core": "6.6.4", "babel-eslint": "5.0.0", "babel-polyfill": "6.6.1", "babel-preset-es2015-rollup": "1.1.1", @@ -60,7 +60,7 @@ "coveralls": "2.11.8", "ink-docstrap": "1.1.4", "istanbul": "0.4.2", - "js-data-adapter-tests": "^2.0.0-alpha.12", + "js-data-adapter-tests": "^2.0.0-alpha.13", "jsdoc": "3.4.0", "mocha": "2.4.5", "rollup": "0.25.4", diff --git a/src/index.js b/src/index.js index e5b78ed..6ee7845 100644 --- a/src/index.js +++ b/src/index.js @@ -5,6 +5,7 @@ import unique from 'mout/array/unique' const { addHiddenPropsToTarget, + extend, fillIn, forEachRelation, forOwn, @@ -310,6 +311,19 @@ export default function RethinkDBAdapter (opts) { self.indices = {} } +/** + * Alternative to ES6 class syntax for extending `RethinkDBAdapter`. + * + * @name RethinkDBAdapter.extend + * @method + * @param {Object} [instanceProps] Properties that will be added to the + * prototype of the subclass. + * @param {Object} [classProps] Properties that will be added as static + * properties to the subclass itself. + * @return {Object} Subclass of `RethinkDBAdapter`. + */ +RethinkDBAdapter.extend = extend + addHiddenPropsToTarget(RethinkDBAdapter.prototype, { _handleErrors (cursor) { if (cursor && cursor.errors > 0) { From e8045ddf80abe93f34d32083316b63c686ba12a4 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Wed, 2 Mar 2016 21:23:44 -0800 Subject: [PATCH 16/27] Update contributors files --- CONTRIBUTORS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index df3d290..cf3e162 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -5,5 +5,5 @@ # Names should be added to this file as: # [commit count] Name 1 InternalFX - 53 Jason Dobry + 55 Jason Dobry 2 Ollie Relph From 98f9d55829a7d746fcb5506741ac8cd0d7d174a5 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 5 Mar 2016 16:14:52 -0800 Subject: [PATCH 17/27] 3.0.0-alpha.8 --- AUTHORS | 2 - CHANGELOG.md | 6 + conf.json | 3 +- dist/js-data-rethinkdb.js | 459 +++++----------------------------- dist/js-data-rethinkdb.js.map | 2 +- package.json | 21 +- scripts/AUTHORS | 7 - src/index.js | 396 ++++------------------------- test/handleErrors.test.js | 1 + 9 files changed, 123 insertions(+), 774 deletions(-) delete mode 100644 scripts/AUTHORS diff --git a/AUTHORS b/AUTHORS index 6f33d2c..6f2ea1e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,7 +1,5 @@ # This is the official list of js-data-rethinkdb project authors. # -# This file is controlled by scripts/authors.js -# # Names are formatted as: # # commits Name or Organization # The email address is not required for organizations. diff --git a/CHANGELOG.md b/CHANGELOG.md index 5705400..ce8103e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +##### 3.0.0-alpha.8 - 06 March 2016 + +###### Other +- Extracted common adapter functionality into js-data-adapter +- Extracted common js-data repo utility scripts into js-data-repo-tools + ##### 3.0.0-alpha.7 - 03 March 2016 ###### Backwards compatible API changes diff --git a/conf.json b/conf.json index f148e9b..651653a 100644 --- a/conf.json +++ b/conf.json @@ -15,10 +15,9 @@ "theme": "lumen", "systemName": "js-data-rethinkdb", "copyright": "js-data-rethinkdb Copyright © 2014-2016 js-data-rethinkdb project authors", - "outputSourceFiles": true, "syntaxTheme": "dark", "linenums": true, - "footer": "
Back to js-data.io
", + "footer": "", "analytics": { "ua": "UA-55528236-2", "domain": "api.js-data.io" diff --git a/dist/js-data-rethinkdb.js b/dist/js-data-rethinkdb.js index 0265c41..817ab97 100644 --- a/dist/js-data-rethinkdb.js +++ b/dist/js-data-rethinkdb.js @@ -3,16 +3,13 @@ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var jsData = require('js-data'); +var Adapter = require('js-data-adapter'); +var Adapter__default = _interopDefault(Adapter); var rethinkdbdash = _interopDefault(require('rethinkdbdash')); var underscore = _interopDefault(require('mout/string/underscore')); var unique = _interopDefault(require('mout/array/unique')); var babelHelpers = {}; -babelHelpers.typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { - return typeof obj; -} : function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; -}; babelHelpers.defineProperty = function (obj, key, value) { if (key in obj) { @@ -32,6 +29,7 @@ babelHelpers.defineProperty = function (obj, key, value) { babelHelpers; var addHiddenPropsToTarget = jsData.utils.addHiddenPropsToTarget; +var classCallCheck = jsData.utils.classCallCheck; var extend = jsData.utils.extend; var fillIn = jsData.utils.fillIn; var forEachRelation = jsData.utils.forEachRelation; @@ -41,47 +39,13 @@ var isArray = jsData.utils.isArray; var isObject = jsData.utils.isObject; var isString = jsData.utils.isString; var isUndefined = jsData.utils.isUndefined; +var omit = jsData.utils.omit; var plainCopy = jsData.utils.plainCopy; var resolve = jsData.utils.resolve; -var reserved = ['orderBy', 'sort', 'limit', 'offset', 'skip', 'where']; - -var noop = function noop() { - var self = this; - - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - var opts = args[args.length - 1]; - self.dbg.apply(self, [opts.op].concat(args)); - return resolve(); -}; - -var noop2 = function noop2() { - var self = this; - - for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - var opts = args[args.length - 2]; - self.dbg.apply(self, [opts.op].concat(args)); - return resolve(); -}; - var withoutRelations = function withoutRelations(mapper, props) { - var relationFields = mapper.relationFields || []; - - // Remove relations - var _props = {}; - forOwn(props, function (value, key) { - if (relationFields.indexOf(key) === -1) { - _props[key] = value; - } - }); - return _props; + return omit(props, mapper.relationFields || []); }; var DEFAULTS = { @@ -260,6 +224,7 @@ var OPERATORS = { * store.defineMapper('user') * * @class RethinkDBAdapter + * @extends Adapter * @param {Object} [opts] Configuration opts. * @param {string} [opts.authKey=""] RethinkDB authorization key. * @param {number} [opts.bufferSize=10] Buffer size for connection pool. @@ -275,9 +240,10 @@ var OPERATORS = { */ function RethinkDBAdapter(opts) { var self = this; + classCallCheck(self, RethinkDBAdapter); opts || (opts = {}); fillIn(opts, DEFAULTS); - fillIn(self, opts); + Adapter__default.call(this, opts); /** * Default options to pass to r#insert. @@ -341,16 +307,31 @@ function RethinkDBAdapter(opts) { self.indices = {}; } +// Setup prototype inheritance from Adapter +RethinkDBAdapter.prototype = Object.create(Adapter__default.prototype, { + constructor: { + value: RethinkDBAdapter, + enumerable: false, + writable: true, + configurable: true + } +}); + +Object.defineProperty(RethinkDBAdapter, '__super__', { + configurable: true, + value: Adapter__default +}); + /** * Alternative to ES6 class syntax for extending `RethinkDBAdapter`. * * @name RethinkDBAdapter.extend * @method * @param {Object} [instanceProps] Properties that will be added to the - * prototype of the subclass. + * prototype of the RethinkDBAdapter. * @param {Object} [classProps] Properties that will be added as static - * properties to the subclass itself. - * @return {Object} Subclass of `RethinkDBAdapter`. + * properties to the RethinkDBAdapter itself. + * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`. */ RethinkDBAdapter.extend = extend; @@ -363,126 +344,6 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { throw new Error('Unknown RethinkDB Error'); } }, - - /** - * @name RethinkDBAdapter#afterCreate - * @method - */ - afterCreate: noop2, - - /** - * @name RethinkDBAdapter#afterCreateMany - * @method - */ - afterCreateMany: noop2, - - /** - * @name RethinkDBAdapter#afterDestroy - * @method - */ - afterDestroy: noop2, - - /** - * @name RethinkDBAdapter#afterDestroyAll - * @method - */ - afterDestroyAll: noop2, - - /** - * @name RethinkDBAdapter#afterFind - * @method - */ - afterFind: noop2, - - /** - * @name RethinkDBAdapter#afterFindAll - * @method - */ - afterFindAll: noop2, - - /** - * @name RethinkDBAdapter#afterUpdate - * @method - */ - afterUpdate: noop2, - - /** - * @name RethinkDBAdapter#afterUpdateAll - * @method - */ - afterUpdateAll: noop2, - - /** - * @name RethinkDBAdapter#afterUpdateMany - * @method - */ - afterUpdateMany: noop2, - - /** - * @name RethinkDBAdapter#beforeCreate - * @method - */ - beforeCreate: noop, - - /** - * @name RethinkDBAdapter#beforeCreateMany - * @method - */ - beforeCreateMany: noop, - - /** - * @name RethinkDBAdapter#beforeDestroy - * @method - */ - beforeDestroy: noop, - - /** - * @name RethinkDBAdapter#beforeDestroyAll - * @method - */ - beforeDestroyAll: noop, - - /** - * @name RethinkDBAdapter#beforeFind - * @method - */ - beforeFind: noop, - - /** - * @name RethinkDBAdapter#beforeFindAll - * @method - */ - beforeFindAll: noop, - - /** - * @name RethinkDBAdapter#beforeUpdate - * @method - */ - beforeUpdate: noop, - - /** - * @name RethinkDBAdapter#beforeUpdateAll - * @method - */ - beforeUpdateAll: noop, - - /** - * @name RethinkDBAdapter#beforeUpdateMany - * @method - */ - beforeUpdateMany: noop, - - /** - * @name RethinkDBAdapter#dbg - * @method - */ - dbg: function dbg() { - for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - args[_key3] = arguments[_key3]; - } - - this.log.apply(this, ['debug'].concat(args)); - }, selectDb: function selectDb(opts) { return this.r.db(isUndefined(opts.db) ? this.db : opts.db); }, @@ -522,7 +383,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { // Transform non-keyword properties to "where" clause configuration forOwn(query, function (config, keyword) { - if (reserved.indexOf(keyword) === -1) { + if (Adapter.reserved.indexOf(keyword) === -1) { if (isObject(config)) { query.where[keyword] = config; } else { @@ -540,7 +401,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { if (Object.keys(query.where).length !== 0) { // Filter sequence using filter function rql = rql.filter(function (row) { - var subQuery = undefined; + var subQuery = void 0; // Apply filter for each field forOwn(query.where, function (criteria, field) { if (!isObject(criteria)) { @@ -620,7 +481,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ create: function create(mapper, props, opts) { var self = this; - var op = undefined; + var op = void 0; props || (props = {}); opts || (opts = {}); @@ -636,21 +497,19 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { self._handleErrors(cursor); - var record = undefined; + var record = void 0; if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { record = cursor.changes[0].new_val; } - var result = {}; - fillIn(result, cursor); - result.data = record; - result.created = record ? 1 : 0; - result = self.getOpt('raw', opts) ? result : result.data; + var response = new Adapter.Response(record, cursor, 'create'); + response.created = record ? 1 : 0; + response = self.respond(response, opts); // afterCreate lifecycle hook op = opts.op = 'afterCreate'; - return resolve(self[op](mapper, props, opts, result)).then(function (_result) { + return resolve(self[op](mapper, props, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result; + return isUndefined(_response) ? response : _response; }); }); }, @@ -672,7 +531,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ createMany: function createMany(mapper, props, opts) { var self = this; - var op = undefined; + var op = void 0; props || (props = {}); opts || (opts = {}); @@ -697,9 +556,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return change.new_val; }); } - var result = {}; - fillIn(result, cursor); - result.data = records; + var result = new Adapter.Response(records, cursor, 'createMany'); result.created = records.length; result = self.getOpt('raw', opts) ? result : result.data; @@ -729,7 +586,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ destroy: function destroy(mapper, id, opts) { var self = this; - var op = undefined; + var op = void 0; opts || (opts = {}); return self.waitForTable(mapper, opts).then(function () { @@ -741,8 +598,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { self.dbg(op, id, opts); return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { - var result = {}; - fillIn(result, cursor); + var result = new Adapter.Response(undefined, cursor, 'destroy'); result = self.getOpt('raw', opts) ? result : undefined; // afterDestroy lifecycle hook @@ -779,7 +635,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ destroyAll: function destroyAll(mapper, query, opts) { var self = this; - var op = undefined; + var op = void 0; query || (query = {}); opts || (opts = {}); @@ -792,8 +648,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { self.dbg(op, query, opts); return self.filterSequence(self.selectTable(mapper, opts), query).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { - var result = {}; - fillIn(result, cursor); + var result = new Adapter.Response(undefined, cursor, 'destroyAll'); result = self.getOpt('raw', opts) ? result : undefined; // afterDestroyAll lifecycle hook @@ -806,147 +661,6 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }, - /** - * Return the foreignKey from the given record for the provided relationship. - * - * There may be reasons why you may want to override this method, like when - * the id of the parent doesn't exactly match up to the key on the child. - * - * @name RethinkDBAdapter#makeHasManyForeignKey - * @method - * @return {*} - */ - makeHasManyForeignKey: function makeHasManyForeignKey(mapper, def, record) { - return def.getForeignKey(record); - }, - - - /** - * Load a hasMany relationship. - * - * @name RethinkDBAdapter#loadHasMany - * @method - * @return {Promise} - */ - loadHasMany: function loadHasMany(mapper, def, records, __opts) { - var self = this; - var singular = false; - - if (isObject(records) && !isArray(records)) { - singular = true; - records = [records]; - } - var IDs = records.map(function (record) { - return self.makeHasManyForeignKey(mapper, def, record); - }); - var query = {}; - var criteria = query[def.foreignKey] = {}; - if (singular) { - // more efficient query when we only have one record - criteria['=='] = IDs[0]; - } else { - criteria['in'] = IDs.filter(function (id) { - return id; - }); - } - return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) { - records.forEach(function (record) { - var attached = []; - // avoid unneccesary iteration when we only have one record - if (singular) { - attached = relatedItems; - } else { - relatedItems.forEach(function (relatedItem) { - if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) { - attached.push(relatedItem); - } - }); - } - def.setLocalField(record, attached); - }); - }); - }, - - - /** - * Load a hasOne relationship. - * - * @name RethinkDBAdapter#loadHasOne - * @method - * @return {Promise} - */ - loadHasOne: function loadHasOne(mapper, def, records, __opts) { - if (isObject(records) && !isArray(records)) { - records = [records]; - } - return this.loadHasMany(mapper, def, records, __opts).then(function () { - records.forEach(function (record) { - var relatedData = def.getLocalField(record); - if (isArray(relatedData) && relatedData.length) { - def.setLocalField(record, relatedData[0]); - } - }); - }); - }, - - - /** - * Return the foreignKey from the given record for the provided relationship. - * - * @name RethinkDBAdapter#makeBelongsToForeignKey - * @method - * @return {*} - */ - makeBelongsToForeignKey: function makeBelongsToForeignKey(mapper, def, record) { - return def.getForeignKey(record); - }, - - - /** - * Load a belongsTo relationship. - * - * @name RethinkDBAdapter#loadBelongsTo - * @method - * @return {Promise} - */ - loadBelongsTo: function loadBelongsTo(mapper, def, records, __opts) { - var self = this; - var relationDef = def.getRelation(); - - if (isObject(records) && !isArray(records)) { - var _ret = function () { - var record = records; - return { - v: self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) { - def.setLocalField(record, relatedItem); - }) - }; - }(); - - if ((typeof _ret === 'undefined' ? 'undefined' : babelHelpers.typeof(_ret)) === "object") return _ret.v; - } else { - var keys = records.map(function (record) { - return self.makeBelongsToForeignKey(mapper, def, record); - }).filter(function (key) { - return key; - }); - return self.findAll(relationDef, { - where: babelHelpers.defineProperty({}, relationDef.idAttribute, { - 'in': keys - }) - }, __opts).then(function (relatedItems) { - records.forEach(function (record) { - relatedItems.forEach(function (relatedItem) { - if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) { - def.setLocalField(record, relatedItem); - } - }); - }); - }); - } - }, - - /** * Retrieve the record with the given primary key. * @@ -963,8 +677,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ find: function find(mapper, id, opts) { var self = this; - var record = undefined, - op = undefined; + var record = void 0, + op = void 0; opts || (opts = {}); opts.with || (opts.with = []); @@ -1002,7 +716,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { forEachRelation(mapper, opts, function (def, __opts) { var relatedMapper = def.getRelation(); - var task = undefined; + var task = void 0; if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { if (def.type === 'hasOne') { @@ -1042,10 +756,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return Promise.all(tasks); }).then(function () { - var result = { - data: record, - found: record ? 1 : 0 - }; + var result = new Adapter.Response(record, {}, 'find'); + result.found = record ? 1 : 0; result = self.getOpt('raw', opts) ? result : result.data; // afterFind lifecycle hook @@ -1086,7 +798,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { opts.with || (opts.with = []); var records = []; - var op = undefined; + var op = void 0; var relationList = mapper.relationList || []; var tasks = [self.waitForTable(mapper, opts)]; @@ -1118,7 +830,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { forEachRelation(mapper, opts, function (def, __opts) { var relatedMapper = def.getRelation(); var idAttribute = mapper.idAttribute; - var task = undefined; + var task = void 0; if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { if (def.type === 'hasMany') { task = self.loadHasMany(mapper, def, records, __opts); @@ -1185,10 +897,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return Promise.all(tasks); }).then(function () { records || (records = []); - var result = { - data: records, - found: records.length - }; + var result = new Adapter.Response(records, {}, 'findAll'); + result.found = records.length; result = self.getOpt('raw', opts) ? result : result.data; // afterFindAll lifecycle hook @@ -1221,53 +931,6 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }, - /** - * Resolve the value of the specified option based on the given options and - * this adapter's settings. - * - * @name RethinkDBAdapter#getOpt - * @method - * @param {string} opt The name of the option. - * @param {Object} [opts] Configuration options. - * @return {*} The value of the specified option. - */ - getOpt: function getOpt(opt, opts) { - opts || (opts = {}); - return isUndefined(opts[opt]) ? plainCopy(this[opt]) : plainCopy(opts[opt]); - }, - - - /** - * Logging utility method. - * - * @name RethinkDBAdapter#log - * @method - */ - log: function log(level) { - for (var _len4 = arguments.length, args = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { - args[_key4 - 1] = arguments[_key4]; - } - - if (level && !args.length) { - args.push(level); - level = 'debug'; - } - if (level === 'debug' && !this.debug) { - return; - } - var prefix = level.toUpperCase() + ': (RethinkDBAdapter)'; - if (console[level]) { - var _console; - - (_console = console)[level].apply(_console, [prefix].concat(args)); - } else { - var _console2; - - (_console2 = console).log.apply(_console2, [prefix].concat(args)); - } - }, - - /** * Apply the given update to the record with the specified primary key. * @@ -1287,7 +950,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { var self = this; props || (props = {}); opts || (opts = {}); - var op = undefined; + var op = void 0; return self.waitForTable(mapper, opts).then(function () { // beforeUpdate lifecycle hook @@ -1300,16 +963,14 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { updateOpts.returnChanges = true; return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { - var record = undefined; + var record = void 0; self._handleErrors(cursor); if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { record = cursor.changes[0].new_val; } else { throw new Error('Not Found'); } - var result = {}; - fillIn(result, cursor); - result.data = record; + var result = new Adapter.Response(record, cursor, 'update'); result.updated = 1; result = self.getOpt('raw', opts) ? result : result.data; @@ -1351,7 +1012,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { props || (props = {}); query || (query = {}); opts || (opts = {}); - var op = undefined; + var op = void 0; return self.waitForTable(mapper, opts).then(function () { // beforeUpdateAll lifecycle hook @@ -1371,9 +1032,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return change.new_val; }); } - var result = {}; - fillIn(result, cursor); - result.data = records; + var result = new Adapter.Response(records, cursor, 'update'); result.updated = records.length; result = self.getOpt('raw', opts) ? result : result.data; @@ -1405,7 +1064,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { var self = this; records || (records = []); opts || (opts = {}); - var op = undefined; + var op = void 0; var idAttribute = mapper.idAttribute; records = records.filter(function (record) { @@ -1427,16 +1086,14 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }); return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { - var updatedRecords = undefined; + var updatedRecords = void 0; self._handleErrors(cursor); if (cursor && cursor.changes && cursor.changes.length) { updatedRecords = cursor.changes.map(function (change) { return change.new_val; }); } - var result = {}; - fillIn(result, cursor); - result.data = updatedRecords || []; + var result = new Adapter.Response(updatedRecords || [], cursor, 'update'); result.updated = result.data.length; result = self.getOpt('raw', opts) ? result : result.data; diff --git a/dist/js-data-rethinkdb.js.map b/dist/js-data-rethinkdb.js.map index bbef1bd..dcc68da 100644 --- a/dist/js-data-rethinkdb.js.map +++ b/dist/js-data-rethinkdb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\nimport unique from 'mout/array/unique'\n\nconst {\n addHiddenPropsToTarget,\n extend,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n plainCopy,\n resolve\n} = utils\n\nconst reserved = [\n 'orderBy',\n 'sort',\n 'limit',\n 'offset',\n 'skip',\n 'where'\n]\n\nconst noop = function (...args) {\n const self = this\n const opts = args[args.length - 1]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst noop2 = function (...args) {\n const self = this\n const opts = args[args.length - 2]\n self.dbg(opts.op, ...args)\n return resolve()\n}\n\nconst withoutRelations = function (mapper, props) {\n const relationFields = mapper.relationFields || []\n\n // Remove relations\n const _props = {}\n forOwn(props, function (value, key) {\n if (relationFields.indexOf(key) === -1) {\n _props[key] = value\n }\n })\n return _props\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * Whether to log debugging information.\n *\n * @name RethinkDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015,\n\n /**\n * Whether to return a more detailed response object.\n *\n * @name RethinkDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n fillIn(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the subclass.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the subclass itself.\n * @return {Object} Subclass of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = extend\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n /**\n * @name RethinkDBAdapter#afterCreate\n * @method\n */\n afterCreate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterCreateMany\n * @method\n */\n afterCreateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroy\n * @method\n */\n afterDestroy: noop2,\n\n /**\n * @name RethinkDBAdapter#afterDestroyAll\n * @method\n */\n afterDestroyAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFind\n * @method\n */\n afterFind: noop2,\n\n /**\n * @name RethinkDBAdapter#afterFindAll\n * @method\n */\n afterFindAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdate\n * @method\n */\n afterUpdate: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateAll\n * @method\n */\n afterUpdateAll: noop2,\n\n /**\n * @name RethinkDBAdapter#afterUpdateMany\n * @method\n */\n afterUpdateMany: noop2,\n\n /**\n * @name RethinkDBAdapter#beforeCreate\n * @method\n */\n beforeCreate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeCreateMany\n * @method\n */\n beforeCreateMany: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroy\n * @method\n */\n beforeDestroy: noop,\n\n /**\n * @name RethinkDBAdapter#beforeDestroyAll\n * @method\n */\n beforeDestroyAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFind\n * @method\n */\n beforeFind: noop,\n\n /**\n * @name RethinkDBAdapter#beforeFindAll\n * @method\n */\n beforeFindAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdate\n * @method\n */\n beforeUpdate: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateAll\n * @method\n */\n beforeUpdateAll: noop,\n\n /**\n * @name RethinkDBAdapter#beforeUpdateMany\n * @method\n */\n beforeUpdateMany: noop,\n\n /**\n * @name RethinkDBAdapter#dbg\n * @method\n */\n dbg (...args) {\n this.log('debug', ...args)\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n let result = {}\n fillIn(result, cursor)\n result.data = record\n result.created = record ? 1 : 0\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return resolve(self[op](mapper, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n _props = props.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n let result = {}\n fillIn(result, cursor)\n result.data = records\n result.created = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return resolve(self[op](mapper, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = {}\n fillIn(result, cursor)\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = {}\n fillIn(result, cursor)\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * There may be reasons why you may want to override this method, like when\n * the id of the parent doesn't exactly match up to the key on the child.\n *\n * @name RethinkDBAdapter#makeHasManyForeignKey\n * @method\n * @return {*}\n */\n makeHasManyForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Load a hasMany relationship.\n *\n * @name RethinkDBAdapter#loadHasMany\n * @method\n * @return {Promise}\n */\n loadHasMany (mapper, def, records, __opts) {\n const self = this\n let singular = false\n\n if (isObject(records) && !isArray(records)) {\n singular = true\n records = [records]\n }\n const IDs = records.map(function (record) {\n return self.makeHasManyForeignKey(mapper, def, record)\n })\n const query = {}\n const criteria = query[def.foreignKey] = {}\n if (singular) {\n // more efficient query when we only have one record\n criteria['=='] = IDs[0]\n } else {\n criteria['in'] = IDs.filter(function (id) {\n return id\n })\n }\n return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n let attached = []\n // avoid unneccesary iteration when we only have one record\n if (singular) {\n attached = relatedItems\n } else {\n relatedItems.forEach(function (relatedItem) {\n if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) {\n attached.push(relatedItem)\n }\n })\n }\n def.setLocalField(record, attached)\n })\n })\n },\n\n /**\n * Load a hasOne relationship.\n *\n * @name RethinkDBAdapter#loadHasOne\n * @method\n * @return {Promise}\n */\n loadHasOne (mapper, def, records, __opts) {\n if (isObject(records) && !isArray(records)) {\n records = [records]\n }\n return this.loadHasMany(mapper, def, records, __opts).then(function () {\n records.forEach(function (record) {\n const relatedData = def.getLocalField(record)\n if (isArray(relatedData) && relatedData.length) {\n def.setLocalField(record, relatedData[0])\n }\n })\n })\n },\n\n /**\n * Return the foreignKey from the given record for the provided relationship.\n *\n * @name RethinkDBAdapter#makeBelongsToForeignKey\n * @method\n * @return {*}\n */\n makeBelongsToForeignKey (mapper, def, record) {\n return def.getForeignKey(record)\n },\n\n /**\n * Load a belongsTo relationship.\n *\n * @name RethinkDBAdapter#loadBelongsTo\n * @method\n * @return {Promise}\n */\n loadBelongsTo (mapper, def, records, __opts) {\n const self = this\n const relationDef = def.getRelation()\n\n if (isObject(records) && !isArray(records)) {\n const record = records\n return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) {\n def.setLocalField(record, relatedItem)\n })\n } else {\n const keys = records.map(function (record) {\n return self.makeBelongsToForeignKey(mapper, def, record)\n }).filter(function (key) {\n return key\n })\n return self.findAll(relationDef, {\n where: {\n [relationDef.idAttribute]: {\n 'in': keys\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (record) {\n relatedItems.forEach(function (relatedItem) {\n if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) {\n def.setLocalField(record, relatedItem)\n }\n })\n })\n })\n }\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n let result = {\n data: record,\n found: record ? 1 : 0\n }\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n records || (records = [])\n let result = {\n data: records,\n found: records.length\n }\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Resolve the value of the specified option based on the given options and\n * this adapter's settings.\n *\n * @name RethinkDBAdapter#getOpt\n * @method\n * @param {string} opt The name of the option.\n * @param {Object} [opts] Configuration options.\n * @return {*} The value of the specified option.\n */\n getOpt (opt, opts) {\n opts || (opts = {})\n return isUndefined(opts[opt]) ? plainCopy(this[opt]) : plainCopy(opts[opt])\n },\n\n /**\n * Logging utility method.\n *\n * @name RethinkDBAdapter#log\n * @method\n */\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (RethinkDBAdapter)`\n if (console[level]) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n let result = {}\n fillIn(result, cursor)\n result.data = record\n result.updated = 1\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = {}\n fillIn(result, cursor)\n result.data = records\n result.updated = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return resolve(self[op](mapper, props, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n _records = _records.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = {}\n fillIn(result, cursor)\n result.data = updatedRecords || []\n result.updated = result.data.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n"],"names":["utils"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved,\n Response\n} from 'js-data-adapter'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\nimport unique from 'mout/array/unique'\n\nconst {\n addHiddenPropsToTarget,\n classCallCheck,\n extend,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n omit,\n plainCopy,\n resolve\n} = utils\n\nconst withoutRelations = function (mapper, props) {\n return omit(props, mapper.relationFields || [])\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * Whether to log debugging information.\n *\n * @name RethinkDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015,\n\n /**\n * Whether to return a more detailed response object.\n *\n * @name RethinkDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n classCallCheck(self, RethinkDBAdapter)\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n Adapter.call(this, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n// Setup prototype inheritance from Adapter\nRethinkDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: RethinkDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(RethinkDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the RethinkDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the RethinkDBAdapter itself.\n * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = extend\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n let response = new Response(record, cursor, 'create')\n response.created = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n _props = props.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n let result = new Response(records, cursor, 'createMany')\n result.created = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return resolve(self[op](mapper, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = new Response(undefined, cursor, 'destroy')\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = new Response(undefined, cursor, 'destroyAll')\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n let result = new Response(record, {}, 'find')\n result.found = record ? 1 : 0\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n records || (records = [])\n let result = new Response(records, {}, 'findAll')\n result.found = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n let result = new Response(record, cursor, 'update')\n result.updated = 1\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = new Response(records, cursor, 'update')\n result.updated = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return resolve(self[op](mapper, props, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n _records = _records.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = new Response(updatedRecords || [], cursor, 'update')\n result.updated = result.data.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n"],"names":["utils","Adapter","reserved","Response"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index e54a648..7081612 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-rethinkdb", "description": "RethinkDB adapter for js-data.", - "version": "3.0.0-alpha.7", + "version": "3.0.0-alpha.8", "homepage": "https://github.com/js-data/js-data-rethinkdb", "repository": { "type": "git", @@ -33,26 +33,28 @@ ] }, "scripts": { - "doc": "jsdoc -c conf.json src && node scripts/cleanup.js", + "lint": "repo-tools lint src/index.js mocha.start.js test/**/*.js scripts/**.js", "bundle": "rollup -c rollup.config.js -f cjs -o dist/js-data-rethinkdb.js -m dist/js-data-rethinkdb.js.map src/index.js", - "lint": "standard src/index.js mocha.start.js test/**/*.js scripts/**.js", + "doc": "jsdoc -c conf.json src node_modules/js-data-adapter/src && node scripts/cleanup.js", + "watch": "watch \"npm run bundle\" src/", "build": "npm run lint && npm run bundle", "mocha": "mocha -t 30000 -R dot -r source-map-support/register mocha.start.js", "cover": "istanbul cover --hook-run-in-context node_modules/mocha/bin/_mocha -- -t 30000 -R dot -r source-map-support/register mocha.start.js", "test": "npm run build && npm run cover", - "release": "npm test && npm run doc && node scripts/authors.js", + "repo-tools": "repo-tools updates && repo-tools changelog && repo-tools authors", + "release": "npm test && npm run doc && npm run repo-tools", "ci": "npm run test && cat coverage/lcov.info | coveralls || true && cat ./coverage/lcov.info | codacy-coverage || true" }, "dependencies": { - "mout": "0.11.1" + "js-data-adapter": "0.1.0", + "mout": "0.12.0" }, "peerDependencies": { - "js-data": "^3.0.0-alpha.15", + "js-data": "^3.0.0-alpha.16", "rethinkdbdash": ">=1.15.0" }, "devDependencies": { - "babel-core": "6.6.4", - "babel-eslint": "5.0.0", + "babel-core": "6.6.5", "babel-polyfill": "6.6.1", "babel-preset-es2015-rollup": "1.1.1", "chai": "3.5.0", @@ -61,12 +63,13 @@ "ink-docstrap": "1.1.4", "istanbul": "0.4.2", "js-data-adapter-tests": "^2.0.0-alpha.13", + "js-data-repo-tools": "0.2.0", "jsdoc": "3.4.0", "mocha": "2.4.5", "rollup": "0.25.4", "rollup-plugin-babel": "2.4.0", "sinon": "1.17.3", "source-map-support": "0.4.0", - "standard": "6.0.7" + "watch": "0.17.1" } } diff --git a/scripts/AUTHORS b/scripts/AUTHORS deleted file mode 100644 index 475aaa7..0000000 --- a/scripts/AUTHORS +++ /dev/null @@ -1,7 +0,0 @@ -# This is the official list of js-data-rethinkdb project authors. -# -# This file is controlled by scripts/authors.js -# -# Names are formatted as: -# # commits Name or Organization -# The email address is not required for organizations. diff --git a/src/index.js b/src/index.js index 6ee7845..6e80313 100644 --- a/src/index.js +++ b/src/index.js @@ -1,10 +1,16 @@ import {utils} from 'js-data' +import Adapter from 'js-data-adapter' +import { + reserved, + Response +} from 'js-data-adapter' import rethinkdbdash from 'rethinkdbdash' import underscore from 'mout/string/underscore' import unique from 'mout/array/unique' const { addHiddenPropsToTarget, + classCallCheck, extend, fillIn, forEachRelation, @@ -14,44 +20,13 @@ const { isObject, isString, isUndefined, + omit, plainCopy, resolve } = utils -const reserved = [ - 'orderBy', - 'sort', - 'limit', - 'offset', - 'skip', - 'where' -] - -const noop = function (...args) { - const self = this - const opts = args[args.length - 1] - self.dbg(opts.op, ...args) - return resolve() -} - -const noop2 = function (...args) { - const self = this - const opts = args[args.length - 2] - self.dbg(opts.op, ...args) - return resolve() -} - const withoutRelations = function (mapper, props) { - const relationFields = mapper.relationFields || [] - - // Remove relations - const _props = {} - forOwn(props, function (value, key) { - if (relationFields.indexOf(key) === -1) { - _props[key] = value - } - }) - return _props + return omit(props, mapper.relationFields || []) } const DEFAULTS = { @@ -230,6 +205,7 @@ const OPERATORS = { * store.defineMapper('user') * * @class RethinkDBAdapter + * @extends Adapter * @param {Object} [opts] Configuration opts. * @param {string} [opts.authKey=""] RethinkDB authorization key. * @param {number} [opts.bufferSize=10] Buffer size for connection pool. @@ -245,9 +221,10 @@ const OPERATORS = { */ export default function RethinkDBAdapter (opts) { const self = this + classCallCheck(self, RethinkDBAdapter) opts || (opts = {}) fillIn(opts, DEFAULTS) - fillIn(self, opts) + Adapter.call(this, opts) /** * Default options to pass to r#insert. @@ -311,16 +288,31 @@ export default function RethinkDBAdapter (opts) { self.indices = {} } +// Setup prototype inheritance from Adapter +RethinkDBAdapter.prototype = Object.create(Adapter.prototype, { + constructor: { + value: RethinkDBAdapter, + enumerable: false, + writable: true, + configurable: true + } +}) + +Object.defineProperty(RethinkDBAdapter, '__super__', { + configurable: true, + value: Adapter +}) + /** * Alternative to ES6 class syntax for extending `RethinkDBAdapter`. * * @name RethinkDBAdapter.extend * @method * @param {Object} [instanceProps] Properties that will be added to the - * prototype of the subclass. + * prototype of the RethinkDBAdapter. * @param {Object} [classProps] Properties that will be added as static - * properties to the subclass itself. - * @return {Object} Subclass of `RethinkDBAdapter`. + * properties to the RethinkDBAdapter itself. + * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`. */ RethinkDBAdapter.extend = extend @@ -333,121 +325,6 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { throw new Error('Unknown RethinkDB Error') } }, - /** - * @name RethinkDBAdapter#afterCreate - * @method - */ - afterCreate: noop2, - - /** - * @name RethinkDBAdapter#afterCreateMany - * @method - */ - afterCreateMany: noop2, - - /** - * @name RethinkDBAdapter#afterDestroy - * @method - */ - afterDestroy: noop2, - - /** - * @name RethinkDBAdapter#afterDestroyAll - * @method - */ - afterDestroyAll: noop2, - - /** - * @name RethinkDBAdapter#afterFind - * @method - */ - afterFind: noop2, - - /** - * @name RethinkDBAdapter#afterFindAll - * @method - */ - afterFindAll: noop2, - - /** - * @name RethinkDBAdapter#afterUpdate - * @method - */ - afterUpdate: noop2, - - /** - * @name RethinkDBAdapter#afterUpdateAll - * @method - */ - afterUpdateAll: noop2, - - /** - * @name RethinkDBAdapter#afterUpdateMany - * @method - */ - afterUpdateMany: noop2, - - /** - * @name RethinkDBAdapter#beforeCreate - * @method - */ - beforeCreate: noop, - - /** - * @name RethinkDBAdapter#beforeCreateMany - * @method - */ - beforeCreateMany: noop, - - /** - * @name RethinkDBAdapter#beforeDestroy - * @method - */ - beforeDestroy: noop, - - /** - * @name RethinkDBAdapter#beforeDestroyAll - * @method - */ - beforeDestroyAll: noop, - - /** - * @name RethinkDBAdapter#beforeFind - * @method - */ - beforeFind: noop, - - /** - * @name RethinkDBAdapter#beforeFindAll - * @method - */ - beforeFindAll: noop, - - /** - * @name RethinkDBAdapter#beforeUpdate - * @method - */ - beforeUpdate: noop, - - /** - * @name RethinkDBAdapter#beforeUpdateAll - * @method - */ - beforeUpdateAll: noop, - - /** - * @name RethinkDBAdapter#beforeUpdateMany - * @method - */ - beforeUpdateMany: noop, - - /** - * @name RethinkDBAdapter#dbg - * @method - */ - dbg (...args) { - this.log('debug', ...args) - }, selectDb (opts) { return this.r.db(isUndefined(opts.db) ? this.db : opts.db) @@ -612,17 +489,15 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { record = cursor.changes[0].new_val } - let result = {} - fillIn(result, cursor) - result.data = record - result.created = record ? 1 : 0 - result = self.getOpt('raw', opts) ? result : result.data + let response = new Response(record, cursor, 'create') + response.created = record ? 1 : 0 + response = self.respond(response, opts) // afterCreate lifecycle hook op = opts.op = 'afterCreate' - return resolve(self[op](mapper, props, opts, result)).then(function (_result) { + return resolve(self[op](mapper, props, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result + return isUndefined(_response) ? response : _response }) }) }, @@ -668,9 +543,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return change.new_val }) } - let result = {} - fillIn(result, cursor) - result.data = records + let result = new Response(records, cursor, 'createMany') result.created = records.length result = self.getOpt('raw', opts) ? result : result.data @@ -711,8 +584,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { self.dbg(op, id, opts) return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)) }).then(function (cursor) { - let result = {} - fillIn(result, cursor) + let result = new Response(undefined, cursor, 'destroy') result = self.getOpt('raw', opts) ? result : undefined // afterDestroy lifecycle hook @@ -764,8 +636,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { .delete(self.getOpt('deleteOpts', opts)) .run(self.getOpt('runOpts', opts)) }).then(function (cursor) { - let result = {} - fillIn(result, cursor) + let result = new Response(undefined, cursor, 'destroyAll') result = self.getOpt('raw', opts) ? result : undefined // afterDestroyAll lifecycle hook @@ -777,138 +648,6 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }) }, - /** - * Return the foreignKey from the given record for the provided relationship. - * - * There may be reasons why you may want to override this method, like when - * the id of the parent doesn't exactly match up to the key on the child. - * - * @name RethinkDBAdapter#makeHasManyForeignKey - * @method - * @return {*} - */ - makeHasManyForeignKey (mapper, def, record) { - return def.getForeignKey(record) - }, - - /** - * Load a hasMany relationship. - * - * @name RethinkDBAdapter#loadHasMany - * @method - * @return {Promise} - */ - loadHasMany (mapper, def, records, __opts) { - const self = this - let singular = false - - if (isObject(records) && !isArray(records)) { - singular = true - records = [records] - } - const IDs = records.map(function (record) { - return self.makeHasManyForeignKey(mapper, def, record) - }) - const query = {} - const criteria = query[def.foreignKey] = {} - if (singular) { - // more efficient query when we only have one record - criteria['=='] = IDs[0] - } else { - criteria['in'] = IDs.filter(function (id) { - return id - }) - } - return self.findAll(def.getRelation(), query, __opts).then(function (relatedItems) { - records.forEach(function (record) { - let attached = [] - // avoid unneccesary iteration when we only have one record - if (singular) { - attached = relatedItems - } else { - relatedItems.forEach(function (relatedItem) { - if (get(relatedItem, def.foreignKey) === record[mapper.idAttribute]) { - attached.push(relatedItem) - } - }) - } - def.setLocalField(record, attached) - }) - }) - }, - - /** - * Load a hasOne relationship. - * - * @name RethinkDBAdapter#loadHasOne - * @method - * @return {Promise} - */ - loadHasOne (mapper, def, records, __opts) { - if (isObject(records) && !isArray(records)) { - records = [records] - } - return this.loadHasMany(mapper, def, records, __opts).then(function () { - records.forEach(function (record) { - const relatedData = def.getLocalField(record) - if (isArray(relatedData) && relatedData.length) { - def.setLocalField(record, relatedData[0]) - } - }) - }) - }, - - /** - * Return the foreignKey from the given record for the provided relationship. - * - * @name RethinkDBAdapter#makeBelongsToForeignKey - * @method - * @return {*} - */ - makeBelongsToForeignKey (mapper, def, record) { - return def.getForeignKey(record) - }, - - /** - * Load a belongsTo relationship. - * - * @name RethinkDBAdapter#loadBelongsTo - * @method - * @return {Promise} - */ - loadBelongsTo (mapper, def, records, __opts) { - const self = this - const relationDef = def.getRelation() - - if (isObject(records) && !isArray(records)) { - const record = records - return self.find(relationDef, self.makeBelongsToForeignKey(mapper, def, record), __opts).then(function (relatedItem) { - def.setLocalField(record, relatedItem) - }) - } else { - const keys = records.map(function (record) { - return self.makeBelongsToForeignKey(mapper, def, record) - }).filter(function (key) { - return key - }) - return self.findAll(relationDef, { - where: { - [relationDef.idAttribute]: { - 'in': keys - } - } - }, __opts).then(function (relatedItems) { - records.forEach(function (record) { - relatedItems.forEach(function (relatedItem) { - if (relatedItem[relationDef.idAttribute] === record[def.foreignKey]) { - def.setLocalField(record, relatedItem) - } - }) - }) - }) - } - }, - /** * Retrieve the record with the given primary key. * @@ -1005,10 +744,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return Promise.all(tasks) }).then(function () { - let result = { - data: record, - found: record ? 1 : 0 - } + let result = new Response(record, {}, 'find') + result.found = record ? 1 : 0 result = self.getOpt('raw', opts) ? result : result.data // afterFind lifecycle hook @@ -1147,10 +884,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return Promise.all(tasks) }).then(function () { records || (records = []) - let result = { - data: records, - found: records.length - } + let result = new Response(records, {}, 'findAll') + result.found = records.length result = self.getOpt('raw', opts) ? result : result.data // afterFindAll lifecycle hook @@ -1181,43 +916,6 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator] }, - /** - * Resolve the value of the specified option based on the given options and - * this adapter's settings. - * - * @name RethinkDBAdapter#getOpt - * @method - * @param {string} opt The name of the option. - * @param {Object} [opts] Configuration options. - * @return {*} The value of the specified option. - */ - getOpt (opt, opts) { - opts || (opts = {}) - return isUndefined(opts[opt]) ? plainCopy(this[opt]) : plainCopy(opts[opt]) - }, - - /** - * Logging utility method. - * - * @name RethinkDBAdapter#log - * @method - */ - log (level, ...args) { - if (level && !args.length) { - args.push(level) - level = 'debug' - } - if (level === 'debug' && !this.debug) { - return - } - const prefix = `${level.toUpperCase()}: (RethinkDBAdapter)` - if (console[level]) { - console[level](prefix, ...args) - } else { - console.log(prefix, ...args) - } - }, - /** * Apply the given update to the record with the specified primary key. * @@ -1257,9 +955,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } else { throw new Error('Not Found') } - let result = {} - fillIn(result, cursor) - result.data = record + let result = new Response(record, cursor, 'update') result.updated = 1 result = self.getOpt('raw', opts) ? result : result.data @@ -1318,9 +1014,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { if (cursor && cursor.changes && cursor.changes.length) { records = cursor.changes.map(function (change) { return change.new_val }) } - let result = {} - fillIn(result, cursor) - result.data = records + let result = new Response(records, cursor, 'update') result.updated = records.length result = self.getOpt('raw', opts) ? result : result.data @@ -1378,9 +1072,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { if (cursor && cursor.changes && cursor.changes.length) { updatedRecords = cursor.changes.map(function (change) { return change.new_val }) } - let result = {} - fillIn(result, cursor) - result.data = updatedRecords || [] + let result = new Response(updatedRecords || [], cursor, 'update') result.updated = result.data.length result = self.getOpt('raw', opts) ? result : result.data diff --git a/test/handleErrors.test.js b/test/handleErrors.test.js index ed6deb2..d5b2960 100644 --- a/test/handleErrors.test.js +++ b/test/handleErrors.test.js @@ -1,3 +1,4 @@ +'use strict' describe('RethinkDBAdapter#handleErrors(err)', function () { it('should do nothing when passed a falsy value', function () { var Test = this From 6f949fb066676899217fbb27221516cd1813e00f Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 5 Mar 2016 20:28:52 -0800 Subject: [PATCH 18/27] 3.0.0-alpha.9 --- CHANGELOG.md | 5 +++++ dist/js-data-rethinkdb.js | 22 ++-------------------- dist/js-data-rethinkdb.js.map | 2 +- package.json | 4 ++-- src/index.js | 22 ++-------------------- 5 files changed, 12 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce8103e..219dfa1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +##### 3.0.0-alpha.9 - 06 March 2016 + +###### Other +- Upgraded js-data-adapter + ##### 3.0.0-alpha.8 - 06 March 2016 ###### Other diff --git a/dist/js-data-rethinkdb.js b/dist/js-data-rethinkdb.js index 817ab97..2f7cee4 100644 --- a/dist/js-data-rethinkdb.js +++ b/dist/js-data-rethinkdb.js @@ -75,15 +75,6 @@ var DEFAULTS = { */ db: 'test', - /** - * Whether to log debugging information. - * - * @name RethinkDBAdapter#debug - * @type {boolean} - * @default false - */ - debug: false, - /** * RethinkDB host. * @@ -118,16 +109,7 @@ var DEFAULTS = { * @type {number} * @default 10 */ - port: 28015, - - /** - * Whether to return a more detailed response object. - * - * @name RethinkDBAdapter#raw - * @type {boolean} - * @default false - */ - raw: false + port: 28015 }; var INSERT_OPTS_DEFAULTS = {}; @@ -243,7 +225,7 @@ function RethinkDBAdapter(opts) { classCallCheck(self, RethinkDBAdapter); opts || (opts = {}); fillIn(opts, DEFAULTS); - Adapter__default.call(this, opts); + Adapter__default.call(self, opts); /** * Default options to pass to r#insert. diff --git a/dist/js-data-rethinkdb.js.map b/dist/js-data-rethinkdb.js.map index dcc68da..04bfecf 100644 --- a/dist/js-data-rethinkdb.js.map +++ b/dist/js-data-rethinkdb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved,\n Response\n} from 'js-data-adapter'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\nimport unique from 'mout/array/unique'\n\nconst {\n addHiddenPropsToTarget,\n classCallCheck,\n extend,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n omit,\n plainCopy,\n resolve\n} = utils\n\nconst withoutRelations = function (mapper, props) {\n return omit(props, mapper.relationFields || [])\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * Whether to log debugging information.\n *\n * @name RethinkDBAdapter#debug\n * @type {boolean}\n * @default false\n */\n debug: false,\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015,\n\n /**\n * Whether to return a more detailed response object.\n *\n * @name RethinkDBAdapter#raw\n * @type {boolean}\n * @default false\n */\n raw: false\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n classCallCheck(self, RethinkDBAdapter)\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n Adapter.call(this, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n// Setup prototype inheritance from Adapter\nRethinkDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: RethinkDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(RethinkDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the RethinkDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the RethinkDBAdapter itself.\n * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = extend\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n let response = new Response(record, cursor, 'create')\n response.created = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n _props = props.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n let result = new Response(records, cursor, 'createMany')\n result.created = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return resolve(self[op](mapper, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = new Response(undefined, cursor, 'destroy')\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = new Response(undefined, cursor, 'destroyAll')\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n let result = new Response(record, {}, 'find')\n result.found = record ? 1 : 0\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n records || (records = [])\n let result = new Response(records, {}, 'findAll')\n result.found = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n let result = new Response(record, cursor, 'update')\n result.updated = 1\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = new Response(records, cursor, 'update')\n result.updated = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return resolve(self[op](mapper, props, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n _records = _records.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = new Response(updatedRecords || [], cursor, 'update')\n result.updated = result.data.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n"],"names":["utils","Adapter","reserved","Response"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved,\n Response\n} from 'js-data-adapter'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\nimport unique from 'mout/array/unique'\n\nconst {\n addHiddenPropsToTarget,\n classCallCheck,\n extend,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n omit,\n plainCopy,\n resolve\n} = utils\n\nconst withoutRelations = function (mapper, props) {\n return omit(props, mapper.relationFields || [])\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n classCallCheck(self, RethinkDBAdapter)\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n// Setup prototype inheritance from Adapter\nRethinkDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: RethinkDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(RethinkDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the RethinkDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the RethinkDBAdapter itself.\n * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = extend\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n let response = new Response(record, cursor, 'create')\n response.created = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n _props = props.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n let result = new Response(records, cursor, 'createMany')\n result.created = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return resolve(self[op](mapper, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = new Response(undefined, cursor, 'destroy')\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = new Response(undefined, cursor, 'destroyAll')\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n let result = new Response(record, {}, 'find')\n result.found = record ? 1 : 0\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n records || (records = [])\n let result = new Response(records, {}, 'findAll')\n result.found = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n let result = new Response(record, cursor, 'update')\n result.updated = 1\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = new Response(records, cursor, 'update')\n result.updated = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return resolve(self[op](mapper, props, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n _records = _records.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = new Response(updatedRecords || [], cursor, 'update')\n result.updated = result.data.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n"],"names":["utils","Adapter","reserved","Response"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAWE,yBAcEA,aAdF;IACA,iBAaEA,aAbF;IACA,SAYEA,aAZF;IACA,SAWEA,aAXF;IACA,kBAUEA,aAVF;IACA,SASEA,aATF;IACA,MAQEA,aARF;IACA,UAOEA,aAPF;IACA,WAMEA,aANF;IACA,WAKEA,aALF;IACA,cAIEA,aAJF;IACA,OAGEA,aAHF;IACA,YAEEA,aAFF;IACA,UACEA,aADF;;;AAGF,IAAM,mBAAmB,SAAnB,gBAAmB,CAAU,MAAV,EAAkB,KAAlB,EAAyB;SACzC,KAAK,KAAL,EAAY,OAAO,cAAP,IAAyB,EAAzB,CAAnB,CADgD;CAAzB;;AAIzB,IAAM,WAAW;;;;;;;WAON,EAAT;;;;;;;;;cASY,EAAZ;;;;;;;;;MASI,MAAJ;;;;;;;;;QASM,WAAN;;;;;;;;;OASK,EAAL;;;;;;;;;OASK,EAAL;;;;;;;;;QASM,KAAN;CA7DI;;AAgEN,IAAM,uBAAuB,EAAvB;AACN,IAAM,uBAAuB,EAAvB;AACN,IAAM,uBAAuB,EAAvB;AACN,IAAM,oBAAoB,EAApB;;AAEN,IAAM,QAAQ,SAAR,KAAQ,CAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;SACrC,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CAD4C;CAAhC;;AAId,IAAM,WAAW,SAAX,QAAW,CAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;SACxC,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CAD+C;CAAhC;;;;;;;;;;;;;;;;;;;;;;;;;AA2BjB,IAAM,YAAY;QACV,KAAN;SACO,KAAP;QACM,QAAN;SACO,QAAP;OACK,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC5B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADmC;GAAhC;QAGC,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC7B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADoC;GAAhC;OAGD,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC5B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADmC;GAAhC;QAGC,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC7B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADoC;GAAhC;gBAGQ,oBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACrC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,eAAvB,CAAuC,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAtB,CAAvC,EAAkE,KAAlE,GAA0E,EAA1E,CAA6E,CAA7E,CAAP,CAD4C;GAAhC;mBAGG,uBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACxC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,eAAvB,CAAuC,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAtB,CAAvC,EAAkE,KAAlE,GAA0E,EAA1E,CAA6E,CAA7E,CAAP,CAD+C;GAAhC;QAGX,aAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC7B,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAE,IAAF,CAAO,EAAP,CAAtB,EAAkC,QAAlC,CAA2C,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,CAA3C,CAAP,CADoC;GAAhC;WAGG,eAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAChC,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAE,IAAF,CAAO,EAAP,CAAtB,EAAkC,QAAlC,CAA2C,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,CAA3C,EAAqE,GAArE,EAAP,CADuC;GAAhC;cAGG,kBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACnC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,QAAvB,CAAgC,KAAhC,CAAP,CAD0C;GAAhC;iBAGG,qBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACtC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,QAAvB,CAAgC,KAAhC,EAAuC,GAAvC,EAAP,CAD6C;GAAhC;CAhCX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwEN,AAAe,SAAS,gBAAT,CAA2B,IAA3B,EAAiC;MACxC,OAAO,IAAP,CADwC;iBAE/B,IAAf,EAAqB,gBAArB,EAF8C;WAGrC,OAAO,EAAP,CAAT,CAH8C;SAIvC,IAAP,EAAa,QAAb,EAJ8C;mBAKtC,IAAR,CAAa,IAAb,EAAmB,IAAnB;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAd8C;SAevC,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAxB8C;SAyBvC,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAlC8C;SAmCvC,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,OAAL,KAAiB,KAAK,OAAL,GAAe,EAAf,CAAjB,CA5C8C;SA6CvC,KAAK,OAAL,EAAc,iBAArB;;;;;;;;;MASA,CAAK,SAAL,KAAmB,KAAK,SAAL,GAAiB,EAAjB,CAAnB;;;;;;;;;MASA,CAAK,CAAL,GAAS,cAAc,IAAd,CAAT,CA/D8C;OAgEzC,SAAL,GAAiB,EAAjB,CAhE8C;OAiEzC,MAAL,GAAc,EAAd,CAjE8C;OAkEzC,OAAL,GAAe,EAAf,CAlE8C;CAAjC;;;AAsEf,iBAAiB,SAAjB,GAA6B,OAAO,MAAP,CAAcC,iBAAQ,SAAR,EAAmB;eAC/C;WACJ,gBAAP;gBACY,KAAZ;cACU,IAAV;kBACc,IAAd;GAJF;CAD2B,CAA7B;;AASA,OAAO,cAAP,CAAsB,gBAAtB,EAAwC,WAAxC,EAAqD;gBACrC,IAAd;SACOA,gBAAP;CAFF;;;;;;;;;;;;;AAgBA,iBAAiB,MAAjB,GAA0B,MAA1B;;AAEA,uBAAuB,iBAAiB,SAAjB,EAA4B;wCAClC,QAAQ;QACjB,UAAU,OAAO,MAAP,GAAgB,CAAhB,EAAmB;UAC3B,OAAO,WAAP,EAAoB;cAChB,IAAI,KAAJ,CAAU,OAAO,WAAP,CAAhB,CADsB;OAAxB;YAGM,IAAI,KAAJ,CAAU,yBAAV,CAAN,CAJ+B;KAAjC;GAF+C;8BAUvC,MAAM;WACP,KAAK,CAAL,CAAO,EAAP,CAAU,YAAY,KAAK,EAAL,CAAZ,GAAuB,KAAK,EAAL,GAAU,KAAK,EAAL,CAAlD,CADc;GAViC;oCAcpC,QAAQ,MAAM;WAClB,KAAK,QAAL,CAAc,IAAd,EAAoB,KAApB,CAA0B,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAAjC,CADyB;GAdsB;;;;;;;;;;;;;;;;;;;;0CAmCjC,UAAU,OAAO,MAAM;QAC/B,OAAO,IAAP,CAD+B;QAE/B,IAAI,KAAK,CAAL,CAF2B;;YAI7B,UAAU,SAAS,EAAT,CAAlB,CAJqC;aAK5B,OAAO,EAAP,CAAT,CALqC;SAMhC,SAAL,KAAmB,KAAK,SAAL,GAAiB,EAAjB,CAAnB,CANqC;UAO/B,KAAN,KAAgB,MAAM,KAAN,GAAc,EAAd,CAAhB,CAPqC;UAQ/B,OAAN,KAAkB,MAAM,OAAN,GAAgB,MAAM,IAAN,CAAlC,CARqC;UAS/B,OAAN,KAAkB,MAAM,OAAN,GAAgB,EAAhB,CAAlB,CATqC;UAU/B,IAAN,KAAe,MAAM,IAAN,GAAa,MAAM,MAAN,CAA5B;;;UAGA,CAAO,KAAP,EAAc,UAAU,MAAV,EAAkB,OAAlB,EAA2B;UACnCC,iBAAS,OAAT,CAAiB,OAAjB,MAA8B,CAAC,CAAD,EAAI;YAChC,SAAS,MAAT,CAAJ,EAAsB;gBACd,KAAN,CAAY,OAAZ,IAAuB,MAAvB,CADoB;SAAtB,MAEO;gBACC,KAAN,CAAY,OAAZ,IAAuB;kBACf,MAAN;WADF,CADK;SAFP;eAOO,MAAM,OAAN,CAAP,CARoC;OAAtC;KADY,CAAd,CAbqC;;QA0BjC,MAAM,QAAN;;;QAGA,OAAO,IAAP,CAAY,MAAM,KAAN,CAAZ,CAAyB,MAAzB,KAAoC,CAApC,EAAuC;;YAEnC,IAAI,MAAJ,CAAW,UAAU,GAAV,EAAe;YAC1B,iBAAJ;;cAEA,CAAO,MAAM,KAAN,EAAa,UAAU,QAAV,EAAoB,KAApB,EAA2B;cACzC,CAAC,SAAS,QAAT,CAAD,EAAqB;uBACZ,EAAE,MAAM,QAAN,EAAb,CADuB;WAAzB;;gBAIA,CAAO,QAAP,EAAiB,UAAU,KAAV,EAAiB,QAAjB,EAA2B;gBACtC,OAAO,KAAP,CADsC;gBAEtC,YAAY,SAAS,CAAT,MAAgB,GAAhB,EAAqB;yBACxB,SAAS,MAAT,CAAgB,CAAhB,CAAX,CADmC;qBAE5B,IAAP,CAFmC;aAArC;gBAII,cAAc,KAAK,WAAL,CAAiB,QAAjB,EAA2B,IAA3B,CAAd,CANsC;gBAOtC,WAAJ,EAAiB;kBACT,kBAAkB,YAAY,CAAZ,EAAe,GAAf,EAAoB,KAApB,EAA2B,KAA3B,CAAlB,CADS;kBAEX,IAAJ,EAAU;2BACG,WAAW,SAAS,EAAT,CAAY,eAAZ,CAAX,GAA0C,eAA1C,CADH;eAAV,MAEO;2BACM,WAAW,SAAS,GAAT,CAAa,eAAb,CAAX,GAA2C,eAA3C,CADN;eAFP;aAFF;WAPe,CAAjB,CAL6C;SAA3B,CAApB,CAH8B;eAyBvB,YAAY,IAAZ,CAzBuB;OAAf,CAAjB,CAFyC;KAA3C;;;QAgCI,MAAM,OAAN,EAAe;UACb,SAAS,MAAM,OAAN,CAAb,EAA6B;cACrB,OAAN,GAAgB,CACd,CAAC,MAAM,OAAN,EAAe,KAAhB,CADc,CAAhB,CAD2B;OAA7B;WAKK,IAAI,IAAI,CAAJ,EAAO,IAAI,MAAM,OAAN,CAAc,MAAd,EAAsB,GAA1C,EAA+C;YACzC,SAAS,MAAM,OAAN,CAAc,CAAd,CAAT,CAAJ,EAAgC;gBACxB,OAAN,CAAc,CAAd,IAAmB,CAAC,MAAM,OAAN,CAAc,CAAd,CAAD,EAAmB,KAAnB,CAAnB,CAD8B;SAAhC;cAGM,CAAC,MAAM,OAAN,CAAc,CAAd,EAAiB,CAAjB,KAAuB,EAAvB,CAAD,CAA4B,WAA5B,OAA8C,MAA9C,GAAuD,IAAI,OAAJ,CAAY,EAAE,IAAF,CAAO,MAAM,OAAN,CAAc,CAAd,EAAiB,CAAjB,CAAP,CAAZ,CAAvD,GAAkG,IAAI,OAAJ,CAAY,MAAM,OAAN,CAAc,CAAd,EAAiB,CAAjB,CAAZ,CAAlG,CAJuC;OAA/C;KANF;;;QAeI,MAAM,IAAN,EAAY;YACR,IAAI,IAAJ,CAAS,CAAC,MAAM,IAAN,CAAhB,CADc;KAAhB;;;QAKI,MAAM,KAAN,EAAa;YACT,IAAI,KAAJ,CAAU,CAAC,MAAM,KAAN,CAAjB,CADe;KAAjB;;WAIO,GAAP,CArFqC;GAnCU;gCA2HtC,MAAM;QACT,OAAO,IAAP,CADS;aAEN,OAAO,EAAP,CAAT,CAFe;QAGT,KAAK,YAAY,KAAK,EAAL,CAAZ,GAAuB,KAAK,EAAL,GAAU,KAAK,EAAL,CAH7B;QAIX,CAAC,KAAK,SAAL,CAAe,EAAf,CAAD,EAAqB;WAClB,SAAL,CAAe,EAAf,IAAqB,KAAK,CAAL,CAAO,MAAP,CACnB,KAAK,CAAL,CAAO,MAAP,GAAgB,QAAhB,CAAyB,EAAzB,CADmB,EAEnB,IAFmB,EAGnB,KAAK,CAAL,CAAO,QAAP,CAAgB,EAAhB,CAHmB,EAInB,GAJmB,EAArB,CADuB;KAAzB;WAOO,KAAK,SAAL,CAAe,EAAf,CAAP,CAXe;GA3HgC;;;;;;;;;;;;;;;;;0BAuJzC,QAAQ,OAAO,MAAM;QACrB,OAAO,IAAP,CADqB;QAEvB,WAAJ,CAF2B;cAGjB,QAAQ,EAAR,CAAV,CAH2B;aAIlB,OAAO,EAAP,CAAT,CAJ2B;;WAMpB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,cAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,UAAU,MAAV,EAAkB;;cAEhB,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAFgB;UAGlB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAHkB;iBAIb,aAAX,GAA2B,IAA3B,CAJwB;aAKjB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,MAA/B,CAAsC,KAAtC,EAA6C,UAA7C,EAAyD,GAAzD,CAA6D,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAA7D,CAAP,CALwB;KAAlB,CAJD,CAUJ,IAVI,CAUC,UAAU,MAAV,EAAkB;WACnB,aAAL,CAAmB,MAAnB,EADwB;UAEpB,eAAJ,CAFwB;UAGpB,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,IAAyB,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,EAA2B;iBACzE,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,CADyE;OAApF;UAGI,WAAW,IAAIC,gBAAJ,CAAa,MAAb,EAAqB,MAArB,EAA6B,QAA7B,CAAX,CANoB;eAOf,OAAT,GAAmB,SAAS,CAAT,GAAa,CAAb,CAPK;iBAQb,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,aAAV,CAXmB;aAYjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,QAA9B,CAAR,EAAiD,IAAjD,CAAsD,UAAU,SAAV,EAAqB;;eAEzE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFyE;OAArB,CAA7D,CAZwB;KAAlB,CAVR,CAN2B;GAvJoB;;;;;;;;;;;;;;;;;kCAwMrC,QAAQ,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;QAE3B,WAAJ,CAF+B;cAGrB,QAAQ,EAAR,CAAV,CAH+B;aAItB,OAAO,EAAP,CAAT,CAJ+B;;WAMxB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,kBAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,UAAU,MAAV,EAAkB;;cAEhB,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAFgB;UAGlB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAHkB;iBAIb,aAAX,GAA2B,IAA3B,CAJwB;eAKf,MAAM,GAAN,CAAU,UAAU,MAAV,EAAkB;eAC5B,iBAAiB,MAAjB,EAAyB,MAAzB,CAAP,CADmC;OAAlB,CAAnB,CALwB;aAQjB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,MAA/B,CAAsC,MAAtC,EAA8C,UAA9C,EAA0D,GAA1D,CAA8D,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAA9D,CAAP,CARwB;KAAlB,CAJD,CAaJ,IAbI,CAaC,UAAU,MAAV,EAAkB;WACnB,aAAL,CAAmB,MAAnB,EADwB;UAEpB,UAAU,EAAV,CAFoB;UAGpB,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,IAAyB,OAAO,OAAP,EAAgB;kBAC7D,OAAO,OAAP,CAAe,GAAf,CAAmB,UAAU,MAAV,EAAkB;iBACtC,OAAO,OAAP,CADsC;SAAlB,CAA7B,CADuE;OAAzE;UAKI,SAAS,IAAIA,gBAAJ,CAAa,OAAb,EAAsB,MAAtB,EAA8B,YAA9B,CAAT,CARoB;aASjB,OAAP,GAAiB,QAAQ,MAAR,CATO;eAUf,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B,MAA3B,GAAoC,OAAO,IAAP;;;QAG7C,GAAK,KAAK,EAAL,GAAU,iBAAV,CAbmB;aAcjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,MAA9B,CAAR,EAA+C,IAA/C,CAAoD,UAAU,OAAV,EAAmB;;eAErE,YAAY,OAAZ,IAAuB,MAAvB,GAAgC,OAAhC,CAFqE;OAAnB,CAA3D,CAdwB;KAAlB,CAbR,CAN+B;GAxMgB;;;;;;;;;;;;;;;;;4BA8PxC,QAAQ,IAAI,MAAM;QACnB,OAAO,IAAP,CADmB;QAErB,WAAJ,CAFyB;aAGhB,OAAO,EAAP,CAAT,CAHyB;;WAKlB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,eAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,YAAY;WACb,KAAK,EAAL,GAAU,SAAV,CADa;WAEb,GAAL,CAAS,EAAT,EAAa,EAAb,EAAiB,IAAjB,EAFkB;aAGX,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,GAA/B,CAAmC,EAAnC,EAAuC,MAAvC,CAA8C,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAA9C,EAA+E,GAA/E,CAAmF,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAAnF,CAAP,CAHkB;KAAZ,CAJD,CAQJ,IARI,CAQC,UAAU,MAAV,EAAkB;UACpB,SAAS,IAAIA,gBAAJ,CAAa,SAAb,EAAwB,MAAxB,EAAgC,SAAhC,CAAT,CADoB;eAEf,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B,MAA3B,GAAoC,SAApC;;;QAGT,GAAK,KAAK,EAAL,GAAU,cAAV,CALmB;aAMjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,EAA2B,MAA3B,CAAR,EAA4C,IAA5C,CAAiD,UAAU,OAAV,EAAmB;;eAElE,YAAY,OAAZ,IAAuB,MAAvB,GAAgC,OAAhC,CAFkE;OAAnB,CAAxD,CANwB;KAAlB,CARR,CALyB;GA9PsB;;;;;;;;;;;;;;;;;;;;;;;;;kCA8SrC,QAAQ,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;QAE3B,WAAJ,CAF+B;cAGrB,QAAQ,EAAR,CAAV,CAH+B;aAItB,OAAO,EAAP,CAAT,CAJ+B;;WAMxB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,kBAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,YAAY;WACb,KAAK,EAAL,GAAU,YAAV,CADa;WAEb,GAAL,CAAS,EAAT,EAAa,KAAb,EAAoB,IAApB,EAFkB;aAGX,KACJ,cADI,CACW,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CADX,EAC2C,KAD3C,EAEJ,MAFI,CAEG,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAFH,EAGJ,GAHI,CAGA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAHA,CAAP,CAHkB;KAAZ,CAJD,CAWJ,IAXI,CAWC,UAAU,MAAV,EAAkB;UACpB,SAAS,IAAIA,gBAAJ,CAAa,SAAb,EAAwB,MAAxB,EAAgC,YAAhC,CAAT,CADoB;eAEf,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B,MAA3B,GAAoC,SAApC;;;QAGT,GAAK,KAAK,EAAL,GAAU,iBAAV,CALmB;aAMjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,MAA9B,CAAR,EAA+C,IAA/C,CAAoD,UAAU,OAAV,EAAmB;;eAErE,YAAY,OAAZ,IAAuB,MAAvB,GAAgC,OAAhC,CAFqE;OAAnB,CAA3D,CANwB;KAAlB,CAXR,CAN+B;GA9SgB;;;;;;;;;;;;;;;;;sBA0V3C,QAAQ,IAAI,MAAM;QAChB,OAAO,IAAP,CADgB;QAElB,eAAJ;QAAY,WAAZ,CAFsB;aAGb,OAAO,EAAP,CAAT,CAHsB;SAIjB,IAAL,KAAc,KAAK,IAAL,GAAY,EAAZ,CAAd,CAJsB;;QAMhB,eAAe,OAAO,YAAP,IAAuB,EAAvB,CANC;QAOlB,QAAQ,CAAC,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,CAAD,CAAR,CAPkB;;iBAST,OAAb,CAAqB,UAAU,GAAV,EAAe;UAC5B,eAAe,IAAI,QAAJ,CADa;UAE5B,cAAc,IAAI,WAAJ,EAAd,CAF4B;UAG9B,CAAC,KAAK,IAAL,IAAa,KAAK,IAAL,CAAU,OAAV,CAAkB,YAAlB,MAAoC,CAAC,CAAD,EAAI;eAAA;OAA1D;UAGI,IAAI,UAAJ,IAAkB,IAAI,IAAJ,KAAa,WAAb,EAA0B;YAC1C,IAAI,IAAJ,KAAa,WAAb,EAA0B;gBACtB,IAAN,CAAW,KAAK,YAAL,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,EAAyC,IAAI,UAAJ,EAAgB,IAA3E,CAAX,EAD4B;SAA9B,MAEO;gBACC,IAAN,CAAW,KAAK,YAAL,CAAkB,YAAY,KAAZ,IAAqB,WAAW,YAAY,IAAZ,CAAhC,EAAmD,IAAI,UAAJ,EAAgB,IAArF,CAAX,EADK;SAFP;OADF;KANmB,CAArB,CATsB;WAuBf,QAAQ,GAAR,CAAY,KAAZ,EAAmB,IAAnB,CAAwB,YAAY;;WAEpC,KAAK,EAAL,GAAU,YAAV,CAFoC;aAGlC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,CAAR,CAAP,CAHyC;KAAZ,CAAxB,CAIJ,IAJI,CAIC,YAAY;WACb,KAAK,EAAL,GAAU,MAAV,CADa;WAEb,GAAL,CAAS,EAAT,EAAa,EAAb,EAAiB,IAAjB,EAFkB;aAGX,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,GAA/B,CAAmC,EAAnC,EAAuC,GAAvC,CAA2C,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAA3C,CAAP,CAHkB;KAAZ,CAJD,CAQJ,IARI,CAQC,UAAU,OAAV,EAAmB;UACrB,CAAC,OAAD,EAAU;eAAA;OAAd;eAGS,OAAT,CAJyB;UAKnB,QAAQ,EAAR,CALmB;;sBAOT,MAAhB,EAAwB,IAAxB,EAA8B,UAAU,GAAV,EAAe,MAAf,EAAuB;YAC7C,gBAAgB,IAAI,WAAJ,EAAhB,CAD6C;YAE/C,aAAJ,CAFmD;;YAI/C,IAAI,UAAJ,KAAmB,IAAI,IAAJ,KAAa,QAAb,IAAyB,IAAI,IAAJ,KAAa,SAAb,CAA5C,EAAqE;cACnE,IAAI,IAAJ,KAAa,QAAb,EAAuB;mBAClB,KAAK,UAAL,CAAgB,MAAhB,EAAwB,GAAxB,EAA6B,MAA7B,EAAqC,MAArC,CAAP,CADyB;WAA3B,MAEO;mBACE,KAAK,WAAL,CAAiB,MAAjB,EAAyB,GAAzB,EAA8B,MAA9B,EAAsC,MAAtC,CAAP,CADK;WAFP;SADF,MAMO,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,SAAJ,EAAe;cAC9C,YAAY,EAAZ,CAD8C;cAE9C,WAAW,IAAI,MAAJ,EAAY,IAAI,SAAJ,CAAZ,IAA8B,EAA9B,CAFmC;qBAGvC,QAAQ,QAAR,IAAoB,QAApB,GAA+B,OAAO,IAAP,CAAY,QAAZ,CAA/B,CAHuC;sBAItC,UAAU,MAAV,CAAiB,QAAjB,CAAZ,CAJkD;iBAK3C,KAAK,OAAL,CAAa,aAAb,EAA4B;mDAE9B,cAAc,WAAd,EAA4B;oBACrB,OAAO,SAAP,EAAkB,MAAlB,CAAyB,UAAU,CAAV,EAAa;uBAAS,CAAP,CAAF;eAAb,CAA/B;cAFJ;WADK,EAMJ,MANI,EAMI,IANJ,CAMS,UAAU,YAAV,EAAwB;gBAClC,aAAJ,CAAkB,MAAlB,EAA0B,YAA1B,EADsC;WAAxB,CANhB,CALkD;SAA7C,MAcA,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,WAAJ,EAAiB;iBAC7C,KAAK,OAAL,CAAa,aAAb,EAA4B;mDAE9B,IAAI,WAAJ,EAAkB;0BACL,IAAI,MAAJ,EAAY,OAAO,WAAP,CAAxB;cAFJ;WADK,EAMJ,MANI,EAMI,IANJ,CAMS,UAAU,YAAV,EAAwB;gBAClC,aAAJ,CAAkB,MAAlB,EAA0B,YAA1B,EADsC;WAAxB,CANhB,CADoD;SAA/C,MAUA,IAAI,IAAI,IAAJ,KAAa,WAAb,EAA0B;iBAC5B,KAAK,aAAL,CAAmB,MAAnB,EAA2B,GAA3B,EAAgC,MAAhC,EAAwC,MAAxC,CAAP,CADmC;SAA9B;YAGH,IAAJ,EAAU;gBACF,IAAN,CAAW,IAAX,EADQ;SAAV;OArC4B,CAA9B,CAPyB;;aAiDlB,QAAQ,GAAR,CAAY,KAAZ,CAAP,CAjDyB;KAAnB,CARD,CA0DJ,IA1DI,CA0DC,YAAY;UACd,SAAS,IAAIA,gBAAJ,CAAa,MAAb,EAAqB,EAArB,EAAyB,MAAzB,CAAT,CADc;aAEX,KAAP,GAAe,SAAS,CAAT,GAAa,CAAb,CAFG;eAGT,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B,MAA3B,GAAoC,OAAO,IAAP;;;QAG7C,GAAK,KAAK,EAAL,GAAU,WAAV,CANa;aAOX,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,EAA2B,MAA3B,CAAR,EAA4C,IAA5C,CAAiD,UAAU,OAAV,EAAmB;;eAElE,YAAY,OAAZ,IAAuB,MAAvB,GAAgC,OAAhC,CAFkE;OAAnB,CAAxD,CAPkB;KAAZ,CA1DR,CAvBsB;GA1VyB;;;;;;;;;;;;;;;;;;;;;;;;;4BA+cxC,QAAQ,OAAO,MAAM;QACtB,OAAO,IAAP,CADsB;aAEnB,OAAO,EAAP,CAAT,CAF4B;SAGvB,IAAL,KAAc,KAAK,IAAL,GAAY,EAAZ,CAAd,CAH4B;;QAKxB,UAAU,EAAV,CALwB;QAMxB,WAAJ,CAN4B;QAOtB,eAAe,OAAO,YAAP,IAAuB,EAAvB,CAPO;QAQxB,QAAQ,CAAC,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,CAAD,CAAR,CARwB;;iBAUf,OAAb,CAAqB,UAAU,GAAV,EAAe;UAC5B,eAAe,IAAI,QAAJ,CADa;UAE5B,cAAc,IAAI,WAAJ,EAAd,CAF4B;UAG9B,CAAC,KAAK,IAAL,IAAa,KAAK,IAAL,CAAU,OAAV,CAAkB,YAAlB,MAAoC,CAAC,CAAD,EAAI;eAAA;OAA1D;UAGI,IAAI,UAAJ,IAAkB,IAAI,IAAJ,KAAa,WAAb,EAA0B;YAC1C,IAAI,IAAJ,KAAa,WAAb,EAA0B;gBACtB,IAAN,CAAW,KAAK,YAAL,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,EAAyC,IAAI,UAAJ,EAAgB,IAA3E,CAAX,EAD4B;SAA9B,MAEO;gBACC,IAAN,CAAW,KAAK,YAAL,CAAkB,YAAY,KAAZ,IAAqB,WAAW,YAAY,IAAZ,CAAhC,EAAmD,IAAI,UAAJ,EAAgB,IAArF,CAAX,EADK;SAFP;OADF;KANmB,CAArB,CAV4B;WAwBrB,QAAQ,GAAR,CAAY,KAAZ,EAAmB,IAAnB,CAAwB,YAAY;;WAEpC,KAAK,EAAL,GAAU,eAAV,CAFoC;aAGlC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,CAAP,CAHyC;KAAZ,CAAxB,CAIJ,IAJI,CAIC,YAAY;WACb,KAAK,EAAL,GAAU,SAAV,CADa;WAEb,GAAL,CAAS,EAAT,EAAa,KAAb,EAAoB,IAApB,EAFkB;aAGX,KAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CAApB,EAAoD,KAApD,EAA2D,GAA3D,CAA+D,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAA/D,CAAP,CAHkB;KAAZ,CAJD,CAQJ,IARI,CAQC,UAAU,QAAV,EAAoB;gBAChB,QAAV,CAD0B;UAEpB,QAAQ,EAAR,CAFoB;sBAGV,MAAhB,EAAwB,IAAxB,EAA8B,UAAU,GAAV,EAAe,MAAf,EAAuB;YAC7C,gBAAgB,IAAI,WAAJ,EAAhB,CAD6C;YAE7C,cAAc,OAAO,WAAP,CAF+B;YAG/C,aAAJ,CAHmD;YAI/C,IAAI,UAAJ,KAAmB,IAAI,IAAJ,KAAa,QAAb,IAAyB,IAAI,IAAJ,KAAa,SAAb,CAA5C,EAAqE;cACnE,IAAI,IAAJ,KAAa,SAAb,EAAwB;mBACnB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,GAAzB,EAA8B,OAA9B,EAAuC,MAAvC,CAAP,CAD0B;WAA5B,MAEO;mBACE,KAAK,UAAL,CAAgB,MAAhB,EAAwB,GAAxB,EAA6B,OAA7B,EAAsC,MAAtC,CAAP,CADK;WAFP;SADF,MAMO,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,SAAJ,EAAe;;gBAC9C,YAAY,EAAZ;oBACI,OAAR,CAAgB,UAAU,IAAV,EAAgB;kBAC1B,WAAW,KAAK,IAAI,SAAJ,CAAL,IAAuB,EAAvB,CADe;yBAEnB,QAAQ,QAAR,IAAoB,QAApB,GAA+B,OAAO,IAAP,CAAY,QAAZ,CAA/B,CAFmB;0BAGlB,UAAU,MAAV,CAAiB,QAAjB,CAAZ,CAH8B;aAAhB,CAAhB;mBAKO,KAAK,OAAL,CAAa,aAAb,EAA4B;qDAE9B,cAAc,WAAd,EAA4B;sBACrB,OAAO,SAAP,EAAkB,MAAlB,CAAyB,UAAU,CAAV,EAAa;yBAAS,CAAP,CAAF;iBAAb,CAA/B;gBAFJ;aADK,EAMJ,MANI,EAMI,IANJ,CAMS,UAAU,YAAV,EAAwB;sBAC9B,OAAR,CAAgB,UAAU,IAAV,EAAgB;oBAC1B,WAAW,EAAX,CAD0B;oBAE1B,WAAW,IAAI,IAAJ,EAAU,IAAI,SAAJ,CAAV,IAA4B,EAA5B,CAFe;2BAGnB,QAAQ,QAAR,IAAoB,QAApB,GAA+B,OAAO,IAAP,CAAY,QAAZ,CAA/B,CAHmB;6BAIjB,OAAb,CAAqB,UAAU,WAAV,EAAuB;sBACtC,YAAY,SAAS,OAAT,CAAiB,YAAY,cAAc,WAAd,CAA7B,MAA6D,CAAC,CAAD,EAAI;6BACtE,IAAT,CAAc,WAAd,EAD+E;mBAAjF;iBADmB,CAArB,CAJ8B;oBAS1B,aAAJ,CAAkB,IAAlB,EAAwB,QAAxB,EAT8B;eAAhB,CAAhB,CADsC;qBAY/B,YAAP,CAZsC;aAAxB,CANhB;eAPkD;SAA7C,MA2BA,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,WAAJ,EAAiB;iBAC7C,KAAK,OAAL,CAAa,aAAb,EAA4B;mDAE9B,IAAI,WAAJ,EAAkB;+BACA,QAAQ,GAAR,CAAY,UAAU,MAAV,EAAkB;uBACtC,IAAI,MAAJ,EAAY,WAAZ,CAAP,CAD6C;eAAlB,CAA7B;cAFJ;WADK,EAQJ,MARI,EAQI,IARJ,CAQS,UAAU,YAAV,EAAwB;gBAChC,mBAAmB,IAAI,WAAJ,CADa;oBAE9B,OAAR,CAAgB,UAAU,MAAV,EAAkB;kBAC1B,gBAAgB,EAAhB,CAD0B;kBAE1B,KAAK,IAAI,MAAJ,EAAY,WAAZ,CAAL,CAF0B;2BAGnB,OAAb,CAAqB,UAAU,WAAV,EAAuB;oBACpC,cAAc,IAAI,YAAJ,EAAkB,gBAAlB,KAAuC,EAAvC,CADsB;oBAEtC,YAAY,OAAZ,CAAoB,EAApB,MAA4B,CAAC,CAAD,EAAI;gCACpB,IAAd,CAAmB,WAAnB,EADkC;iBAApC;eAFmB,CAArB,CAHgC;kBAS5B,aAAJ,CAAkB,MAAlB,EAA0B,aAA1B,EATgC;aAAlB,CAAhB,CAFsC;WAAxB,CARhB,CADoD;SAA/C,MAuBA,IAAI,IAAI,IAAJ,KAAa,WAAb,EAA0B;iBAC5B,KAAK,aAAL,CAAmB,MAAnB,EAA2B,GAA3B,EAAgC,OAAhC,EAAyC,MAAzC,CAAP,CADmC;SAA9B;YAGH,IAAJ,EAAU;gBACF,IAAN,CAAW,IAAX,EADQ;SAAV;OA/D4B,CAA9B,CAH0B;aAsEnB,QAAQ,GAAR,CAAY,KAAZ,CAAP,CAtE0B;KAApB,CARD,CA+EJ,IA/EI,CA+EC,YAAY;kBACN,UAAU,EAAV,CAAZ,CADkB;UAEd,SAAS,IAAIA,gBAAJ,CAAa,OAAb,EAAsB,EAAtB,EAA0B,SAA1B,CAAT,CAFc;aAGX,KAAP,GAAe,QAAQ,MAAR,CAHG;eAIT,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B,MAA3B,GAAoC,OAAO,IAAP;;;QAG7C,GAAK,KAAK,EAAL,GAAU,cAAV,CAPa;aAQX,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,MAA9B,CAAR,EAA+C,IAA/C,CAAoD,UAAU,OAAV,EAAmB;;eAErE,YAAY,OAAZ,IAAuB,MAAvB,GAAgC,OAAhC,CAFqE;OAAnB,CAA3D,CARkB;KAAZ,CA/ER,CAxB4B;GA/cmB;;;;;;;;;;;;;;;oCAilBpC,UAAU,MAAM;aAClB,OAAO,EAAP,CAAT,CAD2B;SAEtB,SAAL,KAAmB,KAAK,SAAL,GAAiB,EAAjB,CAAnB,CAF2B;QAGvB,SAAS,KAAK,SAAL,IAAkB,EAAlB,CAHc;WAIpB,YAAY,KAAK,SAAL,CAAe,QAAf,CAAZ,IAAwC,OAAO,QAAP,KAAoB,UAAU,QAAV,CAApB,GAA0C,KAAK,SAAL,CAAe,QAAf,CAAlF,CAJoB;GAjlBoB;;;;;;;;;;;;;;;;;;0BAumBzC,QAAQ,IAAI,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;cAErB,QAAQ,EAAR,CAAV,CAF+B;aAGtB,OAAO,EAAP,CAAT,CAH+B;QAI3B,WAAJ,CAJ+B;;WAMxB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,cAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,KAArB,EAA4B,IAA5B,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,UAAU,MAAV,EAAkB;;cAEhB,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAFgB;UAGlB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAHkB;iBAIb,aAAX,GAA2B,IAA3B,CAJwB;aAKjB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,GAA/B,CAAmC,EAAnC,EAAuC,MAAvC,CAA8C,iBAAiB,MAAjB,EAAyB,KAAzB,CAA9C,EAA+E,UAA/E,EAA2F,GAA3F,CAA+F,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAA/F,CAAP,CALwB;KAAlB,CAJD,CAUJ,IAVI,CAUC,UAAU,MAAV,EAAkB;UACpB,eAAJ,CADwB;WAEnB,aAAL,CAAmB,MAAnB,EAFwB;UAGpB,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,IAAyB,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,EAA2B;iBACzE,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,CADyE;OAApF,MAEO;cACC,IAAI,KAAJ,CAAU,WAAV,CAAN,CADK;OAFP;UAKI,SAAS,IAAIA,gBAAJ,CAAa,MAAb,EAAqB,MAArB,EAA6B,QAA7B,CAAT,CARoB;aASjB,OAAP,GAAiB,CAAjB,CATwB;eAUf,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B,MAA3B,GAAoC,OAAO,IAAP;;;QAG7C,GAAK,KAAK,EAAL,GAAU,aAAV,CAbmB;aAcjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,KAArB,EAA4B,IAA5B,EAAkC,MAAlC,CAAR,EAAmD,IAAnD,CAAwD,UAAU,OAAV,EAAmB;;eAEzE,YAAY,OAAZ,IAAuB,MAAvB,GAAgC,OAAhC,CAFyE;OAAnB,CAA/D,CAdwB;KAAlB,CAVR,CAN+B;GAvmBgB;;;;;;;;;;;;;;;;;;;;;;;;;;gCAmqBtC,QAAQ,OAAO,OAAO,MAAM;QAC/B,OAAO,IAAP,CAD+B;cAE3B,QAAQ,EAAR,CAAV,CAFqC;cAG3B,QAAQ,EAAR,CAAV,CAHqC;aAI5B,OAAO,EAAP,CAAT,CAJqC;QAKjC,WAAJ,CALqC;;WAO9B,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,iBAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,KAAxB,EAA+B,IAA/B,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,UAAU,MAAV,EAAkB;;cAEhB,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAFgB;UAGlB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAHkB;iBAIb,aAAX,GAA2B,IAA3B,CAJwB;aAKjB,KAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CAApB,EAAoD,KAApD,EAA2D,MAA3D,CAAkE,iBAAiB,MAAjB,EAAyB,KAAzB,CAAlE,EAAmG,UAAnG,EAA+G,GAA/G,CAAmH,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAAnH,CAAP,CALwB;KAAlB,CAJD,CAUJ,IAVI,CAUC,UAAU,MAAV,EAAkB;UACpB,UAAU,EAAV,CADoB;WAEnB,aAAL,CAAmB,MAAnB,EAFwB;UAGpB,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,EAAuB;kBAC3C,OAAO,OAAP,CAAe,GAAf,CAAmB,UAAU,MAAV,EAAkB;iBAAS,OAAO,OAAP,CAAT;SAAlB,CAA7B,CADqD;OAAvD;UAGI,SAAS,IAAIA,gBAAJ,CAAa,OAAb,EAAsB,MAAtB,EAA8B,QAA9B,CAAT,CANoB;aAOjB,OAAP,GAAiB,QAAQ,MAAR,CAPO;eAQf,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B,MAA3B,GAAoC,OAAO,IAAP;;;QAG7C,GAAK,KAAK,EAAL,GAAU,gBAAV,CAXmB;aAYjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,KAAxB,EAA+B,IAA/B,EAAqC,MAArC,CAAR,EAAsD,IAAtD,CAA2D,UAAU,OAAV,EAAmB;;eAE5E,YAAY,OAAZ,IAAuB,MAAvB,GAAgC,OAAhC,CAF4E;OAAnB,CAAlE,CAZwB;KAAlB,CAVR,CAPqC;GAnqBU;;;;;;;;;;;;;;;;;kCAqtBrC,QAAQ,SAAS,MAAM;QAC3B,OAAO,IAAP,CAD2B;gBAErB,UAAU,EAAV,CAAZ,CAFiC;aAGxB,OAAO,EAAP,CAAT,CAHiC;QAI7B,WAAJ,CAJiC;QAK3B,cAAc,OAAO,WAAP,CALa;;cAOvB,QAAQ,MAAR,CAAe,UAAU,MAAV,EAAkB;aAClC,IAAI,MAAJ,EAAY,WAAZ,CAAP,CADyC;KAAlB,CAAzB,CAPiC;;WAW1B,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,kBAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,OAAjB,EAA0B,IAA1B,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,UAAU,QAAV,EAAoB;;iBAEf,YAAY,QAAZ,IAAwB,OAAxB,GAAkC,QAAlC,CAFe;UAGpB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAHoB;iBAIf,aAAX,GAA2B,IAA3B,CAJ0B;iBAKf,QAAX,GAAsB,QAAtB,CAL0B;iBAMf,SAAS,GAAT,CAAa,UAAU,MAAV,EAAkB;eACjC,iBAAiB,MAAjB,EAAyB,MAAzB,CAAP,CADwC;OAAlB,CAAxB,CAN0B;aASnB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,MAA/B,CAAsC,QAAtC,EAAgD,UAAhD,EAA4D,GAA5D,CAAgE,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAAhE,CAAP,CAT0B;KAApB,CAJD,CAcJ,IAdI,CAcC,UAAU,MAAV,EAAkB;UACpB,uBAAJ,CADwB;WAEnB,aAAL,CAAmB,MAAnB,EAFwB;UAGpB,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,EAAuB;yBACpC,OAAO,OAAP,CAAe,GAAf,CAAmB,UAAU,MAAV,EAAkB;iBAAS,OAAO,OAAP,CAAT;SAAlB,CAApC,CADqD;OAAvD;UAGI,SAAS,IAAIA,gBAAJ,CAAa,kBAAkB,EAAlB,EAAsB,MAAnC,EAA2C,QAA3C,CAAT,CANoB;aAOjB,OAAP,GAAiB,OAAO,IAAP,CAAY,MAAZ,CAPO;eAQf,KAAK,MAAL,CAAY,KAAZ,EAAmB,IAAnB,IAA2B,MAA3B,GAAoC,OAAO,IAAP;;;QAG7C,GAAK,KAAK,EAAL,GAAU,iBAAV,CAXmB;aAYjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,OAAjB,EAA0B,IAA1B,EAAgC,MAAhC,CAAR,EAAiD,IAAjD,CAAsD,UAAU,OAAV,EAAmB;;eAEvE,YAAY,OAAZ,IAAuB,MAAvB,GAAgC,OAAhC,CAFuE;OAAnB,CAA7D,CAZwB;KAAlB,CAdR,CAXiC;GArtBc;sCAiwBnC,QAAQ,SAAS;;;QACvB,QAAQ,SAAS,MAAT,IAAmB,MAAnB,GAA6B,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CADd;cAEnB,WAAW,EAAX,CAFmB;QAGzB,KAAK,YAAY,QAAQ,EAAR,CAAZ,GAA0B,KAAK,EAAL,GAAU,QAAQ,EAAR,CAHhB;WAItB,KAAK,SAAL,CAAe,OAAf,EAAwB,IAAxB,CAA6B,YAAM;YACnC,MAAL,CAAY,EAAZ,IAAkB,MAAK,MAAL,CAAY,EAAZ,KAAmB,EAAnB,CADsB;UAEpC,CAAC,MAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,CAAD,EAAyB;cACtB,MAAL,CAAY,EAAZ,EAAgB,KAAhB,IAAyB,MAAK,CAAL,CAAO,MAAP,CAAc,MAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,SAAd,GAA0B,QAA1B,CAAmC,KAAnC,CAAd,EAAyD,IAAzD,EAA+D,MAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,WAAd,CAA0B,KAA1B,CAA/D,EAAiG,GAAjG,EAAzB,CAD2B;OAA7B;aAGO,MAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,CAAP,CALwC;KAAN,CAApC,CAJ6B;GAjwBkB;sCA8wBnC,OAAO,OAAO,SAAS;;;cACzB,WAAW,EAAX,CADyB;QAE/B,KAAK,YAAY,QAAQ,EAAR,CAAZ,GAA0B,KAAK,EAAL,GAAU,QAAQ,EAAR,CAFV;WAG5B,KAAK,SAAL,CAAe,OAAf,EAAwB,IAAxB,CAA6B;aAAM,OAAK,YAAL,CAAkB,KAAlB,EAAyB,OAAzB;KAAN,CAA7B,CAAsE,IAAtE,CAA2E,YAAM;aACjF,OAAL,CAAa,EAAb,IAAmB,OAAK,OAAL,CAAa,EAAb,KAAoB,EAApB,CADmE;aAEjF,OAAL,CAAa,EAAb,EAAiB,KAAjB,IAA0B,OAAK,OAAL,CAAa,EAAb,EAAiB,KAAjB,KAA2B,EAA3B,CAF4D;UAGlF,CAAC,OAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,EAAuB,KAAvB,CAAD,EAAgC;eAC7B,MAAL,CAAY,EAAZ,EAAgB,KAAhB,EAAuB,KAAvB,IAAgC,OAAK,CAAL,CAAO,MAAP,CAAc,OAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,KAAd,CAAoB,KAApB,EAA2B,SAA3B,GAAuC,QAAvC,CAAgD,KAAhD,CAAd,EAAsE,IAAtE,EAA4E,OAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,KAAd,CAAoB,KAApB,EAA2B,WAA3B,CAAuC,KAAvC,CAA5E,EAA2H,GAA3H,GAAiI,IAAjI,CAAsI,YAAM;iBACnK,OAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,KAAd,CAAoB,KAApB,EAA2B,SAA3B,CAAqC,KAArC,EAA4C,GAA5C,EAAP,CAD0K;SAAN,CAAtK,CADkC;OAApC;aAKO,OAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,EAAuB,KAAvB,CAAP,CARsF;KAAN,CAAlF,CAHmC;GA9wBY;CAAnD;;AA8xBA,iBAAiB,SAAjB,GAA6B,SAA7B;;"} \ No newline at end of file diff --git a/package.json b/package.json index 7081612..b41d523 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-rethinkdb", "description": "RethinkDB adapter for js-data.", - "version": "3.0.0-alpha.8", + "version": "3.0.0-alpha.9", "homepage": "https://github.com/js-data/js-data-rethinkdb", "repository": { "type": "git", @@ -46,7 +46,7 @@ "ci": "npm run test && cat coverage/lcov.info | coveralls || true && cat ./coverage/lcov.info | codacy-coverage || true" }, "dependencies": { - "js-data-adapter": "0.1.0", + "js-data-adapter": "0.1.2", "mout": "0.12.0" }, "peerDependencies": { diff --git a/src/index.js b/src/index.js index 6e80313..7f53900 100644 --- a/src/index.js +++ b/src/index.js @@ -56,15 +56,6 @@ const DEFAULTS = { */ db: 'test', - /** - * Whether to log debugging information. - * - * @name RethinkDBAdapter#debug - * @type {boolean} - * @default false - */ - debug: false, - /** * RethinkDB host. * @@ -99,16 +90,7 @@ const DEFAULTS = { * @type {number} * @default 10 */ - port: 28015, - - /** - * Whether to return a more detailed response object. - * - * @name RethinkDBAdapter#raw - * @type {boolean} - * @default false - */ - raw: false + port: 28015 } const INSERT_OPTS_DEFAULTS = {} @@ -224,7 +206,7 @@ export default function RethinkDBAdapter (opts) { classCallCheck(self, RethinkDBAdapter) opts || (opts = {}) fillIn(opts, DEFAULTS) - Adapter.call(this, opts) + Adapter.call(self, opts) /** * Default options to pass to r#insert. From a50c32796d9d346e7fd5a014782e488c84fcd3ab Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 5 Mar 2016 20:34:11 -0800 Subject: [PATCH 19/27] 3.0.0-alpha.10 --- CHANGELOG.md | 5 +++++ dist/js-data-rethinkdb.js | 4 ++-- dist/js-data-rethinkdb.js.map | 2 +- package.json | 2 +- src/index.js | 4 ++-- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 219dfa1..eb93ef9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +##### 3.0.0-alpha.10 - 06 March 2016 + +###### Backwards compatible API changes +- Now making use of makeHasManyForeignKeys + ##### 3.0.0-alpha.9 - 06 March 2016 ###### Other diff --git a/dist/js-data-rethinkdb.js b/dist/js-data-rethinkdb.js index 2f7cee4..211e0d2 100644 --- a/dist/js-data-rethinkdb.js +++ b/dist/js-data-rethinkdb.js @@ -723,7 +723,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } else if (def.type === 'hasMany' && def.foreignKeys) { task = self.findAll(relatedMapper, { where: babelHelpers.defineProperty({}, def.foreignKeys, { - 'contains': get(record, mapper.idAttribute) + 'contains': self.makeHasManyForeignKeys(mapper, def, record) }) }, __opts).then(function (relatedItems) { def.setLocalField(record, relatedItems); @@ -852,7 +852,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { task = self.findAll(relatedMapper, { where: babelHelpers.defineProperty({}, def.foreignKeys, { 'isectNotEmpty': records.map(function (record) { - return get(record, idAttribute); + return self.makeHasManyForeignKeys(mapper, def, record); }) }) }, __opts).then(function (relatedItems) { diff --git a/dist/js-data-rethinkdb.js.map b/dist/js-data-rethinkdb.js.map index 04bfecf..cb24f66 100644 --- a/dist/js-data-rethinkdb.js.map +++ b/dist/js-data-rethinkdb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved,\n Response\n} from 'js-data-adapter'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\nimport unique from 'mout/array/unique'\n\nconst {\n addHiddenPropsToTarget,\n classCallCheck,\n extend,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n omit,\n plainCopy,\n resolve\n} = utils\n\nconst withoutRelations = function (mapper, props) {\n return omit(props, mapper.relationFields || [])\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n classCallCheck(self, RethinkDBAdapter)\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n// Setup prototype inheritance from Adapter\nRethinkDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: RethinkDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(RethinkDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the RethinkDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the RethinkDBAdapter itself.\n * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = extend\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n let response = new Response(record, cursor, 'create')\n response.created = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n _props = props.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n let result = new Response(records, cursor, 'createMany')\n result.created = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return resolve(self[op](mapper, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = new Response(undefined, cursor, 'destroy')\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = new Response(undefined, cursor, 'destroyAll')\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': get(record, mapper.idAttribute)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n let result = new Response(record, {}, 'find')\n result.found = record ? 1 : 0\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return get(record, idAttribute)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n records || (records = [])\n let result = new Response(records, {}, 'findAll')\n result.found = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n let result = new Response(record, cursor, 'update')\n result.updated = 1\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = new Response(records, cursor, 'update')\n result.updated = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return resolve(self[op](mapper, props, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n _records = _records.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = new Response(updatedRecords || [], cursor, 'update')\n result.updated = result.data.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n"],"names":["utils","Adapter","reserved","Response"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved,\n Response\n} from 'js-data-adapter'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\nimport unique from 'mout/array/unique'\n\nconst {\n addHiddenPropsToTarget,\n classCallCheck,\n extend,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n omit,\n plainCopy,\n resolve\n} = utils\n\nconst withoutRelations = function (mapper, props) {\n return omit(props, mapper.relationFields || [])\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n classCallCheck(self, RethinkDBAdapter)\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n// Setup prototype inheritance from Adapter\nRethinkDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: RethinkDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(RethinkDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the RethinkDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the RethinkDBAdapter itself.\n * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = extend\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n let response = new Response(record, cursor, 'create')\n response.created = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n _props = props.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n let result = new Response(records, cursor, 'createMany')\n result.created = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return resolve(self[op](mapper, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = new Response(undefined, cursor, 'destroy')\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = new Response(undefined, cursor, 'destroyAll')\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': self.makeHasManyForeignKeys(mapper, def, record)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n let result = new Response(record, {}, 'find')\n result.found = record ? 1 : 0\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return self.makeHasManyForeignKeys(mapper, def, record)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n records || (records = [])\n let result = new Response(records, {}, 'findAll')\n result.found = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n let result = new Response(record, cursor, 'update')\n result.updated = 1\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = new Response(records, cursor, 'update')\n result.updated = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return resolve(self[op](mapper, props, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n _records = _records.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = new Response(updatedRecords || [], cursor, 'update')\n result.updated = result.data.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n"],"names":["utils","Adapter","reserved","Response"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index b41d523..95b8e26 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-rethinkdb", "description": "RethinkDB adapter for js-data.", - "version": "3.0.0-alpha.9", + "version": "3.0.0-alpha.10", "homepage": "https://github.com/js-data/js-data-rethinkdb", "repository": { "type": "git", diff --git a/src/index.js b/src/index.js index 7f53900..ed946a1 100644 --- a/src/index.js +++ b/src/index.js @@ -710,7 +710,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { task = self.findAll(relatedMapper, { where: { [def.foreignKeys]: { - 'contains': get(record, mapper.idAttribute) + 'contains': self.makeHasManyForeignKeys(mapper, def, record) } } }, __opts).then(function (relatedItems) { @@ -838,7 +838,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { where: { [def.foreignKeys]: { 'isectNotEmpty': records.map(function (record) { - return get(record, idAttribute) + return self.makeHasManyForeignKeys(mapper, def, record) }) } } From 8de16d0bb74e76d8bbf916dda31e746fff62c9b6 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 5 Mar 2016 20:51:21 -0800 Subject: [PATCH 20/27] 3.0.0-alpha.11 --- CHANGELOG.md | 6 +++ dist/js-data-rethinkdb.js | 79 ++++++++++++++++++----------------- dist/js-data-rethinkdb.js.map | 2 +- package.json | 2 +- src/index.js | 79 ++++++++++++++++++----------------- 5 files changed, 88 insertions(+), 80 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb93ef9..3cec362 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +##### 3.0.0-alpha.11 - 06 March 2016 + +###### Backwards compatible bug fixes +- create() now makes us of withoutRelations() +- More use of Adapter#respond() more consistent + ##### 3.0.0-alpha.10 - 06 March 2016 ###### Backwards compatible API changes diff --git a/dist/js-data-rethinkdb.js b/dist/js-data-rethinkdb.js index 211e0d2..9259be9 100644 --- a/dist/js-data-rethinkdb.js +++ b/dist/js-data-rethinkdb.js @@ -476,7 +476,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { props = isUndefined(_props) ? props : _props; var insertOpts = self.getOpt('insertOpts', opts); insertOpts.returnChanges = true; - return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts)); + _props = withoutRelations(mapper, props); + return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { self._handleErrors(cursor); var record = void 0; @@ -538,15 +539,15 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return change.new_val; }); } - var result = new Adapter.Response(records, cursor, 'createMany'); - result.created = records.length; - result = self.getOpt('raw', opts) ? result : result.data; + var response = new Adapter.Response(records, cursor, 'createMany'); + response.created = records.length; + response = self.respond(response, opts); // afterCreateMany lifecycle hook op = opts.op = 'afterCreateMany'; - return resolve(self[op](mapper, props, opts, result)).then(function (_result) { + return resolve(self[op](mapper, props, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result; + return isUndefined(_response) ? response : _response; }); }); }, @@ -580,14 +581,14 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { self.dbg(op, id, opts); return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { - var result = new Adapter.Response(undefined, cursor, 'destroy'); - result = self.getOpt('raw', opts) ? result : undefined; + var response = new Adapter.Response(undefined, cursor, 'destroy'); + response = self.respond(response, opts); // afterDestroy lifecycle hook op = opts.op = 'afterDestroy'; - return resolve(self[op](mapper, id, opts, result)).then(function (_result) { + return resolve(self[op](mapper, id, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result; + return isUndefined(_response) ? response : _response; }); }); }, @@ -630,14 +631,14 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { self.dbg(op, query, opts); return self.filterSequence(self.selectTable(mapper, opts), query).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)); }).then(function (cursor) { - var result = new Adapter.Response(undefined, cursor, 'destroyAll'); - result = self.getOpt('raw', opts) ? result : undefined; + var response = new Adapter.Response(undefined, cursor, 'destroyAll'); + response = self.respond(response, opts); // afterDestroyAll lifecycle hook op = opts.op = 'afterDestroyAll'; - return resolve(self[op](mapper, query, opts, result)).then(function (_result) { + return resolve(self[op](mapper, query, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result; + return isUndefined(_response) ? response : _response; }); }); }, @@ -738,15 +739,15 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return Promise.all(tasks); }).then(function () { - var result = new Adapter.Response(record, {}, 'find'); - result.found = record ? 1 : 0; - result = self.getOpt('raw', opts) ? result : result.data; + var response = new Adapter.Response(record, {}, 'find'); + response.found = record ? 1 : 0; + response = self.respond(response, opts); // afterFind lifecycle hook op = opts.op = 'afterFind'; - return resolve(self[op](mapper, id, opts, result)).then(function (_result) { + return resolve(self[op](mapper, id, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result; + return isUndefined(_response) ? response : _response; }); }); }, @@ -879,15 +880,15 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return Promise.all(tasks); }).then(function () { records || (records = []); - var result = new Adapter.Response(records, {}, 'findAll'); - result.found = records.length; - result = self.getOpt('raw', opts) ? result : result.data; + var response = new Adapter.Response(records, {}, 'findAll'); + response.found = records.length; + response = self.respond(response, opts); // afterFindAll lifecycle hook op = opts.op = 'afterFindAll'; - return resolve(self[op](mapper, query, opts, result)).then(function (_result) { + return resolve(self[op](mapper, query, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result; + return isUndefined(_response) ? response : _response; }); }); }, @@ -952,15 +953,15 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } else { throw new Error('Not Found'); } - var result = new Adapter.Response(record, cursor, 'update'); - result.updated = 1; - result = self.getOpt('raw', opts) ? result : result.data; + var response = new Adapter.Response(record, cursor, 'update'); + response.updated = 1; + response = self.respond(response, opts); // afterUpdate lifecycle hook op = opts.op = 'afterUpdate'; - return resolve(self[op](mapper, id, props, opts, result)).then(function (_result) { + return resolve(self[op](mapper, id, props, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result; + return isUndefined(_response) ? response : _response; }); }); }, @@ -1014,15 +1015,15 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return change.new_val; }); } - var result = new Adapter.Response(records, cursor, 'update'); - result.updated = records.length; - result = self.getOpt('raw', opts) ? result : result.data; + var response = new Adapter.Response(records, cursor, 'update'); + response.updated = records.length; + response = self.respond(response, opts); // afterUpdateAll lifecycle hook op = opts.op = 'afterUpdateAll'; - return resolve(self[op](mapper, props, query, opts, result)).then(function (_result) { + return resolve(self[op](mapper, props, query, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result; + return isUndefined(_response) ? response : _response; }); }); }, @@ -1075,15 +1076,15 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return change.new_val; }); } - var result = new Adapter.Response(updatedRecords || [], cursor, 'update'); - result.updated = result.data.length; - result = self.getOpt('raw', opts) ? result : result.data; + var response = new Adapter.Response(updatedRecords || [], cursor, 'update'); + response.updated = response.data.length; + response = self.respond(response, opts); // afterUpdateMany lifecycle hook op = opts.op = 'afterUpdateMany'; - return resolve(self[op](mapper, records, opts, result)).then(function (_result) { + return resolve(self[op](mapper, records, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result; + return isUndefined(_response) ? response : _response; }); }); }, diff --git a/dist/js-data-rethinkdb.js.map b/dist/js-data-rethinkdb.js.map index cb24f66..b1f95fb 100644 --- a/dist/js-data-rethinkdb.js.map +++ b/dist/js-data-rethinkdb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved,\n Response\n} from 'js-data-adapter'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\nimport unique from 'mout/array/unique'\n\nconst {\n addHiddenPropsToTarget,\n classCallCheck,\n extend,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n omit,\n plainCopy,\n resolve\n} = utils\n\nconst withoutRelations = function (mapper, props) {\n return omit(props, mapper.relationFields || [])\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n classCallCheck(self, RethinkDBAdapter)\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n// Setup prototype inheritance from Adapter\nRethinkDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: RethinkDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(RethinkDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the RethinkDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the RethinkDBAdapter itself.\n * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = extend\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n let response = new Response(record, cursor, 'create')\n response.created = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n _props = props.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n let result = new Response(records, cursor, 'createMany')\n result.created = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return resolve(self[op](mapper, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = new Response(undefined, cursor, 'destroy')\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let result = new Response(undefined, cursor, 'destroyAll')\n result = self.getOpt('raw', opts) ? result : undefined\n\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': self.makeHasManyForeignKeys(mapper, def, record)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n let result = new Response(record, {}, 'find')\n result.found = record ? 1 : 0\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return self.makeHasManyForeignKeys(mapper, def, record)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n records || (records = [])\n let result = new Response(records, {}, 'findAll')\n result.found = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n let result = new Response(record, cursor, 'update')\n result.updated = 1\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = new Response(records, cursor, 'update')\n result.updated = records.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return resolve(self[op](mapper, props, query, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n _records = _records.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n let result = new Response(updatedRecords || [], cursor, 'update')\n result.updated = result.data.length\n result = self.getOpt('raw', opts) ? result : result.data\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, result)).then(function (_result) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_result) ? result : _result\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n"],"names":["utils","Adapter","reserved","Response"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved,\n Response\n} from 'js-data-adapter'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\nimport unique from 'mout/array/unique'\n\nconst {\n addHiddenPropsToTarget,\n classCallCheck,\n extend,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n omit,\n plainCopy,\n resolve\n} = utils\n\nconst withoutRelations = function (mapper, props) {\n return omit(props, mapper.relationFields || [])\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n classCallCheck(self, RethinkDBAdapter)\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n// Setup prototype inheritance from Adapter\nRethinkDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: RethinkDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(RethinkDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the RethinkDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the RethinkDBAdapter itself.\n * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = extend\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n _props = withoutRelations(mapper, props)\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n let response = new Response(record, cursor, 'create')\n response.created = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n _props = props.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n let response = new Response(records, cursor, 'createMany')\n response.created = records.length\n response = self.respond(response, opts)\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let response = new Response(undefined, cursor, 'destroy')\n response = self.respond(response, opts)\n\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let response = new Response(undefined, cursor, 'destroyAll')\n response = self.respond(response, opts)\n\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': self.makeHasManyForeignKeys(mapper, def, record)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n let response = new Response(record, {}, 'find')\n response.found = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return self.makeHasManyForeignKeys(mapper, def, record)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n records || (records = [])\n let response = new Response(records, {}, 'findAll')\n response.found = records.length\n response = self.respond(response, opts)\n\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n let response = new Response(record, cursor, 'update')\n response.updated = 1\n response = self.respond(response, opts)\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n let response = new Response(records, cursor, 'update')\n response.updated = records.length\n response = self.respond(response, opts)\n\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return resolve(self[op](mapper, props, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n _records = _records.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n let response = new Response(updatedRecords || [], cursor, 'update')\n response.updated = response.data.length\n response = self.respond(response, opts)\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n"],"names":["utils","Adapter","reserved","Response"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 95b8e26..0461966 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-rethinkdb", "description": "RethinkDB adapter for js-data.", - "version": "3.0.0-alpha.10", + "version": "3.0.0-alpha.11", "homepage": "https://github.com/js-data/js-data-rethinkdb", "repository": { "type": "git", diff --git a/src/index.js b/src/index.js index ed946a1..9731b1f 100644 --- a/src/index.js +++ b/src/index.js @@ -464,7 +464,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { props = isUndefined(_props) ? props : _props const insertOpts = self.getOpt('insertOpts', opts) insertOpts.returnChanges = true - return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts)) + _props = withoutRelations(mapper, props) + return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts)) }).then(function (cursor) { self._handleErrors(cursor) let record @@ -525,15 +526,15 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return change.new_val }) } - let result = new Response(records, cursor, 'createMany') - result.created = records.length - result = self.getOpt('raw', opts) ? result : result.data + let response = new Response(records, cursor, 'createMany') + response.created = records.length + response = self.respond(response, opts) // afterCreateMany lifecycle hook op = opts.op = 'afterCreateMany' - return resolve(self[op](mapper, props, opts, result)).then(function (_result) { + return resolve(self[op](mapper, props, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result + return isUndefined(_response) ? response : _response }) }) }, @@ -566,14 +567,14 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { self.dbg(op, id, opts) return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)) }).then(function (cursor) { - let result = new Response(undefined, cursor, 'destroy') - result = self.getOpt('raw', opts) ? result : undefined + let response = new Response(undefined, cursor, 'destroy') + response = self.respond(response, opts) // afterDestroy lifecycle hook op = opts.op = 'afterDestroy' - return resolve(self[op](mapper, id, opts, result)).then(function (_result) { + return resolve(self[op](mapper, id, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result + return isUndefined(_response) ? response : _response }) }) }, @@ -618,14 +619,14 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { .delete(self.getOpt('deleteOpts', opts)) .run(self.getOpt('runOpts', opts)) }).then(function (cursor) { - let result = new Response(undefined, cursor, 'destroyAll') - result = self.getOpt('raw', opts) ? result : undefined + let response = new Response(undefined, cursor, 'destroyAll') + response = self.respond(response, opts) // afterDestroyAll lifecycle hook op = opts.op = 'afterDestroyAll' - return resolve(self[op](mapper, query, opts, result)).then(function (_result) { + return resolve(self[op](mapper, query, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result + return isUndefined(_response) ? response : _response }) }) }, @@ -726,15 +727,15 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return Promise.all(tasks) }).then(function () { - let result = new Response(record, {}, 'find') - result.found = record ? 1 : 0 - result = self.getOpt('raw', opts) ? result : result.data + let response = new Response(record, {}, 'find') + response.found = record ? 1 : 0 + response = self.respond(response, opts) // afterFind lifecycle hook op = opts.op = 'afterFind' - return resolve(self[op](mapper, id, opts, result)).then(function (_result) { + return resolve(self[op](mapper, id, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result + return isUndefined(_response) ? response : _response }) }) }, @@ -866,15 +867,15 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return Promise.all(tasks) }).then(function () { records || (records = []) - let result = new Response(records, {}, 'findAll') - result.found = records.length - result = self.getOpt('raw', opts) ? result : result.data + let response = new Response(records, {}, 'findAll') + response.found = records.length + response = self.respond(response, opts) // afterFindAll lifecycle hook op = opts.op = 'afterFindAll' - return resolve(self[op](mapper, query, opts, result)).then(function (_result) { + return resolve(self[op](mapper, query, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result + return isUndefined(_response) ? response : _response }) }) }, @@ -937,15 +938,15 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } else { throw new Error('Not Found') } - let result = new Response(record, cursor, 'update') - result.updated = 1 - result = self.getOpt('raw', opts) ? result : result.data + let response = new Response(record, cursor, 'update') + response.updated = 1 + response = self.respond(response, opts) // afterUpdate lifecycle hook op = opts.op = 'afterUpdate' - return resolve(self[op](mapper, id, props, opts, result)).then(function (_result) { + return resolve(self[op](mapper, id, props, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result + return isUndefined(_response) ? response : _response }) }) }, @@ -996,15 +997,15 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { if (cursor && cursor.changes && cursor.changes.length) { records = cursor.changes.map(function (change) { return change.new_val }) } - let result = new Response(records, cursor, 'update') - result.updated = records.length - result = self.getOpt('raw', opts) ? result : result.data + let response = new Response(records, cursor, 'update') + response.updated = records.length + response = self.respond(response, opts) // afterUpdateAll lifecycle hook op = opts.op = 'afterUpdateAll' - return resolve(self[op](mapper, props, query, opts, result)).then(function (_result) { + return resolve(self[op](mapper, props, query, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result + return isUndefined(_response) ? response : _response }) }) }, @@ -1054,15 +1055,15 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { if (cursor && cursor.changes && cursor.changes.length) { updatedRecords = cursor.changes.map(function (change) { return change.new_val }) } - let result = new Response(updatedRecords || [], cursor, 'update') - result.updated = result.data.length - result = self.getOpt('raw', opts) ? result : result.data + let response = new Response(updatedRecords || [], cursor, 'update') + response.updated = response.data.length + response = self.respond(response, opts) // afterUpdateMany lifecycle hook op = opts.op = 'afterUpdateMany' - return resolve(self[op](mapper, records, opts, result)).then(function (_result) { + return resolve(self[op](mapper, records, opts, response)).then(function (_response) { // Allow for re-assignment from lifecycle hook - return isUndefined(_result) ? result : _result + return isUndefined(_response) ? response : _response }) }) }, From 63a5499edbaead3416a688d58cb6a7a2791cffa7 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Wed, 9 Mar 2016 21:09:59 -0800 Subject: [PATCH 21/27] 3.0.0-alpha.11 --- CHANGELOG.md | 7 +- dist/js-data-rethinkdb.js | 594 +++++++++++---------------------- dist/js-data-rethinkdb.js.map | 2 +- mocha.start.js | 14 +- package.json | 11 +- src/index.js | 599 ++++++++++++---------------------- 6 files changed, 409 insertions(+), 818 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cec362..0144c7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,12 @@ +##### 3.0.0-alpha.12 - 10 March 2016 + +###### Other +- Moved more common adapter functionality into js-data-adapter + ##### 3.0.0-alpha.11 - 06 March 2016 ###### Backwards compatible bug fixes -- create() now makes us of withoutRelations() +- create() now makes use of withoutRelations() - More use of Adapter#respond() more consistent ##### 3.0.0-alpha.10 - 06 March 2016 diff --git a/dist/js-data-rethinkdb.js b/dist/js-data-rethinkdb.js index 9259be9..14cb6f8 100644 --- a/dist/js-data-rethinkdb.js +++ b/dist/js-data-rethinkdb.js @@ -7,47 +7,25 @@ var Adapter = require('js-data-adapter'); var Adapter__default = _interopDefault(Adapter); var rethinkdbdash = _interopDefault(require('rethinkdbdash')); var underscore = _interopDefault(require('mout/string/underscore')); -var unique = _interopDefault(require('mout/array/unique')); - -var babelHelpers = {}; - -babelHelpers.defineProperty = function (obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - - return obj; -}; - -babelHelpers; var addHiddenPropsToTarget = jsData.utils.addHiddenPropsToTarget; var classCallCheck = jsData.utils.classCallCheck; var extend = jsData.utils.extend; var fillIn = jsData.utils.fillIn; -var forEachRelation = jsData.utils.forEachRelation; var forOwn = jsData.utils.forOwn; -var get = jsData.utils.get; -var isArray = jsData.utils.isArray; var isObject = jsData.utils.isObject; var isString = jsData.utils.isString; var isUndefined = jsData.utils.isUndefined; var omit = jsData.utils.omit; var plainCopy = jsData.utils.plainCopy; -var resolve = jsData.utils.resolve; var withoutRelations = function withoutRelations(mapper, props) { return omit(props, mapper.relationFields || []); }; +var __super__ = Adapter__default.prototype; + var DEFAULTS = { /** * RethinkDB authorization key. @@ -107,7 +85,7 @@ var DEFAULTS = { * * @name RethinkDBAdapter#port * @type {number} - * @default 10 + * @default 28015 */ port: 28015 }; @@ -191,13 +169,13 @@ var OPERATORS = { * @example * // Use Container instead of DataStore on the server * import {Container} from 'js-data' - * import RethinkdbDBAdapter from 'js-data-rethinkdb' + * import RethinkDBAdapter from 'js-data-rethinkdb' * * // Create a store to hold your Mappers * const store = new Container() * - * // Create an instance of RethinkdbDBAdapter with default settings - * const adapter = new RethinkdbDBAdapter() + * // Create an instance of RethinkDBAdapter with default settings + * const adapter = new RethinkDBAdapter() * * // Mappers in "store" will use the RethinkDB adapter by default * store.registerAdapter('rethinkdb', adapter, { default: true }) @@ -317,6 +295,8 @@ Object.defineProperty(RethinkDBAdapter, '__super__', { */ RethinkDBAdapter.extend = extend; +RethinkDBAdapter.OPERATORS = OPERATORS; + addHiddenPropsToTarget(RethinkDBAdapter.prototype, { _handleErrors: function _handleErrors(cursor) { if (cursor && cursor.errors > 0) { @@ -326,6 +306,137 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { throw new Error('Unknown RethinkDB Error'); } }, + _create: function _create(mapper, props, opts) { + var self = this; + props || (props = {}); + opts || (opts = {}); + + var insertOpts = self.getOpt('insertOpts', opts); + insertOpts.returnChanges = true; + + return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts)).then(function (cursor) { + self._handleErrors(cursor); + var record = void 0; + if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { + record = cursor.changes[0].new_val; + } + return [record, cursor]; + }); + }, + _createMany: function _createMany(mapper, props, opts) { + var self = this; + props || (props = {}); + opts || (opts = {}); + + var insertOpts = self.getOpt('insertOpts', opts); + insertOpts.returnChanges = true; + + return self.selectTable(mapper, opts).insert(props, insertOpts).run(self.getOpt('runOpts', opts)).then(function (cursor) { + self._handleErrors(cursor); + var records = []; + if (cursor && cursor.changes && cursor.changes.length && cursor.changes) { + records = cursor.changes.map(function (change) { + return change.new_val; + }); + } + return [records, cursor]; + }); + }, + _destroy: function _destroy(mapper, id, opts) { + var self = this; + opts || (opts = {}); + + return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)).then(function (cursor) { + self._handleErrors(cursor); + return [undefined, cursor]; + }); + }, + _destroyAll: function _destroyAll(mapper, query, opts) { + var self = this; + query || (query = {}); + opts || (opts = {}); + + return self.filterSequence(self.selectTable(mapper, opts), query).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)).then(function (cursor) { + self._handleErrors(cursor); + return [undefined, cursor]; + }); + }, + _find: function _find(mapper, id, opts) { + var self = this; + opts || (opts = {}); + + return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts)).then(function (record) { + return [record, {}]; + }); + }, + _findAll: function _findAll(mapper, query, opts) { + var self = this; + opts || (opts = {}); + query || (query = {}); + + return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts)).then(function (records) { + return [records, {}]; + }); + }, + _update: function _update(mapper, id, props, opts) { + var self = this; + props || (props = {}); + opts || (opts = {}); + + var updateOpts = self.getOpt('updateOpts', opts); + updateOpts.returnChanges = true; + + return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts)).then(function (cursor) { + var record = void 0; + self._handleErrors(cursor); + if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { + record = cursor.changes[0].new_val; + } else { + throw new Error('Not Found'); + } + return [record, cursor]; + }); + }, + _updateAll: function _updateAll(mapper, props, query, opts) { + var self = this; + props || (props = {}); + query || (query = {}); + opts || (opts = {}); + + var updateOpts = self.getOpt('updateOpts', opts); + updateOpts.returnChanges = true; + + return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts)).then(function (cursor) { + var records = []; + self._handleErrors(cursor); + if (cursor && cursor.changes && cursor.changes.length) { + records = cursor.changes.map(function (change) { + return change.new_val; + }); + } + return [records, cursor]; + }); + }, + _updateMany: function _updateMany(mapper, records, opts) { + var self = this; + records || (records = []); + opts || (opts = {}); + + var insertOpts = self.getOpt('insertOpts', opts); + insertOpts.returnChanges = true; + insertOpts.conflict = 'update'; + + return self.selectTable(mapper, opts).insert(records, insertOpts).run(self.getOpt('runOpts', opts)).then(function (cursor) { + records = []; + self._handleErrors(cursor); + if (cursor && cursor.changes && cursor.changes.length) { + records = cursor.changes.map(function (change) { + return change.new_val; + }); + } + return [records, cursor]; + }); + }, selectDb: function selectDb(opts) { return this.r.db(isUndefined(opts.db) ? this.db : opts.db); }, @@ -404,6 +515,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } else { subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult; } + } else { + throw new Error('Operator ' + operator + ' not supported!'); } }); }); @@ -445,6 +558,38 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } return self.databases[db]; }, + waitForTable: function waitForTable(mapper, options) { + var _this = this; + + var table = isString(mapper) ? mapper : mapper.table || underscore(mapper.name); + options = options || {}; + var db = isUndefined(options.db) ? this.db : options.db; + return this.waitForDb(options).then(function () { + _this.tables[db] = _this.tables[db] || {}; + if (!_this.tables[db][table]) { + _this.tables[db][table] = _this.r.branch(_this.r.db(db).tableList().contains(table), true, _this.r.db(db).tableCreate(table)).run(); + } + return _this.tables[db][table]; + }); + }, + waitForIndex: function waitForIndex(table, index, options) { + var _this2 = this; + + options = options || {}; + var db = isUndefined(options.db) ? this.db : options.db; + return this.waitForDb(options).then(function () { + return _this2.waitForTable(table, options); + }).then(function () { + _this2.indices[db] = _this2.indices[db] || {}; + _this2.indices[db][table] = _this2.indices[db][table] || {}; + if (!_this2.tables[db][table][index]) { + _this2.tables[db][table][index] = _this2.r.branch(_this2.r.db(db).table(table).indexList().contains(index), true, _this2.r.db(db).table(table).indexCreate(index)).run().then(function () { + return _this2.r.db(db).table(table).indexWait(index).run(); + }); + } + return _this2.tables[db][table][index]; + }); + }, /** @@ -463,37 +608,11 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ create: function create(mapper, props, opts) { var self = this; - var op = void 0; props || (props = {}); opts || (opts = {}); return self.waitForTable(mapper, opts).then(function () { - // beforeCreate lifecycle hook - op = opts.op = 'beforeCreate'; - return resolve(self[op](mapper, props, opts)); - }).then(function (_props) { - // Allow for re-assignment from lifecycle hook - props = isUndefined(_props) ? props : _props; - var insertOpts = self.getOpt('insertOpts', opts); - insertOpts.returnChanges = true; - _props = withoutRelations(mapper, props); - return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts)); - }).then(function (cursor) { - self._handleErrors(cursor); - var record = void 0; - if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { - record = cursor.changes[0].new_val; - } - var response = new Adapter.Response(record, cursor, 'create'); - response.created = record ? 1 : 0; - response = self.respond(response, opts); - - // afterCreate lifecycle hook - op = opts.op = 'afterCreate'; - return resolve(self[op](mapper, props, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; - }); + return __super__.create.call(self, mapper, props, opts); }); }, @@ -514,41 +633,11 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ createMany: function createMany(mapper, props, opts) { var self = this; - var op = void 0; props || (props = {}); opts || (opts = {}); return self.waitForTable(mapper, opts).then(function () { - // beforeCreateMany lifecycle hook - op = opts.op = 'beforeCreateMany'; - return resolve(self[op](mapper, props, opts)); - }).then(function (_props) { - // Allow for re-assignment from lifecycle hook - props = isUndefined(_props) ? props : _props; - var insertOpts = self.getOpt('insertOpts', opts); - insertOpts.returnChanges = true; - _props = props.map(function (record) { - return withoutRelations(mapper, record); - }); - return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts)); - }).then(function (cursor) { - self._handleErrors(cursor); - var records = []; - if (cursor && cursor.changes && cursor.changes.length && cursor.changes) { - records = cursor.changes.map(function (change) { - return change.new_val; - }); - } - var response = new Adapter.Response(records, cursor, 'createMany'); - response.created = records.length; - response = self.respond(response, opts); - - // afterCreateMany lifecycle hook - op = opts.op = 'afterCreateMany'; - return resolve(self[op](mapper, props, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; - }); + return __super__.createMany.call(self, mapper, props, opts); }); }, @@ -569,27 +658,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ destroy: function destroy(mapper, id, opts) { var self = this; - var op = void 0; opts || (opts = {}); return self.waitForTable(mapper, opts).then(function () { - // beforeDestroy lifecycle hook - op = opts.op = 'beforeDestroy'; - return resolve(self[op](mapper, id, opts)); - }).then(function () { - op = opts.op = 'destroy'; - self.dbg(op, id, opts); - return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)); - }).then(function (cursor) { - var response = new Adapter.Response(undefined, cursor, 'destroy'); - response = self.respond(response, opts); - - // afterDestroy lifecycle hook - op = opts.op = 'afterDestroy'; - return resolve(self[op](mapper, id, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; - }); + return __super__.destroy.call(self, mapper, id, opts); }); }, @@ -618,28 +690,11 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ destroyAll: function destroyAll(mapper, query, opts) { var self = this; - var op = void 0; - query || (query = {}); opts || (opts = {}); + query || (query = {}); return self.waitForTable(mapper, opts).then(function () { - // beforeDestroyAll lifecycle hook - op = opts.op = 'beforeDestroyAll'; - return resolve(self[op](mapper, query, opts)); - }).then(function () { - op = opts.op = 'destroyAll'; - self.dbg(op, query, opts); - return self.filterSequence(self.selectTable(mapper, opts), query).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)); - }).then(function (cursor) { - var response = new Adapter.Response(undefined, cursor, 'destroyAll'); - response = self.respond(response, opts); - - // afterDestroyAll lifecycle hook - op = opts.op = 'afterDestroyAll'; - return resolve(self[op](mapper, query, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; - }); + return __super__.destroyAll.call(self, mapper, query, opts); }); }, @@ -660,8 +715,6 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ find: function find(mapper, id, opts) { var self = this; - var record = void 0, - op = void 0; opts || (opts = {}); opts.with || (opts.with = []); @@ -683,72 +736,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } }); return Promise.all(tasks).then(function () { - // beforeFind lifecycle hook - op = opts.op = 'beforeFind'; - return resolve(self[op](mapper, id, opts)); - }).then(function () { - op = opts.op = 'find'; - self.dbg(op, id, opts); - return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts)); - }).then(function (_record) { - if (!_record) { - return; - } - record = _record; - var tasks = []; - - forEachRelation(mapper, opts, function (def, __opts) { - var relatedMapper = def.getRelation(); - var task = void 0; - - if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { - if (def.type === 'hasOne') { - task = self.loadHasOne(mapper, def, record, __opts); - } else { - task = self.loadHasMany(mapper, def, record, __opts); - } - } else if (def.type === 'hasMany' && def.localKeys) { - var localKeys = []; - var itemKeys = get(record, def.localKeys) || []; - itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys); - localKeys = localKeys.concat(itemKeys); - task = self.findAll(relatedMapper, { - where: babelHelpers.defineProperty({}, relatedMapper.idAttribute, { - 'in': unique(localKeys).filter(function (x) { - return x; - }) - }) - }, __opts).then(function (relatedItems) { - def.setLocalField(record, relatedItems); - }); - } else if (def.type === 'hasMany' && def.foreignKeys) { - task = self.findAll(relatedMapper, { - where: babelHelpers.defineProperty({}, def.foreignKeys, { - 'contains': self.makeHasManyForeignKeys(mapper, def, record) - }) - }, __opts).then(function (relatedItems) { - def.setLocalField(record, relatedItems); - }); - } else if (def.type === 'belongsTo') { - task = self.loadBelongsTo(mapper, def, record, __opts); - } - if (task) { - tasks.push(task); - } - }); - - return Promise.all(tasks); - }).then(function () { - var response = new Adapter.Response(record, {}, 'find'); - response.found = record ? 1 : 0; - response = self.respond(response, opts); - - // afterFind lifecycle hook - op = opts.op = 'afterFind'; - return resolve(self[op](mapper, id, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; - }); + return __super__.find.call(self, mapper, id, opts); }); }, @@ -779,9 +767,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { var self = this; opts || (opts = {}); opts.with || (opts.with = []); + query || (query = {}); - var records = []; - var op = void 0; var relationList = mapper.relationList || []; var tasks = [self.waitForTable(mapper, opts)]; @@ -800,96 +787,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } }); return Promise.all(tasks).then(function () { - // beforeFindAll lifecycle hook - op = opts.op = 'beforeFindAll'; - return resolve(self[op](mapper, query, opts)); - }).then(function () { - op = opts.op = 'findAll'; - self.dbg(op, query, opts); - return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts)); - }).then(function (_records) { - records = _records; - var tasks = []; - forEachRelation(mapper, opts, function (def, __opts) { - var relatedMapper = def.getRelation(); - var idAttribute = mapper.idAttribute; - var task = void 0; - if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { - if (def.type === 'hasMany') { - task = self.loadHasMany(mapper, def, records, __opts); - } else { - task = self.loadHasOne(mapper, def, records, __opts); - } - } else if (def.type === 'hasMany' && def.localKeys) { - (function () { - var localKeys = []; - records.forEach(function (item) { - var itemKeys = item[def.localKeys] || []; - itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys); - localKeys = localKeys.concat(itemKeys); - }); - task = self.findAll(relatedMapper, { - where: babelHelpers.defineProperty({}, relatedMapper.idAttribute, { - 'in': unique(localKeys).filter(function (x) { - return x; - }) - }) - }, __opts).then(function (relatedItems) { - records.forEach(function (item) { - var attached = []; - var itemKeys = get(item, def.localKeys) || []; - itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys); - relatedItems.forEach(function (relatedItem) { - if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) { - attached.push(relatedItem); - } - }); - def.setLocalField(item, attached); - }); - return relatedItems; - }); - })(); - } else if (def.type === 'hasMany' && def.foreignKeys) { - task = self.findAll(relatedMapper, { - where: babelHelpers.defineProperty({}, def.foreignKeys, { - 'isectNotEmpty': records.map(function (record) { - return self.makeHasManyForeignKeys(mapper, def, record); - }) - }) - }, __opts).then(function (relatedItems) { - var foreignKeysField = def.foreignKeys; - records.forEach(function (record) { - var _relatedItems = []; - var id = get(record, idAttribute); - relatedItems.forEach(function (relatedItem) { - var foreignKeys = get(relatedItems, foreignKeysField) || []; - if (foreignKeys.indexOf(id) !== -1) { - _relatedItems.push(relatedItem); - } - }); - def.setLocalField(record, _relatedItems); - }); - }); - } else if (def.type === 'belongsTo') { - task = self.loadBelongsTo(mapper, def, records, __opts); - } - if (task) { - tasks.push(task); - } - }); - return Promise.all(tasks); - }).then(function () { - records || (records = []); - var response = new Adapter.Response(records, {}, 'findAll'); - response.found = records.length; - response = self.respond(response, opts); - - // afterFindAll lifecycle hook - op = opts.op = 'afterFindAll'; - return resolve(self[op](mapper, query, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; - }); + return __super__.findAll.call(self, mapper, query, opts); }); }, @@ -933,36 +831,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { var self = this; props || (props = {}); opts || (opts = {}); - var op = void 0; return self.waitForTable(mapper, opts).then(function () { - // beforeUpdate lifecycle hook - op = opts.op = 'beforeUpdate'; - return resolve(self[op](mapper, id, props, opts)); - }).then(function (_props) { - // Allow for re-assignment from lifecycle hook - props = isUndefined(_props) ? props : _props; - var updateOpts = self.getOpt('updateOpts', opts); - updateOpts.returnChanges = true; - return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts)); - }).then(function (cursor) { - var record = void 0; - self._handleErrors(cursor); - if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { - record = cursor.changes[0].new_val; - } else { - throw new Error('Not Found'); - } - var response = new Adapter.Response(record, cursor, 'update'); - response.updated = 1; - response = self.respond(response, opts); - - // afterUpdate lifecycle hook - op = opts.op = 'afterUpdate'; - return resolve(self[op](mapper, id, props, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; - }); + return __super__.update.call(self, mapper, id, props, opts); }); }, @@ -995,36 +866,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { props || (props = {}); query || (query = {}); opts || (opts = {}); - var op = void 0; return self.waitForTable(mapper, opts).then(function () { - // beforeUpdateAll lifecycle hook - op = opts.op = 'beforeUpdateAll'; - return resolve(self[op](mapper, props, query, opts)); - }).then(function (_props) { - // Allow for re-assignment from lifecycle hook - props = isUndefined(_props) ? props : _props; - var updateOpts = self.getOpt('updateOpts', opts); - updateOpts.returnChanges = true; - return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts)); - }).then(function (cursor) { - var records = []; - self._handleErrors(cursor); - if (cursor && cursor.changes && cursor.changes.length) { - records = cursor.changes.map(function (change) { - return change.new_val; - }); - } - var response = new Adapter.Response(records, cursor, 'update'); - response.updated = records.length; - response = self.respond(response, opts); - - // afterUpdateAll lifecycle hook - op = opts.op = 'afterUpdateAll'; - return resolve(self[op](mapper, props, query, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; - }); + return __super__.updateAll.call(self, mapper, props, query, opts); }); }, @@ -1047,82 +891,12 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { var self = this; records || (records = []); opts || (opts = {}); - var op = void 0; - var idAttribute = mapper.idAttribute; - - records = records.filter(function (record) { - return get(record, idAttribute); - }); return self.waitForTable(mapper, opts).then(function () { - // beforeUpdateMany lifecycle hook - op = opts.op = 'beforeUpdateMany'; - return resolve(self[op](mapper, records, opts)); - }).then(function (_records) { - // Allow for re-assignment from lifecycle hook - _records = isUndefined(_records) ? records : _records; - var insertOpts = self.getOpt('insertOpts', opts); - insertOpts.returnChanges = true; - insertOpts.conflict = 'update'; - _records = _records.map(function (record) { - return withoutRelations(mapper, record); - }); - return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts)); - }).then(function (cursor) { - var updatedRecords = void 0; - self._handleErrors(cursor); - if (cursor && cursor.changes && cursor.changes.length) { - updatedRecords = cursor.changes.map(function (change) { - return change.new_val; - }); - } - var response = new Adapter.Response(updatedRecords || [], cursor, 'update'); - response.updated = response.data.length; - response = self.respond(response, opts); - - // afterUpdateMany lifecycle hook - op = opts.op = 'afterUpdateMany'; - return resolve(self[op](mapper, records, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response; - }); - }); - }, - waitForTable: function waitForTable(mapper, options) { - var _this = this; - - var table = isString(mapper) ? mapper : mapper.table || underscore(mapper.name); - options = options || {}; - var db = isUndefined(options.db) ? this.db : options.db; - return this.waitForDb(options).then(function () { - _this.tables[db] = _this.tables[db] || {}; - if (!_this.tables[db][table]) { - _this.tables[db][table] = _this.r.branch(_this.r.db(db).tableList().contains(table), true, _this.r.db(db).tableCreate(table)).run(); - } - return _this.tables[db][table]; - }); - }, - waitForIndex: function waitForIndex(table, index, options) { - var _this2 = this; - - options = options || {}; - var db = isUndefined(options.db) ? this.db : options.db; - return this.waitForDb(options).then(function () { - return _this2.waitForTable(table, options); - }).then(function () { - _this2.indices[db] = _this2.indices[db] || {}; - _this2.indices[db][table] = _this2.indices[db][table] || {}; - if (!_this2.tables[db][table][index]) { - _this2.tables[db][table][index] = _this2.r.branch(_this2.r.db(db).table(table).indexList().contains(index), true, _this2.r.db(db).table(table).indexCreate(index)).run().then(function () { - return _this2.r.db(db).table(table).indexWait(index).run(); - }); - } - return _this2.tables[db][table][index]; + return __super__.updateMany.call(self, mapper, records, opts); }); } }); -RethinkDBAdapter.OPERATORS = OPERATORS; - module.exports = RethinkDBAdapter; //# sourceMappingURL=js-data-rethinkdb.js.map \ No newline at end of file diff --git a/dist/js-data-rethinkdb.js.map b/dist/js-data-rethinkdb.js.map index b1f95fb..ffd4d06 100644 --- a/dist/js-data-rethinkdb.js.map +++ b/dist/js-data-rethinkdb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved,\n Response\n} from 'js-data-adapter'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\nimport unique from 'mout/array/unique'\n\nconst {\n addHiddenPropsToTarget,\n classCallCheck,\n extend,\n fillIn,\n forEachRelation,\n forOwn,\n get,\n isArray,\n isObject,\n isString,\n isUndefined,\n omit,\n plainCopy,\n resolve\n} = utils\n\nconst withoutRelations = function (mapper, props) {\n return omit(props, mapper.relationFields || [])\n}\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 10\n */\n port: 28015\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkdbDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkdbDBAdapter with default settings\n * const adapter = new RethinkdbDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nexport default function RethinkDBAdapter (opts) {\n const self = this\n classCallCheck(self, RethinkDBAdapter)\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n// Setup prototype inheritance from Adapter\nRethinkDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: RethinkDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(RethinkDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the RethinkDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the RethinkDBAdapter itself.\n * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = extend\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreate lifecycle hook\n op = opts.op = 'beforeCreate'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n _props = withoutRelations(mapper, props)\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n let response = new Response(record, cursor, 'create')\n response.created = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterCreate lifecycle hook\n op = opts.op = 'afterCreate'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n let op\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeCreateMany lifecycle hook\n op = opts.op = 'beforeCreateMany'\n return resolve(self[op](mapper, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n _props = props.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n let response = new Response(records, cursor, 'createMany')\n response.created = records.length\n response = self.respond(response, opts)\n\n // afterCreateMany lifecycle hook\n op = opts.op = 'afterCreateMany'\n return resolve(self[op](mapper, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n let op\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroy lifecycle hook\n op = opts.op = 'beforeDestroy'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'destroy'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let response = new Response(undefined, cursor, 'destroy')\n response = self.respond(response, opts)\n\n // afterDestroy lifecycle hook\n op = opts.op = 'afterDestroy'\n return resolve(self[op](mapper, id, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n let op\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeDestroyAll lifecycle hook\n op = opts.op = 'beforeDestroyAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'destroyAll'\n self.dbg(op, query, opts)\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let response = new Response(undefined, cursor, 'destroyAll')\n response = self.respond(response, opts)\n\n // afterDestroyAll lifecycle hook\n op = opts.op = 'afterDestroyAll'\n return resolve(self[op](mapper, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n let record, op\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFind lifecycle hook\n op = opts.op = 'beforeFind'\n return resolve(self[op](mapper, id, opts))\n }).then(function () {\n op = opts.op = 'find'\n self.dbg(op, id, opts)\n return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts))\n }).then(function (_record) {\n if (!_record) {\n return\n }\n record = _record\n const tasks = []\n\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n let task\n\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasOne') {\n task = self.loadHasOne(mapper, def, record, __opts)\n } else {\n task = self.loadHasMany(mapper, def, record, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n let itemKeys = get(record, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'contains': self.makeHasManyForeignKeys(mapper, def, record)\n }\n }\n }, __opts).then(function (relatedItems) {\n def.setLocalField(record, relatedItems)\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, record, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n\n return Promise.all(tasks)\n }).then(function () {\n let response = new Response(record, {}, 'find')\n response.found = record ? 1 : 0\n response = self.respond(response, opts)\n\n // afterFind lifecycle hook\n op = opts.op = 'afterFind'\n return resolve(self[op](mapper, id, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n let records = []\n let op\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n // beforeFindAll lifecycle hook\n op = opts.op = 'beforeFindAll'\n return resolve(self[op](mapper, query, opts))\n }).then(function () {\n op = opts.op = 'findAll'\n self.dbg(op, query, opts)\n return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts))\n }).then(function (_records) {\n records = _records\n const tasks = []\n forEachRelation(mapper, opts, function (def, __opts) {\n const relatedMapper = def.getRelation()\n const idAttribute = mapper.idAttribute\n let task\n if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) {\n if (def.type === 'hasMany') {\n task = self.loadHasMany(mapper, def, records, __opts)\n } else {\n task = self.loadHasOne(mapper, def, records, __opts)\n }\n } else if (def.type === 'hasMany' && def.localKeys) {\n let localKeys = []\n records.forEach(function (item) {\n let itemKeys = item[def.localKeys] || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n localKeys = localKeys.concat(itemKeys)\n })\n task = self.findAll(relatedMapper, {\n where: {\n [relatedMapper.idAttribute]: {\n 'in': unique(localKeys).filter(function (x) { return x })\n }\n }\n }, __opts).then(function (relatedItems) {\n records.forEach(function (item) {\n let attached = []\n let itemKeys = get(item, def.localKeys) || []\n itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys)\n relatedItems.forEach(function (relatedItem) {\n if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) {\n attached.push(relatedItem)\n }\n })\n def.setLocalField(item, attached)\n })\n return relatedItems\n })\n } else if (def.type === 'hasMany' && def.foreignKeys) {\n task = self.findAll(relatedMapper, {\n where: {\n [def.foreignKeys]: {\n 'isectNotEmpty': records.map(function (record) {\n return self.makeHasManyForeignKeys(mapper, def, record)\n })\n }\n }\n }, __opts).then(function (relatedItems) {\n const foreignKeysField = def.foreignKeys\n records.forEach(function (record) {\n const _relatedItems = []\n const id = get(record, idAttribute)\n relatedItems.forEach(function (relatedItem) {\n const foreignKeys = get(relatedItems, foreignKeysField) || []\n if (foreignKeys.indexOf(id) !== -1) {\n _relatedItems.push(relatedItem)\n }\n })\n def.setLocalField(record, _relatedItems)\n })\n })\n } else if (def.type === 'belongsTo') {\n task = self.loadBelongsTo(mapper, def, records, __opts)\n }\n if (task) {\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(function () {\n records || (records = [])\n let response = new Response(records, {}, 'findAll')\n response.found = records.length\n response = self.respond(response, opts)\n\n // afterFindAll lifecycle hook\n op = opts.op = 'afterFindAll'\n return resolve(self[op](mapper, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdate lifecycle hook\n op = opts.op = 'beforeUpdate'\n return resolve(self[op](mapper, id, props, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n let response = new Response(record, cursor, 'update')\n response.updated = 1\n response = self.respond(response, opts)\n\n // afterUpdate lifecycle hook\n op = opts.op = 'afterUpdate'\n return resolve(self[op](mapper, id, props, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n let op\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateAll lifecycle hook\n op = opts.op = 'beforeUpdateAll'\n return resolve(self[op](mapper, props, query, opts))\n }).then(function (_props) {\n // Allow for re-assignment from lifecycle hook\n props = isUndefined(_props) ? props : _props\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n let response = new Response(records, cursor, 'update')\n response.updated = records.length\n response = self.respond(response, opts)\n\n // afterUpdateAll lifecycle hook\n op = opts.op = 'afterUpdateAll'\n return resolve(self[op](mapper, props, query, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n let op\n const idAttribute = mapper.idAttribute\n\n records = records.filter(function (record) {\n return get(record, idAttribute)\n })\n\n return self.waitForTable(mapper, opts).then(function () {\n // beforeUpdateMany lifecycle hook\n op = opts.op = 'beforeUpdateMany'\n return resolve(self[op](mapper, records, opts))\n }).then(function (_records) {\n // Allow for re-assignment from lifecycle hook\n _records = isUndefined(_records) ? records : _records\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n _records = _records.map(function (record) {\n return withoutRelations(mapper, record)\n })\n return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts))\n }).then(function (cursor) {\n let updatedRecords\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n updatedRecords = cursor.changes.map(function (change) { return change.new_val })\n }\n let response = new Response(updatedRecords || [], cursor, 'update')\n response.updated = response.data.length\n response = self.respond(response, opts)\n\n // afterUpdateMany lifecycle hook\n op = opts.op = 'afterUpdateMany'\n return resolve(self[op](mapper, records, opts, response)).then(function (_response) {\n // Allow for re-assignment from lifecycle hook\n return isUndefined(_response) ? response : _response\n })\n })\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n }\n})\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n"],"names":["utils","Adapter","reserved","Response"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAWE,yBAcEA,aAdF;IACA,iBAaEA,aAbF;IACA,SAYEA,aAZF;IACA,SAWEA,aAXF;IACA,kBAUEA,aAVF;IACA,SASEA,aATF;IACA,MAQEA,aARF;IACA,UAOEA,aAPF;IACA,WAMEA,aANF;IACA,WAKEA,aALF;IACA,cAIEA,aAJF;IACA,OAGEA,aAHF;IACA,YAEEA,aAFF;IACA,UACEA,aADF;;;AAGF,IAAM,mBAAmB,SAAnB,gBAAmB,CAAU,MAAV,EAAkB,KAAlB,EAAyB;SACzC,KAAK,KAAL,EAAY,OAAO,cAAP,IAAyB,EAAzB,CAAnB,CADgD;CAAzB;;AAIzB,IAAM,WAAW;;;;;;;WAON,EAAT;;;;;;;;;cASY,EAAZ;;;;;;;;;MASI,MAAJ;;;;;;;;;QASM,WAAN;;;;;;;;;OASK,EAAL;;;;;;;;;OASK,EAAL;;;;;;;;;QASM,KAAN;CA7DI;;AAgEN,IAAM,uBAAuB,EAAvB;AACN,IAAM,uBAAuB,EAAvB;AACN,IAAM,uBAAuB,EAAvB;AACN,IAAM,oBAAoB,EAApB;;AAEN,IAAM,QAAQ,SAAR,KAAQ,CAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;SACrC,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CAD4C;CAAhC;;AAId,IAAM,WAAW,SAAX,QAAW,CAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;SACxC,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CAD+C;CAAhC;;;;;;;;;;;;;;;;;;;;;;;;;AA2BjB,IAAM,YAAY;QACV,KAAN;SACO,KAAP;QACM,QAAN;SACO,QAAP;OACK,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC5B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADmC;GAAhC;QAGC,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC7B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADoC;GAAhC;OAGD,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC5B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADmC;GAAhC;QAGC,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC7B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADoC;GAAhC;gBAGQ,oBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACrC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,eAAvB,CAAuC,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAtB,CAAvC,EAAkE,KAAlE,GAA0E,EAA1E,CAA6E,CAA7E,CAAP,CAD4C;GAAhC;mBAGG,uBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACxC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,eAAvB,CAAuC,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAtB,CAAvC,EAAkE,KAAlE,GAA0E,EAA1E,CAA6E,CAA7E,CAAP,CAD+C;GAAhC;QAGX,aAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC7B,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAE,IAAF,CAAO,EAAP,CAAtB,EAAkC,QAAlC,CAA2C,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,CAA3C,CAAP,CADoC;GAAhC;WAGG,eAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAChC,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAE,IAAF,CAAO,EAAP,CAAtB,EAAkC,QAAlC,CAA2C,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,CAA3C,EAAqE,GAArE,EAAP,CADuC;GAAhC;cAGG,kBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACnC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,QAAvB,CAAgC,KAAhC,CAAP,CAD0C;GAAhC;iBAGG,qBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACtC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,QAAvB,CAAgC,KAAhC,EAAuC,GAAvC,EAAP,CAD6C;GAAhC;CAhCX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwEN,AAAe,SAAS,gBAAT,CAA2B,IAA3B,EAAiC;MACxC,OAAO,IAAP,CADwC;iBAE/B,IAAf,EAAqB,gBAArB,EAF8C;WAGrC,OAAO,EAAP,CAAT,CAH8C;SAIvC,IAAP,EAAa,QAAb,EAJ8C;mBAKtC,IAAR,CAAa,IAAb,EAAmB,IAAnB;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAd8C;SAevC,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAxB8C;SAyBvC,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAlC8C;SAmCvC,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,OAAL,KAAiB,KAAK,OAAL,GAAe,EAAf,CAAjB,CA5C8C;SA6CvC,KAAK,OAAL,EAAc,iBAArB;;;;;;;;;MASA,CAAK,SAAL,KAAmB,KAAK,SAAL,GAAiB,EAAjB,CAAnB;;;;;;;;;MASA,CAAK,CAAL,GAAS,cAAc,IAAd,CAAT,CA/D8C;OAgEzC,SAAL,GAAiB,EAAjB,CAhE8C;OAiEzC,MAAL,GAAc,EAAd,CAjE8C;OAkEzC,OAAL,GAAe,EAAf,CAlE8C;CAAjC;;;AAsEf,iBAAiB,SAAjB,GAA6B,OAAO,MAAP,CAAcC,iBAAQ,SAAR,EAAmB;eAC/C;WACJ,gBAAP;gBACY,KAAZ;cACU,IAAV;kBACc,IAAd;GAJF;CAD2B,CAA7B;;AASA,OAAO,cAAP,CAAsB,gBAAtB,EAAwC,WAAxC,EAAqD;gBACrC,IAAd;SACOA,gBAAP;CAFF;;;;;;;;;;;;;AAgBA,iBAAiB,MAAjB,GAA0B,MAA1B;;AAEA,uBAAuB,iBAAiB,SAAjB,EAA4B;wCAClC,QAAQ;QACjB,UAAU,OAAO,MAAP,GAAgB,CAAhB,EAAmB;UAC3B,OAAO,WAAP,EAAoB;cAChB,IAAI,KAAJ,CAAU,OAAO,WAAP,CAAhB,CADsB;OAAxB;YAGM,IAAI,KAAJ,CAAU,yBAAV,CAAN,CAJ+B;KAAjC;GAF+C;8BAUvC,MAAM;WACP,KAAK,CAAL,CAAO,EAAP,CAAU,YAAY,KAAK,EAAL,CAAZ,GAAuB,KAAK,EAAL,GAAU,KAAK,EAAL,CAAlD,CADc;GAViC;oCAcpC,QAAQ,MAAM;WAClB,KAAK,QAAL,CAAc,IAAd,EAAoB,KAApB,CAA0B,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAAjC,CADyB;GAdsB;;;;;;;;;;;;;;;;;;;;0CAmCjC,UAAU,OAAO,MAAM;QAC/B,OAAO,IAAP,CAD+B;QAE/B,IAAI,KAAK,CAAL,CAF2B;;YAI7B,UAAU,SAAS,EAAT,CAAlB,CAJqC;aAK5B,OAAO,EAAP,CAAT,CALqC;SAMhC,SAAL,KAAmB,KAAK,SAAL,GAAiB,EAAjB,CAAnB,CANqC;UAO/B,KAAN,KAAgB,MAAM,KAAN,GAAc,EAAd,CAAhB,CAPqC;UAQ/B,OAAN,KAAkB,MAAM,OAAN,GAAgB,MAAM,IAAN,CAAlC,CARqC;UAS/B,OAAN,KAAkB,MAAM,OAAN,GAAgB,EAAhB,CAAlB,CATqC;UAU/B,IAAN,KAAe,MAAM,IAAN,GAAa,MAAM,MAAN,CAA5B;;;UAGA,CAAO,KAAP,EAAc,UAAU,MAAV,EAAkB,OAAlB,EAA2B;UACnCC,iBAAS,OAAT,CAAiB,OAAjB,MAA8B,CAAC,CAAD,EAAI;YAChC,SAAS,MAAT,CAAJ,EAAsB;gBACd,KAAN,CAAY,OAAZ,IAAuB,MAAvB,CADoB;SAAtB,MAEO;gBACC,KAAN,CAAY,OAAZ,IAAuB;kBACf,MAAN;WADF,CADK;SAFP;eAOO,MAAM,OAAN,CAAP,CARoC;OAAtC;KADY,CAAd,CAbqC;;QA0BjC,MAAM,QAAN;;;QAGA,OAAO,IAAP,CAAY,MAAM,KAAN,CAAZ,CAAyB,MAAzB,KAAoC,CAApC,EAAuC;;YAEnC,IAAI,MAAJ,CAAW,UAAU,GAAV,EAAe;YAC1B,iBAAJ;;cAEA,CAAO,MAAM,KAAN,EAAa,UAAU,QAAV,EAAoB,KAApB,EAA2B;cACzC,CAAC,SAAS,QAAT,CAAD,EAAqB;uBACZ,EAAE,MAAM,QAAN,EAAb,CADuB;WAAzB;;gBAIA,CAAO,QAAP,EAAiB,UAAU,KAAV,EAAiB,QAAjB,EAA2B;gBACtC,OAAO,KAAP,CADsC;gBAEtC,YAAY,SAAS,CAAT,MAAgB,GAAhB,EAAqB;yBACxB,SAAS,MAAT,CAAgB,CAAhB,CAAX,CADmC;qBAE5B,IAAP,CAFmC;aAArC;gBAII,cAAc,KAAK,WAAL,CAAiB,QAAjB,EAA2B,IAA3B,CAAd,CANsC;gBAOtC,WAAJ,EAAiB;kBACT,kBAAkB,YAAY,CAAZ,EAAe,GAAf,EAAoB,KAApB,EAA2B,KAA3B,CAAlB,CADS;kBAEX,IAAJ,EAAU;2BACG,WAAW,SAAS,EAAT,CAAY,eAAZ,CAAX,GAA0C,eAA1C,CADH;eAAV,MAEO;2BACM,WAAW,SAAS,GAAT,CAAa,eAAb,CAAX,GAA2C,eAA3C,CADN;eAFP;aAFF;WAPe,CAAjB,CAL6C;SAA3B,CAApB,CAH8B;eAyBvB,YAAY,IAAZ,CAzBuB;OAAf,CAAjB,CAFyC;KAA3C;;;QAgCI,MAAM,OAAN,EAAe;UACb,SAAS,MAAM,OAAN,CAAb,EAA6B;cACrB,OAAN,GAAgB,CACd,CAAC,MAAM,OAAN,EAAe,KAAhB,CADc,CAAhB,CAD2B;OAA7B;WAKK,IAAI,IAAI,CAAJ,EAAO,IAAI,MAAM,OAAN,CAAc,MAAd,EAAsB,GAA1C,EAA+C;YACzC,SAAS,MAAM,OAAN,CAAc,CAAd,CAAT,CAAJ,EAAgC;gBACxB,OAAN,CAAc,CAAd,IAAmB,CAAC,MAAM,OAAN,CAAc,CAAd,CAAD,EAAmB,KAAnB,CAAnB,CAD8B;SAAhC;cAGM,CAAC,MAAM,OAAN,CAAc,CAAd,EAAiB,CAAjB,KAAuB,EAAvB,CAAD,CAA4B,WAA5B,OAA8C,MAA9C,GAAuD,IAAI,OAAJ,CAAY,EAAE,IAAF,CAAO,MAAM,OAAN,CAAc,CAAd,EAAiB,CAAjB,CAAP,CAAZ,CAAvD,GAAkG,IAAI,OAAJ,CAAY,MAAM,OAAN,CAAc,CAAd,EAAiB,CAAjB,CAAZ,CAAlG,CAJuC;OAA/C;KANF;;;QAeI,MAAM,IAAN,EAAY;YACR,IAAI,IAAJ,CAAS,CAAC,MAAM,IAAN,CAAhB,CADc;KAAhB;;;QAKI,MAAM,KAAN,EAAa;YACT,IAAI,KAAJ,CAAU,CAAC,MAAM,KAAN,CAAjB,CADe;KAAjB;;WAIO,GAAP,CArFqC;GAnCU;gCA2HtC,MAAM;QACT,OAAO,IAAP,CADS;aAEN,OAAO,EAAP,CAAT,CAFe;QAGT,KAAK,YAAY,KAAK,EAAL,CAAZ,GAAuB,KAAK,EAAL,GAAU,KAAK,EAAL,CAH7B;QAIX,CAAC,KAAK,SAAL,CAAe,EAAf,CAAD,EAAqB;WAClB,SAAL,CAAe,EAAf,IAAqB,KAAK,CAAL,CAAO,MAAP,CACnB,KAAK,CAAL,CAAO,MAAP,GAAgB,QAAhB,CAAyB,EAAzB,CADmB,EAEnB,IAFmB,EAGnB,KAAK,CAAL,CAAO,QAAP,CAAgB,EAAhB,CAHmB,EAInB,GAJmB,EAArB,CADuB;KAAzB;WAOO,KAAK,SAAL,CAAe,EAAf,CAAP,CAXe;GA3HgC;;;;;;;;;;;;;;;;;0BAuJzC,QAAQ,OAAO,MAAM;QACrB,OAAO,IAAP,CADqB;QAEvB,WAAJ,CAF2B;cAGjB,QAAQ,EAAR,CAAV,CAH2B;aAIlB,OAAO,EAAP,CAAT,CAJ2B;;WAMpB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,cAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,UAAU,MAAV,EAAkB;;cAEhB,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAFgB;UAGlB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAHkB;iBAIb,aAAX,GAA2B,IAA3B,CAJwB;eAKf,iBAAiB,MAAjB,EAAyB,KAAzB,CAAT,CALwB;aAMjB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,MAA/B,CAAsC,MAAtC,EAA8C,UAA9C,EAA0D,GAA1D,CAA8D,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAA9D,CAAP,CANwB;KAAlB,CAJD,CAWJ,IAXI,CAWC,UAAU,MAAV,EAAkB;WACnB,aAAL,CAAmB,MAAnB,EADwB;UAEpB,eAAJ,CAFwB;UAGpB,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,IAAyB,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,EAA2B;iBACzE,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,CADyE;OAApF;UAGI,WAAW,IAAIC,gBAAJ,CAAa,MAAb,EAAqB,MAArB,EAA6B,QAA7B,CAAX,CANoB;eAOf,OAAT,GAAmB,SAAS,CAAT,GAAa,CAAb,CAPK;iBAQb,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,aAAV,CAXmB;aAYjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,QAA9B,CAAR,EAAiD,IAAjD,CAAsD,UAAU,SAAV,EAAqB;;eAEzE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFyE;OAArB,CAA7D,CAZwB;KAAlB,CAXR,CAN2B;GAvJoB;;;;;;;;;;;;;;;;;kCAyMrC,QAAQ,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;QAE3B,WAAJ,CAF+B;cAGrB,QAAQ,EAAR,CAAV,CAH+B;aAItB,OAAO,EAAP,CAAT,CAJ+B;;WAMxB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,kBAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,UAAU,MAAV,EAAkB;;cAEhB,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAFgB;UAGlB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAHkB;iBAIb,aAAX,GAA2B,IAA3B,CAJwB;eAKf,MAAM,GAAN,CAAU,UAAU,MAAV,EAAkB;eAC5B,iBAAiB,MAAjB,EAAyB,MAAzB,CAAP,CADmC;OAAlB,CAAnB,CALwB;aAQjB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,MAA/B,CAAsC,MAAtC,EAA8C,UAA9C,EAA0D,GAA1D,CAA8D,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAA9D,CAAP,CARwB;KAAlB,CAJD,CAaJ,IAbI,CAaC,UAAU,MAAV,EAAkB;WACnB,aAAL,CAAmB,MAAnB,EADwB;UAEpB,UAAU,EAAV,CAFoB;UAGpB,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,IAAyB,OAAO,OAAP,EAAgB;kBAC7D,OAAO,OAAP,CAAe,GAAf,CAAmB,UAAU,MAAV,EAAkB;iBACtC,OAAO,OAAP,CADsC;SAAlB,CAA7B,CADuE;OAAzE;UAKI,WAAW,IAAIA,gBAAJ,CAAa,OAAb,EAAsB,MAAtB,EAA8B,YAA9B,CAAX,CARoB;eASf,OAAT,GAAmB,QAAQ,MAAR,CATK;iBAUb,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,iBAAV,CAbmB;aAcjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,QAA9B,CAAR,EAAiD,IAAjD,CAAsD,UAAU,SAAV,EAAqB;;eAEzE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFyE;OAArB,CAA7D,CAdwB;KAAlB,CAbR,CAN+B;GAzMgB;;;;;;;;;;;;;;;;;4BA+PxC,QAAQ,IAAI,MAAM;QACnB,OAAO,IAAP,CADmB;QAErB,WAAJ,CAFyB;aAGhB,OAAO,EAAP,CAAT,CAHyB;;WAKlB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,eAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,YAAY;WACb,KAAK,EAAL,GAAU,SAAV,CADa;WAEb,GAAL,CAAS,EAAT,EAAa,EAAb,EAAiB,IAAjB,EAFkB;aAGX,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,GAA/B,CAAmC,EAAnC,EAAuC,MAAvC,CAA8C,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAA9C,EAA+E,GAA/E,CAAmF,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAAnF,CAAP,CAHkB;KAAZ,CAJD,CAQJ,IARI,CAQC,UAAU,MAAV,EAAkB;UACpB,WAAW,IAAIA,gBAAJ,CAAa,SAAb,EAAwB,MAAxB,EAAgC,SAAhC,CAAX,CADoB;iBAEb,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,cAAV,CALmB;aAMjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,EAA2B,QAA3B,CAAR,EAA8C,IAA9C,CAAmD,UAAU,SAAV,EAAqB;;eAEtE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFsE;OAArB,CAA1D,CANwB;KAAlB,CARR,CALyB;GA/PsB;;;;;;;;;;;;;;;;;;;;;;;;;kCA+SrC,QAAQ,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;QAE3B,WAAJ,CAF+B;cAGrB,QAAQ,EAAR,CAAV,CAH+B;aAItB,OAAO,EAAP,CAAT,CAJ+B;;WAMxB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,kBAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,YAAY;WACb,KAAK,EAAL,GAAU,YAAV,CADa;WAEb,GAAL,CAAS,EAAT,EAAa,KAAb,EAAoB,IAApB,EAFkB;aAGX,KACJ,cADI,CACW,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CADX,EAC2C,KAD3C,EAEJ,MAFI,CAEG,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAFH,EAGJ,GAHI,CAGA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAHA,CAAP,CAHkB;KAAZ,CAJD,CAWJ,IAXI,CAWC,UAAU,MAAV,EAAkB;UACpB,WAAW,IAAIA,gBAAJ,CAAa,SAAb,EAAwB,MAAxB,EAAgC,YAAhC,CAAX,CADoB;iBAEb,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,iBAAV,CALmB;aAMjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,QAA9B,CAAR,EAAiD,IAAjD,CAAsD,UAAU,SAAV,EAAqB;;eAEzE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFyE;OAArB,CAA7D,CANwB;KAAlB,CAXR,CAN+B;GA/SgB;;;;;;;;;;;;;;;;;sBA2V3C,QAAQ,IAAI,MAAM;QAChB,OAAO,IAAP,CADgB;QAElB,eAAJ;QAAY,WAAZ,CAFsB;aAGb,OAAO,EAAP,CAAT,CAHsB;SAIjB,IAAL,KAAc,KAAK,IAAL,GAAY,EAAZ,CAAd,CAJsB;;QAMhB,eAAe,OAAO,YAAP,IAAuB,EAAvB,CANC;QAOlB,QAAQ,CAAC,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,CAAD,CAAR,CAPkB;;iBAST,OAAb,CAAqB,UAAU,GAAV,EAAe;UAC5B,eAAe,IAAI,QAAJ,CADa;UAE5B,cAAc,IAAI,WAAJ,EAAd,CAF4B;UAG9B,CAAC,KAAK,IAAL,IAAa,KAAK,IAAL,CAAU,OAAV,CAAkB,YAAlB,MAAoC,CAAC,CAAD,EAAI;eAAA;OAA1D;UAGI,IAAI,UAAJ,IAAkB,IAAI,IAAJ,KAAa,WAAb,EAA0B;YAC1C,IAAI,IAAJ,KAAa,WAAb,EAA0B;gBACtB,IAAN,CAAW,KAAK,YAAL,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,EAAyC,IAAI,UAAJ,EAAgB,IAA3E,CAAX,EAD4B;SAA9B,MAEO;gBACC,IAAN,CAAW,KAAK,YAAL,CAAkB,YAAY,KAAZ,IAAqB,WAAW,YAAY,IAAZ,CAAhC,EAAmD,IAAI,UAAJ,EAAgB,IAArF,CAAX,EADK;SAFP;OADF;KANmB,CAArB,CATsB;WAuBf,QAAQ,GAAR,CAAY,KAAZ,EAAmB,IAAnB,CAAwB,YAAY;;WAEpC,KAAK,EAAL,GAAU,YAAV,CAFoC;aAGlC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,CAAR,CAAP,CAHyC;KAAZ,CAAxB,CAIJ,IAJI,CAIC,YAAY;WACb,KAAK,EAAL,GAAU,MAAV,CADa;WAEb,GAAL,CAAS,EAAT,EAAa,EAAb,EAAiB,IAAjB,EAFkB;aAGX,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,GAA/B,CAAmC,EAAnC,EAAuC,GAAvC,CAA2C,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAA3C,CAAP,CAHkB;KAAZ,CAJD,CAQJ,IARI,CAQC,UAAU,OAAV,EAAmB;UACrB,CAAC,OAAD,EAAU;eAAA;OAAd;eAGS,OAAT,CAJyB;UAKnB,QAAQ,EAAR,CALmB;;sBAOT,MAAhB,EAAwB,IAAxB,EAA8B,UAAU,GAAV,EAAe,MAAf,EAAuB;YAC7C,gBAAgB,IAAI,WAAJ,EAAhB,CAD6C;YAE/C,aAAJ,CAFmD;;YAI/C,IAAI,UAAJ,KAAmB,IAAI,IAAJ,KAAa,QAAb,IAAyB,IAAI,IAAJ,KAAa,SAAb,CAA5C,EAAqE;cACnE,IAAI,IAAJ,KAAa,QAAb,EAAuB;mBAClB,KAAK,UAAL,CAAgB,MAAhB,EAAwB,GAAxB,EAA6B,MAA7B,EAAqC,MAArC,CAAP,CADyB;WAA3B,MAEO;mBACE,KAAK,WAAL,CAAiB,MAAjB,EAAyB,GAAzB,EAA8B,MAA9B,EAAsC,MAAtC,CAAP,CADK;WAFP;SADF,MAMO,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,SAAJ,EAAe;cAC9C,YAAY,EAAZ,CAD8C;cAE9C,WAAW,IAAI,MAAJ,EAAY,IAAI,SAAJ,CAAZ,IAA8B,EAA9B,CAFmC;qBAGvC,QAAQ,QAAR,IAAoB,QAApB,GAA+B,OAAO,IAAP,CAAY,QAAZ,CAA/B,CAHuC;sBAItC,UAAU,MAAV,CAAiB,QAAjB,CAAZ,CAJkD;iBAK3C,KAAK,OAAL,CAAa,aAAb,EAA4B;mDAE9B,cAAc,WAAd,EAA4B;oBACrB,OAAO,SAAP,EAAkB,MAAlB,CAAyB,UAAU,CAAV,EAAa;uBAAS,CAAP,CAAF;eAAb,CAA/B;cAFJ;WADK,EAMJ,MANI,EAMI,IANJ,CAMS,UAAU,YAAV,EAAwB;gBAClC,aAAJ,CAAkB,MAAlB,EAA0B,YAA1B,EADsC;WAAxB,CANhB,CALkD;SAA7C,MAcA,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,WAAJ,EAAiB;iBAC7C,KAAK,OAAL,CAAa,aAAb,EAA4B;mDAE9B,IAAI,WAAJ,EAAkB;0BACL,KAAK,sBAAL,CAA4B,MAA5B,EAAoC,GAApC,EAAyC,MAAzC,CAAZ;cAFJ;WADK,EAMJ,MANI,EAMI,IANJ,CAMS,UAAU,YAAV,EAAwB;gBAClC,aAAJ,CAAkB,MAAlB,EAA0B,YAA1B,EADsC;WAAxB,CANhB,CADoD;SAA/C,MAUA,IAAI,IAAI,IAAJ,KAAa,WAAb,EAA0B;iBAC5B,KAAK,aAAL,CAAmB,MAAnB,EAA2B,GAA3B,EAAgC,MAAhC,EAAwC,MAAxC,CAAP,CADmC;SAA9B;YAGH,IAAJ,EAAU;gBACF,IAAN,CAAW,IAAX,EADQ;SAAV;OArC4B,CAA9B,CAPyB;;aAiDlB,QAAQ,GAAR,CAAY,KAAZ,CAAP,CAjDyB;KAAnB,CARD,CA0DJ,IA1DI,CA0DC,YAAY;UACd,WAAW,IAAIA,gBAAJ,CAAa,MAAb,EAAqB,EAArB,EAAyB,MAAzB,CAAX,CADc;eAET,KAAT,GAAiB,SAAS,CAAT,GAAa,CAAb,CAFC;iBAGP,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,WAAV,CANa;aAOX,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,IAArB,EAA2B,QAA3B,CAAR,EAA8C,IAA9C,CAAmD,UAAU,SAAV,EAAqB;;eAEtE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFsE;OAArB,CAA1D,CAPkB;KAAZ,CA1DR,CAvBsB;GA3VyB;;;;;;;;;;;;;;;;;;;;;;;;;4BAgdxC,QAAQ,OAAO,MAAM;QACtB,OAAO,IAAP,CADsB;aAEnB,OAAO,EAAP,CAAT,CAF4B;SAGvB,IAAL,KAAc,KAAK,IAAL,GAAY,EAAZ,CAAd,CAH4B;;QAKxB,UAAU,EAAV,CALwB;QAMxB,WAAJ,CAN4B;QAOtB,eAAe,OAAO,YAAP,IAAuB,EAAvB,CAPO;QAQxB,QAAQ,CAAC,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,CAAD,CAAR,CARwB;;iBAUf,OAAb,CAAqB,UAAU,GAAV,EAAe;UAC5B,eAAe,IAAI,QAAJ,CADa;UAE5B,cAAc,IAAI,WAAJ,EAAd,CAF4B;UAG9B,CAAC,KAAK,IAAL,IAAa,KAAK,IAAL,CAAU,OAAV,CAAkB,YAAlB,MAAoC,CAAC,CAAD,EAAI;eAAA;OAA1D;UAGI,IAAI,UAAJ,IAAkB,IAAI,IAAJ,KAAa,WAAb,EAA0B;YAC1C,IAAI,IAAJ,KAAa,WAAb,EAA0B;gBACtB,IAAN,CAAW,KAAK,YAAL,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,EAAyC,IAAI,UAAJ,EAAgB,IAA3E,CAAX,EAD4B;SAA9B,MAEO;gBACC,IAAN,CAAW,KAAK,YAAL,CAAkB,YAAY,KAAZ,IAAqB,WAAW,YAAY,IAAZ,CAAhC,EAAmD,IAAI,UAAJ,EAAgB,IAArF,CAAX,EADK;SAFP;OADF;KANmB,CAArB,CAV4B;WAwBrB,QAAQ,GAAR,CAAY,KAAZ,EAAmB,IAAnB,CAAwB,YAAY;;WAEpC,KAAK,EAAL,GAAU,eAAV,CAFoC;aAGlC,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,CAAR,CAAP,CAHyC;KAAZ,CAAxB,CAIJ,IAJI,CAIC,YAAY;WACb,KAAK,EAAL,GAAU,SAAV,CADa;WAEb,GAAL,CAAS,EAAT,EAAa,KAAb,EAAoB,IAApB,EAFkB;aAGX,KAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CAApB,EAAoD,KAApD,EAA2D,GAA3D,CAA+D,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAA/D,CAAP,CAHkB;KAAZ,CAJD,CAQJ,IARI,CAQC,UAAU,QAAV,EAAoB;gBAChB,QAAV,CAD0B;UAEpB,QAAQ,EAAR,CAFoB;sBAGV,MAAhB,EAAwB,IAAxB,EAA8B,UAAU,GAAV,EAAe,MAAf,EAAuB;YAC7C,gBAAgB,IAAI,WAAJ,EAAhB,CAD6C;YAE7C,cAAc,OAAO,WAAP,CAF+B;YAG/C,aAAJ,CAHmD;YAI/C,IAAI,UAAJ,KAAmB,IAAI,IAAJ,KAAa,QAAb,IAAyB,IAAI,IAAJ,KAAa,SAAb,CAA5C,EAAqE;cACnE,IAAI,IAAJ,KAAa,SAAb,EAAwB;mBACnB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,GAAzB,EAA8B,OAA9B,EAAuC,MAAvC,CAAP,CAD0B;WAA5B,MAEO;mBACE,KAAK,UAAL,CAAgB,MAAhB,EAAwB,GAAxB,EAA6B,OAA7B,EAAsC,MAAtC,CAAP,CADK;WAFP;SADF,MAMO,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,SAAJ,EAAe;;gBAC9C,YAAY,EAAZ;oBACI,OAAR,CAAgB,UAAU,IAAV,EAAgB;kBAC1B,WAAW,KAAK,IAAI,SAAJ,CAAL,IAAuB,EAAvB,CADe;yBAEnB,QAAQ,QAAR,IAAoB,QAApB,GAA+B,OAAO,IAAP,CAAY,QAAZ,CAA/B,CAFmB;0BAGlB,UAAU,MAAV,CAAiB,QAAjB,CAAZ,CAH8B;aAAhB,CAAhB;mBAKO,KAAK,OAAL,CAAa,aAAb,EAA4B;qDAE9B,cAAc,WAAd,EAA4B;sBACrB,OAAO,SAAP,EAAkB,MAAlB,CAAyB,UAAU,CAAV,EAAa;yBAAS,CAAP,CAAF;iBAAb,CAA/B;gBAFJ;aADK,EAMJ,MANI,EAMI,IANJ,CAMS,UAAU,YAAV,EAAwB;sBAC9B,OAAR,CAAgB,UAAU,IAAV,EAAgB;oBAC1B,WAAW,EAAX,CAD0B;oBAE1B,WAAW,IAAI,IAAJ,EAAU,IAAI,SAAJ,CAAV,IAA4B,EAA5B,CAFe;2BAGnB,QAAQ,QAAR,IAAoB,QAApB,GAA+B,OAAO,IAAP,CAAY,QAAZ,CAA/B,CAHmB;6BAIjB,OAAb,CAAqB,UAAU,WAAV,EAAuB;sBACtC,YAAY,SAAS,OAAT,CAAiB,YAAY,cAAc,WAAd,CAA7B,MAA6D,CAAC,CAAD,EAAI;6BACtE,IAAT,CAAc,WAAd,EAD+E;mBAAjF;iBADmB,CAArB,CAJ8B;oBAS1B,aAAJ,CAAkB,IAAlB,EAAwB,QAAxB,EAT8B;eAAhB,CAAhB,CADsC;qBAY/B,YAAP,CAZsC;aAAxB,CANhB;eAPkD;SAA7C,MA2BA,IAAI,IAAI,IAAJ,KAAa,SAAb,IAA0B,IAAI,WAAJ,EAAiB;iBAC7C,KAAK,OAAL,CAAa,aAAb,EAA4B;mDAE9B,IAAI,WAAJ,EAAkB;+BACA,QAAQ,GAAR,CAAY,UAAU,MAAV,EAAkB;uBACtC,KAAK,sBAAL,CAA4B,MAA5B,EAAoC,GAApC,EAAyC,MAAzC,CAAP,CAD6C;eAAlB,CAA7B;cAFJ;WADK,EAQJ,MARI,EAQI,IARJ,CAQS,UAAU,YAAV,EAAwB;gBAChC,mBAAmB,IAAI,WAAJ,CADa;oBAE9B,OAAR,CAAgB,UAAU,MAAV,EAAkB;kBAC1B,gBAAgB,EAAhB,CAD0B;kBAE1B,KAAK,IAAI,MAAJ,EAAY,WAAZ,CAAL,CAF0B;2BAGnB,OAAb,CAAqB,UAAU,WAAV,EAAuB;oBACpC,cAAc,IAAI,YAAJ,EAAkB,gBAAlB,KAAuC,EAAvC,CADsB;oBAEtC,YAAY,OAAZ,CAAoB,EAApB,MAA4B,CAAC,CAAD,EAAI;gCACpB,IAAd,CAAmB,WAAnB,EADkC;iBAApC;eAFmB,CAArB,CAHgC;kBAS5B,aAAJ,CAAkB,MAAlB,EAA0B,aAA1B,EATgC;aAAlB,CAAhB,CAFsC;WAAxB,CARhB,CADoD;SAA/C,MAuBA,IAAI,IAAI,IAAJ,KAAa,WAAb,EAA0B;iBAC5B,KAAK,aAAL,CAAmB,MAAnB,EAA2B,GAA3B,EAAgC,OAAhC,EAAyC,MAAzC,CAAP,CADmC;SAA9B;YAGH,IAAJ,EAAU;gBACF,IAAN,CAAW,IAAX,EADQ;SAAV;OA/D4B,CAA9B,CAH0B;aAsEnB,QAAQ,GAAR,CAAY,KAAZ,CAAP,CAtE0B;KAApB,CARD,CA+EJ,IA/EI,CA+EC,YAAY;kBACN,UAAU,EAAV,CAAZ,CADkB;UAEd,WAAW,IAAIA,gBAAJ,CAAa,OAAb,EAAsB,EAAtB,EAA0B,SAA1B,CAAX,CAFc;eAGT,KAAT,GAAiB,QAAQ,MAAR,CAHC;iBAIP,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,cAAV,CAPa;aAQX,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,IAAxB,EAA8B,QAA9B,CAAR,EAAiD,IAAjD,CAAsD,UAAU,SAAV,EAAqB;;eAEzE,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFyE;OAArB,CAA7D,CARkB;KAAZ,CA/ER,CAxB4B;GAhdmB;;;;;;;;;;;;;;;oCAklBpC,UAAU,MAAM;aAClB,OAAO,EAAP,CAAT,CAD2B;SAEtB,SAAL,KAAmB,KAAK,SAAL,GAAiB,EAAjB,CAAnB,CAF2B;QAGvB,SAAS,KAAK,SAAL,IAAkB,EAAlB,CAHc;WAIpB,YAAY,KAAK,SAAL,CAAe,QAAf,CAAZ,IAAwC,OAAO,QAAP,KAAoB,UAAU,QAAV,CAApB,GAA0C,KAAK,SAAL,CAAe,QAAf,CAAlF,CAJoB;GAllBoB;;;;;;;;;;;;;;;;;;0BAwmBzC,QAAQ,IAAI,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;cAErB,QAAQ,EAAR,CAAV,CAF+B;aAGtB,OAAO,EAAP,CAAT,CAH+B;QAI3B,WAAJ,CAJ+B;;WAMxB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,cAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,KAArB,EAA4B,IAA5B,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,UAAU,MAAV,EAAkB;;cAEhB,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAFgB;UAGlB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAHkB;iBAIb,aAAX,GAA2B,IAA3B,CAJwB;aAKjB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,GAA/B,CAAmC,EAAnC,EAAuC,MAAvC,CAA8C,iBAAiB,MAAjB,EAAyB,KAAzB,CAA9C,EAA+E,UAA/E,EAA2F,GAA3F,CAA+F,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAA/F,CAAP,CALwB;KAAlB,CAJD,CAUJ,IAVI,CAUC,UAAU,MAAV,EAAkB;UACpB,eAAJ,CADwB;WAEnB,aAAL,CAAmB,MAAnB,EAFwB;UAGpB,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,IAAyB,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,EAA2B;iBACzE,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,CADyE;OAApF,MAEO;cACC,IAAI,KAAJ,CAAU,WAAV,CAAN,CADK;OAFP;UAKI,WAAW,IAAIA,gBAAJ,CAAa,MAAb,EAAqB,MAArB,EAA6B,QAA7B,CAAX,CARoB;eASf,OAAT,GAAmB,CAAnB,CATwB;iBAUb,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,aAAV,CAbmB;aAcjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,EAAjB,EAAqB,KAArB,EAA4B,IAA5B,EAAkC,QAAlC,CAAR,EAAqD,IAArD,CAA0D,UAAU,SAAV,EAAqB;;eAE7E,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAF6E;OAArB,CAAjE,CAdwB;KAAlB,CAVR,CAN+B;GAxmBgB;;;;;;;;;;;;;;;;;;;;;;;;;;gCAoqBtC,QAAQ,OAAO,OAAO,MAAM;QAC/B,OAAO,IAAP,CAD+B;cAE3B,QAAQ,EAAR,CAAV,CAFqC;cAG3B,QAAQ,EAAR,CAAV,CAHqC;aAI5B,OAAO,EAAP,CAAT,CAJqC;QAKjC,WAAJ,CALqC;;WAO9B,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,iBAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,KAAxB,EAA+B,IAA/B,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,UAAU,MAAV,EAAkB;;cAEhB,YAAY,MAAZ,IAAsB,KAAtB,GAA8B,MAA9B,CAFgB;UAGlB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAHkB;iBAIb,aAAX,GAA2B,IAA3B,CAJwB;aAKjB,KAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CAApB,EAAoD,KAApD,EAA2D,MAA3D,CAAkE,iBAAiB,MAAjB,EAAyB,KAAzB,CAAlE,EAAmG,UAAnG,EAA+G,GAA/G,CAAmH,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAAnH,CAAP,CALwB;KAAlB,CAJD,CAUJ,IAVI,CAUC,UAAU,MAAV,EAAkB;UACpB,UAAU,EAAV,CADoB;WAEnB,aAAL,CAAmB,MAAnB,EAFwB;UAGpB,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,EAAuB;kBAC3C,OAAO,OAAP,CAAe,GAAf,CAAmB,UAAU,MAAV,EAAkB;iBAAS,OAAO,OAAP,CAAT;SAAlB,CAA7B,CADqD;OAAvD;UAGI,WAAW,IAAIA,gBAAJ,CAAa,OAAb,EAAsB,MAAtB,EAA8B,QAA9B,CAAX,CANoB;eAOf,OAAT,GAAmB,QAAQ,MAAR,CAPK;iBAQb,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,gBAAV,CAXmB;aAYjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,KAAjB,EAAwB,KAAxB,EAA+B,IAA/B,EAAqC,QAArC,CAAR,EAAwD,IAAxD,CAA6D,UAAU,SAAV,EAAqB;;eAEhF,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAFgF;OAArB,CAApE,CAZwB;KAAlB,CAVR,CAPqC;GApqBU;;;;;;;;;;;;;;;;;kCAstBrC,QAAQ,SAAS,MAAM;QAC3B,OAAO,IAAP,CAD2B;gBAErB,UAAU,EAAV,CAAZ,CAFiC;aAGxB,OAAO,EAAP,CAAT,CAHiC;QAI7B,WAAJ,CAJiC;QAK3B,cAAc,OAAO,WAAP,CALa;;cAOvB,QAAQ,MAAR,CAAe,UAAU,MAAV,EAAkB;aAClC,IAAI,MAAJ,EAAY,WAAZ,CAAP,CADyC;KAAlB,CAAzB,CAPiC;;WAW1B,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;;WAEjD,KAAK,EAAL,GAAU,kBAAV,CAFiD;aAG/C,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,OAAjB,EAA0B,IAA1B,CAAR,CAAP,CAHsD;KAAZ,CAArC,CAIJ,IAJI,CAIC,UAAU,QAAV,EAAoB;;iBAEf,YAAY,QAAZ,IAAwB,OAAxB,GAAkC,QAAlC,CAFe;UAGpB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAHoB;iBAIf,aAAX,GAA2B,IAA3B,CAJ0B;iBAKf,QAAX,GAAsB,QAAtB,CAL0B;iBAMf,SAAS,GAAT,CAAa,UAAU,MAAV,EAAkB;eACjC,iBAAiB,MAAjB,EAAyB,MAAzB,CAAP,CADwC;OAAlB,CAAxB,CAN0B;aASnB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EAA+B,MAA/B,CAAsC,QAAtC,EAAgD,UAAhD,EAA4D,GAA5D,CAAgE,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAAhE,CAAP,CAT0B;KAApB,CAJD,CAcJ,IAdI,CAcC,UAAU,MAAV,EAAkB;UACpB,uBAAJ,CADwB;WAEnB,aAAL,CAAmB,MAAnB,EAFwB;UAGpB,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,EAAuB;yBACpC,OAAO,OAAP,CAAe,GAAf,CAAmB,UAAU,MAAV,EAAkB;iBAAS,OAAO,OAAP,CAAT;SAAlB,CAApC,CADqD;OAAvD;UAGI,WAAW,IAAIA,gBAAJ,CAAa,kBAAkB,EAAlB,EAAsB,MAAnC,EAA2C,QAA3C,CAAX,CANoB;eAOf,OAAT,GAAmB,SAAS,IAAT,CAAc,MAAd,CAPK;iBAQb,KAAK,OAAL,CAAa,QAAb,EAAuB,IAAvB,CAAX;;;QAGA,GAAK,KAAK,EAAL,GAAU,iBAAV,CAXmB;aAYjB,QAAQ,KAAK,EAAL,EAAS,MAAT,EAAiB,OAAjB,EAA0B,IAA1B,EAAgC,QAAhC,CAAR,EAAmD,IAAnD,CAAwD,UAAU,SAAV,EAAqB;;eAE3E,YAAY,SAAZ,IAAyB,QAAzB,GAAoC,SAApC,CAF2E;OAArB,CAA/D,CAZwB;KAAlB,CAdR,CAXiC;GAttBc;sCAkwBnC,QAAQ,SAAS;;;QACvB,QAAQ,SAAS,MAAT,IAAmB,MAAnB,GAA6B,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CADd;cAEnB,WAAW,EAAX,CAFmB;QAGzB,KAAK,YAAY,QAAQ,EAAR,CAAZ,GAA0B,KAAK,EAAL,GAAU,QAAQ,EAAR,CAHhB;WAItB,KAAK,SAAL,CAAe,OAAf,EAAwB,IAAxB,CAA6B,YAAM;YACnC,MAAL,CAAY,EAAZ,IAAkB,MAAK,MAAL,CAAY,EAAZ,KAAmB,EAAnB,CADsB;UAEpC,CAAC,MAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,CAAD,EAAyB;cACtB,MAAL,CAAY,EAAZ,EAAgB,KAAhB,IAAyB,MAAK,CAAL,CAAO,MAAP,CAAc,MAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,SAAd,GAA0B,QAA1B,CAAmC,KAAnC,CAAd,EAAyD,IAAzD,EAA+D,MAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,WAAd,CAA0B,KAA1B,CAA/D,EAAiG,GAAjG,EAAzB,CAD2B;OAA7B;aAGO,MAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,CAAP,CALwC;KAAN,CAApC,CAJ6B;GAlwBkB;sCA+wBnC,OAAO,OAAO,SAAS;;;cACzB,WAAW,EAAX,CADyB;QAE/B,KAAK,YAAY,QAAQ,EAAR,CAAZ,GAA0B,KAAK,EAAL,GAAU,QAAQ,EAAR,CAFV;WAG5B,KAAK,SAAL,CAAe,OAAf,EAAwB,IAAxB,CAA6B;aAAM,OAAK,YAAL,CAAkB,KAAlB,EAAyB,OAAzB;KAAN,CAA7B,CAAsE,IAAtE,CAA2E,YAAM;aACjF,OAAL,CAAa,EAAb,IAAmB,OAAK,OAAL,CAAa,EAAb,KAAoB,EAApB,CADmE;aAEjF,OAAL,CAAa,EAAb,EAAiB,KAAjB,IAA0B,OAAK,OAAL,CAAa,EAAb,EAAiB,KAAjB,KAA2B,EAA3B,CAF4D;UAGlF,CAAC,OAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,EAAuB,KAAvB,CAAD,EAAgC;eAC7B,MAAL,CAAY,EAAZ,EAAgB,KAAhB,EAAuB,KAAvB,IAAgC,OAAK,CAAL,CAAO,MAAP,CAAc,OAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,KAAd,CAAoB,KAApB,EAA2B,SAA3B,GAAuC,QAAvC,CAAgD,KAAhD,CAAd,EAAsE,IAAtE,EAA4E,OAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,KAAd,CAAoB,KAApB,EAA2B,WAA3B,CAAuC,KAAvC,CAA5E,EAA2H,GAA3H,GAAiI,IAAjI,CAAsI,YAAM;iBACnK,OAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,KAAd,CAAoB,KAApB,EAA2B,SAA3B,CAAqC,KAArC,EAA4C,GAA5C,EAAP,CAD0K;SAAN,CAAtK,CADkC;OAApC;aAKO,OAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,EAAuB,KAAvB,CAAP,CARsF;KAAN,CAAlF,CAHmC;GA/wBY;CAAnD;;AA+xBA,iBAAiB,SAAjB,GAA6B,SAA7B;;"} \ No newline at end of file +{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved\n} from 'js-data-adapter'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\n\nconst {\n addHiddenPropsToTarget,\n classCallCheck,\n extend,\n fillIn,\n forOwn,\n isObject,\n isString,\n isUndefined,\n omit,\n plainCopy\n} = utils\n\nconst withoutRelations = function (mapper, props) {\n return omit(props, mapper.relationFields || [])\n}\n\nconst __super__ = Adapter.prototype\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 28015\n */\n port: 28015\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkDBAdapter with default settings\n * const adapter = new RethinkDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nfunction RethinkDBAdapter (opts) {\n const self = this\n classCallCheck(self, RethinkDBAdapter)\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n// Setup prototype inheritance from Adapter\nRethinkDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: RethinkDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(RethinkDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the RethinkDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the RethinkDBAdapter itself.\n * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = extend\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n\n _create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .insert(props, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n return [record, cursor]\n })\n },\n\n _createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .insert(props, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n return [records, cursor]\n })\n },\n\n _destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.selectTable(mapper, opts)\n .get(id)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n return [undefined, cursor]\n })\n },\n\n _destroyAll (mapper, query, opts) {\n const self = this\n query || (query = {})\n opts || (opts = {})\n\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n return [undefined, cursor]\n })\n },\n\n _find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.selectTable(mapper, opts)\n .get(id)\n .run(self.getOpt('runOpts', opts)).then(function (record) {\n return [record, {}]\n })\n },\n\n _findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .run(self.getOpt('runOpts', opts)).then(function (records) {\n return [records, {}]\n })\n },\n\n _update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .get(id)\n .update(withoutRelations(mapper, props), updateOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n return [record, cursor]\n })\n },\n\n _updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .update(withoutRelations(mapper, props), updateOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n return [records, cursor]\n })\n },\n\n _updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n\n return self.selectTable(mapper, opts)\n .insert(records, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n return [records, cursor]\n })\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n } else {\n throw new Error(`Operator ${operator} not supported!`)\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.create.call(self, mapper, props, opts)\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.createMany.call(self, mapper, props, opts)\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.destroy.call(self, mapper, id, opts)\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.destroyAll.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n return __super__.find.call(self, mapper, id, opts)\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n query || (query = {})\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n return __super__.findAll.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.update.call(self, mapper, id, props, opts)\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.updateAll.call(self, mapper, props, query, opts)\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.updateMany.call(self, mapper, records, opts)\n })\n }\n})\n\nmodule.exports = RethinkDBAdapter\n"],"names":["utils","Adapter","reserved"],"mappings":";;;;;;;;;;IASE,yBAUEA,aAVF;IACA,iBASEA,aATF;IACA,SAQEA,aARF;IACA,SAOEA,aAPF;IACA,SAMEA,aANF;IACA,WAKEA,aALF;IACA,WAIEA,aAJF;IACA,cAGEA,aAHF;IACA,OAEEA,aAFF;IACA,YACEA,aADF;;;AAGF,IAAM,mBAAmB,SAAnB,gBAAmB,CAAU,MAAV,EAAkB,KAAlB,EAAyB;SACzC,KAAK,KAAL,EAAY,OAAO,cAAP,IAAyB,EAAzB,CAAnB,CADgD;CAAzB;;AAIzB,IAAM,YAAYC,iBAAQ,SAAR;;AAElB,IAAM,WAAW;;;;;;;WAON,EAAT;;;;;;;;;cASY,EAAZ;;;;;;;;;MASI,MAAJ;;;;;;;;;QASM,WAAN;;;;;;;;;OASK,EAAL;;;;;;;;;OASK,EAAL;;;;;;;;;QASM,KAAN;CA7DI;;AAgEN,IAAM,uBAAuB,EAAvB;AACN,IAAM,uBAAuB,EAAvB;AACN,IAAM,uBAAuB,EAAvB;AACN,IAAM,oBAAoB,EAApB;;AAEN,IAAM,QAAQ,SAAR,KAAQ,CAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;SACrC,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CAD4C;CAAhC;;AAId,IAAM,WAAW,SAAX,QAAW,CAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;SACxC,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CAD+C;CAAhC;;;;;;;;;;;;;;;;;;;;;;;;;AA2BjB,IAAM,YAAY;QACV,KAAN;SACO,KAAP;QACM,QAAN;SACO,QAAP;OACK,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC5B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADmC;GAAhC;QAGC,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC7B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADoC;GAAhC;OAGD,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC5B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADmC;GAAhC;QAGC,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC7B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADoC;GAAhC;gBAGQ,oBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACrC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,eAAvB,CAAuC,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAtB,CAAvC,EAAkE,KAAlE,GAA0E,EAA1E,CAA6E,CAA7E,CAAP,CAD4C;GAAhC;mBAGG,uBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACxC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,eAAvB,CAAuC,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAtB,CAAvC,EAAkE,KAAlE,GAA0E,EAA1E,CAA6E,CAA7E,CAAP,CAD+C;GAAhC;QAGX,aAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC7B,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAE,IAAF,CAAO,EAAP,CAAtB,EAAkC,QAAlC,CAA2C,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,CAA3C,CAAP,CADoC;GAAhC;WAGG,eAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAChC,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAE,IAAF,CAAO,EAAP,CAAtB,EAAkC,QAAlC,CAA2C,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,CAA3C,EAAqE,GAArE,EAAP,CADuC;GAAhC;cAGG,kBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACnC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,QAAvB,CAAgC,KAAhC,CAAP,CAD0C;GAAhC;iBAGG,qBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACtC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,QAAvB,CAAgC,KAAhC,EAAuC,GAAvC,EAAP,CAD6C;GAAhC;CAhCX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwEN,SAAS,gBAAT,CAA2B,IAA3B,EAAiC;MACzB,OAAO,IAAP,CADyB;iBAEhB,IAAf,EAAqB,gBAArB,EAF+B;WAGtB,OAAO,EAAP,CAAT,CAH+B;SAIxB,IAAP,EAAa,QAAb,EAJ+B;mBAKvB,IAAR,CAAa,IAAb,EAAmB,IAAnB;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAd+B;SAexB,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAxB+B;SAyBxB,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAlC+B;SAmCxB,KAAK,UAAL,EAAiB,oBAAxB;;;;;;;;;MASA,CAAK,OAAL,KAAiB,KAAK,OAAL,GAAe,EAAf,CAAjB,CA5C+B;SA6CxB,KAAK,OAAL,EAAc,iBAArB;;;;;;;;;MASA,CAAK,SAAL,KAAmB,KAAK,SAAL,GAAiB,EAAjB,CAAnB;;;;;;;;;MASA,CAAK,CAAL,GAAS,cAAc,IAAd,CAAT,CA/D+B;OAgE1B,SAAL,GAAiB,EAAjB,CAhE+B;OAiE1B,MAAL,GAAc,EAAd,CAjE+B;OAkE1B,OAAL,GAAe,EAAf,CAlE+B;CAAjC;;;AAsEA,iBAAiB,SAAjB,GAA6B,OAAO,MAAP,CAAcA,iBAAQ,SAAR,EAAmB;eAC/C;WACJ,gBAAP;gBACY,KAAZ;cACU,IAAV;kBACc,IAAd;GAJF;CAD2B,CAA7B;;AASA,OAAO,cAAP,CAAsB,gBAAtB,EAAwC,WAAxC,EAAqD;gBACrC,IAAd;SACOA,gBAAP;CAFF;;;;;;;;;;;;;AAgBA,iBAAiB,MAAjB,GAA0B,MAA1B;;AAEA,iBAAiB,SAAjB,GAA6B,SAA7B;;AAEA,uBAAuB,iBAAiB,SAAjB,EAA4B;wCAClC,QAAQ;QACjB,UAAU,OAAO,MAAP,GAAgB,CAAhB,EAAmB;UAC3B,OAAO,WAAP,EAAoB;cAChB,IAAI,KAAJ,CAAU,OAAO,WAAP,CAAhB,CADsB;OAAxB;YAGM,IAAI,KAAJ,CAAU,yBAAV,CAAN,CAJ+B;KAAjC;GAF+C;4BAUxC,QAAQ,OAAO,MAAM;QACtB,OAAO,IAAP,CADsB;cAElB,QAAQ,EAAR,CAAV,CAF4B;aAGnB,OAAO,EAAP,CAAT,CAH4B;;QAKtB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CALsB;eAMjB,aAAX,GAA2B,IAA3B,CAN4B;;WAQrB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EACJ,MADI,CACG,KADH,EACU,UADV,EAEJ,GAFI,CAEA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAFA,EAE8B,IAF9B,CAEmC,UAAU,MAAV,EAAkB;WACnD,aAAL,CAAmB,MAAnB,EADwD;UAEpD,eAAJ,CAFwD;UAGpD,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,IAAyB,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,EAA2B;iBACzE,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,CADyE;OAApF;aAGO,CAAC,MAAD,EAAS,MAAT,CAAP,CANwD;KAAlB,CAF1C,CAR4B;GAVmB;oCA8BpC,QAAQ,OAAO,MAAM;QAC1B,OAAO,IAAP,CAD0B;cAEtB,QAAQ,EAAR,CAAV,CAFgC;aAGvB,OAAO,EAAP,CAAT,CAHgC;;QAK1B,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAL0B;eAMrB,aAAX,GAA2B,IAA3B,CANgC;;WAQzB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EACJ,MADI,CACG,KADH,EACU,UADV,EAEJ,GAFI,CAEA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAFA,EAE8B,IAF9B,CAEmC,UAAU,MAAV,EAAkB;WACnD,aAAL,CAAmB,MAAnB,EADwD;UAEpD,UAAU,EAAV,CAFoD;UAGpD,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,IAAyB,OAAO,OAAP,EAAgB;kBAC7D,OAAO,OAAP,CAAe,GAAf,CAAmB,UAAU,MAAV,EAAkB;iBACtC,OAAO,OAAP,CADsC;SAAlB,CAA7B,CADuE;OAAzE;aAKO,CAAC,OAAD,EAAU,MAAV,CAAP,CARwD;KAAlB,CAF1C,CARgC;GA9Be;8BAoDvC,QAAQ,IAAI,MAAM;QACpB,OAAO,IAAP,CADoB;aAEjB,OAAO,EAAP,CAAT,CAF0B;;WAInB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EACJ,GADI,CACA,EADA,EAEJ,MAFI,CAEG,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAFH,EAGJ,GAHI,CAGA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAHA,EAG8B,IAH9B,CAGmC,UAAU,MAAV,EAAkB;WACnD,aAAL,CAAmB,MAAnB,EADwD;aAEjD,CAAC,SAAD,EAAY,MAAZ,CAAP,CAFwD;KAAlB,CAH1C,CAJ0B;GApDqB;oCAiEpC,QAAQ,OAAO,MAAM;QAC1B,OAAO,IAAP,CAD0B;cAEtB,QAAQ,EAAR,CAAV,CAFgC;aAGvB,OAAO,EAAP,CAAT,CAHgC;;WAKzB,KACJ,cADI,CACW,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CADX,EAC2C,KAD3C,EAEJ,MAFI,CAEG,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAFH,EAGJ,GAHI,CAGA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAHA,EAG8B,IAH9B,CAGmC,UAAU,MAAV,EAAkB;WACnD,aAAL,CAAmB,MAAnB,EADwD;aAEjD,CAAC,SAAD,EAAY,MAAZ,CAAP,CAFwD;KAAlB,CAH1C,CALgC;GAjEe;wBA+E1C,QAAQ,IAAI,MAAM;QACjB,OAAO,IAAP,CADiB;aAEd,OAAO,EAAP,CAAT,CAFuB;;WAIhB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EACJ,GADI,CACA,EADA,EAEJ,GAFI,CAEA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAFA,EAE8B,IAF9B,CAEmC,UAAU,MAAV,EAAkB;aACjD,CAAC,MAAD,EAAS,EAAT,CAAP,CADwD;KAAlB,CAF1C,CAJuB;GA/EwB;8BA0FvC,QAAQ,OAAO,MAAM;QACvB,OAAO,IAAP,CADuB;aAEpB,OAAO,EAAP,CAAT,CAF6B;cAGnB,QAAQ,EAAR,CAAV,CAH6B;;WAKtB,KAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CAApB,EAAoD,KAApD,EACJ,GADI,CACA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CADA,EAC8B,IAD9B,CACmC,UAAU,OAAV,EAAmB;aAClD,CAAC,OAAD,EAAU,EAAV,CAAP,CADyD;KAAnB,CAD1C,CAL6B;GA1FkB;4BAqGxC,QAAQ,IAAI,OAAO,MAAM;QAC1B,OAAO,IAAP,CAD0B;cAEtB,QAAQ,EAAR,CAAV,CAFgC;aAGvB,OAAO,EAAP,CAAT,CAHgC;;QAK1B,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAL0B;eAMrB,aAAX,GAA2B,IAA3B,CANgC;;WAQzB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EACJ,GADI,CACA,EADA,EAEJ,MAFI,CAEG,iBAAiB,MAAjB,EAAyB,KAAzB,CAFH,EAEoC,UAFpC,EAGJ,GAHI,CAGA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAHA,EAG8B,IAH9B,CAGmC,UAAU,MAAV,EAAkB;UACpD,eAAJ,CADwD;WAEnD,aAAL,CAAmB,MAAnB,EAFwD;UAGpD,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,IAAyB,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,EAA2B;iBACzE,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,CADyE;OAApF,MAEO;cACC,IAAI,KAAJ,CAAU,WAAV,CAAN,CADK;OAFP;aAKO,CAAC,MAAD,EAAS,MAAT,CAAP,CARwD;KAAlB,CAH1C,CARgC;GArGe;kCA4HrC,QAAQ,OAAO,OAAO,MAAM;QAChC,OAAO,IAAP,CADgC;cAE5B,QAAQ,EAAR,CAAV,CAFsC;cAG5B,QAAQ,EAAR,CAAV,CAHsC;aAI7B,OAAO,EAAP,CAAT,CAJsC;;QAMhC,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CANgC;eAO3B,aAAX,GAA2B,IAA3B,CAPsC;;WAS/B,KAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CAApB,EAAoD,KAApD,EACJ,MADI,CACG,iBAAiB,MAAjB,EAAyB,KAAzB,CADH,EACoC,UADpC,EAEJ,GAFI,CAEA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAFA,EAE8B,IAF9B,CAEmC,UAAU,MAAV,EAAkB;UACpD,UAAU,EAAV,CADoD;WAEnD,aAAL,CAAmB,MAAnB,EAFwD;UAGpD,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,EAAuB;kBAC3C,OAAO,OAAP,CAAe,GAAf,CAAmB,UAAU,MAAV,EAAkB;iBAAS,OAAO,OAAP,CAAT;SAAlB,CAA7B,CADqD;OAAvD;aAGO,CAAC,OAAD,EAAU,MAAV,CAAP,CANwD;KAAlB,CAF1C,CATsC;GA5HS;oCAiJpC,QAAQ,SAAS,MAAM;QAC5B,OAAO,IAAP,CAD4B;gBAEtB,UAAU,EAAV,CAAZ,CAFkC;aAGzB,OAAO,EAAP,CAAT,CAHkC;;QAK5B,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAL4B;eAMvB,aAAX,GAA2B,IAA3B,CANkC;eAOvB,QAAX,GAAsB,QAAtB,CAPkC;;WAS3B,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EACJ,MADI,CACG,OADH,EACY,UADZ,EAEJ,GAFI,CAEA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAFA,EAE8B,IAF9B,CAEmC,UAAU,MAAV,EAAkB;gBAC9C,EAAV,CADwD;WAEnD,aAAL,CAAmB,MAAnB,EAFwD;UAGpD,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,EAAuB;kBAC3C,OAAO,OAAP,CAAe,GAAf,CAAmB,UAAU,MAAV,EAAkB;iBAAS,OAAO,OAAP,CAAT;SAAlB,CAA7B,CADqD;OAAvD;aAGO,CAAC,OAAD,EAAU,MAAV,CAAP,CANwD;KAAlB,CAF1C,CATkC;GAjJa;8BAsKvC,MAAM;WACP,KAAK,CAAL,CAAO,EAAP,CAAU,YAAY,KAAK,EAAL,CAAZ,GAAuB,KAAK,EAAL,GAAU,KAAK,EAAL,CAAlD,CADc;GAtKiC;oCA0KpC,QAAQ,MAAM;WAClB,KAAK,QAAL,CAAc,IAAd,EAAoB,KAApB,CAA0B,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAAjC,CADyB;GA1KsB;;;;;;;;;;;;;;;;;;;;0CA+LjC,UAAU,OAAO,MAAM;QAC/B,OAAO,IAAP,CAD+B;QAE/B,IAAI,KAAK,CAAL,CAF2B;;YAI7B,UAAU,SAAS,EAAT,CAAlB,CAJqC;aAK5B,OAAO,EAAP,CAAT,CALqC;SAMhC,SAAL,KAAmB,KAAK,SAAL,GAAiB,EAAjB,CAAnB,CANqC;UAO/B,KAAN,KAAgB,MAAM,KAAN,GAAc,EAAd,CAAhB,CAPqC;UAQ/B,OAAN,KAAkB,MAAM,OAAN,GAAgB,MAAM,IAAN,CAAlC,CARqC;UAS/B,OAAN,KAAkB,MAAM,OAAN,GAAgB,EAAhB,CAAlB,CATqC;UAU/B,IAAN,KAAe,MAAM,IAAN,GAAa,MAAM,MAAN,CAA5B;;;UAGA,CAAO,KAAP,EAAc,UAAU,MAAV,EAAkB,OAAlB,EAA2B;UACnCC,iBAAS,OAAT,CAAiB,OAAjB,MAA8B,CAAC,CAAD,EAAI;YAChC,SAAS,MAAT,CAAJ,EAAsB;gBACd,KAAN,CAAY,OAAZ,IAAuB,MAAvB,CADoB;SAAtB,MAEO;gBACC,KAAN,CAAY,OAAZ,IAAuB;kBACf,MAAN;WADF,CADK;SAFP;eAOO,MAAM,OAAN,CAAP,CARoC;OAAtC;KADY,CAAd,CAbqC;;QA0BjC,MAAM,QAAN;;;QAGA,OAAO,IAAP,CAAY,MAAM,KAAN,CAAZ,CAAyB,MAAzB,KAAoC,CAApC,EAAuC;;YAEnC,IAAI,MAAJ,CAAW,UAAU,GAAV,EAAe;YAC1B,iBAAJ;;cAEA,CAAO,MAAM,KAAN,EAAa,UAAU,QAAV,EAAoB,KAApB,EAA2B;cACzC,CAAC,SAAS,QAAT,CAAD,EAAqB;uBACZ,EAAE,MAAM,QAAN,EAAb,CADuB;WAAzB;;gBAIA,CAAO,QAAP,EAAiB,UAAU,KAAV,EAAiB,QAAjB,EAA2B;gBACtC,OAAO,KAAP,CADsC;gBAEtC,YAAY,SAAS,CAAT,MAAgB,GAAhB,EAAqB;yBACxB,SAAS,MAAT,CAAgB,CAAhB,CAAX,CADmC;qBAE5B,IAAP,CAFmC;aAArC;gBAII,cAAc,KAAK,WAAL,CAAiB,QAAjB,EAA2B,IAA3B,CAAd,CANsC;gBAOtC,WAAJ,EAAiB;kBACT,kBAAkB,YAAY,CAAZ,EAAe,GAAf,EAAoB,KAApB,EAA2B,KAA3B,CAAlB,CADS;kBAEX,IAAJ,EAAU;2BACG,WAAW,SAAS,EAAT,CAAY,eAAZ,CAAX,GAA0C,eAA1C,CADH;eAAV,MAEO;2BACM,WAAW,SAAS,GAAT,CAAa,eAAb,CAAX,GAA2C,eAA3C,CADN;eAFP;aAFF,MAOO;oBACC,IAAI,KAAJ,eAAsB,4BAAtB,CAAN,CADK;aAPP;WAPe,CAAjB,CAL6C;SAA3B,CAApB,CAH8B;eA2BvB,YAAY,IAAZ,CA3BuB;OAAf,CAAjB,CAFyC;KAA3C;;;QAkCI,MAAM,OAAN,EAAe;UACb,SAAS,MAAM,OAAN,CAAb,EAA6B;cACrB,OAAN,GAAgB,CACd,CAAC,MAAM,OAAN,EAAe,KAAhB,CADc,CAAhB,CAD2B;OAA7B;WAKK,IAAI,IAAI,CAAJ,EAAO,IAAI,MAAM,OAAN,CAAc,MAAd,EAAsB,GAA1C,EAA+C;YACzC,SAAS,MAAM,OAAN,CAAc,CAAd,CAAT,CAAJ,EAAgC;gBACxB,OAAN,CAAc,CAAd,IAAmB,CAAC,MAAM,OAAN,CAAc,CAAd,CAAD,EAAmB,KAAnB,CAAnB,CAD8B;SAAhC;cAGM,CAAC,MAAM,OAAN,CAAc,CAAd,EAAiB,CAAjB,KAAuB,EAAvB,CAAD,CAA4B,WAA5B,OAA8C,MAA9C,GAAuD,IAAI,OAAJ,CAAY,EAAE,IAAF,CAAO,MAAM,OAAN,CAAc,CAAd,EAAiB,CAAjB,CAAP,CAAZ,CAAvD,GAAkG,IAAI,OAAJ,CAAY,MAAM,OAAN,CAAc,CAAd,EAAiB,CAAjB,CAAZ,CAAlG,CAJuC;OAA/C;KANF;;;QAeI,MAAM,IAAN,EAAY;YACR,IAAI,IAAJ,CAAS,CAAC,MAAM,IAAN,CAAhB,CADc;KAAhB;;;QAKI,MAAM,KAAN,EAAa;YACT,IAAI,KAAJ,CAAU,CAAC,MAAM,KAAN,CAAjB,CADe;KAAjB;;WAIO,GAAP,CAvFqC;GA/LU;gCAyRtC,MAAM;QACT,OAAO,IAAP,CADS;aAEN,OAAO,EAAP,CAAT,CAFe;QAGT,KAAK,YAAY,KAAK,EAAL,CAAZ,GAAuB,KAAK,EAAL,GAAU,KAAK,EAAL,CAH7B;QAIX,CAAC,KAAK,SAAL,CAAe,EAAf,CAAD,EAAqB;WAClB,SAAL,CAAe,EAAf,IAAqB,KAAK,CAAL,CAAO,MAAP,CACnB,KAAK,CAAL,CAAO,MAAP,GAAgB,QAAhB,CAAyB,EAAzB,CADmB,EAEnB,IAFmB,EAGnB,KAAK,CAAL,CAAO,QAAP,CAAgB,EAAhB,CAHmB,EAInB,GAJmB,EAArB,CADuB;KAAzB;WAOO,KAAK,SAAL,CAAe,EAAf,CAAP,CAXe;GAzRgC;sCAuSnC,QAAQ,SAAS;;;QACvB,QAAQ,SAAS,MAAT,IAAmB,MAAnB,GAA6B,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CADd;cAEnB,WAAW,EAAX,CAFmB;QAGzB,KAAK,YAAY,QAAQ,EAAR,CAAZ,GAA0B,KAAK,EAAL,GAAU,QAAQ,EAAR,CAHhB;WAItB,KAAK,SAAL,CAAe,OAAf,EAAwB,IAAxB,CAA6B,YAAM;YACnC,MAAL,CAAY,EAAZ,IAAkB,MAAK,MAAL,CAAY,EAAZ,KAAmB,EAAnB,CADsB;UAEpC,CAAC,MAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,CAAD,EAAyB;cACtB,MAAL,CAAY,EAAZ,EAAgB,KAAhB,IAAyB,MAAK,CAAL,CAAO,MAAP,CAAc,MAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,SAAd,GAA0B,QAA1B,CAAmC,KAAnC,CAAd,EAAyD,IAAzD,EAA+D,MAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,WAAd,CAA0B,KAA1B,CAA/D,EAAiG,GAAjG,EAAzB,CAD2B;OAA7B;aAGO,MAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,CAAP,CALwC;KAAN,CAApC,CAJ6B;GAvSkB;sCAoTnC,OAAO,OAAO,SAAS;;;cACzB,WAAW,EAAX,CADyB;QAE/B,KAAK,YAAY,QAAQ,EAAR,CAAZ,GAA0B,KAAK,EAAL,GAAU,QAAQ,EAAR,CAFV;WAG5B,KAAK,SAAL,CAAe,OAAf,EAAwB,IAAxB,CAA6B;aAAM,OAAK,YAAL,CAAkB,KAAlB,EAAyB,OAAzB;KAAN,CAA7B,CAAsE,IAAtE,CAA2E,YAAM;aACjF,OAAL,CAAa,EAAb,IAAmB,OAAK,OAAL,CAAa,EAAb,KAAoB,EAApB,CADmE;aAEjF,OAAL,CAAa,EAAb,EAAiB,KAAjB,IAA0B,OAAK,OAAL,CAAa,EAAb,EAAiB,KAAjB,KAA2B,EAA3B,CAF4D;UAGlF,CAAC,OAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,EAAuB,KAAvB,CAAD,EAAgC;eAC7B,MAAL,CAAY,EAAZ,EAAgB,KAAhB,EAAuB,KAAvB,IAAgC,OAAK,CAAL,CAAO,MAAP,CAAc,OAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,KAAd,CAAoB,KAApB,EAA2B,SAA3B,GAAuC,QAAvC,CAAgD,KAAhD,CAAd,EAAsE,IAAtE,EAA4E,OAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,KAAd,CAAoB,KAApB,EAA2B,WAA3B,CAAuC,KAAvC,CAA5E,EAA2H,GAA3H,GAAiI,IAAjI,CAAsI,YAAM;iBACnK,OAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,KAAd,CAAoB,KAApB,EAA2B,SAA3B,CAAqC,KAArC,EAA4C,GAA5C,EAAP,CAD0K;SAAN,CAAtK,CADkC;OAApC;aAKO,OAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,EAAuB,KAAvB,CAAP,CARsF;KAAN,CAAlF,CAHmC;GApTY;;;;;;;;;;;;;;;;;0BAiVzC,QAAQ,OAAO,MAAM;QACrB,OAAO,IAAP,CADqB;cAEjB,QAAQ,EAAR,CAAV,CAF2B;aAGlB,OAAO,EAAP,CAAT,CAH2B;;WAKpB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;aAC/C,UAAU,MAAV,CAAiB,IAAjB,CAAsB,IAAtB,EAA4B,MAA5B,EAAoC,KAApC,EAA2C,IAA3C,CAAP,CADsD;KAAZ,CAA5C,CAL2B;GAjVoB;;;;;;;;;;;;;;;;;kCAyWrC,QAAQ,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;cAErB,QAAQ,EAAR,CAAV,CAF+B;aAGtB,OAAO,EAAP,CAAT,CAH+B;;WAKxB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;aAC/C,UAAU,UAAV,CAAqB,IAArB,CAA0B,IAA1B,EAAgC,MAAhC,EAAwC,KAAxC,EAA+C,IAA/C,CAAP,CADsD;KAAZ,CAA5C,CAL+B;GAzWgB;;;;;;;;;;;;;;;;;4BAiYxC,QAAQ,IAAI,MAAM;QACnB,OAAO,IAAP,CADmB;aAEhB,OAAO,EAAP,CAAT,CAFyB;;WAIlB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;aAC/C,UAAU,OAAV,CAAkB,IAAlB,CAAuB,IAAvB,EAA6B,MAA7B,EAAqC,EAArC,EAAyC,IAAzC,CAAP,CADsD;KAAZ,CAA5C,CAJyB;GAjYsB;;;;;;;;;;;;;;;;;;;;;;;;;kCAgarC,QAAQ,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;aAEtB,OAAO,EAAP,CAAT,CAF+B;cAGrB,QAAQ,EAAR,CAAV,CAH+B;;WAKxB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;aAC/C,UAAU,UAAV,CAAqB,IAArB,CAA0B,IAA1B,EAAgC,MAAhC,EAAwC,KAAxC,EAA+C,IAA/C,CAAP,CADsD;KAAZ,CAA5C,CAL+B;GAhagB;;;;;;;;;;;;;;;;;sBAwb3C,QAAQ,IAAI,MAAM;QAChB,OAAO,IAAP,CADgB;aAEb,OAAO,EAAP,CAAT,CAFsB;SAGjB,IAAL,KAAc,KAAK,IAAL,GAAY,EAAZ,CAAd,CAHsB;;QAKhB,eAAe,OAAO,YAAP,IAAuB,EAAvB,CALC;QAMlB,QAAQ,CAAC,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,CAAD,CAAR,CANkB;;iBAQT,OAAb,CAAqB,UAAU,GAAV,EAAe;UAC5B,eAAe,IAAI,QAAJ,CADa;UAE5B,cAAc,IAAI,WAAJ,EAAd,CAF4B;UAG9B,CAAC,KAAK,IAAL,IAAa,KAAK,IAAL,CAAU,OAAV,CAAkB,YAAlB,MAAoC,CAAC,CAAD,EAAI;eAAA;OAA1D;UAGI,IAAI,UAAJ,IAAkB,IAAI,IAAJ,KAAa,WAAb,EAA0B;YAC1C,IAAI,IAAJ,KAAa,WAAb,EAA0B;gBACtB,IAAN,CAAW,KAAK,YAAL,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,EAAyC,IAAI,UAAJ,EAAgB,IAA3E,CAAX,EAD4B;SAA9B,MAEO;gBACC,IAAN,CAAW,KAAK,YAAL,CAAkB,YAAY,KAAZ,IAAqB,WAAW,YAAY,IAAZ,CAAhC,EAAmD,IAAI,UAAJ,EAAgB,IAArF,CAAX,EADK;SAFP;OADF;KANmB,CAArB,CARsB;WAsBf,QAAQ,GAAR,CAAY,KAAZ,EAAmB,IAAnB,CAAwB,YAAY;aAClC,UAAU,IAAV,CAAe,IAAf,CAAoB,IAApB,EAA0B,MAA1B,EAAkC,EAAlC,EAAsC,IAAtC,CAAP,CADyC;KAAZ,CAA/B,CAtBsB;GAxbyB;;;;;;;;;;;;;;;;;;;;;;;;;4BAyexC,QAAQ,OAAO,MAAM;QACtB,OAAO,IAAP,CADsB;aAEnB,OAAO,EAAP,CAAT,CAF4B;SAGvB,IAAL,KAAc,KAAK,IAAL,GAAY,EAAZ,CAAd,CAH4B;cAIlB,QAAQ,EAAR,CAAV,CAJ4B;;QAMtB,eAAe,OAAO,YAAP,IAAuB,EAAvB,CANO;QAOxB,QAAQ,CAAC,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,CAAD,CAAR,CAPwB;;iBASf,OAAb,CAAqB,UAAU,GAAV,EAAe;UAC5B,eAAe,IAAI,QAAJ,CADa;UAE5B,cAAc,IAAI,WAAJ,EAAd,CAF4B;UAG9B,CAAC,KAAK,IAAL,IAAa,KAAK,IAAL,CAAU,OAAV,CAAkB,YAAlB,MAAoC,CAAC,CAAD,EAAI;eAAA;OAA1D;UAGI,IAAI,UAAJ,IAAkB,IAAI,IAAJ,KAAa,WAAb,EAA0B;YAC1C,IAAI,IAAJ,KAAa,WAAb,EAA0B;gBACtB,IAAN,CAAW,KAAK,YAAL,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,EAAyC,IAAI,UAAJ,EAAgB,IAA3E,CAAX,EAD4B;SAA9B,MAEO;gBACC,IAAN,CAAW,KAAK,YAAL,CAAkB,YAAY,KAAZ,IAAqB,WAAW,YAAY,IAAZ,CAAhC,EAAmD,IAAI,UAAJ,EAAgB,IAArF,CAAX,EADK;SAFP;OADF;KANmB,CAArB,CAT4B;WAuBrB,QAAQ,GAAR,CAAY,KAAZ,EAAmB,IAAnB,CAAwB,YAAY;aAClC,UAAU,OAAV,CAAkB,IAAlB,CAAuB,IAAvB,EAA6B,MAA7B,EAAqC,KAArC,EAA4C,IAA5C,CAAP,CADyC;KAAZ,CAA/B,CAvB4B;GAzemB;;;;;;;;;;;;;;;oCAihBpC,UAAU,MAAM;aAClB,OAAO,EAAP,CAAT,CAD2B;SAEtB,SAAL,KAAmB,KAAK,SAAL,GAAiB,EAAjB,CAAnB,CAF2B;QAGvB,SAAS,KAAK,SAAL,IAAkB,EAAlB,CAHc;WAIpB,YAAY,KAAK,SAAL,CAAe,QAAf,CAAZ,IAAwC,OAAO,QAAP,KAAoB,UAAU,QAAV,CAApB,GAA0C,KAAK,SAAL,CAAe,QAAf,CAAlF,CAJoB;GAjhBoB;;;;;;;;;;;;;;;;;;0BAuiBzC,QAAQ,IAAI,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;cAErB,QAAQ,EAAR,CAAV,CAF+B;aAGtB,OAAO,EAAP,CAAT,CAH+B;;WAKxB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;aAC/C,UAAU,MAAV,CAAiB,IAAjB,CAAsB,IAAtB,EAA4B,MAA5B,EAAoC,EAApC,EAAwC,KAAxC,EAA+C,IAA/C,CAAP,CADsD;KAAZ,CAA5C,CAL+B;GAviBgB;;;;;;;;;;;;;;;;;;;;;;;;;;gCAwkBtC,QAAQ,OAAO,OAAO,MAAM;QAC/B,OAAO,IAAP,CAD+B;cAE3B,QAAQ,EAAR,CAAV,CAFqC;cAG3B,QAAQ,EAAR,CAAV,CAHqC;aAI5B,OAAO,EAAP,CAAT,CAJqC;;WAM9B,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;aAC/C,UAAU,SAAV,CAAoB,IAApB,CAAyB,IAAzB,EAA+B,MAA/B,EAAuC,KAAvC,EAA8C,KAA9C,EAAqD,IAArD,CAAP,CADsD;KAAZ,CAA5C,CANqC;GAxkBU;;;;;;;;;;;;;;;;;kCAimBrC,QAAQ,SAAS,MAAM;QAC3B,OAAO,IAAP,CAD2B;gBAErB,UAAU,EAAV,CAAZ,CAFiC;aAGxB,OAAO,EAAP,CAAT,CAHiC;;WAK1B,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;aAC/C,UAAU,UAAV,CAAqB,IAArB,CAA0B,IAA1B,EAAgC,MAAhC,EAAwC,OAAxC,EAAiD,IAAjD,CAAP,CADsD;KAAZ,CAA5C,CALiC;GAjmBc;CAAnD;;AA4mBA,OAAO,OAAP,GAAiB,gBAAjB"} \ No newline at end of file diff --git a/mocha.start.js b/mocha.start.js index 333f8be..25a2d45 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -20,16 +20,10 @@ JSDataAdapterTests.init({ max: 5, bufferSize: 5 }, - storeConfig: { - bypassCache: true, - linkRelations: false, - cacheResponse: false, - log: false, - debug: false - }, - features: [ - 'findHasManyLocalKeys', - 'findHasManyForeignKeys' + // js-data-rethinkdb does NOT support these features + xfeatures: [ + 'findAllLikeOp', + 'filterOnRelations' ] }) diff --git a/package.json b/package.json index 0461966..16a176d 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ ] }, "scripts": { - "lint": "repo-tools lint src/index.js mocha.start.js test/**/*.js scripts/**.js", + "lint": "repo-tools lint src/index.js mocha.start.js test/**/*.js scripts/**.js rollup.config.js", "bundle": "rollup -c rollup.config.js -f cjs -o dist/js-data-rethinkdb.js -m dist/js-data-rethinkdb.js.map src/index.js", "doc": "jsdoc -c conf.json src node_modules/js-data-adapter/src && node scripts/cleanup.js", "watch": "watch \"npm run bundle\" src/", @@ -43,10 +43,10 @@ "test": "npm run build && npm run cover", "repo-tools": "repo-tools updates && repo-tools changelog && repo-tools authors", "release": "npm test && npm run doc && npm run repo-tools", - "ci": "npm run test && cat coverage/lcov.info | coveralls || true && cat ./coverage/lcov.info | codacy-coverage || true" + "ci": "npm run test && cat coverage/lcov.info | coveralls || true" }, "dependencies": { - "js-data-adapter": "0.1.2", + "js-data-adapter": "0.2.0", "mout": "0.12.0" }, "peerDependencies": { @@ -54,15 +54,14 @@ "rethinkdbdash": ">=1.15.0" }, "devDependencies": { - "babel-core": "6.6.5", + "babel-core": "6.7.0", "babel-polyfill": "6.6.1", "babel-preset-es2015-rollup": "1.1.1", "chai": "3.5.0", - "codacy-coverage": "1.1.3", "coveralls": "2.11.8", "ink-docstrap": "1.1.4", "istanbul": "0.4.2", - "js-data-adapter-tests": "^2.0.0-alpha.13", + "js-data-adapter-tests": "^2.0.0-alpha.14", "js-data-repo-tools": "0.2.0", "jsdoc": "3.4.0", "mocha": "2.4.5", diff --git a/src/index.js b/src/index.js index 9731b1f..7af78db 100644 --- a/src/index.js +++ b/src/index.js @@ -1,34 +1,30 @@ import {utils} from 'js-data' import Adapter from 'js-data-adapter' import { - reserved, - Response + reserved } from 'js-data-adapter' import rethinkdbdash from 'rethinkdbdash' import underscore from 'mout/string/underscore' -import unique from 'mout/array/unique' const { addHiddenPropsToTarget, classCallCheck, extend, fillIn, - forEachRelation, forOwn, - get, - isArray, isObject, isString, isUndefined, omit, - plainCopy, - resolve + plainCopy } = utils const withoutRelations = function (mapper, props) { return omit(props, mapper.relationFields || []) } +const __super__ = Adapter.prototype + const DEFAULTS = { /** * RethinkDB authorization key. @@ -88,7 +84,7 @@ const DEFAULTS = { * * @name RethinkDBAdapter#port * @type {number} - * @default 10 + * @default 28015 */ port: 28015 } @@ -172,13 +168,13 @@ const OPERATORS = { * @example * // Use Container instead of DataStore on the server * import {Container} from 'js-data' - * import RethinkdbDBAdapter from 'js-data-rethinkdb' + * import RethinkDBAdapter from 'js-data-rethinkdb' * * // Create a store to hold your Mappers * const store = new Container() * - * // Create an instance of RethinkdbDBAdapter with default settings - * const adapter = new RethinkdbDBAdapter() + * // Create an instance of RethinkDBAdapter with default settings + * const adapter = new RethinkDBAdapter() * * // Mappers in "store" will use the RethinkDB adapter by default * store.registerAdapter('rethinkdb', adapter, { default: true }) @@ -201,7 +197,7 @@ const OPERATORS = { * @param {number} [opts.port=28015] RethinkDB port. * @param {boolean} [opts.raw=false] Whether to return a more detailed response object. */ -export default function RethinkDBAdapter (opts) { +function RethinkDBAdapter (opts) { const self = this classCallCheck(self, RethinkDBAdapter) opts || (opts = {}) @@ -298,6 +294,8 @@ Object.defineProperty(RethinkDBAdapter, '__super__', { */ RethinkDBAdapter.extend = extend +RethinkDBAdapter.OPERATORS = OPERATORS + addHiddenPropsToTarget(RethinkDBAdapter.prototype, { _handleErrors (cursor) { if (cursor && cursor.errors > 0) { @@ -308,6 +306,162 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } }, + _create (mapper, props, opts) { + const self = this + props || (props = {}) + opts || (opts = {}) + + const insertOpts = self.getOpt('insertOpts', opts) + insertOpts.returnChanges = true + + return self.selectTable(mapper, opts) + .insert(props, insertOpts) + .run(self.getOpt('runOpts', opts)).then(function (cursor) { + self._handleErrors(cursor) + let record + if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { + record = cursor.changes[0].new_val + } + return [record, cursor] + }) + }, + + _createMany (mapper, props, opts) { + const self = this + props || (props = {}) + opts || (opts = {}) + + const insertOpts = self.getOpt('insertOpts', opts) + insertOpts.returnChanges = true + + return self.selectTable(mapper, opts) + .insert(props, insertOpts) + .run(self.getOpt('runOpts', opts)).then(function (cursor) { + self._handleErrors(cursor) + let records = [] + if (cursor && cursor.changes && cursor.changes.length && cursor.changes) { + records = cursor.changes.map(function (change) { + return change.new_val + }) + } + return [records, cursor] + }) + }, + + _destroy (mapper, id, opts) { + const self = this + opts || (opts = {}) + + return self.selectTable(mapper, opts) + .get(id) + .delete(self.getOpt('deleteOpts', opts)) + .run(self.getOpt('runOpts', opts)).then(function (cursor) { + self._handleErrors(cursor) + return [undefined, cursor] + }) + }, + + _destroyAll (mapper, query, opts) { + const self = this + query || (query = {}) + opts || (opts = {}) + + return self + .filterSequence(self.selectTable(mapper, opts), query) + .delete(self.getOpt('deleteOpts', opts)) + .run(self.getOpt('runOpts', opts)).then(function (cursor) { + self._handleErrors(cursor) + return [undefined, cursor] + }) + }, + + _find (mapper, id, opts) { + const self = this + opts || (opts = {}) + + return self.selectTable(mapper, opts) + .get(id) + .run(self.getOpt('runOpts', opts)).then(function (record) { + return [record, {}] + }) + }, + + _findAll (mapper, query, opts) { + const self = this + opts || (opts = {}) + query || (query = {}) + + return self.filterSequence(self.selectTable(mapper, opts), query) + .run(self.getOpt('runOpts', opts)).then(function (records) { + return [records, {}] + }) + }, + + _update (mapper, id, props, opts) { + const self = this + props || (props = {}) + opts || (opts = {}) + + const updateOpts = self.getOpt('updateOpts', opts) + updateOpts.returnChanges = true + + return self.selectTable(mapper, opts) + .get(id) + .update(withoutRelations(mapper, props), updateOpts) + .run(self.getOpt('runOpts', opts)).then(function (cursor) { + let record + self._handleErrors(cursor) + if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { + record = cursor.changes[0].new_val + } else { + throw new Error('Not Found') + } + return [record, cursor] + }) + }, + + _updateAll (mapper, props, query, opts) { + const self = this + props || (props = {}) + query || (query = {}) + opts || (opts = {}) + + const updateOpts = self.getOpt('updateOpts', opts) + updateOpts.returnChanges = true + + return self.filterSequence(self.selectTable(mapper, opts), query) + .update(withoutRelations(mapper, props), updateOpts) + .run(self.getOpt('runOpts', opts)).then(function (cursor) { + let records = [] + self._handleErrors(cursor) + if (cursor && cursor.changes && cursor.changes.length) { + records = cursor.changes.map(function (change) { return change.new_val }) + } + return [records, cursor] + }) + }, + + _updateMany (mapper, records, opts) { + const self = this + records || (records = []) + opts || (opts = {}) + + const insertOpts = self.getOpt('insertOpts', opts) + insertOpts.returnChanges = true + insertOpts.conflict = 'update' + + return self.selectTable(mapper, opts) + .insert(records, insertOpts) + .run(self.getOpt('runOpts', opts)).then(function (cursor) { + records = [] + self._handleErrors(cursor) + if (cursor && cursor.changes && cursor.changes.length) { + records = cursor.changes.map(function (change) { return change.new_val }) + } + return [records, cursor] + }) + }, + selectDb (opts) { return this.r.db(isUndefined(opts.db) ? this.db : opts.db) }, @@ -386,6 +540,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } else { subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult } + } else { + throw new Error(`Operator ${operator} not supported!`) } }) }) @@ -435,6 +591,34 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return self.databases[db] }, + waitForTable (mapper, options) { + const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name)) + options = options || {} + let db = isUndefined(options.db) ? this.db : options.db + return this.waitForDb(options).then(() => { + this.tables[db] = this.tables[db] || {} + if (!this.tables[db][table]) { + this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run() + } + return this.tables[db][table] + }) + }, + + waitForIndex (table, index, options) { + options = options || {} + let db = isUndefined(options.db) ? this.db : options.db + return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => { + this.indices[db] = this.indices[db] || {} + this.indices[db][table] = this.indices[db][table] || {} + if (!this.tables[db][table][index]) { + this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => { + return this.r.db(db).table(table).indexWait(index).run() + }) + } + return this.tables[db][table][index] + }) + }, + /** * Create a new record. * @@ -451,37 +635,11 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ create (mapper, props, opts) { const self = this - let op props || (props = {}) opts || (opts = {}) return self.waitForTable(mapper, opts).then(function () { - // beforeCreate lifecycle hook - op = opts.op = 'beforeCreate' - return resolve(self[op](mapper, props, opts)) - }).then(function (_props) { - // Allow for re-assignment from lifecycle hook - props = isUndefined(_props) ? props : _props - const insertOpts = self.getOpt('insertOpts', opts) - insertOpts.returnChanges = true - _props = withoutRelations(mapper, props) - return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts)) - }).then(function (cursor) { - self._handleErrors(cursor) - let record - if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { - record = cursor.changes[0].new_val - } - let response = new Response(record, cursor, 'create') - response.created = record ? 1 : 0 - response = self.respond(response, opts) - - // afterCreate lifecycle hook - op = opts.op = 'afterCreate' - return resolve(self[op](mapper, props, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response - }) + return __super__.create.call(self, mapper, props, opts) }) }, @@ -501,41 +659,11 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ createMany (mapper, props, opts) { const self = this - let op props || (props = {}) opts || (opts = {}) return self.waitForTable(mapper, opts).then(function () { - // beforeCreateMany lifecycle hook - op = opts.op = 'beforeCreateMany' - return resolve(self[op](mapper, props, opts)) - }).then(function (_props) { - // Allow for re-assignment from lifecycle hook - props = isUndefined(_props) ? props : _props - const insertOpts = self.getOpt('insertOpts', opts) - insertOpts.returnChanges = true - _props = props.map(function (record) { - return withoutRelations(mapper, record) - }) - return self.selectTable(mapper, opts).insert(_props, insertOpts).run(self.getOpt('runOpts', opts)) - }).then(function (cursor) { - self._handleErrors(cursor) - let records = [] - if (cursor && cursor.changes && cursor.changes.length && cursor.changes) { - records = cursor.changes.map(function (change) { - return change.new_val - }) - } - let response = new Response(records, cursor, 'createMany') - response.created = records.length - response = self.respond(response, opts) - - // afterCreateMany lifecycle hook - op = opts.op = 'afterCreateMany' - return resolve(self[op](mapper, props, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response - }) + return __super__.createMany.call(self, mapper, props, opts) }) }, @@ -555,27 +683,10 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ destroy (mapper, id, opts) { const self = this - let op opts || (opts = {}) return self.waitForTable(mapper, opts).then(function () { - // beforeDestroy lifecycle hook - op = opts.op = 'beforeDestroy' - return resolve(self[op](mapper, id, opts)) - }).then(function () { - op = opts.op = 'destroy' - self.dbg(op, id, opts) - return self.selectTable(mapper, opts).get(id).delete(self.getOpt('deleteOpts', opts)).run(self.getOpt('runOpts', opts)) - }).then(function (cursor) { - let response = new Response(undefined, cursor, 'destroy') - response = self.respond(response, opts) - - // afterDestroy lifecycle hook - op = opts.op = 'afterDestroy' - return resolve(self[op](mapper, id, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response - }) + return __super__.destroy.call(self, mapper, id, opts) }) }, @@ -603,31 +714,11 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ destroyAll (mapper, query, opts) { const self = this - let op - query || (query = {}) opts || (opts = {}) + query || (query = {}) return self.waitForTable(mapper, opts).then(function () { - // beforeDestroyAll lifecycle hook - op = opts.op = 'beforeDestroyAll' - return resolve(self[op](mapper, query, opts)) - }).then(function () { - op = opts.op = 'destroyAll' - self.dbg(op, query, opts) - return self - .filterSequence(self.selectTable(mapper, opts), query) - .delete(self.getOpt('deleteOpts', opts)) - .run(self.getOpt('runOpts', opts)) - }).then(function (cursor) { - let response = new Response(undefined, cursor, 'destroyAll') - response = self.respond(response, opts) - - // afterDestroyAll lifecycle hook - op = opts.op = 'afterDestroyAll' - return resolve(self[op](mapper, query, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response - }) + return __super__.destroyAll.call(self, mapper, query, opts) }) }, @@ -647,7 +738,6 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { */ find (mapper, id, opts) { const self = this - let record, op opts || (opts = {}) opts.with || (opts.with = []) @@ -669,74 +759,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } }) return Promise.all(tasks).then(function () { - // beforeFind lifecycle hook - op = opts.op = 'beforeFind' - return resolve(self[op](mapper, id, opts)) - }).then(function () { - op = opts.op = 'find' - self.dbg(op, id, opts) - return self.selectTable(mapper, opts).get(id).run(self.getOpt('runOpts', opts)) - }).then(function (_record) { - if (!_record) { - return - } - record = _record - const tasks = [] - - forEachRelation(mapper, opts, function (def, __opts) { - const relatedMapper = def.getRelation() - let task - - if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { - if (def.type === 'hasOne') { - task = self.loadHasOne(mapper, def, record, __opts) - } else { - task = self.loadHasMany(mapper, def, record, __opts) - } - } else if (def.type === 'hasMany' && def.localKeys) { - let localKeys = [] - let itemKeys = get(record, def.localKeys) || [] - itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys) - localKeys = localKeys.concat(itemKeys) - task = self.findAll(relatedMapper, { - where: { - [relatedMapper.idAttribute]: { - 'in': unique(localKeys).filter(function (x) { return x }) - } - } - }, __opts).then(function (relatedItems) { - def.setLocalField(record, relatedItems) - }) - } else if (def.type === 'hasMany' && def.foreignKeys) { - task = self.findAll(relatedMapper, { - where: { - [def.foreignKeys]: { - 'contains': self.makeHasManyForeignKeys(mapper, def, record) - } - } - }, __opts).then(function (relatedItems) { - def.setLocalField(record, relatedItems) - }) - } else if (def.type === 'belongsTo') { - task = self.loadBelongsTo(mapper, def, record, __opts) - } - if (task) { - tasks.push(task) - } - }) - - return Promise.all(tasks) - }).then(function () { - let response = new Response(record, {}, 'find') - response.found = record ? 1 : 0 - response = self.respond(response, opts) - - // afterFind lifecycle hook - op = opts.op = 'afterFind' - return resolve(self[op](mapper, id, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response - }) + return __super__.find.call(self, mapper, id, opts) }) }, @@ -766,9 +789,8 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { const self = this opts || (opts = {}) opts.with || (opts.with = []) + query || (query = {}) - let records = [] - let op const relationList = mapper.relationList || [] let tasks = [self.waitForTable(mapper, opts)] @@ -787,96 +809,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } }) return Promise.all(tasks).then(function () { - // beforeFindAll lifecycle hook - op = opts.op = 'beforeFindAll' - return resolve(self[op](mapper, query, opts)) - }).then(function () { - op = opts.op = 'findAll' - self.dbg(op, query, opts) - return self.filterSequence(self.selectTable(mapper, opts), query).run(self.getOpt('runOpts', opts)) - }).then(function (_records) { - records = _records - const tasks = [] - forEachRelation(mapper, opts, function (def, __opts) { - const relatedMapper = def.getRelation() - const idAttribute = mapper.idAttribute - let task - if (def.foreignKey && (def.type === 'hasOne' || def.type === 'hasMany')) { - if (def.type === 'hasMany') { - task = self.loadHasMany(mapper, def, records, __opts) - } else { - task = self.loadHasOne(mapper, def, records, __opts) - } - } else if (def.type === 'hasMany' && def.localKeys) { - let localKeys = [] - records.forEach(function (item) { - let itemKeys = item[def.localKeys] || [] - itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys) - localKeys = localKeys.concat(itemKeys) - }) - task = self.findAll(relatedMapper, { - where: { - [relatedMapper.idAttribute]: { - 'in': unique(localKeys).filter(function (x) { return x }) - } - } - }, __opts).then(function (relatedItems) { - records.forEach(function (item) { - let attached = [] - let itemKeys = get(item, def.localKeys) || [] - itemKeys = isArray(itemKeys) ? itemKeys : Object.keys(itemKeys) - relatedItems.forEach(function (relatedItem) { - if (itemKeys && itemKeys.indexOf(relatedItem[relatedMapper.idAttribute]) !== -1) { - attached.push(relatedItem) - } - }) - def.setLocalField(item, attached) - }) - return relatedItems - }) - } else if (def.type === 'hasMany' && def.foreignKeys) { - task = self.findAll(relatedMapper, { - where: { - [def.foreignKeys]: { - 'isectNotEmpty': records.map(function (record) { - return self.makeHasManyForeignKeys(mapper, def, record) - }) - } - } - }, __opts).then(function (relatedItems) { - const foreignKeysField = def.foreignKeys - records.forEach(function (record) { - const _relatedItems = [] - const id = get(record, idAttribute) - relatedItems.forEach(function (relatedItem) { - const foreignKeys = get(relatedItems, foreignKeysField) || [] - if (foreignKeys.indexOf(id) !== -1) { - _relatedItems.push(relatedItem) - } - }) - def.setLocalField(record, _relatedItems) - }) - }) - } else if (def.type === 'belongsTo') { - task = self.loadBelongsTo(mapper, def, records, __opts) - } - if (task) { - tasks.push(task) - } - }) - return Promise.all(tasks) - }).then(function () { - records || (records = []) - let response = new Response(records, {}, 'findAll') - response.found = records.length - response = self.respond(response, opts) - - // afterFindAll lifecycle hook - op = opts.op = 'afterFindAll' - return resolve(self[op](mapper, query, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response - }) + return __super__.findAll.call(self, mapper, query, opts) }) }, @@ -918,36 +851,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { const self = this props || (props = {}) opts || (opts = {}) - let op return self.waitForTable(mapper, opts).then(function () { - // beforeUpdate lifecycle hook - op = opts.op = 'beforeUpdate' - return resolve(self[op](mapper, id, props, opts)) - }).then(function (_props) { - // Allow for re-assignment from lifecycle hook - props = isUndefined(_props) ? props : _props - const updateOpts = self.getOpt('updateOpts', opts) - updateOpts.returnChanges = true - return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts)) - }).then(function (cursor) { - let record - self._handleErrors(cursor) - if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { - record = cursor.changes[0].new_val - } else { - throw new Error('Not Found') - } - let response = new Response(record, cursor, 'update') - response.updated = 1 - response = self.respond(response, opts) - - // afterUpdate lifecycle hook - op = opts.op = 'afterUpdate' - return resolve(self[op](mapper, id, props, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response - }) + return __super__.update.call(self, mapper, id, props, opts) }) }, @@ -979,34 +885,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { props || (props = {}) query || (query = {}) opts || (opts = {}) - let op return self.waitForTable(mapper, opts).then(function () { - // beforeUpdateAll lifecycle hook - op = opts.op = 'beforeUpdateAll' - return resolve(self[op](mapper, props, query, opts)) - }).then(function (_props) { - // Allow for re-assignment from lifecycle hook - props = isUndefined(_props) ? props : _props - const updateOpts = self.getOpt('updateOpts', opts) - updateOpts.returnChanges = true - return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts)) - }).then(function (cursor) { - let records = [] - self._handleErrors(cursor) - if (cursor && cursor.changes && cursor.changes.length) { - records = cursor.changes.map(function (change) { return change.new_val }) - } - let response = new Response(records, cursor, 'update') - response.updated = records.length - response = self.respond(response, opts) - - // afterUpdateAll lifecycle hook - op = opts.op = 'afterUpdateAll' - return resolve(self[op](mapper, props, query, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response - }) + return __super__.updateAll.call(self, mapper, props, query, opts) }) }, @@ -1028,73 +909,11 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { const self = this records || (records = []) opts || (opts = {}) - let op - const idAttribute = mapper.idAttribute - - records = records.filter(function (record) { - return get(record, idAttribute) - }) return self.waitForTable(mapper, opts).then(function () { - // beforeUpdateMany lifecycle hook - op = opts.op = 'beforeUpdateMany' - return resolve(self[op](mapper, records, opts)) - }).then(function (_records) { - // Allow for re-assignment from lifecycle hook - _records = isUndefined(_records) ? records : _records - const insertOpts = self.getOpt('insertOpts', opts) - insertOpts.returnChanges = true - insertOpts.conflict = 'update' - _records = _records.map(function (record) { - return withoutRelations(mapper, record) - }) - return self.selectTable(mapper, opts).insert(_records, insertOpts).run(self.getOpt('runOpts', opts)) - }).then(function (cursor) { - let updatedRecords - self._handleErrors(cursor) - if (cursor && cursor.changes && cursor.changes.length) { - updatedRecords = cursor.changes.map(function (change) { return change.new_val }) - } - let response = new Response(updatedRecords || [], cursor, 'update') - response.updated = response.data.length - response = self.respond(response, opts) - - // afterUpdateMany lifecycle hook - op = opts.op = 'afterUpdateMany' - return resolve(self[op](mapper, records, opts, response)).then(function (_response) { - // Allow for re-assignment from lifecycle hook - return isUndefined(_response) ? response : _response - }) - }) - }, - - waitForTable (mapper, options) { - const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name)) - options = options || {} - let db = isUndefined(options.db) ? this.db : options.db - return this.waitForDb(options).then(() => { - this.tables[db] = this.tables[db] || {} - if (!this.tables[db][table]) { - this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run() - } - return this.tables[db][table] - }) - }, - - waitForIndex (table, index, options) { - options = options || {} - let db = isUndefined(options.db) ? this.db : options.db - return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => { - this.indices[db] = this.indices[db] || {} - this.indices[db][table] = this.indices[db][table] || {} - if (!this.tables[db][table][index]) { - this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => { - return this.r.db(db).table(table).indexWait(index).run() - }) - } - return this.tables[db][table][index] + return __super__.updateMany.call(self, mapper, records, opts) }) } }) -RethinkDBAdapter.OPERATORS = OPERATORS +module.exports = RethinkDBAdapter From 60447c4ee57eb69055380964e8a1080a609ba7df Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Wed, 9 Mar 2016 21:12:02 -0800 Subject: [PATCH 22/27] 3.0.0-alpha.12 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 16a176d..902c1c6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-rethinkdb", "description": "RethinkDB adapter for js-data.", - "version": "3.0.0-alpha.11", + "version": "3.0.0-alpha.12", "homepage": "https://github.com/js-data/js-data-rethinkdb", "repository": { "type": "git", From f1e33a927fba7d02b9944b01a8c2411cde4b445b Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Thu, 17 Mar 2016 21:59:46 -0700 Subject: [PATCH 23/27] 3.0.0-alpha.13 --- CHANGELOG.md | 5 ++ dist/js-data-rethinkdb.js | 145 ++++++++++++++++++++++++-------- dist/js-data-rethinkdb.js.map | 2 +- package.json | 12 +-- src/index.js | 150 ++++++++++++++++++++++++++-------- 5 files changed, 236 insertions(+), 78 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0144c7a..1f83c5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +##### 3.0.0-alpha.13 - 17 March 2016 + +###### Backwards incompatible API changes +- Added sum and count methods + ##### 3.0.0-alpha.12 - 10 March 2016 ###### Other diff --git a/dist/js-data-rethinkdb.js b/dist/js-data-rethinkdb.js index 14cb6f8..70e551c 100644 --- a/dist/js-data-rethinkdb.js +++ b/dist/js-data-rethinkdb.js @@ -8,20 +8,8 @@ var Adapter__default = _interopDefault(Adapter); var rethinkdbdash = _interopDefault(require('rethinkdbdash')); var underscore = _interopDefault(require('mout/string/underscore')); -var addHiddenPropsToTarget = jsData.utils.addHiddenPropsToTarget; -var classCallCheck = jsData.utils.classCallCheck; -var extend = jsData.utils.extend; -var fillIn = jsData.utils.fillIn; -var forOwn = jsData.utils.forOwn; -var isObject = jsData.utils.isObject; -var isString = jsData.utils.isString; -var isUndefined = jsData.utils.isUndefined; -var omit = jsData.utils.omit; -var plainCopy = jsData.utils.plainCopy; - - var withoutRelations = function withoutRelations(mapper, props) { - return omit(props, mapper.relationFields || []); + return jsData.utils.omit(props, mapper.relationFields || []); }; var __super__ = Adapter__default.prototype; @@ -200,9 +188,9 @@ var OPERATORS = { */ function RethinkDBAdapter(opts) { var self = this; - classCallCheck(self, RethinkDBAdapter); + jsData.utils.classCallCheck(self, RethinkDBAdapter); opts || (opts = {}); - fillIn(opts, DEFAULTS); + jsData.utils.fillIn(opts, DEFAULTS); Adapter__default.call(self, opts); /** @@ -213,7 +201,7 @@ function RethinkDBAdapter(opts) { * @default {} */ self.insertOpts || (self.insertOpts = {}); - fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS); + jsData.utils.fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS); /** * Default options to pass to r#update. @@ -223,7 +211,7 @@ function RethinkDBAdapter(opts) { * @default {} */ self.updateOpts || (self.updateOpts = {}); - fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS); + jsData.utils.fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS); /** * Default options to pass to r#delete. @@ -233,7 +221,7 @@ function RethinkDBAdapter(opts) { * @default {} */ self.deleteOpts || (self.deleteOpts = {}); - fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS); + jsData.utils.fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS); /** * Default options to pass to r#run. @@ -243,7 +231,7 @@ function RethinkDBAdapter(opts) { * @default {} */ self.runOpts || (self.runOpts = {}); - fillIn(self.runOpts, RUN_OPTS_DEFAULTS); + jsData.utils.fillIn(self.runOpts, RUN_OPTS_DEFAULTS); /** * Override the default predicate functions for specified operators. @@ -293,11 +281,11 @@ Object.defineProperty(RethinkDBAdapter, '__super__', { * properties to the RethinkDBAdapter itself. * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`. */ -RethinkDBAdapter.extend = extend; +RethinkDBAdapter.extend = jsData.utils.extend; RethinkDBAdapter.OPERATORS = OPERATORS; -addHiddenPropsToTarget(RethinkDBAdapter.prototype, { +jsData.utils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, { _handleErrors: function _handleErrors(cursor) { if (cursor && cursor.errors > 0) { if (cursor.first_error) { @@ -306,6 +294,15 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { throw new Error('Unknown RethinkDB Error'); } }, + _count: function _count(mapper, query, opts) { + var self = this; + opts || (opts = {}); + query || (query = {}); + + return self.filterSequence(self.selectTable(mapper, opts), query).count().run(self.getOpt('runOpts', opts)).then(function (count) { + return [count, {}]; + }); + }, _create: function _create(mapper, props, opts) { var self = this; props || (props = {}); @@ -378,6 +375,18 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { return [records, {}]; }); }, + _sum: function _sum(mapper, field, query, opts) { + var self = this; + if (!jsData.utils.isString(field)) { + throw new Error('field must be a string!'); + } + opts || (opts = {}); + query || (query = {}); + + return self.filterSequence(self.selectTable(mapper, opts), query).sum(field).run(self.getOpt('runOpts', opts)).then(function (sum) { + return [sum, {}]; + }); + }, _update: function _update(mapper, id, props, opts) { var self = this; props || (props = {}); @@ -438,7 +447,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }); }, selectDb: function selectDb(opts) { - return this.r.db(isUndefined(opts.db) ? this.db : opts.db); + return this.r.db(jsData.utils.isUndefined(opts.db) ? this.db : opts.db); }, selectTable: function selectTable(mapper, opts) { return this.selectDb(opts).table(mapper.table || underscore(mapper.name)); @@ -466,7 +475,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { var self = this; var r = self.r; - query = plainCopy(query || {}); + query = jsData.utils.plainCopy(query || {}); opts || (opts = {}); opts.operators || (opts.operators = {}); query.where || (query.where = {}); @@ -475,9 +484,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { query.skip || (query.skip = query.offset); // Transform non-keyword properties to "where" clause configuration - forOwn(query, function (config, keyword) { + jsData.utils.forOwn(query, function (config, keyword) { if (Adapter.reserved.indexOf(keyword) === -1) { - if (isObject(config)) { + if (jsData.utils.isObject(config)) { query.where[keyword] = config; } else { query.where[keyword] = { @@ -496,12 +505,12 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { rql = rql.filter(function (row) { var subQuery = void 0; // Apply filter for each field - forOwn(query.where, function (criteria, field) { - if (!isObject(criteria)) { + jsData.utils.forOwn(query.where, function (criteria, field) { + if (!jsData.utils.isObject(criteria)) { criteria = { '==': criteria }; } // Apply filter for each operator - forOwn(criteria, function (value, operator) { + jsData.utils.forOwn(criteria, function (value, operator) { var isOr = false; if (operator && operator[0] === '|') { operator = operator.substr(1); @@ -526,11 +535,11 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { // Sort if (query.orderBy) { - if (isString(query.orderBy)) { + if (jsData.utils.isString(query.orderBy)) { query.orderBy = [[query.orderBy, 'asc']]; } for (var i = 0; i < query.orderBy.length; i++) { - if (isString(query.orderBy[i])) { + if (jsData.utils.isString(query.orderBy[i])) { query.orderBy[i] = [query.orderBy[i], 'asc']; } rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0]); @@ -552,7 +561,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { waitForDb: function waitForDb(opts) { var self = this; opts || (opts = {}); - var db = isUndefined(opts.db) ? self.db : opts.db; + var db = jsData.utils.isUndefined(opts.db) ? self.db : opts.db; if (!self.databases[db]) { self.databases[db] = self.r.branch(self.r.dbList().contains(db), true, self.r.dbCreate(db)).run(); } @@ -561,9 +570,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { waitForTable: function waitForTable(mapper, options) { var _this = this; - var table = isString(mapper) ? mapper : mapper.table || underscore(mapper.name); + var table = jsData.utils.isString(mapper) ? mapper : mapper.table || underscore(mapper.name); options = options || {}; - var db = isUndefined(options.db) ? this.db : options.db; + var db = jsData.utils.isUndefined(options.db) ? this.db : options.db; return this.waitForDb(options).then(function () { _this.tables[db] = _this.tables[db] || {}; if (!_this.tables[db][table]) { @@ -576,7 +585,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { var _this2 = this; options = options || {}; - var db = isUndefined(options.db) ? this.db : options.db; + var db = jsData.utils.isUndefined(options.db) ? this.db : options.db; return this.waitForDb(options).then(function () { return _this2.waitForTable(table, options); }).then(function () { @@ -592,6 +601,38 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }, + /** + * Return the number of records that match the selection query. + * + * @name RethinkDBAdapter#count + * @method + * @param {Object} mapper the mapper. + * @param {Object} [query] Selection query. + * @param {Object} [query.where] Filtering criteria. + * @param {string|Array} [query.orderBy] Sorting criteria. + * @param {string|Array} [query.sort] Same as `query.sort`. + * @param {number} [query.limit] Limit results. + * @param {number} [query.skip] Offset results. + * @param {number} [query.offset] Same as `query.skip`. + * @param {Object} [opts] Configuration options. + * @param {Object} [opts.operators] Override the default predicate functions + * for specified operators. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. + * @return {Promise} + */ + count: function count(mapper, query, opts) { + var self = this; + opts || (opts = {}); + query || (query = {}); + + return self.waitForTable(mapper, opts).then(function () { + return __super__.count.call(self, mapper, query, opts); + }); + }, + + /** * Create a new record. * @@ -808,7 +849,41 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { opts || (opts = {}); opts.operators || (opts.operators = {}); var ownOps = this.operators || {}; - return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]; + return jsData.utils.isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]; + }, + + + /** + * Return the sum of the specified field of records that match the selection + * query. + * + * @name RethinkDBAdapter#sum + * @method + * @param {Object} mapper The mapper. + * @param {string} field The field to sum. + * @param {Object} [query] Selection query. + * @param {Object} [query.where] Filtering criteria. + * @param {string|Array} [query.orderBy] Sorting criteria. + * @param {string|Array} [query.sort] Same as `query.sort`. + * @param {number} [query.limit] Limit results. + * @param {number} [query.skip] Offset results. + * @param {number} [query.offset] Same as `query.skip`. + * @param {Object} [opts] Configuration options. + * @param {Object} [opts.operators] Override the default predicate functions + * for specified operators. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. + * @return {Promise} + */ + sum: function sum(mapper, field, query, opts) { + var self = this; + opts || (opts = {}); + query || (query = {}); + + return self.waitForTable(mapper, opts).then(function () { + return __super__.sum.call(self, mapper, field, query, opts); + }); }, diff --git a/dist/js-data-rethinkdb.js.map b/dist/js-data-rethinkdb.js.map index ffd4d06..fe03641 100644 --- a/dist/js-data-rethinkdb.js.map +++ b/dist/js-data-rethinkdb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved\n} from 'js-data-adapter'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\n\nconst {\n addHiddenPropsToTarget,\n classCallCheck,\n extend,\n fillIn,\n forOwn,\n isObject,\n isString,\n isUndefined,\n omit,\n plainCopy\n} = utils\n\nconst withoutRelations = function (mapper, props) {\n return omit(props, mapper.relationFields || [])\n}\n\nconst __super__ = Adapter.prototype\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 28015\n */\n port: 28015\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkDBAdapter with default settings\n * const adapter = new RethinkDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nfunction RethinkDBAdapter (opts) {\n const self = this\n classCallCheck(self, RethinkDBAdapter)\n opts || (opts = {})\n fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n// Setup prototype inheritance from Adapter\nRethinkDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: RethinkDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(RethinkDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the RethinkDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the RethinkDBAdapter itself.\n * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = extend\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n\naddHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n\n _create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .insert(props, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n return [record, cursor]\n })\n },\n\n _createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .insert(props, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n return [records, cursor]\n })\n },\n\n _destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.selectTable(mapper, opts)\n .get(id)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n return [undefined, cursor]\n })\n },\n\n _destroyAll (mapper, query, opts) {\n const self = this\n query || (query = {})\n opts || (opts = {})\n\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n return [undefined, cursor]\n })\n },\n\n _find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.selectTable(mapper, opts)\n .get(id)\n .run(self.getOpt('runOpts', opts)).then(function (record) {\n return [record, {}]\n })\n },\n\n _findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .run(self.getOpt('runOpts', opts)).then(function (records) {\n return [records, {}]\n })\n },\n\n _update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .get(id)\n .update(withoutRelations(mapper, props), updateOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n return [record, cursor]\n })\n },\n\n _updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .update(withoutRelations(mapper, props), updateOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n return [records, cursor]\n })\n },\n\n _updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n\n return self.selectTable(mapper, opts)\n .insert(records, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n return [records, cursor]\n })\n },\n\n selectDb (opts) {\n return this.r.db(isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n forOwn(query.where, function (criteria, field) {\n if (!isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n } else {\n throw new Error(`Operator ${operator} not supported!`)\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n waitForTable (mapper, options) {\n const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.create.call(self, mapper, props, opts)\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.createMany.call(self, mapper, props, opts)\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.destroy.call(self, mapper, id, opts)\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.destroyAll.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n return __super__.find.call(self, mapper, id, opts)\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n query || (query = {})\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n return __super__.findAll.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.update.call(self, mapper, id, props, opts)\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.updateAll.call(self, mapper, props, query, opts)\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.updateMany.call(self, mapper, records, opts)\n })\n }\n})\n\nmodule.exports = RethinkDBAdapter\n"],"names":["utils","Adapter","reserved"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved\n} from 'js-data-adapter'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\n\nconst withoutRelations = function (mapper, props) {\n return utils.omit(props, mapper.relationFields || [])\n}\n\nconst __super__ = Adapter.prototype\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 28015\n */\n port: 28015\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkDBAdapter with default settings\n * const adapter = new RethinkDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nfunction RethinkDBAdapter (opts) {\n const self = this\n utils.classCallCheck(self, RethinkDBAdapter)\n opts || (opts = {})\n utils.fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n utils.fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n utils.fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n utils.fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n utils.fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n// Setup prototype inheritance from Adapter\nRethinkDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: RethinkDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(RethinkDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the RethinkDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the RethinkDBAdapter itself.\n * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = utils.extend\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n\nutils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n\n _count (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .count()\n .run(self.getOpt('runOpts', opts)).then(function (count) {\n return [count, {}]\n })\n },\n\n _create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .insert(props, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n return [record, cursor]\n })\n },\n\n _createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .insert(props, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n return [records, cursor]\n })\n },\n\n _destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.selectTable(mapper, opts)\n .get(id)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n return [undefined, cursor]\n })\n },\n\n _destroyAll (mapper, query, opts) {\n const self = this\n query || (query = {})\n opts || (opts = {})\n\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n return [undefined, cursor]\n })\n },\n\n _find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.selectTable(mapper, opts)\n .get(id)\n .run(self.getOpt('runOpts', opts)).then(function (record) {\n return [record, {}]\n })\n },\n\n _findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .run(self.getOpt('runOpts', opts)).then(function (records) {\n return [records, {}]\n })\n },\n\n _sum (mapper, field, query, opts) {\n const self = this\n if (!utils.isString(field)) {\n throw new Error('field must be a string!')\n }\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .sum(field)\n .run(self.getOpt('runOpts', opts)).then(function (sum) {\n return [sum, {}]\n })\n },\n\n _update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .get(id)\n .update(withoutRelations(mapper, props), updateOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n return [record, cursor]\n })\n },\n\n _updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .update(withoutRelations(mapper, props), updateOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n return [records, cursor]\n })\n },\n\n _updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n\n return self.selectTable(mapper, opts)\n .insert(records, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n return [records, cursor]\n })\n },\n\n selectDb (opts) {\n return this.r.db(utils.isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = utils.plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n utils.forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (utils.isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n utils.forOwn(query.where, function (criteria, field) {\n if (!utils.isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n utils.forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n } else {\n throw new Error(`Operator ${operator} not supported!`)\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (utils.isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (utils.isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = utils.isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n waitForTable (mapper, options) {\n const table = utils.isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = utils.isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = utils.isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n },\n\n /**\n * Return the number of records that match the selection query.\n *\n * @name RethinkDBAdapter#count\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n count (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.count.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.create.call(self, mapper, props, opts)\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.createMany.call(self, mapper, props, opts)\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.destroy.call(self, mapper, id, opts)\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.destroyAll.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n return __super__.find.call(self, mapper, id, opts)\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n query || (query = {})\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n return __super__.findAll.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return utils.isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Return the sum of the specified field of records that match the selection\n * query.\n *\n * @name RethinkDBAdapter#sum\n * @method\n * @param {Object} mapper The mapper.\n * @param {string} field The field to sum.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n sum (mapper, field, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.sum.call(self, mapper, field, query, opts)\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.update.call(self, mapper, id, props, opts)\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.updateAll.call(self, mapper, props, query, opts)\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.updateMany.call(self, mapper, records, opts)\n })\n }\n})\n\nmodule.exports = RethinkDBAdapter\n"],"names":["utils","Adapter","reserved"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 902c1c6..0c7e5ba 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-rethinkdb", "description": "RethinkDB adapter for js-data.", - "version": "3.0.0-alpha.12", + "version": "3.0.0-alpha.13", "homepage": "https://github.com/js-data/js-data-rethinkdb", "repository": { "type": "git", @@ -46,22 +46,22 @@ "ci": "npm run test && cat coverage/lcov.info | coveralls || true" }, "dependencies": { - "js-data-adapter": "0.2.0", + "js-data-adapter": "0.2.3", "mout": "0.12.0" }, "peerDependencies": { - "js-data": "^3.0.0-alpha.16", + "js-data": "^3.0.0-alpha.19", "rethinkdbdash": ">=1.15.0" }, "devDependencies": { - "babel-core": "6.7.0", - "babel-polyfill": "6.6.1", + "babel-core": "6.7.2", + "babel-polyfill": "6.7.2", "babel-preset-es2015-rollup": "1.1.1", "chai": "3.5.0", "coveralls": "2.11.8", "ink-docstrap": "1.1.4", "istanbul": "0.4.2", - "js-data-adapter-tests": "^2.0.0-alpha.14", + "js-data-adapter-tests": "^2.0.0-alpha.15", "js-data-repo-tools": "0.2.0", "jsdoc": "3.4.0", "mocha": "2.4.5", diff --git a/src/index.js b/src/index.js index 7af78db..05a0087 100644 --- a/src/index.js +++ b/src/index.js @@ -6,21 +6,8 @@ import { import rethinkdbdash from 'rethinkdbdash' import underscore from 'mout/string/underscore' -const { - addHiddenPropsToTarget, - classCallCheck, - extend, - fillIn, - forOwn, - isObject, - isString, - isUndefined, - omit, - plainCopy -} = utils - const withoutRelations = function (mapper, props) { - return omit(props, mapper.relationFields || []) + return utils.omit(props, mapper.relationFields || []) } const __super__ = Adapter.prototype @@ -199,9 +186,9 @@ const OPERATORS = { */ function RethinkDBAdapter (opts) { const self = this - classCallCheck(self, RethinkDBAdapter) + utils.classCallCheck(self, RethinkDBAdapter) opts || (opts = {}) - fillIn(opts, DEFAULTS) + utils.fillIn(opts, DEFAULTS) Adapter.call(self, opts) /** @@ -212,7 +199,7 @@ function RethinkDBAdapter (opts) { * @default {} */ self.insertOpts || (self.insertOpts = {}) - fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS) + utils.fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS) /** * Default options to pass to r#update. @@ -222,7 +209,7 @@ function RethinkDBAdapter (opts) { * @default {} */ self.updateOpts || (self.updateOpts = {}) - fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS) + utils.fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS) /** * Default options to pass to r#delete. @@ -232,7 +219,7 @@ function RethinkDBAdapter (opts) { * @default {} */ self.deleteOpts || (self.deleteOpts = {}) - fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS) + utils.fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS) /** * Default options to pass to r#run. @@ -242,7 +229,7 @@ function RethinkDBAdapter (opts) { * @default {} */ self.runOpts || (self.runOpts = {}) - fillIn(self.runOpts, RUN_OPTS_DEFAULTS) + utils.fillIn(self.runOpts, RUN_OPTS_DEFAULTS) /** * Override the default predicate functions for specified operators. @@ -292,11 +279,11 @@ Object.defineProperty(RethinkDBAdapter, '__super__', { * properties to the RethinkDBAdapter itself. * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`. */ -RethinkDBAdapter.extend = extend +RethinkDBAdapter.extend = utils.extend RethinkDBAdapter.OPERATORS = OPERATORS -addHiddenPropsToTarget(RethinkDBAdapter.prototype, { +utils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, { _handleErrors (cursor) { if (cursor && cursor.errors > 0) { if (cursor.first_error) { @@ -306,6 +293,18 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } }, + _count (mapper, query, opts) { + const self = this + opts || (opts = {}) + query || (query = {}) + + return self.filterSequence(self.selectTable(mapper, opts), query) + .count() + .run(self.getOpt('runOpts', opts)).then(function (count) { + return [count, {}] + }) + }, + _create (mapper, props, opts) { const self = this props || (props = {}) @@ -397,6 +396,21 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }) }, + _sum (mapper, field, query, opts) { + const self = this + if (!utils.isString(field)) { + throw new Error('field must be a string!') + } + opts || (opts = {}) + query || (query = {}) + + return self.filterSequence(self.selectTable(mapper, opts), query) + .sum(field) + .run(self.getOpt('runOpts', opts)).then(function (sum) { + return [sum, {}] + }) + }, + _update (mapper, id, props, opts) { const self = this props || (props = {}) @@ -463,7 +477,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }, selectDb (opts) { - return this.r.db(isUndefined(opts.db) ? this.db : opts.db) + return this.r.db(utils.isUndefined(opts.db) ? this.db : opts.db) }, selectTable (mapper, opts) { @@ -491,7 +505,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { const self = this const r = self.r - query = plainCopy(query || {}) + query = utils.plainCopy(query || {}) opts || (opts = {}) opts.operators || (opts.operators = {}) query.where || (query.where = {}) @@ -500,9 +514,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { query.skip || (query.skip = query.offset) // Transform non-keyword properties to "where" clause configuration - forOwn(query, function (config, keyword) { + utils.forOwn(query, function (config, keyword) { if (reserved.indexOf(keyword) === -1) { - if (isObject(config)) { + if (utils.isObject(config)) { query.where[keyword] = config } else { query.where[keyword] = { @@ -521,12 +535,12 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { rql = rql.filter(function (row) { let subQuery // Apply filter for each field - forOwn(query.where, function (criteria, field) { - if (!isObject(criteria)) { + utils.forOwn(query.where, function (criteria, field) { + if (!utils.isObject(criteria)) { criteria = { '==': criteria } } // Apply filter for each operator - forOwn(criteria, function (value, operator) { + utils.forOwn(criteria, function (value, operator) { let isOr = false if (operator && operator[0] === '|') { operator = operator.substr(1) @@ -551,13 +565,13 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { // Sort if (query.orderBy) { - if (isString(query.orderBy)) { + if (utils.isString(query.orderBy)) { query.orderBy = [ [query.orderBy, 'asc'] ] } for (var i = 0; i < query.orderBy.length; i++) { - if (isString(query.orderBy[i])) { + if (utils.isString(query.orderBy[i])) { query.orderBy[i] = [query.orderBy[i], 'asc'] } rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0]) @@ -580,7 +594,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { waitForDb (opts) { const self = this opts || (opts = {}) - const db = isUndefined(opts.db) ? self.db : opts.db + const db = utils.isUndefined(opts.db) ? self.db : opts.db if (!self.databases[db]) { self.databases[db] = self.r.branch( self.r.dbList().contains(db), @@ -592,9 +606,9 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }, waitForTable (mapper, options) { - const table = isString(mapper) ? mapper : (mapper.table || underscore(mapper.name)) + const table = utils.isString(mapper) ? mapper : (mapper.table || underscore(mapper.name)) options = options || {} - let db = isUndefined(options.db) ? this.db : options.db + let db = utils.isUndefined(options.db) ? this.db : options.db return this.waitForDb(options).then(() => { this.tables[db] = this.tables[db] || {} if (!this.tables[db][table]) { @@ -606,7 +620,7 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { waitForIndex (table, index, options) { options = options || {} - let db = isUndefined(options.db) ? this.db : options.db + let db = utils.isUndefined(options.db) ? this.db : options.db return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => { this.indices[db] = this.indices[db] || {} this.indices[db][table] = this.indices[db][table] || {} @@ -619,6 +633,37 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { }) }, + /** + * Return the number of records that match the selection query. + * + * @name RethinkDBAdapter#count + * @method + * @param {Object} mapper the mapper. + * @param {Object} [query] Selection query. + * @param {Object} [query.where] Filtering criteria. + * @param {string|Array} [query.orderBy] Sorting criteria. + * @param {string|Array} [query.sort] Same as `query.sort`. + * @param {number} [query.limit] Limit results. + * @param {number} [query.skip] Offset results. + * @param {number} [query.offset] Same as `query.skip`. + * @param {Object} [opts] Configuration options. + * @param {Object} [opts.operators] Override the default predicate functions + * for specified operators. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. + * @return {Promise} + */ + count (mapper, query, opts) { + const self = this + opts || (opts = {}) + query || (query = {}) + + return self.waitForTable(mapper, opts).then(function () { + return __super__.count.call(self, mapper, query, opts) + }) + }, + /** * Create a new record. * @@ -829,7 +874,40 @@ addHiddenPropsToTarget(RethinkDBAdapter.prototype, { opts || (opts = {}) opts.operators || (opts.operators = {}) let ownOps = this.operators || {} - return isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator] + return utils.isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator] + }, + + /** + * Return the sum of the specified field of records that match the selection + * query. + * + * @name RethinkDBAdapter#sum + * @method + * @param {Object} mapper The mapper. + * @param {string} field The field to sum. + * @param {Object} [query] Selection query. + * @param {Object} [query.where] Filtering criteria. + * @param {string|Array} [query.orderBy] Sorting criteria. + * @param {string|Array} [query.sort] Same as `query.sort`. + * @param {number} [query.limit] Limit results. + * @param {number} [query.skip] Offset results. + * @param {number} [query.offset] Same as `query.skip`. + * @param {Object} [opts] Configuration options. + * @param {Object} [opts.operators] Override the default predicate functions + * for specified operators. + * @param {boolean} [opts.raw=false] Whether to return a more detailed + * response object. + * @param {Object} [opts.runOpts] Options to pass to r#run. + * @return {Promise} + */ + sum (mapper, field, query, opts) { + const self = this + opts || (opts = {}) + query || (query = {}) + + return self.waitForTable(mapper, opts).then(function () { + return __super__.sum.call(self, mapper, field, query, opts) + }) }, /** From fcb2b0a0fb20ae7c5d121b49118d01e2ff34f3ca Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sun, 17 Apr 2016 20:46:54 -0700 Subject: [PATCH 24/27] 3.0.0-beta.1 --- AUTHORS | 4 ++- CHANGELOG.md | 7 ++++++ CONTRIBUTORS | 13 +++++----- dist/js-data-rethinkdb.js | 22 +++++++++++++++++ dist/js-data-rethinkdb.js.map | 2 +- package.json | 23 +++++++++--------- scripts/CONTRIBUTORS | 6 ----- scripts/authors.js | 46 ----------------------------------- src/index.js | 16 ++++++++++++ 9 files changed, 66 insertions(+), 73 deletions(-) delete mode 100644 scripts/CONTRIBUTORS delete mode 100644 scripts/authors.js diff --git a/AUTHORS b/AUTHORS index 6f2ea1e..6b68e28 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,8 +1,10 @@ # This is the official list of js-data-rethinkdb project authors. # # Names are formatted as: -# # commits Name or Organization +# Name or Organization +# # The email address is not required for organizations. +# InternalFX Jason Dobry Ollie Relph diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f83c5d..d1ca6ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +##### 3.0.0-beta.1 - 17 April 2016 + +Official v3 beta release + +###### Other +- Upgraded dependencies + ##### 3.0.0-alpha.13 - 17 March 2016 ###### Backwards incompatible API changes diff --git a/CONTRIBUTORS b/CONTRIBUTORS index cf3e162..91106f7 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,9 +1,8 @@ -# People who have contributed to the js-data-rethinkdb project. +# This is the official list of js-data-rethinkdb project contributors. # -# This file is controlled by scripts/authors.js +# Names are formatted as: +# Name # -# Names should be added to this file as: -# [commit count] Name - 1 InternalFX - 55 Jason Dobry - 2 Ollie Relph +InternalFX +Jason Dobry +Ollie Relph diff --git a/dist/js-data-rethinkdb.js b/dist/js-data-rethinkdb.js index 70e551c..ccea95e 100644 --- a/dist/js-data-rethinkdb.js +++ b/dist/js-data-rethinkdb.js @@ -283,6 +283,28 @@ Object.defineProperty(RethinkDBAdapter, '__super__', { */ RethinkDBAdapter.extend = jsData.utils.extend; +/** + * Details of the current version of the `js-data-rethinkdb` module. + * + * @name RethinkDBAdapter.version + * @type {Object} + * @property {string} full The full semver value. + * @property {number} major The major version number. + * @property {number} minor The minor version number. + * @property {number} patch The patch version number. + * @property {(string|boolean)} alpha The alpha version value, otherwise `false` + * if the current version is not alpha. + * @property {(string|boolean)} beta The beta version value, otherwise `false` + * if the current version is not beta. + */ +RethinkDBAdapter.version = { + beta: 1, + full: '3.0.0-beta.1', + major: 3, + minor: 0, + patch: 0 +}; + RethinkDBAdapter.OPERATORS = OPERATORS; jsData.utils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, { diff --git a/dist/js-data-rethinkdb.js.map b/dist/js-data-rethinkdb.js.map index fe03641..fa25045 100644 --- a/dist/js-data-rethinkdb.js.map +++ b/dist/js-data-rethinkdb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved\n} from 'js-data-adapter'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\n\nconst withoutRelations = function (mapper, props) {\n return utils.omit(props, mapper.relationFields || [])\n}\n\nconst __super__ = Adapter.prototype\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 28015\n */\n port: 28015\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkDBAdapter with default settings\n * const adapter = new RethinkDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nfunction RethinkDBAdapter (opts) {\n const self = this\n utils.classCallCheck(self, RethinkDBAdapter)\n opts || (opts = {})\n utils.fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n utils.fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n utils.fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n utils.fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n utils.fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n// Setup prototype inheritance from Adapter\nRethinkDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: RethinkDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(RethinkDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the RethinkDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the RethinkDBAdapter itself.\n * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = utils.extend\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n\nutils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n\n _count (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .count()\n .run(self.getOpt('runOpts', opts)).then(function (count) {\n return [count, {}]\n })\n },\n\n _create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .insert(props, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n return [record, cursor]\n })\n },\n\n _createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .insert(props, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n return [records, cursor]\n })\n },\n\n _destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.selectTable(mapper, opts)\n .get(id)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n return [undefined, cursor]\n })\n },\n\n _destroyAll (mapper, query, opts) {\n const self = this\n query || (query = {})\n opts || (opts = {})\n\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n return [undefined, cursor]\n })\n },\n\n _find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.selectTable(mapper, opts)\n .get(id)\n .run(self.getOpt('runOpts', opts)).then(function (record) {\n return [record, {}]\n })\n },\n\n _findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .run(self.getOpt('runOpts', opts)).then(function (records) {\n return [records, {}]\n })\n },\n\n _sum (mapper, field, query, opts) {\n const self = this\n if (!utils.isString(field)) {\n throw new Error('field must be a string!')\n }\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .sum(field)\n .run(self.getOpt('runOpts', opts)).then(function (sum) {\n return [sum, {}]\n })\n },\n\n _update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .get(id)\n .update(withoutRelations(mapper, props), updateOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n return [record, cursor]\n })\n },\n\n _updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .update(withoutRelations(mapper, props), updateOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n return [records, cursor]\n })\n },\n\n _updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n\n return self.selectTable(mapper, opts)\n .insert(records, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n return [records, cursor]\n })\n },\n\n selectDb (opts) {\n return this.r.db(utils.isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = utils.plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n utils.forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (utils.isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n utils.forOwn(query.where, function (criteria, field) {\n if (!utils.isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n utils.forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n } else {\n throw new Error(`Operator ${operator} not supported!`)\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (utils.isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (utils.isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = utils.isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n waitForTable (mapper, options) {\n const table = utils.isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = utils.isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = utils.isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n },\n\n /**\n * Return the number of records that match the selection query.\n *\n * @name RethinkDBAdapter#count\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n count (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.count.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.create.call(self, mapper, props, opts)\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.createMany.call(self, mapper, props, opts)\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.destroy.call(self, mapper, id, opts)\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.destroyAll.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n return __super__.find.call(self, mapper, id, opts)\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n query || (query = {})\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n return __super__.findAll.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return utils.isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Return the sum of the specified field of records that match the selection\n * query.\n *\n * @name RethinkDBAdapter#sum\n * @method\n * @param {Object} mapper The mapper.\n * @param {string} field The field to sum.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n sum (mapper, field, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.sum.call(self, mapper, field, query, opts)\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.update.call(self, mapper, id, props, opts)\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.updateAll.call(self, mapper, props, query, opts)\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.updateMany.call(self, mapper, records, opts)\n })\n }\n})\n\nmodule.exports = RethinkDBAdapter\n"],"names":["utils","Adapter","reserved"],"mappings":";;;;;;;;;;AAQA,IAAM,mBAAmB,SAAnB,gBAAmB,CAAU,MAAV,EAAkB,KAAlB,EAAyB;SACzCA,aAAM,IAAN,CAAW,KAAX,EAAkB,OAAO,cAAP,IAAyB,EAAzB,CAAzB,CADgD;CAAzB;;AAIzB,IAAM,YAAYC,iBAAQ,SAAR;;AAElB,IAAM,WAAW;;;;;;;WAON,EAAT;;;;;;;;;cASY,EAAZ;;;;;;;;;MASI,MAAJ;;;;;;;;;QASM,WAAN;;;;;;;;;OASK,EAAL;;;;;;;;;OASK,EAAL;;;;;;;;;QASM,KAAN;CA7DI;;AAgEN,IAAM,uBAAuB,EAAvB;AACN,IAAM,uBAAuB,EAAvB;AACN,IAAM,uBAAuB,EAAvB;AACN,IAAM,oBAAoB,EAApB;;AAEN,IAAM,QAAQ,SAAR,KAAQ,CAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;SACrC,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CAD4C;CAAhC;;AAId,IAAM,WAAW,SAAX,QAAW,CAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;SACxC,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CAD+C;CAAhC;;;;;;;;;;;;;;;;;;;;;;;;;AA2BjB,IAAM,YAAY;QACV,KAAN;SACO,KAAP;QACM,QAAN;SACO,QAAP;OACK,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC5B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADmC;GAAhC;QAGC,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC7B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADoC;GAAhC;OAGD,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC5B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADmC;GAAhC;QAGC,WAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC7B,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,EAAyB,EAAzB,CAA4B,KAA5B,CAAP,CADoC;GAAhC;gBAGQ,oBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACrC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,eAAvB,CAAuC,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAtB,CAAvC,EAAkE,KAAlE,GAA0E,EAA1E,CAA6E,CAA7E,CAAP,CAD4C;GAAhC;mBAGG,uBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACxC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,eAAvB,CAAuC,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAtB,CAAvC,EAAkE,KAAlE,GAA0E,EAA1E,CAA6E,CAA7E,CAAP,CAD+C;GAAhC;QAGX,aAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAC7B,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAE,IAAF,CAAO,EAAP,CAAtB,EAAkC,QAAlC,CAA2C,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,CAA3C,CAAP,CADoC;GAAhC;WAGG,eAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WAChC,EAAE,IAAF,CAAO,KAAP,EAAc,OAAd,CAAsB,EAAE,IAAF,CAAO,EAAP,CAAtB,EAAkC,QAAlC,CAA2C,IAAI,KAAJ,EAAW,OAAX,CAAmB,IAAnB,CAA3C,EAAqE,GAArE,EAAP,CADuC;GAAhC;cAGG,kBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACnC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,QAAvB,CAAgC,KAAhC,CAAP,CAD0C;GAAhC;iBAGG,qBAAU,CAAV,EAAa,GAAb,EAAkB,KAAlB,EAAyB,KAAzB,EAAgC;WACtC,IAAI,KAAJ,EAAW,OAAX,CAAmB,EAAnB,EAAuB,QAAvB,CAAgC,KAAhC,EAAuC,GAAvC,EAAP,CAD6C;GAAhC;CAhCX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwEN,SAAS,gBAAT,CAA2B,IAA3B,EAAiC;MACzB,OAAO,IAAP,CADyB;eAEzB,cAAN,CAAqB,IAArB,EAA2B,gBAA3B,EAF+B;WAGtB,OAAO,EAAP,CAAT,CAH+B;eAIzB,MAAN,CAAa,IAAb,EAAmB,QAAnB,EAJ+B;mBAKvB,IAAR,CAAa,IAAb,EAAmB,IAAnB;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAd+B;eAezB,MAAN,CAAa,KAAK,UAAL,EAAiB,oBAA9B;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAxB+B;eAyBzB,MAAN,CAAa,KAAK,UAAL,EAAiB,oBAA9B;;;;;;;;;MASA,CAAK,UAAL,KAAoB,KAAK,UAAL,GAAkB,EAAlB,CAApB,CAlC+B;eAmCzB,MAAN,CAAa,KAAK,UAAL,EAAiB,oBAA9B;;;;;;;;;MASA,CAAK,OAAL,KAAiB,KAAK,OAAL,GAAe,EAAf,CAAjB,CA5C+B;eA6CzB,MAAN,CAAa,KAAK,OAAL,EAAc,iBAA3B;;;;;;;;;MASA,CAAK,SAAL,KAAmB,KAAK,SAAL,GAAiB,EAAjB,CAAnB;;;;;;;;;MASA,CAAK,CAAL,GAAS,cAAc,IAAd,CAAT,CA/D+B;OAgE1B,SAAL,GAAiB,EAAjB,CAhE+B;OAiE1B,MAAL,GAAc,EAAd,CAjE+B;OAkE1B,OAAL,GAAe,EAAf,CAlE+B;CAAjC;;;AAsEA,iBAAiB,SAAjB,GAA6B,OAAO,MAAP,CAAcA,iBAAQ,SAAR,EAAmB;eAC/C;WACJ,gBAAP;gBACY,KAAZ;cACU,IAAV;kBACc,IAAd;GAJF;CAD2B,CAA7B;;AASA,OAAO,cAAP,CAAsB,gBAAtB,EAAwC,WAAxC,EAAqD;gBACrC,IAAd;SACOA,gBAAP;CAFF;;;;;;;;;;;;;AAgBA,iBAAiB,MAAjB,GAA0BD,aAAM,MAAN;;AAE1B,iBAAiB,SAAjB,GAA6B,SAA7B;;AAEAA,aAAM,sBAAN,CAA6B,iBAAiB,SAAjB,EAA4B;wCACxC,QAAQ;QACjB,UAAU,OAAO,MAAP,GAAgB,CAAhB,EAAmB;UAC3B,OAAO,WAAP,EAAoB;cAChB,IAAI,KAAJ,CAAU,OAAO,WAAP,CAAhB,CADsB;OAAxB;YAGM,IAAI,KAAJ,CAAU,yBAAV,CAAN,CAJ+B;KAAjC;GAFqD;0BAU/C,QAAQ,OAAO,MAAM;QACrB,OAAO,IAAP,CADqB;aAElB,OAAO,EAAP,CAAT,CAF2B;cAGjB,QAAQ,EAAR,CAAV,CAH2B;;WAKpB,KAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CAApB,EAAoD,KAApD,EACJ,KADI,GAEJ,GAFI,CAEA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAFA,EAE8B,IAF9B,CAEmC,UAAU,KAAV,EAAiB;aAChD,CAAC,KAAD,EAAQ,EAAR,CAAP,CADuD;KAAjB,CAF1C,CAL2B;GAV0B;4BAsB9C,QAAQ,OAAO,MAAM;QACtB,OAAO,IAAP,CADsB;cAElB,QAAQ,EAAR,CAAV,CAF4B;aAGnB,OAAO,EAAP,CAAT,CAH4B;;QAKtB,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CALsB;eAMjB,aAAX,GAA2B,IAA3B,CAN4B;;WAQrB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EACJ,MADI,CACG,KADH,EACU,UADV,EAEJ,GAFI,CAEA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAFA,EAE8B,IAF9B,CAEmC,UAAU,MAAV,EAAkB;WACnD,aAAL,CAAmB,MAAnB,EADwD;UAEpD,eAAJ,CAFwD;UAGpD,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,IAAyB,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,EAA2B;iBACzE,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,CADyE;OAApF;aAGO,CAAC,MAAD,EAAS,MAAT,CAAP,CANwD;KAAlB,CAF1C,CAR4B;GAtByB;oCA0C1C,QAAQ,OAAO,MAAM;QAC1B,OAAO,IAAP,CAD0B;cAEtB,QAAQ,EAAR,CAAV,CAFgC;aAGvB,OAAO,EAAP,CAAT,CAHgC;;QAK1B,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAL0B;eAMrB,aAAX,GAA2B,IAA3B,CANgC;;WAQzB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EACJ,MADI,CACG,KADH,EACU,UADV,EAEJ,GAFI,CAEA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAFA,EAE8B,IAF9B,CAEmC,UAAU,MAAV,EAAkB;WACnD,aAAL,CAAmB,MAAnB,EADwD;UAEpD,UAAU,EAAV,CAFoD;UAGpD,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,IAAyB,OAAO,OAAP,EAAgB;kBAC7D,OAAO,OAAP,CAAe,GAAf,CAAmB,UAAU,MAAV,EAAkB;iBACtC,OAAO,OAAP,CADsC;SAAlB,CAA7B,CADuE;OAAzE;aAKO,CAAC,OAAD,EAAU,MAAV,CAAP,CARwD;KAAlB,CAF1C,CARgC;GA1CqB;8BAgE7C,QAAQ,IAAI,MAAM;QACpB,OAAO,IAAP,CADoB;aAEjB,OAAO,EAAP,CAAT,CAF0B;;WAInB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EACJ,GADI,CACA,EADA,EAEJ,MAFI,CAEG,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAFH,EAGJ,GAHI,CAGA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAHA,EAG8B,IAH9B,CAGmC,UAAU,MAAV,EAAkB;WACnD,aAAL,CAAmB,MAAnB,EADwD;aAEjD,CAAC,SAAD,EAAY,MAAZ,CAAP,CAFwD;KAAlB,CAH1C,CAJ0B;GAhE2B;oCA6E1C,QAAQ,OAAO,MAAM;QAC1B,OAAO,IAAP,CAD0B;cAEtB,QAAQ,EAAR,CAAV,CAFgC;aAGvB,OAAO,EAAP,CAAT,CAHgC;;WAKzB,KACJ,cADI,CACW,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CADX,EAC2C,KAD3C,EAEJ,MAFI,CAEG,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAFH,EAGJ,GAHI,CAGA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAHA,EAG8B,IAH9B,CAGmC,UAAU,MAAV,EAAkB;WACnD,aAAL,CAAmB,MAAnB,EADwD;aAEjD,CAAC,SAAD,EAAY,MAAZ,CAAP,CAFwD;KAAlB,CAH1C,CALgC;GA7EqB;wBA2FhD,QAAQ,IAAI,MAAM;QACjB,OAAO,IAAP,CADiB;aAEd,OAAO,EAAP,CAAT,CAFuB;;WAIhB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EACJ,GADI,CACA,EADA,EAEJ,GAFI,CAEA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAFA,EAE8B,IAF9B,CAEmC,UAAU,MAAV,EAAkB;aACjD,CAAC,MAAD,EAAS,EAAT,CAAP,CADwD;KAAlB,CAF1C,CAJuB;GA3F8B;8BAsG7C,QAAQ,OAAO,MAAM;QACvB,OAAO,IAAP,CADuB;aAEpB,OAAO,EAAP,CAAT,CAF6B;cAGnB,QAAQ,EAAR,CAAV,CAH6B;;WAKtB,KAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CAApB,EAAoD,KAApD,EACJ,GADI,CACA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CADA,EAC8B,IAD9B,CACmC,UAAU,OAAV,EAAmB;aAClD,CAAC,OAAD,EAAU,EAAV,CAAP,CADyD;KAAnB,CAD1C,CAL6B;GAtGwB;sBAiHjD,QAAQ,OAAO,OAAO,MAAM;QAC1B,OAAO,IAAP,CAD0B;QAE5B,CAACA,aAAM,QAAN,CAAe,KAAf,CAAD,EAAwB;YACpB,IAAI,KAAJ,CAAU,yBAAV,CAAN,CAD0B;KAA5B;aAGS,OAAO,EAAP,CAAT,CALgC;cAMtB,QAAQ,EAAR,CAAV,CANgC;;WAQzB,KAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CAApB,EAAoD,KAApD,EACJ,GADI,CACA,KADA,EAEJ,GAFI,CAEA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAFA,EAE8B,IAF9B,CAEmC,UAAU,GAAV,EAAe;aAC9C,CAAC,GAAD,EAAM,EAAN,CAAP,CADqD;KAAf,CAF1C,CARgC;GAjHqB;4BAgI9C,QAAQ,IAAI,OAAO,MAAM;QAC1B,OAAO,IAAP,CAD0B;cAEtB,QAAQ,EAAR,CAAV,CAFgC;aAGvB,OAAO,EAAP,CAAT,CAHgC;;QAK1B,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAL0B;eAMrB,aAAX,GAA2B,IAA3B,CANgC;;WAQzB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EACJ,GADI,CACA,EADA,EAEJ,MAFI,CAEG,iBAAiB,MAAjB,EAAyB,KAAzB,CAFH,EAEoC,UAFpC,EAGJ,GAHI,CAGA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAHA,EAG8B,IAH9B,CAGmC,UAAU,MAAV,EAAkB;UACpD,eAAJ,CADwD;WAEnD,aAAL,CAAmB,MAAnB,EAFwD;UAGpD,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,IAAyB,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,EAA2B;iBACzE,OAAO,OAAP,CAAe,CAAf,EAAkB,OAAlB,CADyE;OAApF,MAEO;cACC,IAAI,KAAJ,CAAU,WAAV,CAAN,CADK;OAFP;aAKO,CAAC,MAAD,EAAS,MAAT,CAAP,CARwD;KAAlB,CAH1C,CARgC;GAhIqB;kCAuJ3C,QAAQ,OAAO,OAAO,MAAM;QAChC,OAAO,IAAP,CADgC;cAE5B,QAAQ,EAAR,CAAV,CAFsC;cAG5B,QAAQ,EAAR,CAAV,CAHsC;aAI7B,OAAO,EAAP,CAAT,CAJsC;;QAMhC,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CANgC;eAO3B,aAAX,GAA2B,IAA3B,CAPsC;;WAS/B,KAAK,cAAL,CAAoB,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,CAApB,EAAoD,KAApD,EACJ,MADI,CACG,iBAAiB,MAAjB,EAAyB,KAAzB,CADH,EACoC,UADpC,EAEJ,GAFI,CAEA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAFA,EAE8B,IAF9B,CAEmC,UAAU,MAAV,EAAkB;UACpD,UAAU,EAAV,CADoD;WAEnD,aAAL,CAAmB,MAAnB,EAFwD;UAGpD,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,EAAuB;kBAC3C,OAAO,OAAP,CAAe,GAAf,CAAmB,UAAU,MAAV,EAAkB;iBAAS,OAAO,OAAP,CAAT;SAAlB,CAA7B,CADqD;OAAvD;aAGO,CAAC,OAAD,EAAU,MAAV,CAAP,CANwD;KAAlB,CAF1C,CATsC;GAvJe;oCA4K1C,QAAQ,SAAS,MAAM;QAC5B,OAAO,IAAP,CAD4B;gBAEtB,UAAU,EAAV,CAAZ,CAFkC;aAGzB,OAAO,EAAP,CAAT,CAHkC;;QAK5B,aAAa,KAAK,MAAL,CAAY,YAAZ,EAA0B,IAA1B,CAAb,CAL4B;eAMvB,aAAX,GAA2B,IAA3B,CANkC;eAOvB,QAAX,GAAsB,QAAtB,CAPkC;;WAS3B,KAAK,WAAL,CAAiB,MAAjB,EAAyB,IAAzB,EACJ,MADI,CACG,OADH,EACY,UADZ,EAEJ,GAFI,CAEA,KAAK,MAAL,CAAY,SAAZ,EAAuB,IAAvB,CAFA,EAE8B,IAF9B,CAEmC,UAAU,MAAV,EAAkB;gBAC9C,EAAV,CADwD;WAEnD,aAAL,CAAmB,MAAnB,EAFwD;UAGpD,UAAU,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,MAAf,EAAuB;kBAC3C,OAAO,OAAP,CAAe,GAAf,CAAmB,UAAU,MAAV,EAAkB;iBAAS,OAAO,OAAP,CAAT;SAAlB,CAA7B,CADqD;OAAvD;aAGO,CAAC,OAAD,EAAU,MAAV,CAAP,CANwD;KAAlB,CAF1C,CATkC;GA5KmB;8BAiM7C,MAAM;WACP,KAAK,CAAL,CAAO,EAAP,CAAUA,aAAM,WAAN,CAAkB,KAAK,EAAL,CAAlB,GAA6B,KAAK,EAAL,GAAU,KAAK,EAAL,CAAxD,CADc;GAjMuC;oCAqM1C,QAAQ,MAAM;WAClB,KAAK,QAAL,CAAc,IAAd,EAAoB,KAApB,CAA0B,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CAAjC,CADyB;GArM4B;;;;;;;;;;;;;;;;;;;;0CA0NvC,UAAU,OAAO,MAAM;QAC/B,OAAO,IAAP,CAD+B;QAE/B,IAAI,KAAK,CAAL,CAF2B;;YAI7BA,aAAM,SAAN,CAAgB,SAAS,EAAT,CAAxB,CAJqC;aAK5B,OAAO,EAAP,CAAT,CALqC;SAMhC,SAAL,KAAmB,KAAK,SAAL,GAAiB,EAAjB,CAAnB,CANqC;UAO/B,KAAN,KAAgB,MAAM,KAAN,GAAc,EAAd,CAAhB,CAPqC;UAQ/B,OAAN,KAAkB,MAAM,OAAN,GAAgB,MAAM,IAAN,CAAlC,CARqC;UAS/B,OAAN,KAAkB,MAAM,OAAN,GAAgB,EAAhB,CAAlB,CATqC;UAU/B,IAAN,KAAe,MAAM,IAAN,GAAa,MAAM,MAAN,CAA5B;;;gBAGA,CAAM,MAAN,CAAa,KAAb,EAAoB,UAAU,MAAV,EAAkB,OAAlB,EAA2B;UACzCE,iBAAS,OAAT,CAAiB,OAAjB,MAA8B,CAAC,CAAD,EAAI;YAChCF,aAAM,QAAN,CAAe,MAAf,CAAJ,EAA4B;gBACpB,KAAN,CAAY,OAAZ,IAAuB,MAAvB,CAD0B;SAA5B,MAEO;gBACC,KAAN,CAAY,OAAZ,IAAuB;kBACf,MAAN;WADF,CADK;SAFP;eAOO,MAAM,OAAN,CAAP,CARoC;OAAtC;KADkB,CAApB,CAbqC;;QA0BjC,MAAM,QAAN;;;QAGA,OAAO,IAAP,CAAY,MAAM,KAAN,CAAZ,CAAyB,MAAzB,KAAoC,CAApC,EAAuC;;YAEnC,IAAI,MAAJ,CAAW,UAAU,GAAV,EAAe;YAC1B,iBAAJ;;oBAEA,CAAM,MAAN,CAAa,MAAM,KAAN,EAAa,UAAU,QAAV,EAAoB,KAApB,EAA2B;cAC/C,CAACA,aAAM,QAAN,CAAe,QAAf,CAAD,EAA2B;uBAClB,EAAE,MAAM,QAAN,EAAb,CAD6B;WAA/B;;sBAIA,CAAM,MAAN,CAAa,QAAb,EAAuB,UAAU,KAAV,EAAiB,QAAjB,EAA2B;gBAC5C,OAAO,KAAP,CAD4C;gBAE5C,YAAY,SAAS,CAAT,MAAgB,GAAhB,EAAqB;yBACxB,SAAS,MAAT,CAAgB,CAAhB,CAAX,CADmC;qBAE5B,IAAP,CAFmC;aAArC;gBAII,cAAc,KAAK,WAAL,CAAiB,QAAjB,EAA2B,IAA3B,CAAd,CAN4C;gBAO5C,WAAJ,EAAiB;kBACT,kBAAkB,YAAY,CAAZ,EAAe,GAAf,EAAoB,KAApB,EAA2B,KAA3B,CAAlB,CADS;kBAEX,IAAJ,EAAU;2BACG,WAAW,SAAS,EAAT,CAAY,eAAZ,CAAX,GAA0C,eAA1C,CADH;eAAV,MAEO;2BACM,WAAW,SAAS,GAAT,CAAa,eAAb,CAAX,GAA2C,eAA3C,CADN;eAFP;aAFF,MAOO;oBACC,IAAI,KAAJ,eAAsB,4BAAtB,CAAN,CADK;aAPP;WAPqB,CAAvB,CALmD;SAA3B,CAA1B,CAH8B;eA2BvB,YAAY,IAAZ,CA3BuB;OAAf,CAAjB,CAFyC;KAA3C;;;QAkCI,MAAM,OAAN,EAAe;UACbA,aAAM,QAAN,CAAe,MAAM,OAAN,CAAnB,EAAmC;cAC3B,OAAN,GAAgB,CACd,CAAC,MAAM,OAAN,EAAe,KAAhB,CADc,CAAhB,CADiC;OAAnC;WAKK,IAAI,IAAI,CAAJ,EAAO,IAAI,MAAM,OAAN,CAAc,MAAd,EAAsB,GAA1C,EAA+C;YACzCA,aAAM,QAAN,CAAe,MAAM,OAAN,CAAc,CAAd,CAAf,CAAJ,EAAsC;gBAC9B,OAAN,CAAc,CAAd,IAAmB,CAAC,MAAM,OAAN,CAAc,CAAd,CAAD,EAAmB,KAAnB,CAAnB,CADoC;SAAtC;cAGM,CAAC,MAAM,OAAN,CAAc,CAAd,EAAiB,CAAjB,KAAuB,EAAvB,CAAD,CAA4B,WAA5B,OAA8C,MAA9C,GAAuD,IAAI,OAAJ,CAAY,EAAE,IAAF,CAAO,MAAM,OAAN,CAAc,CAAd,EAAiB,CAAjB,CAAP,CAAZ,CAAvD,GAAkG,IAAI,OAAJ,CAAY,MAAM,OAAN,CAAc,CAAd,EAAiB,CAAjB,CAAZ,CAAlG,CAJuC;OAA/C;KANF;;;QAeI,MAAM,IAAN,EAAY;YACR,IAAI,IAAJ,CAAS,CAAC,MAAM,IAAN,CAAhB,CADc;KAAhB;;;QAKI,MAAM,KAAN,EAAa;YACT,IAAI,KAAJ,CAAU,CAAC,MAAM,KAAN,CAAjB,CADe;KAAjB;;WAIO,GAAP,CAvFqC;GA1NgB;gCAoT5C,MAAM;QACT,OAAO,IAAP,CADS;aAEN,OAAO,EAAP,CAAT,CAFe;QAGT,KAAKA,aAAM,WAAN,CAAkB,KAAK,EAAL,CAAlB,GAA6B,KAAK,EAAL,GAAU,KAAK,EAAL,CAHnC;QAIX,CAAC,KAAK,SAAL,CAAe,EAAf,CAAD,EAAqB;WAClB,SAAL,CAAe,EAAf,IAAqB,KAAK,CAAL,CAAO,MAAP,CACnB,KAAK,CAAL,CAAO,MAAP,GAAgB,QAAhB,CAAyB,EAAzB,CADmB,EAEnB,IAFmB,EAGnB,KAAK,CAAL,CAAO,QAAP,CAAgB,EAAhB,CAHmB,EAInB,GAJmB,EAArB,CADuB;KAAzB;WAOO,KAAK,SAAL,CAAe,EAAf,CAAP,CAXe;GApTsC;sCAkUzC,QAAQ,SAAS;;;QACvB,QAAQA,aAAM,QAAN,CAAe,MAAf,IAAyB,MAAzB,GAAmC,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,CADpB;cAEnB,WAAW,EAAX,CAFmB;QAGzB,KAAKA,aAAM,WAAN,CAAkB,QAAQ,EAAR,CAAlB,GAAgC,KAAK,EAAL,GAAU,QAAQ,EAAR,CAHtB;WAItB,KAAK,SAAL,CAAe,OAAf,EAAwB,IAAxB,CAA6B,YAAM;YACnC,MAAL,CAAY,EAAZ,IAAkB,MAAK,MAAL,CAAY,EAAZ,KAAmB,EAAnB,CADsB;UAEpC,CAAC,MAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,CAAD,EAAyB;cACtB,MAAL,CAAY,EAAZ,EAAgB,KAAhB,IAAyB,MAAK,CAAL,CAAO,MAAP,CAAc,MAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,SAAd,GAA0B,QAA1B,CAAmC,KAAnC,CAAd,EAAyD,IAAzD,EAA+D,MAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,WAAd,CAA0B,KAA1B,CAA/D,EAAiG,GAAjG,EAAzB,CAD2B;OAA7B;aAGO,MAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,CAAP,CALwC;KAAN,CAApC,CAJ6B;GAlUwB;sCA+UzC,OAAO,OAAO,SAAS;;;cACzB,WAAW,EAAX,CADyB;QAE/B,KAAKA,aAAM,WAAN,CAAkB,QAAQ,EAAR,CAAlB,GAAgC,KAAK,EAAL,GAAU,QAAQ,EAAR,CAFhB;WAG5B,KAAK,SAAL,CAAe,OAAf,EAAwB,IAAxB,CAA6B;aAAM,OAAK,YAAL,CAAkB,KAAlB,EAAyB,OAAzB;KAAN,CAA7B,CAAsE,IAAtE,CAA2E,YAAM;aACjF,OAAL,CAAa,EAAb,IAAmB,OAAK,OAAL,CAAa,EAAb,KAAoB,EAApB,CADmE;aAEjF,OAAL,CAAa,EAAb,EAAiB,KAAjB,IAA0B,OAAK,OAAL,CAAa,EAAb,EAAiB,KAAjB,KAA2B,EAA3B,CAF4D;UAGlF,CAAC,OAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,EAAuB,KAAvB,CAAD,EAAgC;eAC7B,MAAL,CAAY,EAAZ,EAAgB,KAAhB,EAAuB,KAAvB,IAAgC,OAAK,CAAL,CAAO,MAAP,CAAc,OAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,KAAd,CAAoB,KAApB,EAA2B,SAA3B,GAAuC,QAAvC,CAAgD,KAAhD,CAAd,EAAsE,IAAtE,EAA4E,OAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,KAAd,CAAoB,KAApB,EAA2B,WAA3B,CAAuC,KAAvC,CAA5E,EAA2H,GAA3H,GAAiI,IAAjI,CAAsI,YAAM;iBACnK,OAAK,CAAL,CAAO,EAAP,CAAU,EAAV,EAAc,KAAd,CAAoB,KAApB,EAA2B,SAA3B,CAAqC,KAArC,EAA4C,GAA5C,EAAP,CAD0K;SAAN,CAAtK,CADkC;OAApC;aAKO,OAAK,MAAL,CAAY,EAAZ,EAAgB,KAAhB,EAAuB,KAAvB,CAAP,CARsF;KAAN,CAAlF,CAHmC;GA/UkB;;;;;;;;;;;;;;;;;;;;;;;;wBAmXhD,QAAQ,OAAO,MAAM;QACpB,OAAO,IAAP,CADoB;aAEjB,OAAO,EAAP,CAAT,CAF0B;cAGhB,QAAQ,EAAR,CAAV,CAH0B;;WAKnB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;aAC/C,UAAU,KAAV,CAAgB,IAAhB,CAAqB,IAArB,EAA2B,MAA3B,EAAmC,KAAnC,EAA0C,IAA1C,CAAP,CADsD;KAAZ,CAA5C,CAL0B;GAnX2B;;;;;;;;;;;;;;;;;0BA2Y/C,QAAQ,OAAO,MAAM;QACrB,OAAO,IAAP,CADqB;cAEjB,QAAQ,EAAR,CAAV,CAF2B;aAGlB,OAAO,EAAP,CAAT,CAH2B;;WAKpB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;aAC/C,UAAU,MAAV,CAAiB,IAAjB,CAAsB,IAAtB,EAA4B,MAA5B,EAAoC,KAApC,EAA2C,IAA3C,CAAP,CADsD;KAAZ,CAA5C,CAL2B;GA3Y0B;;;;;;;;;;;;;;;;;kCAma3C,QAAQ,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;cAErB,QAAQ,EAAR,CAAV,CAF+B;aAGtB,OAAO,EAAP,CAAT,CAH+B;;WAKxB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;aAC/C,UAAU,UAAV,CAAqB,IAArB,CAA0B,IAA1B,EAAgC,MAAhC,EAAwC,KAAxC,EAA+C,IAA/C,CAAP,CADsD;KAAZ,CAA5C,CAL+B;GAnasB;;;;;;;;;;;;;;;;;4BA2b9C,QAAQ,IAAI,MAAM;QACnB,OAAO,IAAP,CADmB;aAEhB,OAAO,EAAP,CAAT,CAFyB;;WAIlB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;aAC/C,UAAU,OAAV,CAAkB,IAAlB,CAAuB,IAAvB,EAA6B,MAA7B,EAAqC,EAArC,EAAyC,IAAzC,CAAP,CADsD;KAAZ,CAA5C,CAJyB;GA3b4B;;;;;;;;;;;;;;;;;;;;;;;;;kCA0d3C,QAAQ,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;aAEtB,OAAO,EAAP,CAAT,CAF+B;cAGrB,QAAQ,EAAR,CAAV,CAH+B;;WAKxB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;aAC/C,UAAU,UAAV,CAAqB,IAArB,CAA0B,IAA1B,EAAgC,MAAhC,EAAwC,KAAxC,EAA+C,IAA/C,CAAP,CADsD;KAAZ,CAA5C,CAL+B;GA1dsB;;;;;;;;;;;;;;;;;sBAkfjD,QAAQ,IAAI,MAAM;QAChB,OAAO,IAAP,CADgB;aAEb,OAAO,EAAP,CAAT,CAFsB;SAGjB,IAAL,KAAc,KAAK,IAAL,GAAY,EAAZ,CAAd,CAHsB;;QAKhB,eAAe,OAAO,YAAP,IAAuB,EAAvB,CALC;QAMlB,QAAQ,CAAC,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,CAAD,CAAR,CANkB;;iBAQT,OAAb,CAAqB,UAAU,GAAV,EAAe;UAC5B,eAAe,IAAI,QAAJ,CADa;UAE5B,cAAc,IAAI,WAAJ,EAAd,CAF4B;UAG9B,CAAC,KAAK,IAAL,IAAa,KAAK,IAAL,CAAU,OAAV,CAAkB,YAAlB,MAAoC,CAAC,CAAD,EAAI;eAAA;OAA1D;UAGI,IAAI,UAAJ,IAAkB,IAAI,IAAJ,KAAa,WAAb,EAA0B;YAC1C,IAAI,IAAJ,KAAa,WAAb,EAA0B;gBACtB,IAAN,CAAW,KAAK,YAAL,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,EAAyC,IAAI,UAAJ,EAAgB,IAA3E,CAAX,EAD4B;SAA9B,MAEO;gBACC,IAAN,CAAW,KAAK,YAAL,CAAkB,YAAY,KAAZ,IAAqB,WAAW,YAAY,IAAZ,CAAhC,EAAmD,IAAI,UAAJ,EAAgB,IAArF,CAAX,EADK;SAFP;OADF;KANmB,CAArB,CARsB;WAsBf,QAAQ,GAAR,CAAY,KAAZ,EAAmB,IAAnB,CAAwB,YAAY;aAClC,UAAU,IAAV,CAAe,IAAf,CAAoB,IAApB,EAA0B,MAA1B,EAAkC,EAAlC,EAAsC,IAAtC,CAAP,CADyC;KAAZ,CAA/B,CAtBsB;GAlf+B;;;;;;;;;;;;;;;;;;;;;;;;;4BAmiB9C,QAAQ,OAAO,MAAM;QACtB,OAAO,IAAP,CADsB;aAEnB,OAAO,EAAP,CAAT,CAF4B;SAGvB,IAAL,KAAc,KAAK,IAAL,GAAY,EAAZ,CAAd,CAH4B;cAIlB,QAAQ,EAAR,CAAV,CAJ4B;;QAMtB,eAAe,OAAO,YAAP,IAAuB,EAAvB,CANO;QAOxB,QAAQ,CAAC,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,CAAD,CAAR,CAPwB;;iBASf,OAAb,CAAqB,UAAU,GAAV,EAAe;UAC5B,eAAe,IAAI,QAAJ,CADa;UAE5B,cAAc,IAAI,WAAJ,EAAd,CAF4B;UAG9B,CAAC,KAAK,IAAL,IAAa,KAAK,IAAL,CAAU,OAAV,CAAkB,YAAlB,MAAoC,CAAC,CAAD,EAAI;eAAA;OAA1D;UAGI,IAAI,UAAJ,IAAkB,IAAI,IAAJ,KAAa,WAAb,EAA0B;YAC1C,IAAI,IAAJ,KAAa,WAAb,EAA0B;gBACtB,IAAN,CAAW,KAAK,YAAL,CAAkB,OAAO,KAAP,IAAgB,WAAW,OAAO,IAAP,CAA3B,EAAyC,IAAI,UAAJ,EAAgB,IAA3E,CAAX,EAD4B;SAA9B,MAEO;gBACC,IAAN,CAAW,KAAK,YAAL,CAAkB,YAAY,KAAZ,IAAqB,WAAW,YAAY,IAAZ,CAAhC,EAAmD,IAAI,UAAJ,EAAgB,IAArF,CAAX,EADK;SAFP;OADF;KANmB,CAArB,CAT4B;WAuBrB,QAAQ,GAAR,CAAY,KAAZ,EAAmB,IAAnB,CAAwB,YAAY;aAClC,UAAU,OAAV,CAAkB,IAAlB,CAAuB,IAAvB,EAA6B,MAA7B,EAAqC,KAArC,EAA4C,IAA5C,CAAP,CADyC;KAAZ,CAA/B,CAvB4B;GAniByB;;;;;;;;;;;;;;;oCA2kB1C,UAAU,MAAM;aAClB,OAAO,EAAP,CAAT,CAD2B;SAEtB,SAAL,KAAmB,KAAK,SAAL,GAAiB,EAAjB,CAAnB,CAF2B;QAGvB,SAAS,KAAK,SAAL,IAAkB,EAAlB,CAHc;WAIpBA,aAAM,WAAN,CAAkB,KAAK,SAAL,CAAe,QAAf,CAAlB,IAA8C,OAAO,QAAP,KAAoB,UAAU,QAAV,CAApB,GAA0C,KAAK,SAAL,CAAe,QAAf,CAAxF,CAJoB;GA3kB0B;;;;;;;;;;;;;;;;;;;;;;;;;;oBAymBlD,QAAQ,OAAO,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;aAEtB,OAAO,EAAP,CAAT,CAF+B;cAGrB,QAAQ,EAAR,CAAV,CAH+B;;WAKxB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;aAC/C,UAAU,GAAV,CAAc,IAAd,CAAmB,IAAnB,EAAyB,MAAzB,EAAiC,KAAjC,EAAwC,KAAxC,EAA+C,IAA/C,CAAP,CADsD;KAAZ,CAA5C,CAL+B;GAzmBsB;;;;;;;;;;;;;;;;;;0BAkoB/C,QAAQ,IAAI,OAAO,MAAM;QACzB,OAAO,IAAP,CADyB;cAErB,QAAQ,EAAR,CAAV,CAF+B;aAGtB,OAAO,EAAP,CAAT,CAH+B;;WAKxB,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;aAC/C,UAAU,MAAV,CAAiB,IAAjB,CAAsB,IAAtB,EAA4B,MAA5B,EAAoC,EAApC,EAAwC,KAAxC,EAA+C,IAA/C,CAAP,CADsD;KAAZ,CAA5C,CAL+B;GAloBsB;;;;;;;;;;;;;;;;;;;;;;;;;;gCAmqB5C,QAAQ,OAAO,OAAO,MAAM;QAC/B,OAAO,IAAP,CAD+B;cAE3B,QAAQ,EAAR,CAAV,CAFqC;cAG3B,QAAQ,EAAR,CAAV,CAHqC;aAI5B,OAAO,EAAP,CAAT,CAJqC;;WAM9B,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;aAC/C,UAAU,SAAV,CAAoB,IAApB,CAAyB,IAAzB,EAA+B,MAA/B,EAAuC,KAAvC,EAA8C,KAA9C,EAAqD,IAArD,CAAP,CADsD;KAAZ,CAA5C,CANqC;GAnqBgB;;;;;;;;;;;;;;;;;kCA4rB3C,QAAQ,SAAS,MAAM;QAC3B,OAAO,IAAP,CAD2B;gBAErB,UAAU,EAAV,CAAZ,CAFiC;aAGxB,OAAO,EAAP,CAAT,CAHiC;;WAK1B,KAAK,YAAL,CAAkB,MAAlB,EAA0B,IAA1B,EAAgC,IAAhC,CAAqC,YAAY;aAC/C,UAAU,UAAV,CAAqB,IAArB,CAA0B,IAA1B,EAAgC,MAAhC,EAAwC,OAAxC,EAAiD,IAAjD,CAAP,CADsD;KAAZ,CAA5C,CALiC;GA5rBoB;CAAzD;;AAusBA,OAAO,OAAP,GAAiB,gBAAjB"} \ No newline at end of file +{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved\n} from 'js-data-adapter'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\n\nconst withoutRelations = function (mapper, props) {\n return utils.omit(props, mapper.relationFields || [])\n}\n\nconst __super__ = Adapter.prototype\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 28015\n */\n port: 28015\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkDBAdapter with default settings\n * const adapter = new RethinkDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nfunction RethinkDBAdapter (opts) {\n const self = this\n utils.classCallCheck(self, RethinkDBAdapter)\n opts || (opts = {})\n utils.fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n utils.fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n utils.fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n utils.fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n utils.fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n// Setup prototype inheritance from Adapter\nRethinkDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: RethinkDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(RethinkDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the RethinkDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the RethinkDBAdapter itself.\n * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = utils.extend\n\n/**\n * Details of the current version of the `js-data-rethinkdb` module.\n *\n * @name RethinkDBAdapter.version\n * @type {Object}\n * @property {string} full The full semver value.\n * @property {number} major The major version number.\n * @property {number} minor The minor version number.\n * @property {number} patch The patch version number.\n * @property {(string|boolean)} alpha The alpha version value, otherwise `false`\n * if the current version is not alpha.\n * @property {(string|boolean)} beta The beta version value, otherwise `false`\n * if the current version is not beta.\n */\nRethinkDBAdapter.version = '<%= version %>'\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n\nutils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n\n _count (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .count()\n .run(self.getOpt('runOpts', opts)).then(function (count) {\n return [count, {}]\n })\n },\n\n _create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .insert(props, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n return [record, cursor]\n })\n },\n\n _createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .insert(props, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n return [records, cursor]\n })\n },\n\n _destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.selectTable(mapper, opts)\n .get(id)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n return [undefined, cursor]\n })\n },\n\n _destroyAll (mapper, query, opts) {\n const self = this\n query || (query = {})\n opts || (opts = {})\n\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n return [undefined, cursor]\n })\n },\n\n _find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.selectTable(mapper, opts)\n .get(id)\n .run(self.getOpt('runOpts', opts)).then(function (record) {\n return [record, {}]\n })\n },\n\n _findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .run(self.getOpt('runOpts', opts)).then(function (records) {\n return [records, {}]\n })\n },\n\n _sum (mapper, field, query, opts) {\n const self = this\n if (!utils.isString(field)) {\n throw new Error('field must be a string!')\n }\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .sum(field)\n .run(self.getOpt('runOpts', opts)).then(function (sum) {\n return [sum, {}]\n })\n },\n\n _update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .get(id)\n .update(withoutRelations(mapper, props), updateOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n return [record, cursor]\n })\n },\n\n _updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .update(withoutRelations(mapper, props), updateOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n return [records, cursor]\n })\n },\n\n _updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n\n return self.selectTable(mapper, opts)\n .insert(records, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n return [records, cursor]\n })\n },\n\n selectDb (opts) {\n return this.r.db(utils.isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = utils.plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n utils.forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (utils.isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n utils.forOwn(query.where, function (criteria, field) {\n if (!utils.isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n utils.forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n } else {\n throw new Error(`Operator ${operator} not supported!`)\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (utils.isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (utils.isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = utils.isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n waitForTable (mapper, options) {\n const table = utils.isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = utils.isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = utils.isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n },\n\n /**\n * Return the number of records that match the selection query.\n *\n * @name RethinkDBAdapter#count\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n count (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.count.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.create.call(self, mapper, props, opts)\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.createMany.call(self, mapper, props, opts)\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.destroy.call(self, mapper, id, opts)\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.destroyAll.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n return __super__.find.call(self, mapper, id, opts)\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n query || (query = {})\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n return __super__.findAll.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return utils.isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Return the sum of the specified field of records that match the selection\n * query.\n *\n * @name RethinkDBAdapter#sum\n * @method\n * @param {Object} mapper The mapper.\n * @param {string} field The field to sum.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n sum (mapper, field, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.sum.call(self, mapper, field, query, opts)\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.update.call(self, mapper, id, props, opts)\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.updateAll.call(self, mapper, props, query, opts)\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.updateMany.call(self, mapper, records, opts)\n })\n }\n})\n\nmodule.exports = RethinkDBAdapter\n"],"names":["utils","Adapter","reserved"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 0c7e5ba..d24ed03 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-rethinkdb", "description": "RethinkDB adapter for js-data.", - "version": "3.0.0-alpha.13", + "version": "3.0.0-beta.1", "homepage": "https://github.com/js-data/js-data-rethinkdb", "repository": { "type": "git", @@ -34,7 +34,7 @@ }, "scripts": { "lint": "repo-tools lint src/index.js mocha.start.js test/**/*.js scripts/**.js rollup.config.js", - "bundle": "rollup -c rollup.config.js -f cjs -o dist/js-data-rethinkdb.js -m dist/js-data-rethinkdb.js.map src/index.js", + "bundle": "rollup -c rollup.config.js -f cjs -o dist/js-data-rethinkdb.js -m dist/js-data-rethinkdb.js.map src/index.js && repo-tools write-version dist/js-data-rethinkdb.js", "doc": "jsdoc -c conf.json src node_modules/js-data-adapter/src && node scripts/cleanup.js", "watch": "watch \"npm run bundle\" src/", "build": "npm run lint && npm run bundle", @@ -43,29 +43,28 @@ "test": "npm run build && npm run cover", "repo-tools": "repo-tools updates && repo-tools changelog && repo-tools authors", "release": "npm test && npm run doc && npm run repo-tools", - "ci": "npm run test && cat coverage/lcov.info | coveralls || true" + "ci": "npm run test && cat coverage/lcov.info | codecov || true" }, "dependencies": { - "js-data-adapter": "0.2.3", - "mout": "0.12.0" + "js-data-adapter": "~0.3.0", + "mout": "1.0.0" }, "peerDependencies": { - "js-data": "^3.0.0-alpha.19", + "js-data": "^3.0.0-beta.1", "rethinkdbdash": ">=1.15.0" }, "devDependencies": { - "babel-core": "6.7.2", - "babel-polyfill": "6.7.2", + "babel-core": "6.7.6", + "babel-polyfill": "6.7.4", "babel-preset-es2015-rollup": "1.1.1", "chai": "3.5.0", - "coveralls": "2.11.8", "ink-docstrap": "1.1.4", - "istanbul": "0.4.2", + "istanbul": "0.4.3", "js-data-adapter-tests": "^2.0.0-alpha.15", - "js-data-repo-tools": "0.2.0", + "js-data-repo-tools": "0.3.0", "jsdoc": "3.4.0", "mocha": "2.4.5", - "rollup": "0.25.4", + "rollup": "0.25.8", "rollup-plugin-babel": "2.4.0", "sinon": "1.17.3", "source-map-support": "0.4.0", diff --git a/scripts/CONTRIBUTORS b/scripts/CONTRIBUTORS deleted file mode 100644 index f833e6e..0000000 --- a/scripts/CONTRIBUTORS +++ /dev/null @@ -1,6 +0,0 @@ -# People who have contributed to the js-data-rethinkdb project. -# -# This file is controlled by scripts/authors.js -# -# Names should be added to this file as: -# [commit count] Name diff --git a/scripts/authors.js b/scripts/authors.js deleted file mode 100644 index 5ba1712..0000000 --- a/scripts/authors.js +++ /dev/null @@ -1,46 +0,0 @@ -var fs = require('fs') -var exec = require('child_process').exec -var path = require('path') - -console.log('Writing AUTHORS file...') - -var authorsFile = fs.readFileSync(path.join(__dirname, '/AUTHORS'), { - encoding: 'utf-8' -}) -var contributorsFile = fs.readFileSync(path.join(__dirname, '/CONTRIBUTORS'), { - encoding: 'utf-8' -}) - -var tty = process.platform === 'win32' ? 'CON' : '/dev/tty' - -exec('git shortlog -s -e < ' + tty, function (err, stdout, stderr) { - if (err) { - console.error(err) - process.exit(-1) - } else { - var lines = stdout.split('\n') - var countsAndNames = lines.map(function (line) { - return line.split('\t') - }) - var names = countsAndNames.map(function (pair) { - return pair[1] - }) - - // Add to or otherwise modify "names" if necessary - - fs.writeFileSync(path.join(__dirname, '/../AUTHORS'), authorsFile + names.join('\n'), { - encoding: 'utf-8' - }) - console.log('Done!') - console.log('Writing CONTRIBUTORS file...') - - names = lines - - // Add to or otherwise modify "names" if necessary - - fs.writeFileSync(path.join(__dirname, '/../CONTRIBUTORS'), contributorsFile + names.join('\n'), { - encoding: 'utf-8' - }) - console.log('Done!') - } -}) diff --git a/src/index.js b/src/index.js index 05a0087..3355cec 100644 --- a/src/index.js +++ b/src/index.js @@ -281,6 +281,22 @@ Object.defineProperty(RethinkDBAdapter, '__super__', { */ RethinkDBAdapter.extend = utils.extend +/** + * Details of the current version of the `js-data-rethinkdb` module. + * + * @name RethinkDBAdapter.version + * @type {Object} + * @property {string} full The full semver value. + * @property {number} major The major version number. + * @property {number} minor The minor version number. + * @property {number} patch The patch version number. + * @property {(string|boolean)} alpha The alpha version value, otherwise `false` + * if the current version is not alpha. + * @property {(string|boolean)} beta The beta version value, otherwise `false` + * if the current version is not beta. + */ +RethinkDBAdapter.version = '<%= version %>' + RethinkDBAdapter.OPERATORS = OPERATORS utils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, { From 5571b947c8f069c6c8e9597c391fc64095085b41 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sun, 17 Apr 2016 21:00:36 -0700 Subject: [PATCH 25/27] codecov --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index d24ed03..f7a5db5 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "test": "npm run build && npm run cover", "repo-tools": "repo-tools updates && repo-tools changelog && repo-tools authors", "release": "npm test && npm run doc && npm run repo-tools", - "ci": "npm run test && cat coverage/lcov.info | codecov || true" + "ci": "npm run test && cat coverage/lcov.info | codecov" }, "dependencies": { "js-data-adapter": "~0.3.0", @@ -58,6 +58,7 @@ "babel-polyfill": "6.7.4", "babel-preset-es2015-rollup": "1.1.1", "chai": "3.5.0", + "codecov": "1.0.1", "ink-docstrap": "1.1.4", "istanbul": "0.4.3", "js-data-adapter-tests": "^2.0.0-alpha.15", From 69ea83a2ec06c6246758a190d47867fb68b3e959 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sun, 17 Apr 2016 21:23:31 -0700 Subject: [PATCH 26/27] Update readme --- README.md | 76 ++++++++----------------------------------------------- 1 file changed, 10 insertions(+), 66 deletions(-) diff --git a/README.md b/README.md index eed4372..bcb0b8a 100644 --- a/README.md +++ b/README.md @@ -11,72 +11,16 @@ RethinkDB adapter for [js-data](http://www.js-data.io/). -To get started, visit __[http://js-data.io](http://www.js-data.io)__. +To get started, visit __[http://js-data.io](http://www.js-data.io/v3.0/docs/js-data-rethinkdb)__. -## Table of contents +## Links -* [Quick start](#quick-start) -* [Example App](#example-app) -* [Guides and Tutorials](#guides-and-tutorials) -* [API Reference Docs](#api-reference-docs) -* [Community](#community) -* [Support](#support) -* [Contributing](#contributing) -* [License](#license) - -## Quick Start -`npm install --save js-data js-data-rethinkdb rethinkdbdash`. - -```js -// Use Container instead of DataStore on the server -import {Container} from 'js-data' -import RethinkDBAdapter from 'js-data-rethinkdb' - -// Create a store to hold your Mappers -const store = new Container() - -// Create an instance of RethinkDBAdapter with default settings -const adapter = new RethinkDBAdapter() - -// Mappers in "store" will use the RethinkDB adapter by default -store.registerAdapter('rethinkdb', adapter, { default: true }) - -// Create a Mapper that maps to a "user" table -store.defineMapper('user') -``` - -```js -async function findAllAdminUsers () { - // Find all users where "user.role" == "admin" - return await store.findAll('user', { - role: 'admin' - }) -} -``` - -## Example App - -[js-data-examples/server/rethinkdb](https://github.com/js-data/js-data-examples/tree/master/server/rethinkdb) - -## Guides and Tutorials - -[Get started at http://js-data.io](http://js-data.io) - -## API Reference Docs - -[Visit http://api.js-data.io](http://api.js-data.io). - -## Community - -[Explore the Community](http://js-data.io/docs/community). - -## Support - -[Find out how to Get Support](http://js-data.io/docs/support). - -## Contributing - -[Read the Contributing Guide](http://js-data.io/docs/contributing). +* [Quick start](http://www.js-data.io/v3.0/docs/js-data-rethinkdb) +* [Guides and Tutorials](http://www.js-data.io/v3.0/docs/home) +* [API Reference Docs](http://api.js-data.io/js-data-rethinkdb) +* [Community](http://js-data.io/docs/community) +* [Support](http://js-data.io/docs/support) +* [Contributing](http://js-data.io/docs/contributing) ## License @@ -96,7 +40,7 @@ Copyright (c) 2014-2016 js-data-rethinkdb project authors [circle_l]: https://circleci.com/gh/js-data/js-data-rethinkdb/tree/master [dn_b]: https://img.shields.io/npm/dm/js-data-rethinkdb.svg?style=flat [dn_l]: https://www.npmjs.org/package/js-data-rethinkdb -[cov_b]: https://img.shields.io/coveralls/js-data/js-data-rethinkdb/master.svg?style=flat -[cov_l]: https://coveralls.io/github/js-data/js-data-rethinkdb?branch=master +[cov_b]: https://img.shields.io/codecov/c/github/js-data/js-data-rethinkdb/v3.svg?style=flat +[cov_l]: https://codecov.io/github/js-data/js-data-rethinkdb [cod_b]: https://img.shields.io/codacy/69206fcb0df6462ca559610af32fd1fb.svg [cod_l]: https://www.codacy.com/app/jasondobry/js-data-rethinkdb/dashboard From 05aedcb4c974341b25af0820614f053ee0712f6d Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Fri, 29 Apr 2016 20:41:51 -0700 Subject: [PATCH 27/27] Prepare for 3.0.0-beta.2 --- .github/CONTRIBUTING.md | 34 ++++++--- .github/ISSUE_TEMPLATE.md | 6 +- .github/PULL_REQUEST_TEMPLATE.md | 2 - .npmignore | 39 ---------- CHANGELOG.md | 31 ++++++++ README.md | 24 +++--- conf.json | 6 +- dist/js-data-rethinkdb.js | 122 +++++++++++++++++-------------- dist/js-data-rethinkdb.js.map | 2 +- mocha.start.js | 14 +++- package.json | 35 +++++---- scripts/cleanup.js | 25 ------- src/index.js | 99 ++++++++++++++----------- 13 files changed, 223 insertions(+), 216 deletions(-) delete mode 100644 .npmignore delete mode 100644 scripts/cleanup.js diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index ad84ef7..25f3f56 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,27 +1,37 @@ -# Contributing +# Contributing to js-data-rethinkdb -[Read the Contributing Guide](http://js-data.io/docs/contributing). +[Read the general Contributing Guide](http://js-data.io/docs/contributing). -## Support +## Project structure -[Find out how to Get Support](http://js-data.io/docs/support). +* `dist/` - Contains final build files for distribution +* `doc/` - Output folder for JSDocs +* `src/` - Project source code +* `test/` - Project tests -## Community +## Clone, build & test -[Explore the Community](http://js-data.io/docs/community). +1. `clone git@github.com:js-data/js-data-rethinkdb.git` +1. `cd js-data-rethinkdb` +1. `npm install` +1. `npm run build` - Lint and build distribution files +1. `npm run mocha` - Run tests (RethinkDB must be running) -### Have write access? - -To cut a release: +## To cut a release 1. Checkout master 1. Bump version in `package.json` appropriately -1. Run `npm run release` 1. Update `CHANGELOG.md` appropriately -1. Commit and push changes, including the `dist/` folder +1. Run `npm run release` +1. Commit and push changes +1. Checkout `release`, merge `master` into `release` +1. Run `npm run release` again +1. Commit and push changes 1. Make a GitHub release + - tag from `release` branch - set tag name to version - set release name to version - set release body to changelog entry for the version - - attach the files in the `dist/` folder 1. `npm publish .` + +See also [Community & Support](http://js-data.io/docs/community). diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 2ce62e8..b66d610 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,7 +1,5 @@ -(delete this line) GitHub Issues are NOT for support questions. -(delete this line) GitHub Issues ARE for bug reports, feature requests, and other issues. -(delete this line) Find out how to Get Support here: http://js-data.io/docs/support. +(delete this line) Find out how to get help here: http://js-data.io/docs/community. - + Thanks! diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 4c14bdc..4a12cfd 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,8 +1,6 @@ Fixes # (it's a good idea to open an issue first for discussion) - [ ] - `npm test` succeeds -- [ ] - Pull request has been squashed into 1 commit -- [ ] - I did NOT commit changes to `dist/` - [ ] - Code coverage does not decrease (if any source code was changed) - [ ] - Appropriate JSDoc comments were updated in source code (if applicable) - [ ] - Approprate changes to js-data.io docs have been suggested ("Suggest Edits" button) diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 99541f1..0000000 --- a/.npmignore +++ /dev/null @@ -1,39 +0,0 @@ -# Logs -logs -*.log - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directory -# Commenting this out is preferred by some people, see -# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- -node_modules - -# Users Environment Variables -.lock-wscript - -.idea/ -*.iml -coverage/ -src/ -doc/ -junit/ -test/ -mocha.start.js -webpack.config.js -rethinkdb_data \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index d1ca6ab..8ec5f40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,34 @@ +##### 3.0.0-beta.2 - 29 April 2016 + +###### Breaking changes +- How you must now import in ES2015: + + ```js + import RethinkDBAdapter from 'js-data-rethinkdb' + const adapter = new RethinkDBAdapter() + ``` + or + ```js + import {RethinkDBAdapter, version} from 'js-data-rethinkdb' + console.log(version) + const adapter = new RethinkDBAdapter() + ``` + +- How you must now import in ES5: + + ```js + var JSDataRethinkDB = require('js-data-rethinkdb') + var RethinkDBAdapter = JSDataRethinkDB.RethinkDBAdapter + var adapter = new RethinkDBAdapter() + ``` + +- `OPERATORS` is now an export, not a static property of the `RethinkDBAdapter` class. + +###### Other +- Upgraded dependencies +- Improved JSDoc comments +- Now using js-data JSDoc template + ##### 3.0.0-beta.1 - 17 April 2016 Official v3 beta release diff --git a/README.md b/README.md index bcb0b8a..e4cb3b1 100644 --- a/README.md +++ b/README.md @@ -7,20 +7,20 @@ [![Circle CI][circle_b]][circle_l] [![npm downloads][dn_b]][dn_l] [![Coverage Status][cov_b]][cov_l] -[![Codacy][cod_b]][cod_l] RethinkDB adapter for [js-data](http://www.js-data.io/). -To get started, visit __[http://js-data.io](http://www.js-data.io/v3.0/docs/js-data-rethinkdb)__. +To get started, visit __[http://js-data.io](http://www.js-data.io/docs/js-data-rethinkdb)__. ## Links -* [Quick start](http://www.js-data.io/v3.0/docs/js-data-rethinkdb) -* [Guides and Tutorials](http://www.js-data.io/v3.0/docs/home) -* [API Reference Docs](http://api.js-data.io/js-data-rethinkdb) -* [Community](http://js-data.io/docs/community) -* [Support](http://js-data.io/docs/support) -* [Contributing](http://js-data.io/docs/contributing) +* [Quick start](http://www.js-data.io/docs/home#quick-start) - Get started in 5 minutes +* [Guides and Tutorials](http://www.js-data.io/docs/home) - Learn how to use JSData +* [`RethinkDBAdapter` Guide](http://www.js-data.io/docs/js-data-rethinkdb) - Learn how to use `RethinkDBAdapter` +* [API Reference Docs](http://api.js-data.io) - Explore components, methods, options, etc. +* [Community & Support](http://js-data.io/docs/community) - Find solutions and chat with the community +* [General Contributing Guide](http://js-data.io/docs/contributing) - Give back and move the project forward + * [Contributing to js-data-rethinkdb](https://github.com/js-data/js-data-rethinkdb/blob/master/.github/CONTRIBUTING.md) ## License @@ -36,11 +36,9 @@ Copyright (c) 2014-2016 js-data-rethinkdb project authors [sl_l]: http://slack.js-data.io [npm_b]: https://img.shields.io/npm/v/js-data-rethinkdb.svg?style=flat [npm_l]: https://www.npmjs.org/package/js-data-rethinkdb -[circle_b]: https://img.shields.io/circleci/project/js-data/js-data-rethinkdb/master.svg?style=flat -[circle_l]: https://circleci.com/gh/js-data/js-data-rethinkdb/tree/master +[circle_b]: https://img.shields.io/circleci/project/js-data/js-data-rethinkdb.svg?style=flat +[circle_l]: https://circleci.com/gh/js-data/js-data-rethinkdb [dn_b]: https://img.shields.io/npm/dm/js-data-rethinkdb.svg?style=flat [dn_l]: https://www.npmjs.org/package/js-data-rethinkdb -[cov_b]: https://img.shields.io/codecov/c/github/js-data/js-data-rethinkdb/v3.svg?style=flat +[cov_b]: https://img.shields.io/codecov/c/github/js-data/js-data-rethinkdb.svg?style=flat [cov_l]: https://codecov.io/github/js-data/js-data-rethinkdb -[cod_b]: https://img.shields.io/codacy/69206fcb0df6462ca559610af32fd1fb.svg -[cod_l]: https://www.codacy.com/app/jasondobry/js-data-rethinkdb/dashboard diff --git a/conf.json b/conf.json index 651653a..7ea030f 100644 --- a/conf.json +++ b/conf.json @@ -12,12 +12,12 @@ "package": "./package.json" }, "templates": { - "theme": "lumen", + "theme": "jsdata", "systemName": "js-data-rethinkdb", "copyright": "js-data-rethinkdb Copyright © 2014-2016 js-data-rethinkdb project authors", - "syntaxTheme": "dark", + "outputSourceFiles": true, "linenums": true, - "footer": "", + "footer": "", "analytics": { "ua": "UA-55528236-2", "domain": "api.js-data.io" diff --git a/dist/js-data-rethinkdb.js b/dist/js-data-rethinkdb.js index ccea95e..3d1c0b1 100644 --- a/dist/js-data-rethinkdb.js +++ b/dist/js-data-rethinkdb.js @@ -3,16 +3,11 @@ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var jsData = require('js-data'); -var Adapter = require('js-data-adapter'); -var Adapter__default = _interopDefault(Adapter); +var jsDataAdapter = require('js-data-adapter'); var rethinkdbdash = _interopDefault(require('rethinkdbdash')); var underscore = _interopDefault(require('mout/string/underscore')); -var withoutRelations = function withoutRelations(mapper, props) { - return jsData.utils.omit(props, mapper.relationFields || []); -}; - -var __super__ = Adapter__default.prototype; +var __super__ = jsDataAdapter.Adapter.prototype; var DEFAULTS = { /** @@ -94,7 +89,7 @@ var notEqual = function notEqual(r, row, field, value) { /** * Default predicate functions for the filtering operators. * - * @name RethinkDBAdapter.OPERATORS + * @name module:js-data-rethinkdb.OPERATORS * @property {Function} == Equality operator. * @property {Function} != Inequality operator. * @property {Function} > "Greater than" operator. @@ -151,6 +146,8 @@ var OPERATORS = { } }; +Object.freeze(OPERATORS); + /** * RethinkDBAdapter class. * @@ -173,25 +170,28 @@ var OPERATORS = { * * @class RethinkDBAdapter * @extends Adapter - * @param {Object} [opts] Configuration opts. - * @param {string} [opts.authKey=""] RethinkDB authorization key. - * @param {number} [opts.bufferSize=10] Buffer size for connection pool. + * @param {Object} [opts] Configuration options. + * @param {string} [opts.authKey=""] See {@link RethinkDBAdapter#authKey}. + * @param {number} [opts.bufferSize=10] See {@link RethinkDBAdapter#bufferSize}. * @param {string} [opts.db="test"] Default database. - * @param {boolean} [opts.debug=false] Whether to log debugging information. - * @param {string} [opts.host="localhost"] RethinkDB host. - * @param {number} [opts.max=50] Maximum connections in pool. - * @param {number} [opts.min=10] Minimum connections in pool. - * @param {Object} [opts.operators] Override the default predicate functions for - * specified operators. - * @param {number} [opts.port=28015] RethinkDB port. - * @param {boolean} [opts.raw=false] Whether to return a more detailed response object. + * @param {boolean} [opts.debug=false] See {@link Adapter#debug}. + * @param {Object} [opts.deleteOpts={}] See {@link RethinkDBAdapter#deleteOpts}. + * @param {string} [opts.host="localhost"] See {@link RethinkDBAdapter#host}. + * @param {Object} [opts.insertOpts={}] See {@link RethinkDBAdapter#insertOpts}. + * @param {number} [opts.max=50] See {@link RethinkDBAdapter#max}. + * @param {number} [opts.min=10] See {@link RethinkDBAdapter#min}. + * @param {Object} [opts.operators] See {@link RethinkDBAdapter#operators}. + * @param {number} [opts.port=28015] See {@link RethinkDBAdapter#port}. + * @param {boolean} [opts.raw=false] See {@link Adapter#raw}. + * @param {Object} [opts.runOpts={}] See {@link RethinkDBAdapter#runOpts}. + * @param {Object} [opts.updateOpts={}] See {@link RethinkDBAdapter#updateOpts}. */ function RethinkDBAdapter(opts) { var self = this; jsData.utils.classCallCheck(self, RethinkDBAdapter); opts || (opts = {}); jsData.utils.fillIn(opts, DEFAULTS); - Adapter__default.call(self, opts); + jsDataAdapter.Adapter.call(self, opts); /** * Default options to pass to r#insert. @@ -242,6 +242,8 @@ function RethinkDBAdapter(opts) { */ self.operators || (self.operators = {}); + jsData.utils.fillIn(self.operators, OPERATORS); + /** * The rethinkdbdash instance used by this adapter. Use this directly when you * need to write custom queries. @@ -256,7 +258,7 @@ function RethinkDBAdapter(opts) { } // Setup prototype inheritance from Adapter -RethinkDBAdapter.prototype = Object.create(Adapter__default.prototype, { +RethinkDBAdapter.prototype = Object.create(jsDataAdapter.Adapter.prototype, { constructor: { value: RethinkDBAdapter, enumerable: false, @@ -267,46 +269,33 @@ RethinkDBAdapter.prototype = Object.create(Adapter__default.prototype, { Object.defineProperty(RethinkDBAdapter, '__super__', { configurable: true, - value: Adapter__default + value: jsDataAdapter.Adapter }); /** * Alternative to ES6 class syntax for extending `RethinkDBAdapter`. * + * @example Using the ES2015 class syntax. + * class MyRethinkDBAdapter extends RethinkDBAdapter {...} + * const adapter = new MyRethinkDBAdapter() + * + * @example Using {@link RethinkDBAdapter.extend}. + * var instanceProps = {...} + * var classProps = {...} + * + * var MyRethinkDBAdapter = RethinkDBAdapter.extend(instanceProps, classProps) + * var adapter = new MyRethinkDBAdapter() + * * @name RethinkDBAdapter.extend * @method * @param {Object} [instanceProps] Properties that will be added to the - * prototype of the RethinkDBAdapter. + * prototype of the Subclass. * @param {Object} [classProps] Properties that will be added as static - * properties to the RethinkDBAdapter itself. - * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`. + * properties to the Subclass itself. + * @return {Constructor} Subclass of `RethinkDBAdapter`. */ RethinkDBAdapter.extend = jsData.utils.extend; -/** - * Details of the current version of the `js-data-rethinkdb` module. - * - * @name RethinkDBAdapter.version - * @type {Object} - * @property {string} full The full semver value. - * @property {number} major The major version number. - * @property {number} minor The minor version number. - * @property {number} patch The patch version number. - * @property {(string|boolean)} alpha The alpha version value, otherwise `false` - * if the current version is not alpha. - * @property {(string|boolean)} beta The beta version value, otherwise `false` - * if the current version is not beta. - */ -RethinkDBAdapter.version = { - beta: 1, - full: '3.0.0-beta.1', - major: 3, - minor: 0, - patch: 0 -}; - -RethinkDBAdapter.OPERATORS = OPERATORS; - jsData.utils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, { _handleErrors: function _handleErrors(cursor) { if (cursor && cursor.errors > 0) { @@ -417,7 +406,7 @@ jsData.utils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, { var updateOpts = self.getOpt('updateOpts', opts); updateOpts.returnChanges = true; - return self.selectTable(mapper, opts).get(id).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts)).then(function (cursor) { + return self.selectTable(mapper, opts).get(id).update(jsDataAdapter.withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts)).then(function (cursor) { var record = void 0; self._handleErrors(cursor); if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) { @@ -437,7 +426,7 @@ jsData.utils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, { var updateOpts = self.getOpt('updateOpts', opts); updateOpts.returnChanges = true; - return self.filterSequence(self.selectTable(mapper, opts), query).update(withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts)).then(function (cursor) { + return self.filterSequence(self.selectTable(mapper, opts), query).update(jsDataAdapter.withoutRelations(mapper, props), updateOpts).run(self.getOpt('runOpts', opts)).then(function (cursor) { var records = []; self._handleErrors(cursor); if (cursor && cursor.changes && cursor.changes.length) { @@ -507,7 +496,7 @@ jsData.utils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, { // Transform non-keyword properties to "where" clause configuration jsData.utils.forOwn(query, function (config, keyword) { - if (Adapter.reserved.indexOf(keyword) === -1) { + if (jsDataAdapter.reserved.indexOf(keyword) === -1) { if (jsData.utils.isObject(config)) { query.where[keyword] = config; } else { @@ -871,7 +860,7 @@ jsData.utils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, { opts || (opts = {}); opts.operators || (opts.operators = {}); var ownOps = this.operators || {}; - return jsData.utils.isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]; + return jsData.utils.isUndefined(opts.operators[operator]) ? ownOps[operator] : opts.operators[operator]; }, @@ -995,5 +984,30 @@ jsData.utils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } }); -module.exports = RethinkDBAdapter; +/** + * Details of the current version of the `js-data-rethinkdb` module. + * + * @name module:js-data-rethinkdb.version + * @type {Object} + * @property {string} version.full The full semver value. + * @property {number} version.major The major version number. + * @property {number} version.minor The minor version number. + * @property {number} version.patch The patch version number. + * @property {(string|boolean)} version.alpha The alpha version value, + * otherwise `false` if the current version is not alpha. + * @property {(string|boolean)} version.beta The beta version value, + * otherwise `false` if the current version is not beta. + */ +var version = { + beta: 2, + full: '3.0.0-beta.2', + major: 3, + minor: 0, + patch: 0 +}; + +exports.OPERATORS = OPERATORS; +exports.RethinkDBAdapter = RethinkDBAdapter; +exports.version = version; +exports['default'] = RethinkDBAdapter; //# sourceMappingURL=js-data-rethinkdb.js.map \ No newline at end of file diff --git a/dist/js-data-rethinkdb.js.map b/dist/js-data-rethinkdb.js.map index fa25045..542d187 100644 --- a/dist/js-data-rethinkdb.js.map +++ b/dist/js-data-rethinkdb.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport Adapter from 'js-data-adapter'\nimport {\n reserved\n} from 'js-data-adapter'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\n\nconst withoutRelations = function (mapper, props) {\n return utils.omit(props, mapper.relationFields || [])\n}\n\nconst __super__ = Adapter.prototype\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 28015\n */\n port: 28015\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name RethinkDBAdapter.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nconst OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkDBAdapter with default settings\n * const adapter = new RethinkDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration opts.\n * @param {string} [opts.authKey=\"\"] RethinkDB authorization key.\n * @param {number} [opts.bufferSize=10] Buffer size for connection pool.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] Whether to log debugging information.\n * @param {string} [opts.host=\"localhost\"] RethinkDB host.\n * @param {number} [opts.max=50] Maximum connections in pool.\n * @param {number} [opts.min=10] Minimum connections in pool.\n * @param {Object} [opts.operators] Override the default predicate functions for\n * specified operators.\n * @param {number} [opts.port=28015] RethinkDB port.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed response object.\n */\nfunction RethinkDBAdapter (opts) {\n const self = this\n utils.classCallCheck(self, RethinkDBAdapter)\n opts || (opts = {})\n utils.fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n utils.fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n utils.fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n utils.fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n utils.fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n// Setup prototype inheritance from Adapter\nRethinkDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: RethinkDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(RethinkDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the RethinkDBAdapter.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the RethinkDBAdapter itself.\n * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = utils.extend\n\n/**\n * Details of the current version of the `js-data-rethinkdb` module.\n *\n * @name RethinkDBAdapter.version\n * @type {Object}\n * @property {string} full The full semver value.\n * @property {number} major The major version number.\n * @property {number} minor The minor version number.\n * @property {number} patch The patch version number.\n * @property {(string|boolean)} alpha The alpha version value, otherwise `false`\n * if the current version is not alpha.\n * @property {(string|boolean)} beta The beta version value, otherwise `false`\n * if the current version is not beta.\n */\nRethinkDBAdapter.version = '<%= version %>'\n\nRethinkDBAdapter.OPERATORS = OPERATORS\n\nutils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n\n _count (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .count()\n .run(self.getOpt('runOpts', opts)).then(function (count) {\n return [count, {}]\n })\n },\n\n _create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .insert(props, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n return [record, cursor]\n })\n },\n\n _createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .insert(props, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n return [records, cursor]\n })\n },\n\n _destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.selectTable(mapper, opts)\n .get(id)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n return [undefined, cursor]\n })\n },\n\n _destroyAll (mapper, query, opts) {\n const self = this\n query || (query = {})\n opts || (opts = {})\n\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n return [undefined, cursor]\n })\n },\n\n _find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.selectTable(mapper, opts)\n .get(id)\n .run(self.getOpt('runOpts', opts)).then(function (record) {\n return [record, {}]\n })\n },\n\n _findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .run(self.getOpt('runOpts', opts)).then(function (records) {\n return [records, {}]\n })\n },\n\n _sum (mapper, field, query, opts) {\n const self = this\n if (!utils.isString(field)) {\n throw new Error('field must be a string!')\n }\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .sum(field)\n .run(self.getOpt('runOpts', opts)).then(function (sum) {\n return [sum, {}]\n })\n },\n\n _update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .get(id)\n .update(withoutRelations(mapper, props), updateOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n return [record, cursor]\n })\n },\n\n _updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .update(withoutRelations(mapper, props), updateOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n return [records, cursor]\n })\n },\n\n _updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n\n return self.selectTable(mapper, opts)\n .insert(records, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n return [records, cursor]\n })\n },\n\n selectDb (opts) {\n return this.r.db(utils.isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = utils.plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n utils.forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (utils.isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n utils.forOwn(query.where, function (criteria, field) {\n if (!utils.isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n utils.forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n } else {\n throw new Error(`Operator ${operator} not supported!`)\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (utils.isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (utils.isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = utils.isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n waitForTable (mapper, options) {\n const table = utils.isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = utils.isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = utils.isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n },\n\n /**\n * Return the number of records that match the selection query.\n *\n * @name RethinkDBAdapter#count\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n count (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.count.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.create.call(self, mapper, props, opts)\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.createMany.call(self, mapper, props, opts)\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.destroy.call(self, mapper, id, opts)\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.destroyAll.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n return __super__.find.call(self, mapper, id, opts)\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n query || (query = {})\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n return __super__.findAll.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return utils.isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator]\n },\n\n /**\n * Return the sum of the specified field of records that match the selection\n * query.\n *\n * @name RethinkDBAdapter#sum\n * @method\n * @param {Object} mapper The mapper.\n * @param {string} field The field to sum.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n sum (mapper, field, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.sum.call(self, mapper, field, query, opts)\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.update.call(self, mapper, id, props, opts)\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.updateAll.call(self, mapper, props, query, opts)\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.updateMany.call(self, mapper, records, opts)\n })\n }\n})\n\nmodule.exports = RethinkDBAdapter\n"],"names":["utils","Adapter","reserved"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-rethinkdb.js","sources":["../src/index.js"],"sourcesContent":["import {utils} from 'js-data'\nimport {\n Adapter,\n reserved,\n withoutRelations\n} from 'js-data-adapter'\nimport rethinkdbdash from 'rethinkdbdash'\nimport underscore from 'mout/string/underscore'\n\nconst __super__ = Adapter.prototype\n\nconst DEFAULTS = {\n /**\n * RethinkDB authorization key.\n *\n * @name RethinkDBAdapter#authKey\n * @type {string}\n */\n authKey: '',\n\n /**\n * Buffer size for connection pool.\n *\n * @name RethinkDBAdapter#bufferSize\n * @type {number}\n * @default 10\n */\n bufferSize: 10,\n\n /**\n * Default database.\n *\n * @name RethinkDBAdapter#db\n * @type {string}\n * @default \"test\"\n */\n db: 'test',\n\n /**\n * RethinkDB host.\n *\n * @name RethinkDBAdapter#host\n * @type {string}\n * @default \"localhost\"\n */\n host: 'localhost',\n\n /**\n * Minimum connections in pool.\n *\n * @name RethinkDBAdapter#min\n * @type {number}\n * @default 10\n */\n min: 10,\n\n /**\n * Maximum connections in pool.\n *\n * @name RethinkDBAdapter#max\n * @type {number}\n * @default 50\n */\n max: 50,\n\n /**\n * RethinkDB port.\n *\n * @name RethinkDBAdapter#port\n * @type {number}\n * @default 28015\n */\n port: 28015\n}\n\nconst INSERT_OPTS_DEFAULTS = {}\nconst UPDATE_OPTS_DEFAULTS = {}\nconst DELETE_OPTS_DEFAULTS = {}\nconst RUN_OPTS_DEFAULTS = {}\n\nconst equal = function (r, row, field, value) {\n return row(field).default(null).eq(value)\n}\n\nconst notEqual = function (r, row, field, value) {\n return row(field).default(null).ne(value)\n}\n\n/**\n * Default predicate functions for the filtering operators.\n *\n * @name module:js-data-rethinkdb.OPERATORS\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > \"Greater than\" operator.\n * @property {Function} >= \"Greater than or equal to\" operator.\n * @property {Function} < \"Less than\" operator.\n * @property {Function} <= \"Less than or equal to\" operator.\n * @property {Function} isectEmpty Operator to test that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator to test that the intersection\n * between two arrays is NOT empty.\n * @property {Function} in Operator to test whether a value is found in the\n * provided array.\n * @property {Function} notIn Operator to test whether a value is NOT found in\n * the provided array.\n * @property {Function} contains Operator to test whether an array contains the\n * provided value.\n * @property {Function} notContains Operator to test whether an array does NOT\n * contain the provided value.\n */\nexport const OPERATORS = {\n '==': equal,\n '===': equal,\n '!=': notEqual,\n '!==': notEqual,\n '>': function (r, row, field, value) {\n return row(field).default(null).gt(value)\n },\n '>=': function (r, row, field, value) {\n return row(field).default(null).ge(value)\n },\n '<': function (r, row, field, value) {\n return row(field).default(null).lt(value)\n },\n '<=': function (r, row, field, value) {\n return row(field).default(null).le(value)\n },\n 'isectEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().eq(0)\n },\n 'isectNotEmpty': function (r, row, field, value) {\n return row(field).default([]).setIntersection(r.expr(value).default([])).count().ne(0)\n },\n 'in': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null))\n },\n 'notIn': function (r, row, field, value) {\n return r.expr(value).default(r.expr([])).contains(row(field).default(null)).not()\n },\n 'contains': function (r, row, field, value) {\n return row(field).default([]).contains(value)\n },\n 'notContains': function (r, row, field, value) {\n return row(field).default([]).contains(value).not()\n }\n}\n\nObject.freeze(OPERATORS)\n\n/**\n * RethinkDBAdapter class.\n *\n * @example\n * // Use Container instead of DataStore on the server\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n *\n * // Create a store to hold your Mappers\n * const store = new Container()\n *\n * // Create an instance of RethinkDBAdapter with default settings\n * const adapter = new RethinkDBAdapter()\n *\n * // Mappers in \"store\" will use the RethinkDB adapter by default\n * store.registerAdapter('rethinkdb', adapter, { default: true })\n *\n * // Create a Mapper that maps to a \"user\" table\n * store.defineMapper('user')\n *\n * @class RethinkDBAdapter\n * @extends Adapter\n * @param {Object} [opts] Configuration options.\n * @param {string} [opts.authKey=\"\"] See {@link RethinkDBAdapter#authKey}.\n * @param {number} [opts.bufferSize=10] See {@link RethinkDBAdapter#bufferSize}.\n * @param {string} [opts.db=\"test\"] Default database.\n * @param {boolean} [opts.debug=false] See {@link Adapter#debug}.\n * @param {Object} [opts.deleteOpts={}] See {@link RethinkDBAdapter#deleteOpts}.\n * @param {string} [opts.host=\"localhost\"] See {@link RethinkDBAdapter#host}.\n * @param {Object} [opts.insertOpts={}] See {@link RethinkDBAdapter#insertOpts}.\n * @param {number} [opts.max=50] See {@link RethinkDBAdapter#max}.\n * @param {number} [opts.min=10] See {@link RethinkDBAdapter#min}.\n * @param {Object} [opts.operators] See {@link RethinkDBAdapter#operators}.\n * @param {number} [opts.port=28015] See {@link RethinkDBAdapter#port}.\n * @param {boolean} [opts.raw=false] See {@link Adapter#raw}.\n * @param {Object} [opts.runOpts={}] See {@link RethinkDBAdapter#runOpts}.\n * @param {Object} [opts.updateOpts={}] See {@link RethinkDBAdapter#updateOpts}.\n */\nexport function RethinkDBAdapter (opts) {\n const self = this\n utils.classCallCheck(self, RethinkDBAdapter)\n opts || (opts = {})\n utils.fillIn(opts, DEFAULTS)\n Adapter.call(self, opts)\n\n /**\n * Default options to pass to r#insert.\n *\n * @name RethinkDBAdapter#insertOpts\n * @type {Object}\n * @default {}\n */\n self.insertOpts || (self.insertOpts = {})\n utils.fillIn(self.insertOpts, INSERT_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#update.\n *\n * @name RethinkDBAdapter#updateOpts\n * @type {Object}\n * @default {}\n */\n self.updateOpts || (self.updateOpts = {})\n utils.fillIn(self.updateOpts, UPDATE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#delete.\n *\n * @name RethinkDBAdapter#deleteOpts\n * @type {Object}\n * @default {}\n */\n self.deleteOpts || (self.deleteOpts = {})\n utils.fillIn(self.deleteOpts, DELETE_OPTS_DEFAULTS)\n\n /**\n * Default options to pass to r#run.\n *\n * @name RethinkDBAdapter#runOpts\n * @type {Object}\n * @default {}\n */\n self.runOpts || (self.runOpts = {})\n utils.fillIn(self.runOpts, RUN_OPTS_DEFAULTS)\n\n /**\n * Override the default predicate functions for specified operators.\n *\n * @name RethinkDBAdapter#operators\n * @type {Object}\n * @default {}\n */\n self.operators || (self.operators = {})\n\n utils.fillIn(self.operators, OPERATORS)\n\n /**\n * The rethinkdbdash instance used by this adapter. Use this directly when you\n * need to write custom queries.\n *\n * @name RethinkDBAdapter#r\n * @type {Object}\n */\n self.r = rethinkdbdash(opts)\n self.databases = {}\n self.tables = {}\n self.indices = {}\n}\n\n// Setup prototype inheritance from Adapter\nRethinkDBAdapter.prototype = Object.create(Adapter.prototype, {\n constructor: {\n value: RethinkDBAdapter,\n enumerable: false,\n writable: true,\n configurable: true\n }\n})\n\nObject.defineProperty(RethinkDBAdapter, '__super__', {\n configurable: true,\n value: Adapter\n})\n\n/**\n * Alternative to ES6 class syntax for extending `RethinkDBAdapter`.\n *\n * @example Using the ES2015 class syntax.\n * class MyRethinkDBAdapter extends RethinkDBAdapter {...}\n * const adapter = new MyRethinkDBAdapter()\n *\n * @example Using {@link RethinkDBAdapter.extend}.\n * var instanceProps = {...}\n * var classProps = {...}\n *\n * var MyRethinkDBAdapter = RethinkDBAdapter.extend(instanceProps, classProps)\n * var adapter = new MyRethinkDBAdapter()\n *\n * @name RethinkDBAdapter.extend\n * @method\n * @param {Object} [instanceProps] Properties that will be added to the\n * prototype of the Subclass.\n * @param {Object} [classProps] Properties that will be added as static\n * properties to the Subclass itself.\n * @return {Constructor} Subclass of `RethinkDBAdapter`.\n */\nRethinkDBAdapter.extend = utils.extend\n\nutils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, {\n _handleErrors (cursor) {\n if (cursor && cursor.errors > 0) {\n if (cursor.first_error) {\n throw new Error(cursor.first_error)\n }\n throw new Error('Unknown RethinkDB Error')\n }\n },\n\n _count (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .count()\n .run(self.getOpt('runOpts', opts)).then(function (count) {\n return [count, {}]\n })\n },\n\n _create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .insert(props, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n let record\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n }\n return [record, cursor]\n })\n },\n\n _createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .insert(props, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n let records = []\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes) {\n records = cursor.changes.map(function (change) {\n return change.new_val\n })\n }\n return [records, cursor]\n })\n },\n\n _destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.selectTable(mapper, opts)\n .get(id)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n return [undefined, cursor]\n })\n },\n\n _destroyAll (mapper, query, opts) {\n const self = this\n query || (query = {})\n opts || (opts = {})\n\n return self\n .filterSequence(self.selectTable(mapper, opts), query)\n .delete(self.getOpt('deleteOpts', opts))\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n self._handleErrors(cursor)\n return [undefined, cursor]\n })\n },\n\n _find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.selectTable(mapper, opts)\n .get(id)\n .run(self.getOpt('runOpts', opts)).then(function (record) {\n return [record, {}]\n })\n },\n\n _findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .run(self.getOpt('runOpts', opts)).then(function (records) {\n return [records, {}]\n })\n },\n\n _sum (mapper, field, query, opts) {\n const self = this\n if (!utils.isString(field)) {\n throw new Error('field must be a string!')\n }\n opts || (opts = {})\n query || (query = {})\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .sum(field)\n .run(self.getOpt('runOpts', opts)).then(function (sum) {\n return [sum, {}]\n })\n },\n\n _update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n\n return self.selectTable(mapper, opts)\n .get(id)\n .update(withoutRelations(mapper, props), updateOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n let record\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length && cursor.changes[0].new_val) {\n record = cursor.changes[0].new_val\n } else {\n throw new Error('Not Found')\n }\n return [record, cursor]\n })\n },\n\n _updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n\n const updateOpts = self.getOpt('updateOpts', opts)\n updateOpts.returnChanges = true\n\n return self.filterSequence(self.selectTable(mapper, opts), query)\n .update(withoutRelations(mapper, props), updateOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n let records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n return [records, cursor]\n })\n },\n\n _updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n\n const insertOpts = self.getOpt('insertOpts', opts)\n insertOpts.returnChanges = true\n insertOpts.conflict = 'update'\n\n return self.selectTable(mapper, opts)\n .insert(records, insertOpts)\n .run(self.getOpt('runOpts', opts)).then(function (cursor) {\n records = []\n self._handleErrors(cursor)\n if (cursor && cursor.changes && cursor.changes.length) {\n records = cursor.changes.map(function (change) { return change.new_val })\n }\n return [records, cursor]\n })\n },\n\n selectDb (opts) {\n return this.r.db(utils.isUndefined(opts.db) ? this.db : opts.db)\n },\n\n selectTable (mapper, opts) {\n return this.selectDb(opts).table(mapper.table || underscore(mapper.name))\n },\n\n /**\n * Apply the specified selection query to the provided RQL sequence.\n *\n * @name RethinkDBAdapter#filterSequence\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n */\n filterSequence (sequence, query, opts) {\n const self = this\n const r = self.r\n\n query = utils.plainCopy(query || {})\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n query.where || (query.where = {})\n query.orderBy || (query.orderBy = query.sort)\n query.orderBy || (query.orderBy = [])\n query.skip || (query.skip = query.offset)\n\n // Transform non-keyword properties to \"where\" clause configuration\n utils.forOwn(query, function (config, keyword) {\n if (reserved.indexOf(keyword) === -1) {\n if (utils.isObject(config)) {\n query.where[keyword] = config\n } else {\n query.where[keyword] = {\n '==': config\n }\n }\n delete query[keyword]\n }\n })\n\n let rql = sequence\n\n // Filter\n if (Object.keys(query.where).length !== 0) {\n // Filter sequence using filter function\n rql = rql.filter(function (row) {\n let subQuery\n // Apply filter for each field\n utils.forOwn(query.where, function (criteria, field) {\n if (!utils.isObject(criteria)) {\n criteria = { '==': criteria }\n }\n // Apply filter for each operator\n utils.forOwn(criteria, function (value, operator) {\n let isOr = false\n if (operator && operator[0] === '|') {\n operator = operator.substr(1)\n isOr = true\n }\n let predicateFn = self.getOperator(operator, opts)\n if (predicateFn) {\n const predicateResult = predicateFn(r, row, field, value)\n if (isOr) {\n subQuery = subQuery ? subQuery.or(predicateResult) : predicateResult\n } else {\n subQuery = subQuery ? subQuery.and(predicateResult) : predicateResult\n }\n } else {\n throw new Error(`Operator ${operator} not supported!`)\n }\n })\n })\n return subQuery || true\n })\n }\n\n // Sort\n if (query.orderBy) {\n if (utils.isString(query.orderBy)) {\n query.orderBy = [\n [query.orderBy, 'asc']\n ]\n }\n for (var i = 0; i < query.orderBy.length; i++) {\n if (utils.isString(query.orderBy[i])) {\n query.orderBy[i] = [query.orderBy[i], 'asc']\n }\n rql = (query.orderBy[i][1] || '').toUpperCase() === 'DESC' ? rql.orderBy(r.desc(query.orderBy[i][0])) : rql.orderBy(query.orderBy[i][0])\n }\n }\n\n // Offset\n if (query.skip) {\n rql = rql.skip(+query.skip)\n }\n\n // Limit\n if (query.limit) {\n rql = rql.limit(+query.limit)\n }\n\n return rql\n },\n\n waitForDb (opts) {\n const self = this\n opts || (opts = {})\n const db = utils.isUndefined(opts.db) ? self.db : opts.db\n if (!self.databases[db]) {\n self.databases[db] = self.r.branch(\n self.r.dbList().contains(db),\n true,\n self.r.dbCreate(db)\n ).run()\n }\n return self.databases[db]\n },\n\n waitForTable (mapper, options) {\n const table = utils.isString(mapper) ? mapper : (mapper.table || underscore(mapper.name))\n options = options || {}\n let db = utils.isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => {\n this.tables[db] = this.tables[db] || {}\n if (!this.tables[db][table]) {\n this.tables[db][table] = this.r.branch(this.r.db(db).tableList().contains(table), true, this.r.db(db).tableCreate(table)).run()\n }\n return this.tables[db][table]\n })\n },\n\n waitForIndex (table, index, options) {\n options = options || {}\n let db = utils.isUndefined(options.db) ? this.db : options.db\n return this.waitForDb(options).then(() => this.waitForTable(table, options)).then(() => {\n this.indices[db] = this.indices[db] || {}\n this.indices[db][table] = this.indices[db][table] || {}\n if (!this.tables[db][table][index]) {\n this.tables[db][table][index] = this.r.branch(this.r.db(db).table(table).indexList().contains(index), true, this.r.db(db).table(table).indexCreate(index)).run().then(() => {\n return this.r.db(db).table(table).indexWait(index).run()\n })\n }\n return this.tables[db][table][index]\n })\n },\n\n /**\n * Return the number of records that match the selection query.\n *\n * @name RethinkDBAdapter#count\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n count (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.count.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Create a new record.\n *\n * @name RethinkDBAdapter#create\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The record to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n create (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.create.call(self, mapper, props, opts)\n })\n },\n\n /**\n * Create multiple records in a single batch.\n *\n * @name RethinkDBAdapter#createMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The records to be created.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n createMany (mapper, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.createMany.call(self, mapper, props, opts)\n })\n },\n\n /**\n * Destroy the record with the given primary key.\n *\n * @name RethinkDBAdapter#destroy\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to destroy.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroy (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.destroy.call(self, mapper, id, opts)\n })\n },\n\n /**\n * Destroy the records that match the selection query.\n *\n * @name RethinkDBAdapter#destroyAll\n * @method\n * @param {Object} mapper the mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.deleteOpts] Options to pass to r#delete.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n destroyAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.destroyAll.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Retrieve the record with the given primary key.\n *\n * @name RethinkDBAdapter#find\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id Primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n find (mapper, id, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n return __super__.find.call(self, mapper, id, opts)\n })\n },\n\n /**\n * Retrieve the records that match the selection query.\n *\n * @name RethinkDBAdapter#findAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {string[]} [opts.with=[]] Relations to eager load.\n * @return {Promise}\n */\n findAll (mapper, query, opts) {\n const self = this\n opts || (opts = {})\n opts.with || (opts.with = [])\n query || (query = {})\n\n const relationList = mapper.relationList || []\n let tasks = [self.waitForTable(mapper, opts)]\n\n relationList.forEach(function (def) {\n const relationName = def.relation\n const relationDef = def.getRelation()\n if (!opts.with || opts.with.indexOf(relationName) === -1) {\n return\n }\n if (def.foreignKey && def.type !== 'belongsTo') {\n if (def.type === 'belongsTo') {\n tasks.push(self.waitForIndex(mapper.table || underscore(mapper.name), def.foreignKey, opts))\n } else {\n tasks.push(self.waitForIndex(relationDef.table || underscore(relationDef.name), def.foreignKey, opts))\n }\n }\n })\n return Promise.all(tasks).then(function () {\n return __super__.findAll.call(self, mapper, query, opts)\n })\n },\n\n /**\n * Resolve the predicate function for the specified operator based on the\n * given options and this adapter's settings.\n *\n * @name RethinkDBAdapter#getOperator\n * @method\n * @param {string} operator The name of the operator.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @return {*} The predicate function for the specified operator.\n */\n getOperator (operator, opts) {\n opts || (opts = {})\n opts.operators || (opts.operators = {})\n let ownOps = this.operators || {}\n return utils.isUndefined(opts.operators[operator]) ? ownOps[operator] : opts.operators[operator]\n },\n\n /**\n * Return the sum of the specified field of records that match the selection\n * query.\n *\n * @name RethinkDBAdapter#sum\n * @method\n * @param {Object} mapper The mapper.\n * @param {string} field The field to sum.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n sum (mapper, field, query, opts) {\n const self = this\n opts || (opts = {})\n query || (query = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.sum.call(self, mapper, field, query, opts)\n })\n },\n\n /**\n * Apply the given update to the record with the specified primary key.\n *\n * @name RethinkDBAdapter#update\n * @method\n * @param {Object} mapper The mapper.\n * @param {(string|number)} id The primary key of the record to be updated.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n update (mapper, id, props, opts) {\n const self = this\n props || (props = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.update.call(self, mapper, id, props, opts)\n })\n },\n\n /**\n * Apply the given update to all records that match the selection query.\n *\n * @name RethinkDBAdapter#updateAll\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object} props The update to apply to the selected records.\n * @param {Object} [query] Selection query.\n * @param {Object} [query.where] Filtering criteria.\n * @param {string|Array} [query.orderBy] Sorting criteria.\n * @param {string|Array} [query.sort] Same as `query.sort`.\n * @param {number} [query.limit] Limit results.\n * @param {number} [query.skip] Offset results.\n * @param {number} [query.offset] Same as `query.skip`.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.operators] Override the default predicate functions\n * for specified operators.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @param {Object} [opts.updateOpts] Options to pass to r#update.\n * @return {Promise}\n */\n updateAll (mapper, props, query, opts) {\n const self = this\n props || (props = {})\n query || (query = {})\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.updateAll.call(self, mapper, props, query, opts)\n })\n },\n\n /**\n * Update the given records in a single batch.\n *\n * @name RethinkDBAdapter#updateMany\n * @method\n * @param {Object} mapper The mapper.\n * @param {Object[]} records The records to update.\n * @param {Object} [opts] Configuration options.\n * @param {Object} [opts.insertOpts] Options to pass to r#insert.\n * @param {boolean} [opts.raw=false] Whether to return a more detailed\n * response object.\n * @param {Object} [opts.runOpts] Options to pass to r#run.\n * @return {Promise}\n */\n updateMany (mapper, records, opts) {\n const self = this\n records || (records = [])\n opts || (opts = {})\n\n return self.waitForTable(mapper, opts).then(function () {\n return __super__.updateMany.call(self, mapper, records, opts)\n })\n }\n})\n\n/**\n * Details of the current version of the `js-data-rethinkdb` module.\n *\n * @name module:js-data-rethinkdb.version\n * @type {Object}\n * @property {string} version.full The full semver value.\n * @property {number} version.major The major version number.\n * @property {number} version.minor The minor version number.\n * @property {number} version.patch The patch version number.\n * @property {(string|boolean)} version.alpha The alpha version value,\n * otherwise `false` if the current version is not alpha.\n * @property {(string|boolean)} version.beta The beta version value,\n * otherwise `false` if the current version is not beta.\n */\nexport const version = '<%= version %>'\n\nexport default RethinkDBAdapter\n"],"names":["Adapter","utils","withoutRelations","reserved"],"mappings":"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"} \ No newline at end of file diff --git a/mocha.start.js b/mocha.start.js index 25a2d45..4c6be41 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -6,9 +6,12 @@ require('babel-polyfill') var JSData = require('js-data') var JSDataAdapterTests = require('js-data-adapter-tests') -var RethinkDBAdapter = require('./') +var JSDataRethinkDB = require('./') +var version = JSDataRethinkDB.version +var OPERATORS = JSDataRethinkDB.OPERATORS +var RethinkDBAdapter = JSDataRethinkDB.RethinkDBAdapter -global.assert = JSDataAdapterTests.assert +var assert = global.assert = JSDataAdapterTests.assert global.sinon = JSDataAdapterTests.sinon JSDataAdapterTests.init({ @@ -28,3 +31,10 @@ JSDataAdapterTests.init({ }) require('./test/handleErrors.test') + +describe('exports', function () { + assert(OPERATORS) + assert(OPERATORS['==']) + assert(version) + assert(version.full) +}) diff --git a/package.json b/package.json index f7a5db5..944aa93 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-rethinkdb", "description": "RethinkDB adapter for js-data.", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "homepage": "https://github.com/js-data/js-data-rethinkdb", "repository": { "type": "git", @@ -10,6 +10,12 @@ "author": "js-data-rethinkdb project authors", "license": "MIT", "main": "./dist/js-data-rethinkdb.js", + "files": [ + "dist/", + "src/", + "AUTHORS", + "CONTRIBUTORS" + ], "keywords": [ "data", "datastore", @@ -30,45 +36,38 @@ "after", "beforeEach", "afterEach" - ] + ], + "ignore": ["dist/"] }, "scripts": { - "lint": "repo-tools lint src/index.js mocha.start.js test/**/*.js scripts/**.js rollup.config.js", + "lint": "repo-tools lint \"**/*.js\"", "bundle": "rollup -c rollup.config.js -f cjs -o dist/js-data-rethinkdb.js -m dist/js-data-rethinkdb.js.map src/index.js && repo-tools write-version dist/js-data-rethinkdb.js", - "doc": "jsdoc -c conf.json src node_modules/js-data-adapter/src && node scripts/cleanup.js", + "doc": "jsdoc -c conf.json src node_modules/js-data-adapter/src", "watch": "watch \"npm run bundle\" src/", "build": "npm run lint && npm run bundle", "mocha": "mocha -t 30000 -R dot -r source-map-support/register mocha.start.js", "cover": "istanbul cover --hook-run-in-context node_modules/mocha/bin/_mocha -- -t 30000 -R dot -r source-map-support/register mocha.start.js", "test": "npm run build && npm run cover", - "repo-tools": "repo-tools updates && repo-tools changelog && repo-tools authors", - "release": "npm test && npm run doc && npm run repo-tools", + "release": "npm test && npm run doc && repo-tools updates && repo-tools changelog && repo-tools authors", "ci": "npm run test && cat coverage/lcov.info | codecov" }, "dependencies": { - "js-data-adapter": "~0.3.0", + "js-data-adapter": "~0.6.0", "mout": "1.0.0" }, "peerDependencies": { - "js-data": "^3.0.0-beta.1", + "js-data": "^3.0.0-beta.3", "rethinkdbdash": ">=1.15.0" }, "devDependencies": { - "babel-core": "6.7.6", "babel-polyfill": "6.7.4", "babel-preset-es2015-rollup": "1.1.1", - "chai": "3.5.0", - "codecov": "1.0.1", - "ink-docstrap": "1.1.4", "istanbul": "0.4.3", "js-data-adapter-tests": "^2.0.0-alpha.15", - "js-data-repo-tools": "0.3.0", - "jsdoc": "3.4.0", - "mocha": "2.4.5", - "rollup": "0.25.8", + "js-data-repo-tools": "0.5.0", + "rollup": "0.26.1", "rollup-plugin-babel": "2.4.0", - "sinon": "1.17.3", "source-map-support": "0.4.0", - "watch": "0.17.1" + "watch": "0.18.0" } } diff --git a/scripts/cleanup.js b/scripts/cleanup.js deleted file mode 100644 index 0c02a66..0000000 --- a/scripts/cleanup.js +++ /dev/null @@ -1,25 +0,0 @@ -var fs = require('fs') - -var pkg = require('../package.json') - -var path = './doc/js-data-rethinkdb/' + pkg.version + '/styles/' - -var files = fs.readdirSync(path) -files.forEach(function (file) { - if (file.indexOf('site') === 0) { - if (file.indexOf('lumen') === -1 && file.indexOf('dibs') === -1) { - fs.unlinkSync(path + file) - } - } -}) - -path = './doc/js-data-rethinkdb/' + pkg.version - -files = fs.readdirSync(path) -files.forEach(function (file) { - if (file.indexOf('.html') === file.length - 5) { - var content = fs.readFileSync(path + '/' + file, { encoding: 'utf8' }) - content = content.replace(/\/home\/ubuntu\/workspace\//gi, '') - fs.writeFileSync(path + '/' + file, content, { encoding: 'utf8' }) - } -}) diff --git a/src/index.js b/src/index.js index 3355cec..441126b 100644 --- a/src/index.js +++ b/src/index.js @@ -1,15 +1,12 @@ import {utils} from 'js-data' -import Adapter from 'js-data-adapter' import { - reserved + Adapter, + reserved, + withoutRelations } from 'js-data-adapter' import rethinkdbdash from 'rethinkdbdash' import underscore from 'mout/string/underscore' -const withoutRelations = function (mapper, props) { - return utils.omit(props, mapper.relationFields || []) -} - const __super__ = Adapter.prototype const DEFAULTS = { @@ -92,7 +89,7 @@ const notEqual = function (r, row, field, value) { /** * Default predicate functions for the filtering operators. * - * @name RethinkDBAdapter.OPERATORS + * @name module:js-data-rethinkdb.OPERATORS * @property {Function} == Equality operator. * @property {Function} != Inequality operator. * @property {Function} > "Greater than" operator. @@ -112,7 +109,7 @@ const notEqual = function (r, row, field, value) { * @property {Function} notContains Operator to test whether an array does NOT * contain the provided value. */ -const OPERATORS = { +export const OPERATORS = { '==': equal, '===': equal, '!=': notEqual, @@ -149,6 +146,8 @@ const OPERATORS = { } } +Object.freeze(OPERATORS) + /** * RethinkDBAdapter class. * @@ -171,20 +170,23 @@ const OPERATORS = { * * @class RethinkDBAdapter * @extends Adapter - * @param {Object} [opts] Configuration opts. - * @param {string} [opts.authKey=""] RethinkDB authorization key. - * @param {number} [opts.bufferSize=10] Buffer size for connection pool. + * @param {Object} [opts] Configuration options. + * @param {string} [opts.authKey=""] See {@link RethinkDBAdapter#authKey}. + * @param {number} [opts.bufferSize=10] See {@link RethinkDBAdapter#bufferSize}. * @param {string} [opts.db="test"] Default database. - * @param {boolean} [opts.debug=false] Whether to log debugging information. - * @param {string} [opts.host="localhost"] RethinkDB host. - * @param {number} [opts.max=50] Maximum connections in pool. - * @param {number} [opts.min=10] Minimum connections in pool. - * @param {Object} [opts.operators] Override the default predicate functions for - * specified operators. - * @param {number} [opts.port=28015] RethinkDB port. - * @param {boolean} [opts.raw=false] Whether to return a more detailed response object. + * @param {boolean} [opts.debug=false] See {@link Adapter#debug}. + * @param {Object} [opts.deleteOpts={}] See {@link RethinkDBAdapter#deleteOpts}. + * @param {string} [opts.host="localhost"] See {@link RethinkDBAdapter#host}. + * @param {Object} [opts.insertOpts={}] See {@link RethinkDBAdapter#insertOpts}. + * @param {number} [opts.max=50] See {@link RethinkDBAdapter#max}. + * @param {number} [opts.min=10] See {@link RethinkDBAdapter#min}. + * @param {Object} [opts.operators] See {@link RethinkDBAdapter#operators}. + * @param {number} [opts.port=28015] See {@link RethinkDBAdapter#port}. + * @param {boolean} [opts.raw=false] See {@link Adapter#raw}. + * @param {Object} [opts.runOpts={}] See {@link RethinkDBAdapter#runOpts}. + * @param {Object} [opts.updateOpts={}] See {@link RethinkDBAdapter#updateOpts}. */ -function RethinkDBAdapter (opts) { +export function RethinkDBAdapter (opts) { const self = this utils.classCallCheck(self, RethinkDBAdapter) opts || (opts = {}) @@ -240,6 +242,8 @@ function RethinkDBAdapter (opts) { */ self.operators || (self.operators = {}) + utils.fillIn(self.operators, OPERATORS) + /** * The rethinkdbdash instance used by this adapter. Use this directly when you * need to write custom queries. @@ -271,34 +275,27 @@ Object.defineProperty(RethinkDBAdapter, '__super__', { /** * Alternative to ES6 class syntax for extending `RethinkDBAdapter`. * + * @example Using the ES2015 class syntax. + * class MyRethinkDBAdapter extends RethinkDBAdapter {...} + * const adapter = new MyRethinkDBAdapter() + * + * @example Using {@link RethinkDBAdapter.extend}. + * var instanceProps = {...} + * var classProps = {...} + * + * var MyRethinkDBAdapter = RethinkDBAdapter.extend(instanceProps, classProps) + * var adapter = new MyRethinkDBAdapter() + * * @name RethinkDBAdapter.extend * @method * @param {Object} [instanceProps] Properties that will be added to the - * prototype of the RethinkDBAdapter. + * prototype of the Subclass. * @param {Object} [classProps] Properties that will be added as static - * properties to the RethinkDBAdapter itself. - * @return {Object} RethinkDBAdapter of `RethinkDBAdapter`. + * properties to the Subclass itself. + * @return {Constructor} Subclass of `RethinkDBAdapter`. */ RethinkDBAdapter.extend = utils.extend -/** - * Details of the current version of the `js-data-rethinkdb` module. - * - * @name RethinkDBAdapter.version - * @type {Object} - * @property {string} full The full semver value. - * @property {number} major The major version number. - * @property {number} minor The minor version number. - * @property {number} patch The patch version number. - * @property {(string|boolean)} alpha The alpha version value, otherwise `false` - * if the current version is not alpha. - * @property {(string|boolean)} beta The beta version value, otherwise `false` - * if the current version is not beta. - */ -RethinkDBAdapter.version = '<%= version %>' - -RethinkDBAdapter.OPERATORS = OPERATORS - utils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, { _handleErrors (cursor) { if (cursor && cursor.errors > 0) { @@ -890,7 +887,7 @@ utils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, { opts || (opts = {}) opts.operators || (opts.operators = {}) let ownOps = this.operators || {} - return utils.isUndefined(opts.operators[operator]) ? ownOps[operator] || OPERATORS[operator] : opts.operators[operator] + return utils.isUndefined(opts.operators[operator]) ? ownOps[operator] : opts.operators[operator] }, /** @@ -1010,4 +1007,20 @@ utils.addHiddenPropsToTarget(RethinkDBAdapter.prototype, { } }) -module.exports = RethinkDBAdapter +/** + * Details of the current version of the `js-data-rethinkdb` module. + * + * @name module:js-data-rethinkdb.version + * @type {Object} + * @property {string} version.full The full semver value. + * @property {number} version.major The major version number. + * @property {number} version.minor The minor version number. + * @property {number} version.patch The patch version number. + * @property {(string|boolean)} version.alpha The alpha version value, + * otherwise `false` if the current version is not alpha. + * @property {(string|boolean)} version.beta The beta version value, + * otherwise `false` if the current version is not beta. + */ +export const version = '<%= version %>' + +export default RethinkDBAdapter