You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					96 lines
				
				2.7 KiB
			
		
		
			
		
	
	
					96 lines
				
				2.7 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | const get = require('../get'); | ||
|  | const utils = require('../../utils'); | ||
|  | 
 | ||
|  | /** | ||
|  |  * Given a Mongoose index definition (key + options objects) and a MongoDB server | ||
|  |  * index definition, determine if the two indexes are equal. | ||
|  |  * | ||
|  |  * @param {Object} key the Mongoose index spec | ||
|  |  * @param {Object} options the Mongoose index definition's options | ||
|  |  * @param {Object} dbIndex the index in MongoDB as returned by `listIndexes()` | ||
|  |  * @api private | ||
|  |  */ | ||
|  | 
 | ||
|  | module.exports = function isIndexEqual(key, options, dbIndex) { | ||
|  |   // Special case: text indexes have a special format in the db. For example,
 | ||
|  |   // `{ name: 'text' }` becomes:
 | ||
|  |   // {
 | ||
|  |   //   v: 2,
 | ||
|  |   //   key: { _fts: 'text', _ftsx: 1 },
 | ||
|  |   //   name: 'name_text',
 | ||
|  |   //   ns: 'test.tests',
 | ||
|  |   //   background: true,
 | ||
|  |   //   weights: { name: 1 },
 | ||
|  |   //   default_language: 'english',
 | ||
|  |   //   language_override: 'language',
 | ||
|  |   //   textIndexVersion: 3
 | ||
|  |   // }
 | ||
|  |   if (dbIndex.textIndexVersion != null) { | ||
|  |     const weights = dbIndex.weights; | ||
|  |     if (Object.keys(weights).length !== Object.keys(key).length) { | ||
|  |       return false; | ||
|  |     } | ||
|  |     for (const prop of Object.keys(weights)) { | ||
|  |       if (!(prop in key)) { | ||
|  |         return false; | ||
|  |       } | ||
|  |       const weight = weights[prop]; | ||
|  |       if (weight !== get(options, 'weights.' + prop) && !(weight === 1 && get(options, 'weights.' + prop) == null)) { | ||
|  |         return false; | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     if (options['default_language'] !== dbIndex['default_language']) { | ||
|  |       return dbIndex['default_language'] === 'english' && options['default_language'] == null; | ||
|  |     } | ||
|  | 
 | ||
|  |     return true; | ||
|  |   } | ||
|  | 
 | ||
|  |   const optionKeys = [ | ||
|  |     'unique', | ||
|  |     'partialFilterExpression', | ||
|  |     'sparse', | ||
|  |     'expireAfterSeconds', | ||
|  |     'collation' | ||
|  |   ]; | ||
|  |   for (const key of optionKeys) { | ||
|  |     if (!(key in options) && !(key in dbIndex)) { | ||
|  |       continue; | ||
|  |     } | ||
|  |     if (key === 'collation') { | ||
|  |       if (options[key] == null || dbIndex[key] == null) { | ||
|  |         return options[key] == null && dbIndex[key] == null; | ||
|  |       } | ||
|  |       const definedKeys = Object.keys(options.collation); | ||
|  |       const schemaCollation = options.collation; | ||
|  |       const dbCollation = dbIndex.collation; | ||
|  |       for (const opt of definedKeys) { | ||
|  |         if (get(schemaCollation, opt) !== get(dbCollation, opt)) { | ||
|  |           return false; | ||
|  |         } | ||
|  |       } | ||
|  |     } else if (!utils.deepEqual(options[key], dbIndex[key])) { | ||
|  |       return false; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   const schemaIndexKeys = Object.keys(key); | ||
|  |   const dbIndexKeys = Object.keys(dbIndex.key); | ||
|  |   if (schemaIndexKeys.length !== dbIndexKeys.length) { | ||
|  |     return false; | ||
|  |   } | ||
|  |   for (let i = 0; i < schemaIndexKeys.length; ++i) { | ||
|  |     if (schemaIndexKeys[i] !== dbIndexKeys[i]) { | ||
|  |       return false; | ||
|  |     } | ||
|  |     if (!utils.deepEqual(key[schemaIndexKeys[i]], dbIndex.key[dbIndexKeys[i]])) { | ||
|  |       return false; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   return true; | ||
|  | }; |