| 
/* 
 | 
* Licensed to the Apache Software Foundation (ASF) under one 
 | 
* or more contributor license agreements.  See the NOTICE file 
 | 
* distributed with this work for additional information 
 | 
* regarding copyright ownership.  The ASF licenses this file 
 | 
* to you under the Apache License, Version 2.0 (the 
 | 
* "License"); you may not use this file except in compliance 
 | 
* with the License.  You may obtain a copy of the License at 
 | 
* 
 | 
*   http://www.apache.org/licenses/LICENSE-2.0 
 | 
* 
 | 
* Unless required by applicable law or agreed to in writing, 
 | 
* software distributed under the License is distributed on an 
 | 
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 | 
* KIND, either express or implied.  See the License for the 
 | 
* specific language governing permissions and limitations 
 | 
* under the License. 
 | 
*/ 
 | 
  
 | 
  
 | 
/** 
 | 
 * AUTO-GENERATED FILE. DO NOT MODIFY. 
 | 
 */ 
 | 
  
 | 
/* 
 | 
* Licensed to the Apache Software Foundation (ASF) under one 
 | 
* or more contributor license agreements.  See the NOTICE file 
 | 
* distributed with this work for additional information 
 | 
* regarding copyright ownership.  The ASF licenses this file 
 | 
* to you under the Apache License, Version 2.0 (the 
 | 
* "License"); you may not use this file except in compliance 
 | 
* with the License.  You may obtain a copy of the License at 
 | 
* 
 | 
*   http://www.apache.org/licenses/LICENSE-2.0 
 | 
* 
 | 
* Unless required by applicable law or agreed to in writing, 
 | 
* software distributed under the License is distributed on an 
 | 
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 | 
* KIND, either express or implied.  See the License for the 
 | 
* specific language governing permissions and limitations 
 | 
* under the License. 
 | 
*/ 
 | 
import { parseDate, numericToNumber } from '../../util/number.js'; 
 | 
import { createHashMap, trim, hasOwn, isString, isNumber } from 'zrender/lib/core/util.js'; 
 | 
import { throwError } from '../../util/log.js'; 
 | 
/** 
 | 
 * Convert raw the value in to inner value in List. 
 | 
 * 
 | 
 * [Performance sensitive] 
 | 
 * 
 | 
 * [Caution]: this is the key logic of user value parser. 
 | 
 * For backward compatibility, do not modify it until you have to! 
 | 
 */ 
 | 
export function parseDataValue(value, 
 | 
// For high performance, do not omit the second param. 
 | 
opt) { 
 | 
  // Performance sensitive. 
 | 
  var dimType = opt && opt.type; 
 | 
  if (dimType === 'ordinal') { 
 | 
    // If given value is a category string 
 | 
    return value; 
 | 
  } 
 | 
  if (dimType === 'time' 
 | 
  // spead up when using timestamp 
 | 
  && !isNumber(value) && value != null && value !== '-') { 
 | 
    value = +parseDate(value); 
 | 
  } 
 | 
  // dimType defaults 'number'. 
 | 
  // If dimType is not ordinal and value is null or undefined or NaN or '-', 
 | 
  // parse to NaN. 
 | 
  // number-like string (like ' 123 ') can be converted to a number. 
 | 
  // where null/undefined or other string will be converted to NaN. 
 | 
  return value == null || value === '' ? NaN 
 | 
  // If string (like '-'), using '+' parse to NaN 
 | 
  // If object, also parse to NaN 
 | 
  : Number(value); 
 | 
} 
 | 
; 
 | 
var valueParserMap = createHashMap({ 
 | 
  'number': function (val) { 
 | 
    // Do not use `numericToNumber` here. We have `numericToNumber` by default. 
 | 
    // Here the number parser can have loose rule: 
 | 
    // enable to cut suffix: "120px" => 120, "14%" => 14. 
 | 
    return parseFloat(val); 
 | 
  }, 
 | 
  'time': function (val) { 
 | 
    // return timestamp. 
 | 
    return +parseDate(val); 
 | 
  }, 
 | 
  'trim': function (val) { 
 | 
    return isString(val) ? trim(val) : val; 
 | 
  } 
 | 
}); 
 | 
