UNPKG

hyperformula

Version:

HyperFormula is a JavaScript engine for efficient processing of spreadsheet-like data and formulas

186 lines (184 loc) 7.1 kB
"use strict"; exports.__esModule = true; exports.buildCriterionLambda = exports.buildCriterion = exports.CriterionType = exports.CriterionBuilder = void 0; var _InterpreterValue = require("./InterpreterValue"); /** * @license * Copyright (c) 2025 Handsoncode. All rights reserved. */ var CriterionType; (function (CriterionType) { CriterionType["GREATER_THAN"] = "GREATER_THAN"; CriterionType["GREATER_THAN_OR_EQUAL"] = "GREATER_THAN_OR_EQUAL"; CriterionType["LESS_THAN"] = "LESS_THAN"; CriterionType["LESS_THAN_OR_EQUAL"] = "LESS_THAN_OR_EQUAL"; CriterionType["NOT_EQUAL"] = "NOT_EQUAL"; CriterionType["EQUAL"] = "EQUAL"; })(CriterionType || (exports.CriterionType = CriterionType = {})); const buildCriterion = (operator, value) => ({ operator, value }); exports.buildCriterion = buildCriterion; class CriterionBuilder { constructor(config) { var _a, _b, _c, _d; this.trueString = (_b = (_a = config.translationPackage.getMaybeFunctionTranslation('TRUE')) === null || _a === void 0 ? void 0 : _a.toLowerCase()) !== null && _b !== void 0 ? _b : 'true'; this.falseString = (_d = (_c = config.translationPackage.getMaybeFunctionTranslation('FALSE')) === null || _c === void 0 ? void 0 : _c.toLowerCase()) !== null && _d !== void 0 ? _d : 'false'; } fromCellValue(raw, arithmeticHelper) { if (typeof raw !== 'string' && typeof raw !== 'boolean' && typeof raw !== 'number') { return undefined; } const criterion = this.parseCriterion(raw, arithmeticHelper); if (criterion === undefined) { return undefined; } return { raw, lambda: buildCriterionLambda(criterion, arithmeticHelper) }; } parseCriterion(criterion, arithmeticHelper) { if (typeof criterion === 'number' || typeof criterion === 'boolean') { return buildCriterion(CriterionType.EQUAL, criterion); } else if (typeof criterion === 'string') { const regexResult = ANY_CRITERION_REGEX.exec(criterion); let criterionValue; let criterionType; if (regexResult) { criterionType = StrToCriterionType(regexResult[1]); criterionValue = regexResult[2]; } else { criterionType = CriterionType.EQUAL; criterionValue = criterion; } const value = arithmeticHelper.coerceToMaybeNumber(criterionValue); const boolvalue = criterionValue.toLowerCase() === this.trueString ? true : criterionValue.toLowerCase() === this.falseString ? false : undefined; if (criterionType === undefined) { return undefined; } if (criterionValue === '') { return buildCriterion(criterionType, null); } else if (value === undefined) { if (criterionType === CriterionType.EQUAL || criterionType === CriterionType.NOT_EQUAL) { return buildCriterion(criterionType, boolvalue !== null && boolvalue !== void 0 ? boolvalue : criterionValue); } } else { return buildCriterion(criterionType, (0, _InterpreterValue.getRawValue)(value)); } } return undefined; } } exports.CriterionBuilder = CriterionBuilder; const ANY_CRITERION_REGEX = /([<>=]+)(.*)/; function StrToCriterionType(str) { switch (str) { case '>': return CriterionType.GREATER_THAN; case '>=': return CriterionType.GREATER_THAN_OR_EQUAL; case '<': return CriterionType.LESS_THAN; case '<=': return CriterionType.LESS_THAN_OR_EQUAL; case '<>': return CriterionType.NOT_EQUAL; case '=': return CriterionType.EQUAL; default: return undefined; } } const buildCriterionLambda = (criterion, arithmeticHelper) => { switch (criterion.operator) { case CriterionType.GREATER_THAN: { if (typeof criterion.value === 'number') { return cellValue => typeof cellValue === 'number' && arithmeticHelper.floatCmp(cellValue, criterion.value) > 0; } else { return _cellValue => false; } } case CriterionType.GREATER_THAN_OR_EQUAL: { if (typeof criterion.value === 'number') { return cellValue => typeof cellValue === 'number' && arithmeticHelper.floatCmp(cellValue, criterion.value) >= 0; } else { return _cellValue => false; } } case CriterionType.LESS_THAN: { if (typeof criterion.value === 'number') { return cellValue => typeof cellValue === 'number' && arithmeticHelper.floatCmp(cellValue, criterion.value) < 0; } else { return _cellValue => false; } } case CriterionType.LESS_THAN_OR_EQUAL: { if (typeof criterion.value === 'number') { return cellValue => typeof cellValue === 'number' && arithmeticHelper.floatCmp(cellValue, criterion.value) <= 0; } else { return _cellValue => false; } } case CriterionType.EQUAL: { if (typeof criterion.value === 'number') { return cellValue => { if (typeof cellValue === 'number') { return arithmeticHelper.floatCmp(cellValue, criterion.value) === 0; } else if (typeof cellValue === 'string') { if (cellValue === '') { return false; } const val = arithmeticHelper.coerceToMaybeNumber(cellValue); if (val === undefined) { return false; } return arithmeticHelper.floatCmp(val, criterion.value) === 0; } else { return false; } }; } else if (typeof criterion.value === 'string') { return arithmeticHelper.eqMatcherFunction(criterion.value); } else if (typeof criterion.value === 'boolean') { return cellValue => typeof cellValue === 'boolean' && cellValue === criterion.value; } else { return cellValue => cellValue === _InterpreterValue.EmptyValue; } } case CriterionType.NOT_EQUAL: { if (typeof criterion.value === 'number') { return cellValue => { if (typeof cellValue === 'number') { return arithmeticHelper.floatCmp(cellValue, criterion.value) !== 0; } else if (typeof cellValue === 'string') { if (cellValue === '') { return true; } const val = arithmeticHelper.coerceToMaybeNumber(cellValue); if (val === undefined) { return true; } return arithmeticHelper.floatCmp(val, criterion.value) !== 0; } else { return true; } }; } else if (typeof criterion.value === 'string') { return arithmeticHelper.neqMatcherFunction(criterion.value); } else if (typeof criterion.value === 'boolean') { return cellValue => typeof cellValue !== 'boolean' || cellValue !== criterion.value; } else { return cellValue => cellValue !== _InterpreterValue.EmptyValue; } } } }; exports.buildCriterionLambda = buildCriterionLambda;