hyperformula
Version:
HyperFormula is a JavaScript engine for efficient processing of spreadsheet-like data and formulas
186 lines (184 loc) • 7.1 kB
JavaScript
"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;