Source: lib/query/Filter.js

'use strict';

const Node = require('./Node');
const Condition = require('./Condition');
const deprecated = require('../util/deprecated');

/**
 * A Filter saves the state for a filtered query
 * @alias query.Filter<T>
 * @extends query.Node<T>
 * @implements query.Condition<T>
 */
class Filter extends Node {
  /**
   * @param {EntityManager} entityManager The owning entity manager of this query
   * @param {Class<T>} resultClass The query result class
   */
  constructor(entityManager, resultClass) {
    super(entityManager, resultClass);

    /**
     * The actual filters of this node
     * @type Object<string,*>
     * @readonly
     */
    this.filter = {};
  }

  /**
   * @inheritDoc
   */
  addFilter(field, filter, value) {
    if (field !== null) {
      if (!(Object(field) instanceof String)) {
        throw new Error('Field must be a string.');
      }

      if (filter) {
        let fieldFilter = this.filter[field];
        if (!(fieldFilter instanceof Object) || Object.getPrototypeOf(fieldFilter) !== Object.prototype) {
          fieldFilter = {};
          this.filter[field] = fieldFilter;
        }

        fieldFilter[filter] = value;
      } else {
        this.filter[field] = value;
      }
    } else {
      Object.assign(this.filter, value);
    }

    return this;
  }

  toJSON() {
    return this.filter;
  }
}

Object.assign(Filter.prototype, Condition);

deprecated(Filter.prototype, '_filter', 'filter');
deprecated(Filter.prototype, '_addFilter', 'addFilter');

module.exports = Filter;