export function getRawValueParser(type) { 
 | 
  return valueParserMap.get(type); 
 | 
} 
 | 
var ORDER_COMPARISON_OP_MAP = { 
 | 
  lt: function (lval, rval) { 
 | 
    return lval < rval; 
 | 
  }, 
 | 
  lte: function (lval, rval) { 
 | 
    return lval <= rval; 
 | 
  }, 
 | 
  gt: function (lval, rval) { 
 | 
    return lval > rval; 
 | 
  }, 
 | 
  gte: function (lval, rval) { 
 | 
    return lval >= rval; 
 | 
  } 
 | 
}; 
 | 
var FilterOrderComparator = /** @class */function () { 
 | 
  function FilterOrderComparator(op, rval) { 
 | 
    if (!isNumber(rval)) { 
 | 
      var errMsg = ''; 
 | 
      if (process.env.NODE_ENV !== 'production') { 
 | 
        errMsg = 'rvalue of "<", ">", "<=", ">=" can only be number in filter.'; 
 | 
      } 
 | 
      throwError(errMsg); 
 | 
    } 
 | 
    this._opFn = ORDER_COMPARISON_OP_MAP[op]; 
 | 
    this._rvalFloat = numericToNumber(rval); 
 | 
  } 
 | 
  // Performance sensitive. 
 | 
  FilterOrderComparator.prototype.evaluate = function (lval) { 
 | 
    // Most cases is 'number', and typeof maybe 10 times faseter than parseFloat. 
 | 
    return isNumber(lval) ? this._opFn(lval, this._rvalFloat) : this._opFn(numericToNumber(lval), this._rvalFloat); 
 | 
  }; 
 | 
  return FilterOrderComparator; 
 | 
}(); 
 | 
var SortOrderComparator = /** @class */function () { 
 | 
  /** 
 | 
   * @param order by default: 'asc' 
 | 
   * @param incomparable by default: Always on the tail. 
 | 
   *        That is, if 'asc' => 'max', if 'desc' => 'min' 
 | 
   *        See the definition of "incomparable" in [SORT_COMPARISON_RULE]. 
 | 
   */ 
 | 
  function SortOrderComparator(order, incomparable) { 
 | 
    var isDesc = order === 'desc'; 
 | 
    this._resultLT = isDesc ? 1 : -1; 
 | 
    if (incomparable == null) { 
 | 
      incomparable = isDesc ? 'min' : 'max'; 
 | 
    } 
 | 
    this._incomparable = incomparable === 'min' ? -Infinity : Infinity; 
 | 
  } 
 | 
  // See [SORT_COMPARISON_RULE]. 
 | 
  // Performance sensitive. 
 | 
  SortOrderComparator.prototype.evaluate = function (lval, rval) { 
 | 
    // Most cases is 'number', and typeof maybe 10 times faseter than parseFloat. 
 | 
    var lvalFloat = isNumber(lval) ? lval : numericToNumber(lval); 
 | 
    var rvalFloat = isNumber(rval) ? rval : numericToNumber(rval); 
 | 
    var lvalNotNumeric = isNaN(lvalFloat); 
 | 
    var rvalNotNumeric = isNaN(rvalFloat); 
 | 
    if (lvalNotNumeric) { 
 | 
      lvalFloat = this._incomparable; 
 | 
    } 
 | 
    if (rvalNotNumeric) { 
 | 
      rvalFloat = this._incomparable; 
 | 
    } 
 | 
    if (lvalNotNumeric && rvalNotNumeric) { 
 | 
      var lvalIsStr = isString(lval); 
 | 
      var rvalIsStr = isString(rval); 
 | 
      if (lvalIsStr) { 
 | 
        lvalFloat = rvalIsStr ? lval : 0; 
 | 
      } 
 | 
      if (rvalIsStr) { 
 | 
        rvalFloat = lvalIsStr ? rval : 0; 
 | 
      } 
 | 
    } 
 | 
    return lvalFloat < rvalFloat ? this._resultLT : lvalFloat > rvalFloat ? -this._resultLT : 0; 
 | 
  }; 
 | 
  return SortOrderComparator; 
 | 
}(); 
 | 
