From f1e33a927fba7d02b9944b01a8c2411cde4b445b Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Thu, 17 Mar 2016 21:59:46 -0700 Subject: [PATCH] 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) + }) }, /**