Source: filter/filter.js

goog.provide('M.filter');

/**
 * @namespace M.filter
 */
(function () {
  /**
   * This function joins the filters so that all the filters are fulfilled
   *
   * @function
   * @param {Array<M.Fiter>} filters - Filters to joins
   * @return {M.Filter} Filters joins
   * @api stable
   */
  M.filter.AND = function (filters) {
    let cqlFilter = '';
    let numFilters = filters.length;
    filters.forEach(function (filter, index) {
      cqlFilter += `(${filter.toCQL()})`;
      if (index < (numFilters - 1)) {
        cqlFilter += ' AND ';
      }
    });
    return new M.filter.Function(function (feature) {
      return filters.every(function (filter) {
        return filter.getFunctionFilter()(feature);
      });
    }, {
      cqlFilter: cqlFilter
    });
  };

  /**
   * This function joins the filters so that at least one of the filters
   *
   * @function
   * @param {Array<M.Fiter>} filters - Filters to joins
   * @return {M.Filter} Filters joins
   * @api stable
   */
  M.filter.OR = function (filters) {
    let cqlFilter = '';
    let numFilters = filters.length;
    filters.forEach(function (filter, index) {
      cqlFilter += `(${filter.toCQL()})`;
      if (index < (numFilters - 1)) {
        cqlFilter += ' OR ';
      }
    });
    return new M.filter.Function(function (feature) {
      return filters.some(function (filter) {
        return filter.getFunctionFilter()(feature);
      });
    }, {
      cqlFilter: cqlFilter
    });
  };

  /**
   * This function run the opposite of the filter
   *
   * @function
   * @param {M.Fiter} filters - Filters to joins
   * @return {M.Filter} opposite filter
   * @api stable
   */
  M.filter.NOT = function (filter) {
    return new M.filter.Function(function (feature) {
      return !filter.getFunctionFilter()(feature);
    }, {
      cqlFilter: `NOT ${filter.toCQL()}`
    });
  };

  /**
   * This function compares the value of the indicated attribute with the indicated value.
   *
   * @function
   * @param {string} nameAtt - Name Attribute
   * @param {string|number} value - Value to compare
   * @return {M.Filter} Filter - Filter to compare the value of an attribute
   * @api stable
   */
  M.filter.EQUAL = function (nameAtt, value) {
    return new M.filter.Function(function (feature) {
      return Object.is(feature.getAttribute(nameAtt), value);
    }, {
      cqlFilter: `${nameAtt}='${value}'`
    });
  };

  /**
   * This function return the value of the indicated attribute of the feature if it satisfies the condition of the regular expression
   *
   * @function
   * @param {string} nameAtt - Name Attribute
   * @param {string|number} value - Regular expression
   * @return {M.Filter} Filter - Filter
   * @api stable
   */
  M.filter.LIKE = function (nameAtt, value) {
    return new M.filter.Function(function (feature) {
      return (feature.getAttribute(nameAtt)).toString().match(new RegExp(value));
    }, {
      cqlFilter: `${nameAtt} LIKE '%${value}%'`
    });
  };

  /**
   * This function returns if the value of the indicated attribute of the feature is less than the indicated value.
   * @function
   * @param {string} nameAtt - name Attribute
   * @param {string|number} value - value to compare
   * @return {M.Filter} Filter - Filter
   * @api stable
   */
  M.filter.LT = function (nameAtt, value) {
    return new M.filter.Function(function (feature) {
      return feature.getAttribute(nameAtt) != null && feature.getAttribute(nameAtt) < value;
    }, {
      cqlFilter: `${nameAtt} < '${value}'`
    });
  };

  /**
   * This function returns if the value of the indicated attribute of the feature is greater than the indicated value.
   * @function
   * @param {string} nameAtt - name Attribute
   * @param {string|number} value - value to compare
   * @return {M.Filter} Filter - Filter
   * @api stable
   */
  M.filter.GT = function (nameAtt, value) {
    return new M.filter.Function(function (feature) {
      return feature.getAttribute(nameAtt) != null && feature.getAttribute(nameAtt) > value;
    }, {
      cqlFilter: `${nameAtt} > '${value}'`
    });
  };

  /**
   * This function returns if the value of the indicated attribute of the feature is less than or equal to the indicated value.
   * @function
   * @param {string} nameAtt - name Attribute
   * @param {string|number} value - value to compare
   * @return {M.Filter} Filter - Filter
   * @api stable
   */
  M.filter.LTE = function (nameAtt, value) {
    return new M.filter.Function(function (feature) {
      return feature.getAttribute(nameAtt) != null && feature.getAttribute(nameAtt) <= value;
    }, {
      cqlFilter: `${nameAtt} <= '${value}'`
    });
  };

  /**
   * This function returns if the value of the indicated attribute of the feature is greater than or equal to the indicated value.
   * @function
   * @param {string} nameAtt - name Attribute
   * @param {string|number} value - value to compare
   * @return {M.Filter} Filter - Filter
   * @api stable
   */
  M.filter.GTE = function (nameAtt, value) {
    return new M.filter.Function(function (feature) {
      return feature.getAttribute(nameAtt) != null && feature.getAttribute(nameAtt) >= value;
    }, {
      cqlFilter: `${nameAtt} >= '${value}'`
    });
  };

})();