From 0e24a81991a554d34fcfcc183b5730ddf6150d87 Mon Sep 17 00:00:00 2001 From: jannyHou Date: Mon, 11 Nov 2019 11:58:04 -0500 Subject: [PATCH] refactor: migrate functions To support partitioned index in cloudant connector, some inner functions are refactored into private functions. Details could be found in the description of PR#69 --- lib/migrate.js | 136 +++++++++++++++++++++++++++++-------------------- 1 file changed, 81 insertions(+), 55 deletions(-) diff --git a/lib/migrate.js b/lib/migrate.js index ca0178e..cb8aa1b 100644 --- a/lib/migrate.js +++ b/lib/migrate.js @@ -5,10 +5,11 @@ 'use strict'; -var async = require('async'); -var g = require('strong-globalize')(); -var util = require('util'); -var _ = require('lodash'); +const async = require('async'); +const g = require('strong-globalize')(); +const util = require('util'); +const _ = require('lodash'); +const inspect = util.inspect; module.exports = mixinMigrate; @@ -112,24 +113,10 @@ function mixinMigrate(CouchDB) { async.eachOf(indexes, create, cb); // {indexName: "foo"} or {indexName: [{"foo": "asc"}, {"bar": "asc"}]} function create(value, key, cb) { - createIndex(key, value, cb); + self._createIndex(mo, model, key, value, cb); }; }; - function createIndex(name, fields, cb) { - fields = self.coerceIndexFields(fields); - self.addModelViewToIndex(mo.modelView, fields); - // naming convertion: '_design/LBModel__Foo__LBIndex__foo_index', - // here the driver api takes in the name without prefix '_design/' - var config = { - ddocName: self.getIndexModelPrefix(mo) + '__' + model + '__' + - self.getIndexPropertyPrefix(mo) + '__' + name, - indexName: name, - fields: fields, - }; - self.createIndex(config.ddocName, config.indexName, config.fields, cb); - } - function removeIndexes(indexes, cb) { if (typeof indexes !== 'object') return cb(new Error('indexes to drop must be an object!')); async.eachOf(indexes, removeIndex, cb); @@ -142,7 +129,31 @@ function mixinMigrate(CouchDB) { }; /** - * Add an index for modelView propery to indexes got from modelDef + * Used in function `migrateOrUpdateIndex`. + * Create index with index fields. + * @param {Object} mo The model configuration. + * @param {String} model The model name. + * @param {String} name The index name. + * @param {Object} indexObj The index object e.g. [{"foo": "asc"}, {"bar": "asc"}] + * @param {Function} cb + */ + CouchDB.prototype._createIndex = function(mo, model, name, fields, cb) { + const self = this; + fields = self.coerceIndexFields(fields); + self.addModelViewToIndex(mo.modelView, fields); + // naming convertion: '_design/LBModel__Foo__LBIndex__foo_index', + // here the driver api takes in the name without prefix '_design/' + var config = { + ddocName: self.getIndexModelPrefix(mo) + '__' + model + '__' + + self.getIndexPropertyPrefix(mo) + '__' + name, + indexName: name, + fields: fields, + }; + self.createIndex(config.ddocName, config.indexName, config.fields, cb); + }; + + /** + * Add an index for modelView property to indexes got from modelDef * @param {Object} modelObject generated by CouchDB.prototype.selectModel * @param {Object} indexes the modelDef indexes of a model * @@ -212,6 +223,7 @@ function mixinMigrate(CouchDB) { var modelViewIndex = {}; modelViewIndex[modelView] = defaultOrder; fields.push(modelViewIndex); + return fields; }; /** @@ -302,8 +314,8 @@ function mixinMigrate(CouchDB) { return newLBIndexes[index]; }); - newIndexes = _.merge(newIndexes, generateModelLevelIndexes(newModelIndexes)); - newIndexes = _.merge(newIndexes, generatePropertyLevelIndexes(newPropertyIndexes)); + newIndexes = _.merge(newIndexes, self._generateModelLevelIndexes(newModelIndexes)); + newIndexes = _.merge(newIndexes, self._generatePropertyLevelIndexes(newPropertyIndexes)); // Call `getModelIndexes` to get existing indexes. self.getModelIndexes(modelName, function(err, oldIndexes) { @@ -314,44 +326,58 @@ function mixinMigrate(CouchDB) { } else { results = self.compare(newIndexes, oldIndexes); } + debug('getModifyIndexes results: %s', inspect(results, {depth: 4})); cb(null, results); }); + }; - function generatePropertyLevelIndexes(indexes) { - var results = {}; - for (var key in indexes) { - var field = {}; - // By default the order will be `asc`, - // please create Model level index if you need `desc` - field[key.split('_index')[0]] = 'asc'; - var fields = [field]; - results[key] = fields; - }; - return results; - } + /** + * Used in function `getModifyIndexes()`. + * Generate indexes for model properties that are configured as + * `{index: true}` + * @param {Object} indexes indexes from model config, retrieved in + * `getModifyIndexes()` + */ + CouchDB.prototype._generatePropertyLevelIndexes = function(indexes) { + var results = {}; + for (var key in indexes) { + var field = {}; + // By default the order will be `asc`, + // please create Model level index if you need `desc` + field[key.split('_index')[0]] = 'asc'; + var fields = [field]; + results[key] = fields; + }; + return results; + }; - function generateModelLevelIndexes(indexes) { - var results = {}; - for (var key in indexes) { - var keys = indexes[key].keys; - if (!keys || typeof keys !== 'object') return cb(new Error( - 'the keys in your model index are not well defined! please see' + - 'https://loopback.io/doc/en/lb3/Model-definition-JSON-file.html#indexes' - )); - - var fields = []; - _.forEach(keys, function(value, key) { - var obj = {}; - var order; - if (keys[key] === 1) order = 'asc'; - else order = 'desc'; - obj[key] = order; - fields.push(obj); - }); - results[key] = fields; - } - return results; + /** + * Used in function `getModifyIndexes()`. + * Generate indexes for indexes defined in the model config. + * @param {Object} indexes indexes from model config, provided by + * `getModifyIndexes()` + */ + CouchDB.prototype._generateModelLevelIndexes = function(indexes, cb) { + var results = {}; + for (var key in indexes) { + var keys = indexes[key].keys; + if (!keys || typeof keys !== 'object') return cb(new Error( + 'the keys in your model index are not well defined! please see' + + 'https://loopback.io/doc/en/lb3/Model-definition-JSON-file.html#indexes' + )); + + var fields = []; + _.forEach(keys, function(value, key) { + var obj = {}; + var order; + if (keys[key] === 1) order = 'asc'; + else order = 'desc'; + obj[key] = order; + fields.push(obj); + }); + results[key] = fields; } + return results; }; /**