Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
136 changes: 81 additions & 55 deletions lib/migrate.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand All @@ -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
*
Expand Down Expand Up @@ -212,6 +223,7 @@ function mixinMigrate(CouchDB) {
var modelViewIndex = {};
modelViewIndex[modelView] = defaultOrder;
fields.push(modelViewIndex);
return fields;
};

/**
Expand Down Expand Up @@ -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) {
Expand All @@ -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;
};

/**
Expand Down