Source: lib/metamodel/DbIndex.js

'use strict';

/**
 * Creates a new index instance which is needed to create an
 * database index.
 *
 * @alias metamodel.DbIndex
 */
class DbIndex {
  /**
   * An array of mappings from field to index type which are parts of this index/compound index
   * @name keys
   * @type Array<Object<string,string>>
   * @memberOf metamodel.DbIndex.prototype
   */

  /**
   * @param {string|Object<string,string>|Array<Object<string,string>>} keys The name of the field which will be used
   * for the index,
   * an object of an field and index type combination or
   * an array of objects to create an compound index
   * @param {boolean=} unique Indicates if the index will be unique
   */
  constructor(keys, unique) {
    if (Object(keys) instanceof String) {
      const key = {};
      key[keys] = DbIndex.ASC;
      this.keys = [key];
    } else if (Object(keys) instanceof Array) {
      this.keys = keys;
    } else if (keys) {
      this.keys = [keys];
    } else {
      throw new Error('The keys parameter must be an String, Object or Array.');
    }

    /** @type boolean */
    this.drop = false;
    this.unique = unique === true;
  }

  /**
   * Indicates if this index is for the given field or includes it in a compound index
   * @param {string} name The name of the field to check for
   * @return {boolean} <code>true</code> if the index contains this field
   */
  hasKey(name) {
    for (let i = 0; i < this.keys.length; i += 1) {
      if (this.keys[i][name]) {
        return true;
      }
    }
    return false;
  }

  /**
   * Indicates if this index is a compound index of multiple attributes
   * @type boolean
   * @readonly
   */
  get isCompound() {
    return this.keys.length > 1;
  }

  /**
   * Indicates if this index is an unique index
   * @type boolean
   * @readonly
   */
  get isUnique() {
    return this.unique;
  }

  /**
   * Returns a JSON representation of the Index object
   *
   * @return {json} A Json of this Index object
   */
  toJSON() {
    return {
      unique: this.unique,
      keys: this.keys,
      drop: this.drop,
    };
  }
}

Object.assign(DbIndex, /** @lends metamodel.DbIndex */ {
  /**
   * @type string
   */
  ASC: 'asc',

  /**
   * @type string
   */
  DESC: 'desc',

  /**
   * @type string
   */
  GEO: 'geo',

  /**
   * Returns DbIndex Object created from the given JSON
   * @param {json} json
   * @return {metamodel.DbIndex}
   */
  fromJSON(json) {
    return new DbIndex(json.keys, json.unique);
  },
});

module.exports = DbIndex;