export { SortOrderComparator }; 
 | 
var FilterEqualityComparator = /** @class */function () { 
 | 
  function FilterEqualityComparator(isEq, rval) { 
 | 
    this._rval = rval; 
 | 
    this._isEQ = isEq; 
 | 
    this._rvalTypeof = typeof rval; 
 | 
    this._rvalFloat = numericToNumber(rval); 
 | 
  } 
 | 
  // Performance sensitive. 
 | 
  FilterEqualityComparator.prototype.evaluate = function (lval) { 
 | 
    var eqResult = lval === this._rval; 
 | 
    if (!eqResult) { 
 | 
      var lvalTypeof = typeof lval; 
 | 
      if (lvalTypeof !== this._rvalTypeof && (lvalTypeof === 'number' || this._rvalTypeof === 'number')) { 
 | 
        eqResult = numericToNumber(lval) === this._rvalFloat; 
 | 
      } 
 | 
    } 
 | 
    return this._isEQ ? eqResult : !eqResult; 
 | 
  }; 
 | 
  return FilterEqualityComparator; 
 | 
}(); 
 | 
/** 
 | 
 * [FILTER_COMPARISON_RULE] 
 | 
 * `lt`|`lte`|`gt`|`gte`: 
 | 
 * + rval must be a number. And lval will be converted to number (`numericToNumber`) to compare. 
 | 
 * `eq`: 
 | 
 * + If same type, compare with `===`. 
 | 
 * + If there is one number, convert to number (`numericToNumber`) to compare. 
 | 
 * + Else return `false`. 
 | 
 * `ne`: 
 | 
 * + Not `eq`. 
 | 
 * 
 | 
 * 
 | 
 * [SORT_COMPARISON_RULE] 
 | 
 * All the values are grouped into three categories: 
 | 
 * + "numeric" (number and numeric string) 
 | 
 * + "non-numeric-string" (string that excluding numeric string) 
 | 
 * + "others" 
 | 
 * "numeric" vs "numeric": values are ordered by number order. 
 | 
 * "non-numeric-string" vs "non-numeric-string": values are ordered by ES spec (#sec-abstract-relational-comparison). 
 | 
 * "others" vs "others": do not change order (always return 0). 
 | 
 * "numeric" vs "non-numeric-string": "non-numeric-string" is treated as "incomparable". 
 | 
 * "number" vs "others": "others" is treated as "incomparable". 
 | 
 * "non-numeric-string" vs "others": "others" is treated as "incomparable". 
 | 
 * "incomparable" will be seen as -Infinity or Infinity (depends on the settings). 
 | 
 * MEMO: 
 | 
 *   Non-numeric string sort makes sense when we need to put the items with the same tag together. 
 | 
 *   But if we support string sort, we still need to avoid the misleading like `'2' > '12'`, 
 | 
 *   So we treat "numeric-string" sorted by number order rather than string comparison. 
 | 
 * 
 | 
 * 
 | 
 * [CHECK_LIST_OF_THE_RULE_DESIGN] 
 | 
 * + Do not support string comparison until required. And also need to 
 | 
 *   avoid the misleading of "2" > "12". 
 | 
 * + Should avoid the misleading case: 
 | 
 *   `" 22 " gte "22"` is `true` but `" 22 " eq "22"` is `false`. 
 | 
 * + JS bad case should be avoided: null <= 0, [] <= 0, ' ' <= 0, ... 
 | 
 * + Only "numeric" can be converted to comparable number, otherwise converted to NaN. 
 | 
 *   See `util/number.ts#numericToNumber`. 
 | 
 * 
 | 
 * @return If `op` is not `RelationalOperator`, return null; 
 | 
 */ 
 | 
export function createFilterComparator(op, rval) { 
 | 
  return op === 'eq' || op === 'ne' ? new FilterEqualityComparator(op === 'eq', rval) : hasOwn(ORDER_COMPARISON_OP_MAP, op) ? new FilterOrderComparator(op, rval) : null; 
 | 
} 
 |