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
						
					
					
				'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;
 | 
						|
};
 |