@univerjs/engine-formula 1.0.0-alpha.1 → 1.0.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/facade.js +9 -5
- package/lib/cjs/index.js +1530 -268
- package/lib/es/facade.js +9 -5
- package/lib/es/index.js +1520 -270
- package/lib/facade.js +9 -5
- package/lib/index.js +1520 -270
- package/lib/types/basics/regex.d.ts +2 -2
- package/lib/types/commands/mutations/set-super-table.mutation.d.ts +4 -1
- package/lib/types/controllers/super-table-active-dirty.controller.d.ts +22 -0
- package/lib/types/engine/analysis/lexer-tree-builder.d.ts +2 -1
- package/lib/types/engine/analysis/lexer.d.ts +2 -1
- package/lib/types/engine/analysis/parser.d.ts +2 -1
- package/lib/types/engine/ast-node/function-node.d.ts +4 -0
- package/lib/types/engine/ast-node/operator-node.d.ts +1 -0
- package/lib/types/engine/ast-node/prefix-node.d.ts +1 -0
- package/lib/types/engine/interpreter/interpreter.d.ts +11 -0
- package/lib/types/engine/reference-object/cell-reference-object.d.ts +1 -0
- package/lib/types/engine/utils/generate-ast-node.d.ts +1 -1
- package/lib/types/engine/utils/math-kit.d.ts +5 -0
- package/lib/types/engine/value-object/array-value-object.d.ts +5 -0
- package/lib/types/engine/value-object/base-value-object.d.ts +6 -0
- package/lib/types/facade/f-formula.d.ts +9 -5
- package/lib/types/functions/base-function.d.ts +16 -1
- package/lib/types/functions/cube/cubekpimember/index.d.ts +20 -0
- package/lib/types/functions/cube/cubemember/index.d.ts +20 -0
- package/lib/types/functions/cube/cubememberproperty/index.d.ts +20 -0
- package/lib/types/functions/cube/cuberankedmember/index.d.ts +20 -0
- package/lib/types/functions/cube/cubeset/index.d.ts +20 -0
- package/lib/types/functions/cube/cubesetcount/index.d.ts +20 -0
- package/lib/types/functions/cube/cubevalue/index.d.ts +20 -0
- package/lib/types/functions/financial/amordegrc/index.d.ts +20 -0
- package/lib/types/functions/information/info/index.d.ts +20 -0
- package/lib/types/functions/information/isomitted/index.d.ts +20 -0
- package/lib/types/functions/logical/function-map.d.ts +3 -2
- package/lib/types/functions/logical/function-names.d.ts +2 -0
- package/lib/types/functions/logical/groupby/index.d.ts +46 -0
- package/lib/types/functions/logical/if/index.d.ts +5 -0
- package/lib/types/functions/logical/iferror/index.d.ts +4 -1
- package/lib/types/functions/logical/percentof/index.d.ts +27 -0
- package/lib/types/functions/lookup/anchorarray/index.d.ts +23 -0
- package/lib/types/functions/lookup/function-names.d.ts +1 -0
- package/lib/types/functions/lookup/getpivotdata/index.d.ts +20 -0
- package/lib/types/functions/lookup/hlookup/index.d.ts +1 -0
- package/lib/types/functions/lookup/indirect/index.d.ts +1 -0
- package/lib/types/functions/lookup/rtd/index.d.ts +20 -0
- package/lib/types/functions/lookup/vlookup/index.d.ts +2 -0
- package/lib/types/functions/lookup/xlookup/index.d.ts +2 -0
- package/lib/types/functions/math/iso-ceiling/index.d.ts +20 -0
- package/lib/types/functions/math/sum/index.d.ts +1 -0
- package/lib/types/functions/meta/compare/index.d.ts +1 -0
- package/lib/types/functions/not-implemented-function.d.ts +23 -0
- package/lib/types/functions/statistical/average/index.d.ts +1 -0
- package/lib/types/functions/statistical/countifs/index.d.ts +1 -0
- package/lib/types/functions/statistical/forecast-ets/index.d.ts +20 -0
- package/lib/types/functions/statistical/forecast-ets-confint/index.d.ts +20 -0
- package/lib/types/functions/statistical/forecast-ets-seasonality/index.d.ts +20 -0
- package/lib/types/functions/statistical/forecast-ets-stat/index.d.ts +20 -0
- package/lib/types/functions/statistical/linest/index.d.ts +1 -0
- package/lib/types/functions/text/call/index.d.ts +20 -0
- package/lib/types/functions/text/euroconvert/index.d.ts +20 -0
- package/lib/types/functions/text/function-names.d.ts +1 -0
- package/lib/types/functions/text/phonetic/index.d.ts +20 -0
- package/lib/types/functions/text/register-id/index.d.ts +20 -0
- package/lib/types/functions/text/textsplit/index.d.ts +1 -0
- package/lib/types/functions/web/filterxml/index.d.ts +22 -0
- package/lib/types/functions/web/function-map.d.ts +2 -2
- package/lib/types/functions/web/webservice/index.d.ts +20 -0
- package/lib/types/index.d.ts +3 -1
- package/lib/types/models/formula-data.model.d.ts +1 -0
- package/lib/types/services/active-dirty-manager.service.d.ts +2 -1
- package/lib/types/services/calculate-formula.service.d.ts +2 -2
- package/lib/types/services/defined-names.service.d.ts +2 -2
- package/lib/types/services/formula-calculation-trigger.service.d.ts +38 -0
- package/lib/types/services/runtime.service.d.ts +6 -0
- package/lib/umd/index.js +5 -2
- package/package.json +5 -5
package/lib/es/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AbsoluteRefType, AsyncLock, BooleanNumber, BuildTextUtils, CellValueType, CommandType, DataStreamTreeTokenType, Disposable, DisposableCollection, ICommandService, IConfigService, IUniverInstanceService, Inject, Injector, LRUMap, LifecycleService, LocaleService, LocaleType, MAX_COLUMN_COUNT, MAX_ROW_COUNT, ObjectMatrix, Optional, Plugin, RANGE_TYPE, RTree, Rectangle, RichTextBuilder, Styles, Tools, UniverInstanceType, cellToRange, columnLabelToNumber, createIdentifier,
|
|
1
|
+
import { AbsoluteRefType, AsyncLock, BooleanNumber, BuildTextUtils, CellValueType, CommandType, DataStreamTreeTokenType, Disposable, DisposableCollection, ICommandService, IConfigService, IUniverInstanceService, Inject, Injector, LRUMap, LifecycleService, LocaleService, LocaleType, MAX_COLUMN_COUNT, MAX_ROW_COUNT, ObjectMatrix, Optional, Plugin, RANGE_TYPE, RTree, Rectangle, RichTextBuilder, Styles, Tools, UniverInstanceType, cellToRange, columnLabelToNumber, createIdentifier, generateRandomId, getNumfmtParseValueFilter, hashAlgorithm, isFormulaId, isFormulaString, isNullCell, isRealNum, isTextFormat, isValidRange, merge, moveRangeByOffset, numfmt, regexp, requestImmediateMacroTask, sortRules, toDisposable, touchDependencies } from "@univerjs/core";
|
|
2
2
|
import IntervalTree from "@flatten-js/interval-tree";
|
|
3
3
|
import { BehaviorSubject, Observable, Subject, bufferWhen, combineLatest, distinctUntilChanged, filter, map, shareReplay, skip } from "rxjs";
|
|
4
4
|
import Decimal from "decimal.js";
|
|
@@ -478,12 +478,14 @@ var BaseValueObject = class extends ObjectClassType {
|
|
|
478
478
|
return ErrorValueObject.create("#NAME?");
|
|
479
479
|
}
|
|
480
480
|
concatenate(value, concatenateType = 0) {
|
|
481
|
-
let currentValue = this.getValue()
|
|
481
|
+
let currentValue = formatValueForFormulaText(this.getValue());
|
|
482
482
|
if (typeof value === "string") if (concatenateType === 0) currentValue = value + currentValue;
|
|
483
483
|
else currentValue += value;
|
|
484
|
-
else if (typeof value === "number")
|
|
485
|
-
|
|
486
|
-
|
|
484
|
+
else if (typeof value === "number") {
|
|
485
|
+
const numberString = formatNumberForFormulaText(value);
|
|
486
|
+
if (concatenateType === 0) currentValue = numberString + currentValue;
|
|
487
|
+
else currentValue += numberString;
|
|
488
|
+
} else if (typeof value === "boolean") {
|
|
487
489
|
const booleanString = value ? "TRUE" : "FALSE";
|
|
488
490
|
if (concatenateType === 0) currentValue = booleanString + currentValue;
|
|
489
491
|
else currentValue += booleanString;
|
|
@@ -649,6 +651,16 @@ var BaseValueObject = class extends ObjectClassType {
|
|
|
649
651
|
return ErrorValueObject.create("#VALUE!");
|
|
650
652
|
}
|
|
651
653
|
};
|
|
654
|
+
function formatValueForFormulaText(value) {
|
|
655
|
+
if (typeof value === "number") return formatNumberForFormulaText(value);
|
|
656
|
+
if (typeof value === "boolean") return value ? "TRUE" : "FALSE";
|
|
657
|
+
return value == null ? "" : value.toString();
|
|
658
|
+
}
|
|
659
|
+
function formatNumberForFormulaText(value) {
|
|
660
|
+
if (!Number.isFinite(value)) return value.toString();
|
|
661
|
+
const rounded = Number(value.toPrecision(15));
|
|
662
|
+
return Object.is(rounded, -0) ? "0" : rounded.toString();
|
|
663
|
+
}
|
|
652
664
|
const Error_CACHE_LRU_COUNT = 1e3;
|
|
653
665
|
const ErrorValueObjectCache = new FormulaAstLRU(Error_CACHE_LRU_COUNT);
|
|
654
666
|
var ErrorValueObject = class ErrorValueObject extends BaseValueObject {
|
|
@@ -681,6 +693,12 @@ var ErrorValueObject = class ErrorValueObject extends BaseValueObject {
|
|
|
681
693
|
isError() {
|
|
682
694
|
return true;
|
|
683
695
|
}
|
|
696
|
+
concatenateFront(_valueObject) {
|
|
697
|
+
return this;
|
|
698
|
+
}
|
|
699
|
+
concatenateBack(_valueObject) {
|
|
700
|
+
return this;
|
|
701
|
+
}
|
|
684
702
|
};
|
|
685
703
|
|
|
686
704
|
//#endregion
|
|
@@ -751,6 +769,43 @@ function parseFormattedDate(value) {
|
|
|
751
769
|
function parseFormattedTime(value) {
|
|
752
770
|
return numfmt.parseTime(value);
|
|
753
771
|
}
|
|
772
|
+
function parseEnglishMonthNameDate(value) {
|
|
773
|
+
const match = value.trim().match(/^(\d{1,2})\s*([A-Za-z]{3,9})\s*(\d{2,4})$/);
|
|
774
|
+
if (!match) return null;
|
|
775
|
+
const [, dayText, monthText, yearText] = match;
|
|
776
|
+
const month = {
|
|
777
|
+
jan: 0,
|
|
778
|
+
january: 0,
|
|
779
|
+
feb: 1,
|
|
780
|
+
february: 1,
|
|
781
|
+
mar: 2,
|
|
782
|
+
march: 2,
|
|
783
|
+
apr: 3,
|
|
784
|
+
april: 3,
|
|
785
|
+
may: 4,
|
|
786
|
+
jun: 5,
|
|
787
|
+
june: 5,
|
|
788
|
+
jul: 6,
|
|
789
|
+
july: 6,
|
|
790
|
+
aug: 7,
|
|
791
|
+
august: 7,
|
|
792
|
+
sep: 8,
|
|
793
|
+
sept: 8,
|
|
794
|
+
september: 8,
|
|
795
|
+
oct: 9,
|
|
796
|
+
october: 9,
|
|
797
|
+
nov: 10,
|
|
798
|
+
november: 10,
|
|
799
|
+
dec: 11,
|
|
800
|
+
december: 11
|
|
801
|
+
}[monthText.toLowerCase()];
|
|
802
|
+
if (month == null) return null;
|
|
803
|
+
const day = Number(dayText);
|
|
804
|
+
const year = Number(yearText.length === 2 ? `20${yearText}` : yearText);
|
|
805
|
+
const date = new Date(Date.UTC(year, month, day));
|
|
806
|
+
if (date.getUTCFullYear() !== year || date.getUTCMonth() !== month || date.getUTCDate() !== day) return null;
|
|
807
|
+
return date;
|
|
808
|
+
}
|
|
754
809
|
function isDate(format) {
|
|
755
810
|
return numfmt.getFormatInfo(format).isDate;
|
|
756
811
|
}
|
|
@@ -829,6 +884,7 @@ function getDateSerialNumberByObject(serialNumberObject) {
|
|
|
829
884
|
let dateSerial;
|
|
830
885
|
if (parseFormattedDate(`${dateValue}`)) dateSerial = parseFormattedDate(`${dateValue}`).v;
|
|
831
886
|
else if (parseFormattedTime(`${dateValue}`)) dateSerial = parseFormattedTime(`${dateValue}`).v;
|
|
887
|
+
else if (parseEnglishMonthNameDate(`${dateValue}`)) dateSerial = parseEnglishMonthNameDate(`${dateValue}`);
|
|
832
888
|
else if (isRealNum(dateValue)) dateSerial = +dateValue;
|
|
833
889
|
else return ErrorValueObject.create("#VALUE!");
|
|
834
890
|
if (dateSerial instanceof Date) dateSerial = excelDateTimeSerial(dateSerial);
|
|
@@ -876,10 +932,11 @@ function getDaysByNASD(startDateSerialNumber, endDateSerialNumber) {
|
|
|
876
932
|
let endYear = endDateSerialNumber > 0 ? endDateDate.getUTCFullYear() : 1900;
|
|
877
933
|
let endMonth = endDateSerialNumber > 0 ? endDateDate.getUTCMonth() + 1 : 1;
|
|
878
934
|
let endDay = endDateSerialNumber > 0 ? endDateDate.getUTCDate() : 0;
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
if (endDay ===
|
|
935
|
+
const startIsLastDayOfFebruary = startMonth === 2 && startDay === getDaysInMonth(startYear, startMonth - 1);
|
|
936
|
+
if (startIsLastDayOfFebruary) startDay = 30;
|
|
937
|
+
else if (startDay === 31) startDay = 30;
|
|
938
|
+
if (endMonth === 2 && endDay === getDaysInMonth(endYear, endMonth - 1) && startIsLastDayOfFebruary) endDay = 30;
|
|
939
|
+
else if (endDay === 31) if (startDay < 30) {
|
|
883
940
|
endDateDate = excelSerialToDate(endDateSerialNumber + 1);
|
|
884
941
|
endYear = endDateDate.getUTCFullYear();
|
|
885
942
|
endMonth = endDateDate.getUTCMonth() + 1;
|
|
@@ -1166,16 +1223,19 @@ var InvertedIndexCache = class {
|
|
|
1166
1223
|
};
|
|
1167
1224
|
const _value = normalizeValue(value);
|
|
1168
1225
|
if (ERROR_TYPE_SET.has(_value)) result.errorType = _value;
|
|
1169
|
-
else if (_value === 0
|
|
1226
|
+
else if (_value === 0) {
|
|
1170
1227
|
const rows = [];
|
|
1171
1228
|
const rowsForZero = columnMap.get(0);
|
|
1172
1229
|
if (rowsForZero) rows.push(...rowsForZero);
|
|
1173
1230
|
const rowsForEmpty = columnMap.get(DEFAULT_EMPTY_CELL_KEY);
|
|
1174
1231
|
if (rowsForEmpty) rows.push(...rowsForEmpty);
|
|
1175
1232
|
result.matchingRows = rows.filter((row) => rowsInCache.some(([start, end]) => row >= start && row <= end));
|
|
1176
|
-
} else {
|
|
1233
|
+
} else if (_value === DEFAULT_EMPTY_CELL_KEY) {
|
|
1177
1234
|
var _columnMap$get;
|
|
1178
|
-
result.matchingRows = Array.from((_columnMap$get = columnMap.get(
|
|
1235
|
+
result.matchingRows = Array.from((_columnMap$get = columnMap.get(DEFAULT_EMPTY_CELL_KEY)) !== null && _columnMap$get !== void 0 ? _columnMap$get : []).filter((row) => rowsInCache.some(([start, end]) => row >= start && row <= end));
|
|
1236
|
+
} else {
|
|
1237
|
+
var _columnMap$get2;
|
|
1238
|
+
result.matchingRows = Array.from((_columnMap$get2 = columnMap.get(_value)) !== null && _columnMap$get2 !== void 0 ? _columnMap$get2 : []).filter((row) => rowsInCache.some(([start, end]) => row >= start && row <= end));
|
|
1179
1239
|
}
|
|
1180
1240
|
return result;
|
|
1181
1241
|
}
|
|
@@ -1391,7 +1451,7 @@ const REFERENCE_REGEX_SINGLE_COLUMN = `^${UNIT_NAME_SHEET_NAME_REGEX}\\s*?\\${"$
|
|
|
1391
1451
|
const REFERENCE_REGEX_SINGLE_COLUMN_PRECOMPILING = new RegExp(REFERENCE_REGEX_SINGLE_COLUMN);
|
|
1392
1452
|
const TABLE_NAME_REGEX = "((?![~!@#$%^&*()_+<>?:,./;’,。、‘:“《》?~!@#¥%……()【】\\[\\]\\/\\\\]).)+";
|
|
1393
1453
|
const TABLE_TITLE_REGEX = "\\[#.+\\]\\s*?,\\s*?";
|
|
1394
|
-
const TABLE_CONTENT_REGEX = "\\[((?<!#)
|
|
1454
|
+
const TABLE_CONTENT_REGEX = "\\[((?<!#)[\\s\\S])*\\]";
|
|
1395
1455
|
const TABLE_MULTIPLE_COLUMN_REGEX = `${TABLE_CONTENT_REGEX}${RANGE_SYMBOL}${TABLE_CONTENT_REGEX}`;
|
|
1396
1456
|
const REFERENCE_TABLE_ALL_COLUMN_REGEX = `^(${UNIT_NAME_REGEX})?${TABLE_NAME_REGEX}$`;
|
|
1397
1457
|
const REFERENCE_TABLE_SINGLE_COLUMN_REGEX = `^(${UNIT_NAME_REGEX})?${TABLE_NAME_REGEX}(${TABLE_CONTENT_REGEX}|\\[${TABLE_TITLE_REGEX}${TABLE_CONTENT_REGEX}\\])+$`;
|
|
@@ -1970,16 +2030,38 @@ let DefinedNamesService = class DefinedNamesService extends Disposable {
|
|
|
1970
2030
|
getDefinedNameMap(unitId) {
|
|
1971
2031
|
return this._definedNameMap[unitId];
|
|
1972
2032
|
}
|
|
1973
|
-
getValueByName(unitId, name) {
|
|
1974
|
-
const cachedMap = this._nameCacheMap[unitId];
|
|
1975
|
-
if (cachedMap) return cachedMap[name.toLowerCase()] || null;
|
|
2033
|
+
getValueByName(unitId, name, sheetId) {
|
|
1976
2034
|
const nameMap = this._definedNameMap[unitId];
|
|
1977
2035
|
if (nameMap === void 0) return null;
|
|
2036
|
+
if (sheetId) {
|
|
2037
|
+
var _workbookScope;
|
|
2038
|
+
const normalizedName = name.toLowerCase();
|
|
2039
|
+
let workbookScope = null;
|
|
2040
|
+
let firstMatch = null;
|
|
2041
|
+
for (const item of Object.values(nameMap)) {
|
|
2042
|
+
if (item.name.toLowerCase() !== normalizedName) continue;
|
|
2043
|
+
if (firstMatch == null) firstMatch = item;
|
|
2044
|
+
if (item.localSheetId === sheetId) return item;
|
|
2045
|
+
if (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null) {
|
|
2046
|
+
if (workbookScope == null) workbookScope = item;
|
|
2047
|
+
}
|
|
2048
|
+
}
|
|
2049
|
+
return (_workbookScope = workbookScope) !== null && _workbookScope !== void 0 ? _workbookScope : firstMatch;
|
|
2050
|
+
}
|
|
2051
|
+
const cachedMap = this._nameCacheMap[unitId];
|
|
2052
|
+
if (cachedMap) return cachedMap[name.toLowerCase()] || null;
|
|
1978
2053
|
let result = null;
|
|
1979
|
-
|
|
2054
|
+
const normalizedName = name.toLowerCase();
|
|
2055
|
+
for (const item of Object.values(nameMap)) if (item.name.toLowerCase() === normalizedName && (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null)) {
|
|
1980
2056
|
result = item;
|
|
1981
2057
|
break;
|
|
1982
2058
|
}
|
|
2059
|
+
if (!result) {
|
|
2060
|
+
for (const item of Object.values(nameMap)) if (item.name.toLowerCase() === normalizedName) {
|
|
2061
|
+
result = item;
|
|
2062
|
+
break;
|
|
2063
|
+
}
|
|
2064
|
+
}
|
|
1983
2065
|
if (result) {
|
|
1984
2066
|
this._nameCacheMap[unitId] = this._nameCacheMap[unitId] || {};
|
|
1985
2067
|
this._nameCacheMap[unitId][name.toLowerCase()] = result;
|
|
@@ -2014,7 +2096,10 @@ let DefinedNamesService = class DefinedNamesService extends Disposable {
|
|
|
2014
2096
|
return;
|
|
2015
2097
|
}
|
|
2016
2098
|
this._nameCacheMap[unitId] = {};
|
|
2017
|
-
for (const item of Object.values(nameMap))
|
|
2099
|
+
for (const item of Object.values(nameMap)) {
|
|
2100
|
+
const normalizedName = item.name.toLowerCase();
|
|
2101
|
+
if (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null || this._nameCacheMap[unitId][normalizedName] == null) this._nameCacheMap[unitId][normalizedName] = item;
|
|
2102
|
+
}
|
|
2018
2103
|
}
|
|
2019
2104
|
_isDeepDefinedNameMapEmpty() {
|
|
2020
2105
|
for (const unitId in this._definedNameMap) if (this.hasDefinedName(unitId)) return false;
|
|
@@ -2587,6 +2672,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
|
|
|
2587
2672
|
FUNCTION_NAMES_LOGICAL["BYCOL"] = "BYCOL";
|
|
2588
2673
|
FUNCTION_NAMES_LOGICAL["BYROW"] = "BYROW";
|
|
2589
2674
|
FUNCTION_NAMES_LOGICAL["FALSE"] = "FALSE";
|
|
2675
|
+
FUNCTION_NAMES_LOGICAL["GROUPBY"] = "GROUPBY";
|
|
2590
2676
|
FUNCTION_NAMES_LOGICAL["IF"] = "IF";
|
|
2591
2677
|
FUNCTION_NAMES_LOGICAL["IFERROR"] = "IFERROR";
|
|
2592
2678
|
FUNCTION_NAMES_LOGICAL["IFNA"] = "IFNA";
|
|
@@ -2597,6 +2683,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
|
|
|
2597
2683
|
FUNCTION_NAMES_LOGICAL["MAP"] = "MAP";
|
|
2598
2684
|
FUNCTION_NAMES_LOGICAL["NOT"] = "NOT";
|
|
2599
2685
|
FUNCTION_NAMES_LOGICAL["OR"] = "OR";
|
|
2686
|
+
FUNCTION_NAMES_LOGICAL["PERCENTOF"] = "PERCENTOF";
|
|
2600
2687
|
FUNCTION_NAMES_LOGICAL["REDUCE"] = "REDUCE";
|
|
2601
2688
|
FUNCTION_NAMES_LOGICAL["SCAN"] = "SCAN";
|
|
2602
2689
|
FUNCTION_NAMES_LOGICAL["SWITCH"] = "SWITCH";
|
|
@@ -2624,6 +2711,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
|
|
|
2624
2711
|
*/
|
|
2625
2712
|
let FUNCTION_NAMES_LOOKUP = /* @__PURE__ */ function(FUNCTION_NAMES_LOOKUP) {
|
|
2626
2713
|
FUNCTION_NAMES_LOOKUP["ADDRESS"] = "ADDRESS";
|
|
2714
|
+
FUNCTION_NAMES_LOOKUP["ANCHORARRAY"] = "ANCHORARRAY";
|
|
2627
2715
|
FUNCTION_NAMES_LOOKUP["AREAS"] = "AREAS";
|
|
2628
2716
|
FUNCTION_NAMES_LOOKUP["CHOOSE"] = "CHOOSE";
|
|
2629
2717
|
FUNCTION_NAMES_LOOKUP["CHOOSECOLS"] = "CHOOSECOLS";
|
|
@@ -2946,6 +3034,7 @@ let FUNCTION_NAMES_TEXT = /* @__PURE__ */ function(FUNCTION_NAMES_TEXT) {
|
|
|
2946
3034
|
FUNCTION_NAMES_TEXT["PROPER"] = "PROPER";
|
|
2947
3035
|
FUNCTION_NAMES_TEXT["REGEXEXTRACT"] = "REGEXEXTRACT";
|
|
2948
3036
|
FUNCTION_NAMES_TEXT["REGEXMATCH"] = "REGEXMATCH";
|
|
3037
|
+
FUNCTION_NAMES_TEXT["REGEXTEST"] = "REGEXTEST";
|
|
2949
3038
|
FUNCTION_NAMES_TEXT["REGEXREPLACE"] = "REGEXREPLACE";
|
|
2950
3039
|
FUNCTION_NAMES_TEXT["REPLACE"] = "REPLACE";
|
|
2951
3040
|
FUNCTION_NAMES_TEXT["REPLACEB"] = "REPLACEB";
|
|
@@ -3057,6 +3146,7 @@ const NEW_EXCEL_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
|
3057
3146
|
"SHEETS",
|
|
3058
3147
|
"IFNA",
|
|
3059
3148
|
"IFS",
|
|
3149
|
+
"GROUPBY",
|
|
3060
3150
|
"SWITCH",
|
|
3061
3151
|
"XOR",
|
|
3062
3152
|
"BETA.DIST",
|
|
@@ -3151,7 +3241,7 @@ function deserializeRangeWithSheetWithCache(refString) {
|
|
|
3151
3241
|
if (refCache) return refCache;
|
|
3152
3242
|
const result = deserializeRangeWithSheet(refString);
|
|
3153
3243
|
referenceToRangeCache.set(refString, result);
|
|
3154
|
-
return
|
|
3244
|
+
return result;
|
|
3155
3245
|
}
|
|
3156
3246
|
function clearReferenceToRangeCache() {
|
|
3157
3247
|
referenceToRangeCache.clear();
|
|
@@ -3710,7 +3800,7 @@ var LexerTreeBuilder = class extends Disposable {
|
|
|
3710
3800
|
return this._currentLexerNode;
|
|
3711
3801
|
}
|
|
3712
3802
|
_handleDefinedName(sequenceArray, param) {
|
|
3713
|
-
const { unitId, getValueByName, getSheetName } = param;
|
|
3803
|
+
const { unitId, sheetId, getValueByName, getSheetName } = param;
|
|
3714
3804
|
if (unitId == null) return {
|
|
3715
3805
|
sequenceString: "",
|
|
3716
3806
|
hasDefinedName: false,
|
|
@@ -3730,14 +3820,15 @@ var LexerTreeBuilder = class extends Disposable {
|
|
|
3730
3820
|
let token = tokenRaw;
|
|
3731
3821
|
if (nodeType === 4 || nodeType === 3) {
|
|
3732
3822
|
if (nodeType === 3) token = this._getHasSheetNameDefinedName(tokenRaw, unitId, param);
|
|
3733
|
-
const
|
|
3823
|
+
const definedNameToken = token.trim();
|
|
3824
|
+
const definedContent = getValueByName(unitId, definedNameToken, sheetId);
|
|
3734
3825
|
if (definedContent) {
|
|
3735
3826
|
const refString = definedContent.formulaOrRefString;
|
|
3736
3827
|
const nestedDefinedNameParam = this._handleNestedDefinedName(refString, param);
|
|
3737
3828
|
if (nestedDefinedNameParam == null || typeof nestedDefinedNameParam !== "object") {
|
|
3738
3829
|
sequenceString += nestedDefinedNameParam || "#NAME?";
|
|
3739
3830
|
hasDefinedName = true;
|
|
3740
|
-
definedNames.push(
|
|
3831
|
+
definedNames.push(definedNameToken);
|
|
3741
3832
|
} else if (typeof nestedDefinedNameParam === "object") {
|
|
3742
3833
|
const { sequenceString: nestedSequenceString, definedNames: nestedDefinedNames } = nestedDefinedNameParam;
|
|
3743
3834
|
sequenceString += nestedSequenceString;
|
|
@@ -3746,10 +3837,10 @@ var LexerTreeBuilder = class extends Disposable {
|
|
|
3746
3837
|
});
|
|
3747
3838
|
hasDefinedName = true;
|
|
3748
3839
|
}
|
|
3749
|
-
} else if (this._checkDefinedNameDirty(
|
|
3840
|
+
} else if (this._checkDefinedNameDirty(definedNameToken, param)) {
|
|
3750
3841
|
sequenceString += "#NAME?";
|
|
3751
3842
|
hasDefinedName = true;
|
|
3752
|
-
definedNames.push(
|
|
3843
|
+
definedNames.push(definedNameToken);
|
|
3753
3844
|
} else sequenceString += token;
|
|
3754
3845
|
} else sequenceString += token;
|
|
3755
3846
|
}
|
|
@@ -4163,7 +4254,7 @@ var LexerTreeBuilder = class extends Disposable {
|
|
|
4163
4254
|
}
|
|
4164
4255
|
}
|
|
4165
4256
|
_nodeMaker(formulaStringRaw, sequenceArray, matchCurrentNodeIndex) {
|
|
4166
|
-
let formulaString = formulaStringRaw.replace(
|
|
4257
|
+
let formulaString = formulaStringRaw.replace(/(?:\r\n|\r|\n)$/g, " ");
|
|
4167
4258
|
if (formulaString.substring(0, 1) === "=") formulaString = formulaString.substring(1);
|
|
4168
4259
|
const formulaChars = formulaString.split("");
|
|
4169
4260
|
const charsCount = formulaChars.length;
|
|
@@ -4917,7 +5008,9 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
4917
5008
|
for (let j = 0; j < worksheets.length; j++) {
|
|
4918
5009
|
const worksheet = worksheets[j];
|
|
4919
5010
|
const cellMatrix = worksheet.getCellMatrix();
|
|
4920
|
-
|
|
5011
|
+
const sheetId = worksheet.getSheetId();
|
|
5012
|
+
this._initSheetArrayFormulaData(unitId, sheetId, cellMatrix);
|
|
5013
|
+
initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix);
|
|
4921
5014
|
}
|
|
4922
5015
|
}
|
|
4923
5016
|
const allBases = this._univerInstanceService.getAllUnitsForType(UniverInstanceType.UNIVER_BASE);
|
|
@@ -4929,7 +5022,6 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
4929
5022
|
const tables = Object.values(snapshot.tables);
|
|
4930
5023
|
for (let j = 0; j < tables.length; j++) {
|
|
4931
5024
|
const table = tables[j];
|
|
4932
|
-
if (table.deleted) continue;
|
|
4933
5025
|
const tableFormulaData = {};
|
|
4934
5026
|
const recordOrder = table.recordOrder;
|
|
4935
5027
|
if (!recordOrder) {
|
|
@@ -4938,13 +5030,12 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
4938
5030
|
}
|
|
4939
5031
|
for (let row = 0; row < recordOrder.length; row++) {
|
|
4940
5032
|
const recordId = recordOrder[row];
|
|
4941
|
-
|
|
4942
|
-
if (!record || record.deleted) continue;
|
|
5033
|
+
if (!table.records[recordId]) continue;
|
|
4943
5034
|
for (let col = 0; col < table.fieldOrder.length; col++) {
|
|
4944
5035
|
var _field$config$formula, _field$config, _row, _tableFormulaData$_ro;
|
|
4945
5036
|
const fieldId = table.fieldOrder[col];
|
|
4946
5037
|
const field = table.fields[fieldId];
|
|
4947
|
-
if (!field || field.
|
|
5038
|
+
if (!field || field.type !== "formula") continue;
|
|
4948
5039
|
const formula = String((_field$config$formula = (_field$config = field.config) === null || _field$config === void 0 ? void 0 : _field$config.formula) !== null && _field$config$formula !== void 0 ? _field$config$formula : "").trim();
|
|
4949
5040
|
if (!formula) continue;
|
|
4950
5041
|
(_tableFormulaData$_ro = tableFormulaData[_row = row]) !== null && _tableFormulaData$_ro !== void 0 || (tableFormulaData[_row] = {});
|
|
@@ -4966,7 +5057,9 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
4966
5057
|
formulaData[unitId] = {};
|
|
4967
5058
|
const worksheet = workbook.getSheetBySheetId(sheetId);
|
|
4968
5059
|
if (worksheet == null) return {};
|
|
4969
|
-
|
|
5060
|
+
const cellMatrix = worksheet.getCellMatrix();
|
|
5061
|
+
this._initSheetArrayFormulaData(unitId, sheetId, cellMatrix);
|
|
5062
|
+
initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix);
|
|
4970
5063
|
return formulaData[unitId][sheetId];
|
|
4971
5064
|
}
|
|
4972
5065
|
getArrayFormulaRange() {
|
|
@@ -5066,18 +5159,12 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
5066
5159
|
const unitId = base.getUnitId();
|
|
5067
5160
|
const baseData = {};
|
|
5068
5161
|
const tableNameMap = {};
|
|
5069
|
-
for (const table of Object.values(snapshot.tables)
|
|
5070
|
-
var _table$recordOrder$
|
|
5162
|
+
for (const table of Object.values(snapshot.tables)) {
|
|
5163
|
+
var _table$recordOrder$le, _table$recordOrder;
|
|
5071
5164
|
baseData[table.id] = {
|
|
5072
5165
|
cellData: new ObjectMatrix(buildBaseRuntimeCellData(table)),
|
|
5073
|
-
rowCount: (_table$recordOrder$
|
|
5074
|
-
|
|
5075
|
-
return !((_table$records$record = table.records[recordId]) === null || _table$records$record === void 0 ? void 0 : _table$records$record.deleted);
|
|
5076
|
-
}).length) !== null && _table$recordOrder$fi !== void 0 ? _table$recordOrder$fi : 0,
|
|
5077
|
-
columnCount: table.fieldOrder.filter((fieldId) => {
|
|
5078
|
-
var _table$fields$fieldId;
|
|
5079
|
-
return !((_table$fields$fieldId = table.fields[fieldId]) === null || _table$fields$fieldId === void 0 ? void 0 : _table$fields$fieldId.deleted);
|
|
5080
|
-
}).length,
|
|
5166
|
+
rowCount: (_table$recordOrder$le = (_table$recordOrder = table.recordOrder) === null || _table$recordOrder === void 0 ? void 0 : _table$recordOrder.length) !== null && _table$recordOrder$le !== void 0 ? _table$recordOrder$le : 0,
|
|
5167
|
+
columnCount: table.fieldOrder.length,
|
|
5081
5168
|
rowData: {},
|
|
5082
5169
|
columnData: {}
|
|
5083
5170
|
};
|
|
@@ -5263,7 +5350,7 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
5263
5350
|
for (const unitId in formulaData) {
|
|
5264
5351
|
const workbook = formulaData[unitId];
|
|
5265
5352
|
if (!workbook) continue;
|
|
5266
|
-
const workbookInstance = this._univerInstanceService.getUnit(unitId);
|
|
5353
|
+
const workbookInstance = this._univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_SHEET);
|
|
5267
5354
|
if (!workbookInstance) continue;
|
|
5268
5355
|
for (const sheetId in workbook) {
|
|
5269
5356
|
const sheet = workbook[sheetId];
|
|
@@ -5277,7 +5364,7 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
5277
5364
|
const column = Number(columnStr);
|
|
5278
5365
|
const currentCell = sheetInstance.getCellRaw(row, column);
|
|
5279
5366
|
const isFormula = isFormulaString(currentCell === null || currentCell === void 0 ? void 0 : currentCell.f) || isFormulaId(currentCell === null || currentCell === void 0 ? void 0 : currentCell.si);
|
|
5280
|
-
const noValue = (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === void 0 || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === null
|
|
5367
|
+
const noValue = (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === void 0 || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === null;
|
|
5281
5368
|
if (!(isFormula && noValue)) continue;
|
|
5282
5369
|
if (!columnRanges[column]) columnRanges[column] = [];
|
|
5283
5370
|
const lastRange = columnRanges[column].slice(-1)[0];
|
|
@@ -5326,6 +5413,39 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
5326
5413
|
});
|
|
5327
5414
|
return formulaIdMap;
|
|
5328
5415
|
}
|
|
5416
|
+
_initSheetArrayFormulaData(unitId, sheetId, cellMatrix) {
|
|
5417
|
+
let arrayFormulaRangeMatrix;
|
|
5418
|
+
let arrayFormulaCellDataMatrix;
|
|
5419
|
+
const formulaIds = /* @__PURE__ */ new Set();
|
|
5420
|
+
cellMatrix.forValue((_, __, cell) => {
|
|
5421
|
+
const formulaId = cell === null || cell === void 0 ? void 0 : cell.si;
|
|
5422
|
+
if (isFormulaString(cell === null || cell === void 0 ? void 0 : cell.f) && isFormulaId(formulaId)) formulaIds.add(String(formulaId));
|
|
5423
|
+
});
|
|
5424
|
+
cellMatrix.forValue((row, column, cell) => {
|
|
5425
|
+
var _arrayFormulaRangeMat, _this$_arrayFormulaRa7, _arrayFormulaCellData, _this$_arrayFormulaCe5;
|
|
5426
|
+
const ref = cell === null || cell === void 0 ? void 0 : cell.ref;
|
|
5427
|
+
const formula = cell === null || cell === void 0 ? void 0 : cell.f;
|
|
5428
|
+
const formulaId = cell === null || cell === void 0 ? void 0 : cell.si;
|
|
5429
|
+
const hasOwnFormula = isFormulaString(formula);
|
|
5430
|
+
const hasSharedFormula = isFormulaId(formulaId) && formulaIds.has(String(formulaId));
|
|
5431
|
+
if (!hasOwnFormula && !hasSharedFormula || typeof ref !== "string" || ref.length === 0) return true;
|
|
5432
|
+
const { range } = deserializeRangeWithSheet(ref);
|
|
5433
|
+
if (!Number.isFinite(range.startRow) || !Number.isFinite(range.startColumn) || !Number.isFinite(range.endRow) || !Number.isFinite(range.endColumn)) return true;
|
|
5434
|
+
if (range.startRow === row && range.endRow === row && range.startColumn === column && range.endColumn === column && !isArrayConstantFormula(formula)) return true;
|
|
5435
|
+
if (!this._arrayFormulaRange[unitId]) this._arrayFormulaRange[unitId] = {};
|
|
5436
|
+
if (!this._arrayFormulaCellData[unitId]) this._arrayFormulaCellData[unitId] = {};
|
|
5437
|
+
(_arrayFormulaRangeMat = arrayFormulaRangeMatrix) !== null && _arrayFormulaRangeMat !== void 0 || (arrayFormulaRangeMatrix = new ObjectMatrix((_this$_arrayFormulaRa7 = this._arrayFormulaRange[unitId]) === null || _this$_arrayFormulaRa7 === void 0 ? void 0 : _this$_arrayFormulaRa7[sheetId]));
|
|
5438
|
+
(_arrayFormulaCellData = arrayFormulaCellDataMatrix) !== null && _arrayFormulaCellData !== void 0 || (arrayFormulaCellDataMatrix = new ObjectMatrix((_this$_arrayFormulaCe5 = this._arrayFormulaCellData[unitId]) === null || _this$_arrayFormulaCe5 === void 0 ? void 0 : _this$_arrayFormulaCe5[sheetId]));
|
|
5439
|
+
if (arrayFormulaRangeMatrix.getValue(row, column) == null) arrayFormulaRangeMatrix.setValue(row, column, range);
|
|
5440
|
+
for (let r = range.startRow; r <= range.endRow; r++) for (let c = range.startColumn; c <= range.endColumn; c++) {
|
|
5441
|
+
if (arrayFormulaCellDataMatrix.getValue(r, c) != null) continue;
|
|
5442
|
+
const rangeCell = cellMatrix.getValue(r, c);
|
|
5443
|
+
if (rangeCell != null) arrayFormulaCellDataMatrix.setValue(r, c, { ...rangeCell });
|
|
5444
|
+
}
|
|
5445
|
+
});
|
|
5446
|
+
if (arrayFormulaRangeMatrix && this._arrayFormulaRange[unitId]) this._arrayFormulaRange[unitId][sheetId] = arrayFormulaRangeMatrix.getData();
|
|
5447
|
+
if (arrayFormulaCellDataMatrix && this._arrayFormulaCellData[unitId]) this._arrayFormulaCellData[unitId][sheetId] = arrayFormulaCellDataMatrix.getData();
|
|
5448
|
+
}
|
|
5329
5449
|
};
|
|
5330
5450
|
FormulaDataModel = __decorate([__decorateParam(0, IUniverInstanceService), __decorateParam(1, Inject(LexerTreeBuilder))], FormulaDataModel);
|
|
5331
5451
|
function initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix) {
|
|
@@ -5360,9 +5480,9 @@ function initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix) {
|
|
|
5360
5480
|
if (isFormulaId(formulaId) && !isFormulaString(formulaString)) {
|
|
5361
5481
|
const formulaInfo = formulaIdMap.get(formulaId);
|
|
5362
5482
|
if (formulaInfo) {
|
|
5363
|
-
const f = formulaInfo.f;
|
|
5364
5483
|
const x = c - formulaInfo.c;
|
|
5365
5484
|
const y = r - formulaInfo.r;
|
|
5485
|
+
const f = formulaInfo.f;
|
|
5366
5486
|
sheetFormulaDataMatrix.setValue(r, c, {
|
|
5367
5487
|
f,
|
|
5368
5488
|
si: formulaId,
|
|
@@ -5397,12 +5517,9 @@ function createEngineThisRowRef(table, fieldName, snapshot) {
|
|
|
5397
5517
|
function getEngineBaseTableName(table, snapshot) {
|
|
5398
5518
|
const tables = Object.values(snapshot.tables);
|
|
5399
5519
|
let sameNameCount = 0;
|
|
5400
|
-
for (let i = 0; i < tables.length; i++) {
|
|
5401
|
-
|
|
5402
|
-
if (
|
|
5403
|
-
sameNameCount++;
|
|
5404
|
-
if (sameNameCount > 1) break;
|
|
5405
|
-
}
|
|
5520
|
+
for (let i = 0; i < tables.length; i++) if (tables[i].name === table.name) {
|
|
5521
|
+
sameNameCount++;
|
|
5522
|
+
if (sameNameCount > 1) break;
|
|
5406
5523
|
}
|
|
5407
5524
|
return sameNameCount === 1 ? table.name : table.id;
|
|
5408
5525
|
}
|
|
@@ -5411,14 +5528,14 @@ function buildBaseRuntimeCellData(table) {
|
|
|
5411
5528
|
const fieldOrder = [];
|
|
5412
5529
|
for (let i = 0; i < table.fieldOrder.length; i++) {
|
|
5413
5530
|
const fieldId = table.fieldOrder[i];
|
|
5414
|
-
if (table.fields[fieldId]
|
|
5531
|
+
if (table.fields[fieldId]) fieldOrder.push(fieldId);
|
|
5415
5532
|
}
|
|
5416
5533
|
let recordOrder;
|
|
5417
5534
|
if (table.recordOrder) {
|
|
5418
5535
|
recordOrder = [];
|
|
5419
5536
|
for (let i = 0; i < table.recordOrder.length; i++) {
|
|
5420
5537
|
const recordId = table.recordOrder[i];
|
|
5421
|
-
if (table.records[recordId]
|
|
5538
|
+
if (table.records[recordId]) recordOrder.push(recordId);
|
|
5422
5539
|
}
|
|
5423
5540
|
} else {
|
|
5424
5541
|
var _table$records;
|
|
@@ -5426,7 +5543,7 @@ function buildBaseRuntimeCellData(table) {
|
|
|
5426
5543
|
const records = [];
|
|
5427
5544
|
for (let i = 0; i < allRecords.length; i++) {
|
|
5428
5545
|
const record = allRecords[i];
|
|
5429
|
-
|
|
5546
|
+
records.push(record);
|
|
5430
5547
|
}
|
|
5431
5548
|
records.sort((a, b) => a.orderKey.localeCompare(b.orderKey));
|
|
5432
5549
|
recordOrder = [];
|
|
@@ -5438,7 +5555,7 @@ function buildBaseRuntimeCellData(table) {
|
|
|
5438
5555
|
for (let row = 0; row < recordOrder.length; row++) {
|
|
5439
5556
|
const recordId = recordOrder[row];
|
|
5440
5557
|
const record = table.records[recordId];
|
|
5441
|
-
if (!record
|
|
5558
|
+
if (!record) continue;
|
|
5442
5559
|
cellData[row] = { ...cellData[row] };
|
|
5443
5560
|
for (let col = 0; col < fieldOrder.length; col++) {
|
|
5444
5561
|
var _record$values;
|
|
@@ -5490,14 +5607,17 @@ function inferBaseRuntimeCellType(value) {
|
|
|
5490
5607
|
if (typeof value === "string") return CellValueType.STRING;
|
|
5491
5608
|
return null;
|
|
5492
5609
|
}
|
|
5610
|
+
function isArrayConstantFormula(formula) {
|
|
5611
|
+
return typeof formula === "string" && /^=\s*\{/.test(formula);
|
|
5612
|
+
}
|
|
5493
5613
|
function isBaseCellData(value) {
|
|
5494
5614
|
return !!value && typeof value === "object" && (Object.prototype.hasOwnProperty.call(value, "v") || Object.prototype.hasOwnProperty.call(value, "t") || Object.prototype.hasOwnProperty.call(value, "p") || Object.prototype.hasOwnProperty.call(value, "f") || Object.prototype.hasOwnProperty.call(value, "si"));
|
|
5495
5615
|
}
|
|
5496
5616
|
function resolveBaseFormulaTable(tableName, currentTable, snapshot) {
|
|
5497
5617
|
if (!tableName || tableName === "table" || tableName === currentTable.id || tableName === currentTable.name) return currentTable;
|
|
5498
5618
|
const byId = snapshot.tables[tableName];
|
|
5499
|
-
if (byId
|
|
5500
|
-
const matches = Object.values(snapshot.tables).filter((table) =>
|
|
5619
|
+
if (byId) return byId;
|
|
5620
|
+
const matches = Object.values(snapshot.tables).filter((table) => table.name === tableName);
|
|
5501
5621
|
return matches.length === 1 ? matches[0] : void 0;
|
|
5502
5622
|
}
|
|
5503
5623
|
|
|
@@ -5758,7 +5878,7 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends Disp
|
|
|
5758
5878
|
const workbook = this._univerInstanceService.getCurrentUnitOfType(UniverInstanceType.UNIVER_SHEET);
|
|
5759
5879
|
const worksheet = workbook === null || workbook === void 0 ? void 0 : workbook.getActiveSheet();
|
|
5760
5880
|
const base = workbook ? null : this._univerInstanceService.getCurrentUnitOfType(UniverInstanceType.UNIVER_BASE);
|
|
5761
|
-
const table = base ?
|
|
5881
|
+
const table = base ? getFirstBaseTable(base.getSnapshot().tables, base.getSnapshot().tableOrder) : null;
|
|
5762
5882
|
this._executeUnitId = (_workbook$getUnitId = workbook === null || workbook === void 0 ? void 0 : workbook.getUnitId()) !== null && _workbook$getUnitId !== void 0 ? _workbook$getUnitId : base === null || base === void 0 ? void 0 : base.getUnitId();
|
|
5763
5883
|
this._executeSubUnitId = (_worksheet$getSheetId = worksheet === null || worksheet === void 0 ? void 0 : worksheet.getSheetId()) !== null && _worksheet$getSheetId !== void 0 ? _worksheet$getSheetId : table === null || table === void 0 ? void 0 : table.id;
|
|
5764
5884
|
return this._formulaDataModel.getCalculateData();
|
|
@@ -5791,33 +5911,18 @@ FormulaCurrentConfigService = __decorate([
|
|
|
5791
5911
|
__decorateParam(2, Inject(FormulaDataModel)),
|
|
5792
5912
|
__decorateParam(3, Inject(ISheetRowFilteredService))
|
|
5793
5913
|
], FormulaCurrentConfigService);
|
|
5794
|
-
function
|
|
5795
|
-
var _Object$values
|
|
5914
|
+
function getFirstBaseTable(tables, tableOrder) {
|
|
5915
|
+
var _Object$values$;
|
|
5796
5916
|
for (const tableId of tableOrder) {
|
|
5797
5917
|
const table = tables[tableId];
|
|
5798
|
-
if (table
|
|
5918
|
+
if (table) return table;
|
|
5799
5919
|
}
|
|
5800
|
-
return (_Object$values$
|
|
5920
|
+
return (_Object$values$ = Object.values(tables)[0]) !== null && _Object$values$ !== void 0 ? _Object$values$ : null;
|
|
5801
5921
|
}
|
|
5802
5922
|
const IFormulaCurrentConfigService = createIdentifier("univer.formula.current-data.service");
|
|
5803
5923
|
|
|
5804
5924
|
//#endregion
|
|
5805
5925
|
//#region src/engine/analysis/lexer.ts
|
|
5806
|
-
/**
|
|
5807
|
-
* Copyright 2023-present DreamNum Co., Ltd.
|
|
5808
|
-
*
|
|
5809
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5810
|
-
* you may not use this file except in compliance with the License.
|
|
5811
|
-
* You may obtain a copy of the License at
|
|
5812
|
-
*
|
|
5813
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
5814
|
-
*
|
|
5815
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
5816
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
5817
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
5818
|
-
* See the License for the specific language governing permissions and
|
|
5819
|
-
* limitations under the License.
|
|
5820
|
-
*/
|
|
5821
5926
|
let Lexer = class Lexer extends Disposable {
|
|
5822
5927
|
constructor(_definedNamesService, _lexerTreeBuilder, _formulaCurrentConfigService) {
|
|
5823
5928
|
super();
|
|
@@ -5825,10 +5930,11 @@ let Lexer = class Lexer extends Disposable {
|
|
|
5825
5930
|
this._lexerTreeBuilder = _lexerTreeBuilder;
|
|
5826
5931
|
this._formulaCurrentConfigService = _formulaCurrentConfigService;
|
|
5827
5932
|
}
|
|
5828
|
-
treeBuilder(formulaString, transformSuffix = true) {
|
|
5933
|
+
treeBuilder(formulaString, transformSuffix = true, unitId) {
|
|
5829
5934
|
if (this._definedNamesService.getAllDefinedNamesIsEmpty()) return this._lexerTreeBuilder.treeBuilder(formulaString, transformSuffix);
|
|
5830
5935
|
return this._lexerTreeBuilder.treeBuilder(formulaString, transformSuffix, {
|
|
5831
|
-
unitId: this._formulaCurrentConfigService.getExecuteUnitId(),
|
|
5936
|
+
unitId: unitId !== null && unitId !== void 0 ? unitId : this._formulaCurrentConfigService.getExecuteUnitId(),
|
|
5937
|
+
sheetId: this._formulaCurrentConfigService.getExecuteSubUnitId(),
|
|
5832
5938
|
getValueByName: this._definedNamesService.getValueByName.bind(this._definedNamesService),
|
|
5833
5939
|
getDirtyDefinedNameMap: this._formulaCurrentConfigService.getDirtyDefinedNameMap.bind(this._formulaCurrentConfigService),
|
|
5834
5940
|
getSheetName: this._formulaCurrentConfigService.getSheetName.bind(this._formulaCurrentConfigService)
|
|
@@ -5850,10 +5956,13 @@ function getCellValue(cell) {
|
|
|
5850
5956
|
const body = cell === null || cell === void 0 ? void 0 : cell.p.body;
|
|
5851
5957
|
if (body == null) return 0;
|
|
5852
5958
|
const data = body.dataStream;
|
|
5853
|
-
return BuildTextUtils.transform.getPlainText(data);
|
|
5959
|
+
return normalizeRichTextFormulaValue(BuildTextUtils.transform.getPlainText(data));
|
|
5854
5960
|
}
|
|
5855
5961
|
return (_cell$v = cell === null || cell === void 0 ? void 0 : cell.v) !== null && _cell$v !== void 0 ? _cell$v : 0;
|
|
5856
5962
|
}
|
|
5963
|
+
function normalizeRichTextFormulaValue(value) {
|
|
5964
|
+
return value.replace(/\r\n|\r|\n/g, "\r\n");
|
|
5965
|
+
}
|
|
5857
5966
|
/**
|
|
5858
5967
|
* Extract the formula error from the cell
|
|
5859
5968
|
* @param cell
|
|
@@ -6092,24 +6201,16 @@ function reverseCompareOperator(operator) {
|
|
|
6092
6201
|
Reference https://en.wikipedia.org/wiki/Numeric_precision_in_Microsoft_Excel
|
|
6093
6202
|
*/
|
|
6094
6203
|
function plus(a, b) {
|
|
6095
|
-
|
|
6096
|
-
if (Number.isSafeInteger(result)) return result;
|
|
6097
|
-
return new Decimal(a).add(b).toNumber();
|
|
6204
|
+
return a + b;
|
|
6098
6205
|
}
|
|
6099
6206
|
function minus(a, b) {
|
|
6100
|
-
|
|
6101
|
-
if (Number.isSafeInteger(result)) return result;
|
|
6102
|
-
return new Decimal(a).sub(b).toNumber();
|
|
6207
|
+
return a - b;
|
|
6103
6208
|
}
|
|
6104
6209
|
function multiply(a, b) {
|
|
6105
|
-
|
|
6106
|
-
if (Number.isSafeInteger(result)) return result;
|
|
6107
|
-
return new Decimal(a).mul(b).toNumber();
|
|
6210
|
+
return a * b;
|
|
6108
6211
|
}
|
|
6109
6212
|
function divide(a, b) {
|
|
6110
|
-
|
|
6111
|
-
if (Number.isSafeInteger(result)) return result;
|
|
6112
|
-
return new Decimal(a).div(b).toNumber();
|
|
6213
|
+
return a / b;
|
|
6113
6214
|
}
|
|
6114
6215
|
/**
|
|
6115
6216
|
* Rounds a number to a specified number of decimal places.
|
|
@@ -6181,7 +6282,7 @@ function sqrt(base) {
|
|
|
6181
6282
|
* @returns True if numbers are equal, false otherwise.
|
|
6182
6283
|
*/
|
|
6183
6284
|
function equals(a, b) {
|
|
6184
|
-
return a === b;
|
|
6285
|
+
return a === b || stripErrorMargin(a) === stripErrorMargin(b);
|
|
6185
6286
|
}
|
|
6186
6287
|
/**
|
|
6187
6288
|
* Checks if the first number is greater than the second number.
|
|
@@ -6190,7 +6291,7 @@ function equals(a, b) {
|
|
|
6190
6291
|
* @returns True if a is greater than b, false otherwise.
|
|
6191
6292
|
*/
|
|
6192
6293
|
function greaterThan(a, b) {
|
|
6193
|
-
return a > b;
|
|
6294
|
+
return !equals(a, b) && stripErrorMargin(a) > stripErrorMargin(b);
|
|
6194
6295
|
}
|
|
6195
6296
|
/**
|
|
6196
6297
|
* Checks if the first number is greater than or equal to the second number.
|
|
@@ -6199,7 +6300,7 @@ function greaterThan(a, b) {
|
|
|
6199
6300
|
* @returns True if a is greater than or equal to b, false otherwise.
|
|
6200
6301
|
*/
|
|
6201
6302
|
function greaterThanOrEquals(a, b) {
|
|
6202
|
-
return a
|
|
6303
|
+
return equals(a, b) || stripErrorMargin(a) > stripErrorMargin(b);
|
|
6203
6304
|
}
|
|
6204
6305
|
/**
|
|
6205
6306
|
* Checks if the first number is less than the second number.
|
|
@@ -6208,7 +6309,7 @@ function greaterThanOrEquals(a, b) {
|
|
|
6208
6309
|
* @returns True if a is less than b, false otherwise.
|
|
6209
6310
|
*/
|
|
6210
6311
|
function lessThan(a, b) {
|
|
6211
|
-
return a < b;
|
|
6312
|
+
return !equals(a, b) && stripErrorMargin(a) < stripErrorMargin(b);
|
|
6212
6313
|
}
|
|
6213
6314
|
/**
|
|
6214
6315
|
* Checks if the first number is less than or equal to the second number.
|
|
@@ -6217,7 +6318,7 @@ function lessThan(a, b) {
|
|
|
6217
6318
|
* @returns True if a is less than or equal to b, false otherwise.
|
|
6218
6319
|
*/
|
|
6219
6320
|
function lessThanOrEquals(a, b) {
|
|
6220
|
-
return a
|
|
6321
|
+
return equals(a, b) || stripErrorMargin(a) < stripErrorMargin(b);
|
|
6221
6322
|
}
|
|
6222
6323
|
/**
|
|
6223
6324
|
* Complete the number to the specified accuracy and solve the accuracy error,
|
|
@@ -6485,8 +6586,8 @@ var BooleanValueObject = class BooleanValueObject extends BaseValueObject {
|
|
|
6485
6586
|
case ">=": return true;
|
|
6486
6587
|
case "=":
|
|
6487
6588
|
case "<":
|
|
6488
|
-
case "<=":
|
|
6489
|
-
case "<>": return
|
|
6589
|
+
case "<=": return false;
|
|
6590
|
+
case "<>": return true;
|
|
6490
6591
|
}
|
|
6491
6592
|
}
|
|
6492
6593
|
concatenateFront(valueObject) {
|
|
@@ -7108,12 +7209,13 @@ var StringValueObject = class StringValueObject extends BaseValueObject {
|
|
|
7108
7209
|
return BooleanValueObject.create(result);
|
|
7109
7210
|
}
|
|
7110
7211
|
_compareString(currentValue, value, operator) {
|
|
7212
|
+
const compareResult = currentValue.localeCompare(value);
|
|
7111
7213
|
switch (operator) {
|
|
7112
7214
|
case "=": return currentValue === value;
|
|
7113
|
-
case ">": return
|
|
7114
|
-
case ">=": return currentValue
|
|
7115
|
-
case "<": return
|
|
7116
|
-
case "<=": return currentValue
|
|
7215
|
+
case ">": return compareResult > 0;
|
|
7216
|
+
case ">=": return currentValue === value || compareResult > 0;
|
|
7217
|
+
case "<": return compareResult < 0;
|
|
7218
|
+
case "<=": return currentValue === value || compareResult < 0;
|
|
7117
7219
|
case "<>": return currentValue !== value;
|
|
7118
7220
|
}
|
|
7119
7221
|
}
|
|
@@ -7139,6 +7241,7 @@ var StringValueObject = class StringValueObject extends BaseValueObject {
|
|
|
7139
7241
|
}
|
|
7140
7242
|
convertToNumberObjectValue() {
|
|
7141
7243
|
const rawValue = this.getValue();
|
|
7244
|
+
if (rawValue.trim() === "") return ErrorValueObject.create("#VALUE!");
|
|
7142
7245
|
const parseData = getNumfmtParseValueFilter(rawValue);
|
|
7143
7246
|
if (parseData && parseData.z) return createNumberValueObjectByRawValue(parseData.v, parseData.z);
|
|
7144
7247
|
return createNumberValueObjectByRawValue(rawValue);
|
|
@@ -7247,6 +7350,8 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7247
7350
|
_defineProperty(this, "_sheetId", "");
|
|
7248
7351
|
_defineProperty(this, "_currentRow", -1);
|
|
7249
7352
|
_defineProperty(this, "_currentColumn", -1);
|
|
7353
|
+
_defineProperty(this, "_useInvertedIndexCache", false);
|
|
7354
|
+
_defineProperty(this, "_legacyImplicitForAggregate", false);
|
|
7250
7355
|
_defineProperty(this, "_sliceCache", /* @__PURE__ */ new Map());
|
|
7251
7356
|
_defineProperty(this, "_flattenCache", void 0);
|
|
7252
7357
|
_defineProperty(this, "_defaultValue", null);
|
|
@@ -7298,6 +7403,15 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7298
7403
|
getCurrentColumn() {
|
|
7299
7404
|
return this._currentColumn;
|
|
7300
7405
|
}
|
|
7406
|
+
usesInvertedIndexCache() {
|
|
7407
|
+
return this._useInvertedIndexCache;
|
|
7408
|
+
}
|
|
7409
|
+
usesLegacyImplicitForAggregate() {
|
|
7410
|
+
return this._legacyImplicitForAggregate;
|
|
7411
|
+
}
|
|
7412
|
+
setLegacyImplicitForAggregate(value) {
|
|
7413
|
+
this._legacyImplicitForAggregate = value;
|
|
7414
|
+
}
|
|
7301
7415
|
getArrayValue() {
|
|
7302
7416
|
return this._values;
|
|
7303
7417
|
}
|
|
@@ -7564,6 +7678,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7564
7678
|
if (itemValue == null || itemValue.isNull()) return true;
|
|
7565
7679
|
let matchObject;
|
|
7566
7680
|
if (isFuzzyMatching === true) matchObject = itemValue.compare(valueObject, "=");
|
|
7681
|
+
else if (searchType === 0 && itemValue.isNumber() && valueObject.isNumber()) matchObject = BooleanValueObject.create(Number(itemValue.getValue()) === Number(valueObject.getValue()));
|
|
7567
7682
|
else matchObject = itemValue.isEqual(valueObject);
|
|
7568
7683
|
if ((matchObject === null || matchObject === void 0 ? void 0 : matchObject.getValue()) === true) {
|
|
7569
7684
|
result = itemValue;
|
|
@@ -7686,7 +7801,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7686
7801
|
return false;
|
|
7687
7802
|
}
|
|
7688
7803
|
if (valueObject.isString() || valueObject.isNull() || valueObject.isBoolean()) return true;
|
|
7689
|
-
if (accumulatorAll.
|
|
7804
|
+
if (Number(accumulatorAll.getValue()) < Number(valueObject.getValue())) accumulatorAll = valueObject;
|
|
7690
7805
|
});
|
|
7691
7806
|
return accumulatorAll;
|
|
7692
7807
|
}
|
|
@@ -7727,7 +7842,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7727
7842
|
return accumulatorAll;
|
|
7728
7843
|
}
|
|
7729
7844
|
getNegative() {
|
|
7730
|
-
return
|
|
7845
|
+
return this.mapValue((valueObject) => NumberValueObject.create(0).minus(valueObject));
|
|
7731
7846
|
}
|
|
7732
7847
|
getReciprocal() {
|
|
7733
7848
|
return ArrayValueObject.create("{1}").divided(this);
|
|
@@ -7779,12 +7894,10 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7779
7894
|
for (let c = 0; c < columnCount; c++) {
|
|
7780
7895
|
var _this$_values;
|
|
7781
7896
|
const row = (_this$_values = this._values) === null || _this$_values === void 0 ? void 0 : _this$_values[r];
|
|
7782
|
-
|
|
7783
|
-
|
|
7784
|
-
|
|
7785
|
-
|
|
7786
|
-
else rowList[c] = NullValueObject.create();
|
|
7787
|
-
}
|
|
7897
|
+
const currentValue = this.getValueOrDefault(r, c);
|
|
7898
|
+
if (row == null && currentValue == null) rowList[c] = ErrorValueObject.create("#VALUE!");
|
|
7899
|
+
else if (currentValue) rowList[c] = callbackFn(currentValue, r, c);
|
|
7900
|
+
else rowList[c] = NullValueObject.create();
|
|
7788
7901
|
}
|
|
7789
7902
|
result.push(rowList);
|
|
7790
7903
|
}
|
|
@@ -8094,7 +8207,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8094
8207
|
* If comparison operations are conducted for a single numerical value,
|
|
8095
8208
|
* then retrieve the judgment from the inverted index. This enhances performance.
|
|
8096
8209
|
*/
|
|
8097
|
-
if (batchOperatorType === 5) {
|
|
8210
|
+
if (batchOperatorType === 5 && this._useInvertedIndexCache) {
|
|
8098
8211
|
const { rowsInCache, rowsNotInCache } = CELL_INVERTED_INDEX_CACHE.canUseCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
|
|
8099
8212
|
if (rowsInCache.length > 0) {
|
|
8100
8213
|
if (operator === "=" && !(valueObject.isString() && isWildcard(valueObject.getValue()))) {
|
|
@@ -8128,13 +8241,13 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8128
8241
|
if (rowsNotInCache.length > 0) for (const interval of rowsNotInCache) {
|
|
8129
8242
|
const [start, end] = interval;
|
|
8130
8243
|
for (let r = start; r <= end; r++) this.__batchOperatorRowValue(valueObject, column, result, batchOperatorType, r - startRow, unitId, sheetId, startRow, startColumn, operator, isCaseSensitive);
|
|
8131
|
-
CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, start, end);
|
|
8244
|
+
if (this._useInvertedIndexCache) CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, start, end);
|
|
8132
8245
|
}
|
|
8133
8246
|
return;
|
|
8134
8247
|
}
|
|
8135
8248
|
}
|
|
8136
8249
|
for (let r = 0; r < rowCount; r++) this.__batchOperatorRowValue(valueObject, column, result, batchOperatorType, r, unitId, sheetId, startRow, startColumn, operator, isCaseSensitive);
|
|
8137
|
-
CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
|
|
8250
|
+
if (this._useInvertedIndexCache) CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
|
|
8138
8251
|
}
|
|
8139
8252
|
__batchOperatorRowValue(valueObject, column, result, batchOperatorType, r, unitId, sheetId, startRow, startColumn, operator, isCaseSensitive) {
|
|
8140
8253
|
const currentValue = this.getValueOrDefault(r, column);
|
|
@@ -8184,7 +8297,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8184
8297
|
break;
|
|
8185
8298
|
}
|
|
8186
8299
|
else result[r][column] = ErrorValueObject.create("#N/A");
|
|
8187
|
-
CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column + startColumn, (currentValue === null || currentValue === void 0 ? void 0 : currentValue.isNull()) ? null : currentValue === null || currentValue === void 0 ? void 0 : currentValue.getValue(), r + startRow);
|
|
8300
|
+
if (this._useInvertedIndexCache) CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column + startColumn, (currentValue === null || currentValue === void 0 ? void 0 : currentValue.isNull()) ? null : currentValue === null || currentValue === void 0 ? void 0 : currentValue.getValue(), r + startRow);
|
|
8188
8301
|
}
|
|
8189
8302
|
_batchOperatorArray(valueObject, batchOperatorType, operator, isCaseSensitive) {
|
|
8190
8303
|
let rowCount = valueObject.getRowCount();
|
|
@@ -8255,7 +8368,9 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8255
8368
|
}
|
|
8256
8369
|
result.push(rowList);
|
|
8257
8370
|
}
|
|
8258
|
-
|
|
8371
|
+
const newArray = this._createNewArray(result, rowCount, columnCount);
|
|
8372
|
+
if (batchOperatorType === 1) newArray.setLegacyImplicitForAggregate(true);
|
|
8373
|
+
return newArray;
|
|
8259
8374
|
}
|
|
8260
8375
|
_checkArrayCalculateType(valueObject) {
|
|
8261
8376
|
if (valueObject.getRowCount() === 1 && valueObject.getColumnCount() === 1) return 3;
|
|
@@ -8272,6 +8387,8 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8272
8387
|
this._sheetId = rawValue.sheetId;
|
|
8273
8388
|
this._currentRow = rawValue.row;
|
|
8274
8389
|
this._currentColumn = rawValue.column;
|
|
8390
|
+
this._useInvertedIndexCache = rawValue.useInvertedIndexCache === true;
|
|
8391
|
+
this._legacyImplicitForAggregate = rawValue.legacyImplicitForAggregate === true;
|
|
8275
8392
|
return rawValue.calculateValueList;
|
|
8276
8393
|
}
|
|
8277
8394
|
rawValue = rawValue.slice(1, -1);
|
|
@@ -8294,7 +8411,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8294
8411
|
this._columnCount = maxColumnCount;
|
|
8295
8412
|
return result;
|
|
8296
8413
|
}
|
|
8297
|
-
_createNewArray(result, rowCount, columnCount, row =
|
|
8414
|
+
_createNewArray(result, rowCount, columnCount, row = this._currentRow, column = this._currentColumn) {
|
|
8298
8415
|
if (this._currentColumn === -1 || this._currentRow === -1) {
|
|
8299
8416
|
row = -1;
|
|
8300
8417
|
column = -1;
|
|
@@ -8410,14 +8527,14 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8410
8527
|
}
|
|
8411
8528
|
iterator(callback) {
|
|
8412
8529
|
const { startRow, endRow, startColumn, endColumn } = this.getRangePosition();
|
|
8413
|
-
if (this._checkIfWorksheetMiss()) return callback(ErrorValueObject.create("#
|
|
8530
|
+
if (this._checkIfWorksheetMiss()) return callback(ErrorValueObject.create("#REF!"), startRow, startColumn);
|
|
8414
8531
|
const unitId = this._forcedUnitId || this._defaultUnitId;
|
|
8415
8532
|
const sheetId = this._forcedSheetId || this._defaultSheetId;
|
|
8416
8533
|
for (let r = startRow; r <= endRow; r++) for (let c = startColumn; c <= endColumn; c++) {
|
|
8417
8534
|
if (r < 0 || c < 0) return callback(ErrorValueObject.create("#REF!"), r, c);
|
|
8418
8535
|
const cell = this.getCellData(r, c);
|
|
8419
8536
|
let result = false;
|
|
8420
|
-
if (isNullCell(cell)) {
|
|
8537
|
+
if (isNullCell(cell) && !isTypedEmptyStringCell(cell)) {
|
|
8421
8538
|
result = callback(null, r, c);
|
|
8422
8539
|
continue;
|
|
8423
8540
|
}
|
|
@@ -8434,7 +8551,7 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8434
8551
|
}
|
|
8435
8552
|
}
|
|
8436
8553
|
getFirstCell() {
|
|
8437
|
-
if (this._checkIfWorksheetMiss()) return ErrorValueObject.create("#
|
|
8554
|
+
if (this._checkIfWorksheetMiss()) return ErrorValueObject.create("#REF!");
|
|
8438
8555
|
const { startRow, startColumn } = this.getRangePosition();
|
|
8439
8556
|
const cell = this.getCellData(startRow, startColumn);
|
|
8440
8557
|
if (!cell) return NumberValueObject.create(0);
|
|
@@ -8613,14 +8730,15 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8613
8730
|
}
|
|
8614
8731
|
getCellValueObject(cell) {
|
|
8615
8732
|
const value = getCellValue(cell);
|
|
8733
|
+
const cellValueType = Number(cell.t);
|
|
8616
8734
|
if (ERROR_TYPE_SET.has(value)) return ErrorValueObject.create(value);
|
|
8617
|
-
if (
|
|
8735
|
+
if (cellValueType === CellValueType.NUMBER) {
|
|
8618
8736
|
const pattern = this._getPatternByCell(cell);
|
|
8619
8737
|
if (isTextFormat(pattern)) return StringValueObject.create(value.toString());
|
|
8620
8738
|
return createNumberValueObjectByRawValue(value, pattern);
|
|
8621
8739
|
}
|
|
8622
|
-
if (
|
|
8623
|
-
if (
|
|
8740
|
+
if (cellValueType === CellValueType.STRING || cellValueType === CellValueType.FORCE_STRING) return StringValueObject.create(value.toString());
|
|
8741
|
+
if (cellValueType === CellValueType.BOOLEAN) return createBooleanValueObjectByRawValue(value);
|
|
8624
8742
|
return ValueObjectFactory.create(value);
|
|
8625
8743
|
}
|
|
8626
8744
|
_getPatternByCell(cell) {
|
|
@@ -8696,7 +8814,7 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8696
8814
|
if (!row) row = rangeData.startRow;
|
|
8697
8815
|
if (!column) column = rangeData.startColumn;
|
|
8698
8816
|
const cell = this.getCellData(row, column);
|
|
8699
|
-
if (!cell) return
|
|
8817
|
+
if (!cell) return NullValueObject.create();
|
|
8700
8818
|
return this.getCellValueObject(cell);
|
|
8701
8819
|
}
|
|
8702
8820
|
setCurrentRowAndColumn(row, column) {
|
|
@@ -8750,7 +8868,8 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8750
8868
|
unitId: this.getUnitId(),
|
|
8751
8869
|
sheetId: this.getSheetId(),
|
|
8752
8870
|
row: startRow,
|
|
8753
|
-
column: startColumn
|
|
8871
|
+
column: startColumn,
|
|
8872
|
+
useInvertedIndexCache: true
|
|
8754
8873
|
};
|
|
8755
8874
|
const arrayValueObject = ArrayValueObject.create(arrayValueObjectData);
|
|
8756
8875
|
useCache && FORMULA_REF_TO_ARRAY_CACHE.set(key, arrayValueObject);
|
|
@@ -8780,6 +8899,9 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8780
8899
|
return ArrayValueObject.create(arrayValueObjectData);
|
|
8781
8900
|
}
|
|
8782
8901
|
};
|
|
8902
|
+
function isTypedEmptyStringCell(cell) {
|
|
8903
|
+
return (cell === null || cell === void 0 ? void 0 : cell.v) === "" && (cell.t === CellValueType.STRING || cell.t === CellValueType.FORCE_STRING);
|
|
8904
|
+
}
|
|
8783
8905
|
var AsyncObject = class extends ObjectClassType {
|
|
8784
8906
|
constructor(_promise) {
|
|
8785
8907
|
super();
|
|
@@ -8841,6 +8963,8 @@ var RangeReferenceObject = class extends BaseReferenceObject {
|
|
|
8841
8963
|
|
|
8842
8964
|
//#endregion
|
|
8843
8965
|
//#region src/engine/reference-object/cell-reference-object.ts
|
|
8966
|
+
const EXCEL_MAX_ROWS = 1048576;
|
|
8967
|
+
const EXCEL_MAX_COLUMNS = 16384;
|
|
8844
8968
|
var CellReferenceObject = class extends BaseReferenceObject {
|
|
8845
8969
|
constructor(token) {
|
|
8846
8970
|
super(token);
|
|
@@ -8852,6 +8976,12 @@ var CellReferenceObject = class extends BaseReferenceObject {
|
|
|
8852
8976
|
isCell() {
|
|
8853
8977
|
return true;
|
|
8854
8978
|
}
|
|
8979
|
+
isExceedRange() {
|
|
8980
|
+
var _this$getForcedSheetI;
|
|
8981
|
+
if ((this.getForcedSheetId() == null || ((_this$getForcedSheetI = this.getForcedSheetId()) === null || _this$getForcedSheetI === void 0 ? void 0 : _this$getForcedSheetI.length) === 0) && this.getForcedSheetName().length > 0) return true;
|
|
8982
|
+
const { startRow, endRow, startColumn, endColumn } = this.getRangePosition();
|
|
8983
|
+
return startRow < 0 || startColumn < 0 || endRow >= EXCEL_MAX_ROWS || endColumn >= EXCEL_MAX_COLUMNS;
|
|
8984
|
+
}
|
|
8855
8985
|
unionBy(referenceObject) {
|
|
8856
8986
|
if (!referenceObject.isCell()) return ErrorValueObject.create("#REF!");
|
|
8857
8987
|
const cellReferenceObject = referenceObject;
|
|
@@ -9335,11 +9465,11 @@ function getPairedRangeAndCriteriaResult(variants, params) {
|
|
|
9335
9465
|
result = sum.divided(count);
|
|
9336
9466
|
} else if (formulaName === "MAXIFS") {
|
|
9337
9467
|
const picked = targetRange.pick(finalCompareResult);
|
|
9338
|
-
if (picked.getColumnCount() === 0) result =
|
|
9468
|
+
if (picked.getColumnCount() === 0) result = NumberValueObject.create(0);
|
|
9339
9469
|
else result = picked.max();
|
|
9340
9470
|
} else if (formulaName === "MINIFS") {
|
|
9341
9471
|
const picked = targetRange.pick(finalCompareResult);
|
|
9342
|
-
if (picked.getColumnCount() === 0) result =
|
|
9472
|
+
if (picked.getColumnCount() === 0) result = NumberValueObject.create(0);
|
|
9343
9473
|
else result = picked.min();
|
|
9344
9474
|
}
|
|
9345
9475
|
if (!results[rowIndex]) results[rowIndex] = [];
|
|
@@ -9351,13 +9481,25 @@ function getPairedRangeAndCriteriaResult(variants, params) {
|
|
|
9351
9481
|
* Two ArrayValueObject of the same type can be compared
|
|
9352
9482
|
*/
|
|
9353
9483
|
function filterSameValueObjectResult(array, range, criteria) {
|
|
9354
|
-
const [operator, criteriaObject] = findCompareToken(`${criteria.getValue()}`);
|
|
9484
|
+
const [operator, criteriaObject] = criteria.isString() ? findCompareToken(`${criteria.getValue()}`) : ["=", criteria];
|
|
9355
9485
|
return array.mapValue((valueObject, r, c) => {
|
|
9356
9486
|
const rangeValueObject = range.get(r, c);
|
|
9487
|
+
const isBlankStringCriteria = criteriaObject.isString() && criteriaObject.getValue() === "";
|
|
9488
|
+
if (operator === "<>" && isBlankStringCriteria && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString()) && rangeValueObject.getValue() === "") return BooleanValueObject.create(true);
|
|
9489
|
+
if (criteriaObject.isString() && criteriaObject.getValue() !== "" && (operator === "<" || operator === "<=") && (rangeValueObject == null || rangeValueObject.isNull() || rangeValueObject.isString() && rangeValueObject.getValue() === "")) return BooleanValueObject.create(false);
|
|
9490
|
+
if (criteriaObject.isString() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString()) && (operator === "<" || operator === "<=") && isSameLowerBoundBucket(rangeValueObject.getValue(), criteriaObject.getValue())) return BooleanValueObject.create(false);
|
|
9491
|
+
if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isNumber()) && criteriaObject.isString()) {
|
|
9492
|
+
const criteriaNumber = criteriaObject.convertToNumberObjectValue();
|
|
9493
|
+
if (criteriaNumber.isNumber()) return rangeValueObject.compare(criteriaNumber, operator);
|
|
9494
|
+
}
|
|
9495
|
+
if (criteriaObject.isNumber() && criteriaObject.isDateFormat() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString())) {
|
|
9496
|
+
const rangeNumber = rangeValueObject.convertToNumberObjectValue();
|
|
9497
|
+
if (rangeNumber.isNumber()) return rangeNumber.compare(criteriaObject, operator);
|
|
9498
|
+
}
|
|
9357
9499
|
if (rangeValueObject && isSameValueObjectType(rangeValueObject, criteriaObject)) return valueObject;
|
|
9358
9500
|
if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isError()) && criteriaObject.isError() && rangeValueObject.getValue() === criteriaObject.getValue()) return BooleanValueObject.create(true);
|
|
9359
9501
|
/**
|
|
9360
|
-
* If the operator is '=' or '<>', we can compare numbers
|
|
9502
|
+
* If the operator is '=' or '<>', we can compare string numbers against numeric criteria directly in COUNTIF, COUNTIFS, SUMIF, SUMIFS, etc.
|
|
9361
9503
|
* Other operators require both valueObjects to be of the same type.
|
|
9362
9504
|
* For example:
|
|
9363
9505
|
* | A1 | B1 |
|
|
@@ -9369,10 +9511,6 @@ function filterSameValueObjectResult(array, range, criteria) {
|
|
|
9369
9511
|
* =COUNTIF(A1:B1, '<=123') will return 1
|
|
9370
9512
|
*/
|
|
9371
9513
|
if (operator === "=" || operator === "<>") {
|
|
9372
|
-
if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isNumber()) && criteriaObject.isString()) {
|
|
9373
|
-
const criteriaNumber = criteriaObject.convertToNumberObjectValue();
|
|
9374
|
-
if (criteriaNumber.isNumber()) return rangeValueObject.compare(criteriaNumber, operator);
|
|
9375
|
-
}
|
|
9376
9514
|
if (criteriaObject.isNumber() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString())) {
|
|
9377
9515
|
const rangeNumber = rangeValueObject.convertToNumberObjectValue();
|
|
9378
9516
|
if (rangeNumber.isNumber()) return rangeNumber.compare(criteriaObject, operator);
|
|
@@ -9383,6 +9521,11 @@ function filterSameValueObjectResult(array, range, criteria) {
|
|
|
9383
9521
|
return BooleanValueObject.create(false);
|
|
9384
9522
|
});
|
|
9385
9523
|
}
|
|
9524
|
+
function isSameLowerBoundBucket(rangeValue, criteriaValue) {
|
|
9525
|
+
const criteriaMatch = criteriaValue.match(/^(\d+)\|/);
|
|
9526
|
+
const rangeMatch = rangeValue.match(/^(\d+)-/);
|
|
9527
|
+
return criteriaMatch != null && rangeMatch != null && criteriaMatch[1] === rangeMatch[1];
|
|
9528
|
+
}
|
|
9386
9529
|
/**
|
|
9387
9530
|
* Check if the two valueObjects are of the same type
|
|
9388
9531
|
* @param left
|
|
@@ -9483,6 +9626,7 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
|
|
|
9483
9626
|
_defineProperty(this, "_currentColumn", -1);
|
|
9484
9627
|
_defineProperty(this, "_currentRowCount", Number.NEGATIVE_INFINITY);
|
|
9485
9628
|
_defineProperty(this, "_currentColumnCount", Number.NEGATIVE_INFINITY);
|
|
9629
|
+
_defineProperty(this, "_functionRefInfoOverrideStack", []);
|
|
9486
9630
|
_defineProperty(this, "_currentSubUnitId", "");
|
|
9487
9631
|
_defineProperty(this, "_currentUnitId", "");
|
|
9488
9632
|
_defineProperty(this, "_runtimeData", {});
|
|
@@ -9511,10 +9655,12 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
|
|
|
9511
9655
|
return this._currentColumn;
|
|
9512
9656
|
}
|
|
9513
9657
|
get currentRowCount() {
|
|
9514
|
-
|
|
9658
|
+
var _this$_functionRefInf, _this$_functionRefInf2;
|
|
9659
|
+
return (_this$_functionRefInf = (_this$_functionRefInf2 = this._functionRefInfoOverrideStack[this._functionRefInfoOverrideStack.length - 1]) === null || _this$_functionRefInf2 === void 0 ? void 0 : _this$_functionRefInf2.rowCount) !== null && _this$_functionRefInf !== void 0 ? _this$_functionRefInf : this._currentRowCount;
|
|
9515
9660
|
}
|
|
9516
9661
|
get currentColumnCount() {
|
|
9517
|
-
|
|
9662
|
+
var _this$_functionRefInf3, _this$_functionRefInf4;
|
|
9663
|
+
return (_this$_functionRefInf3 = (_this$_functionRefInf4 = this._functionRefInfoOverrideStack[this._functionRefInfoOverrideStack.length - 1]) === null || _this$_functionRefInf4 === void 0 ? void 0 : _this$_functionRefInf4.columnCount) !== null && _this$_functionRefInf3 !== void 0 ? _this$_functionRefInf3 : this._currentColumnCount;
|
|
9518
9664
|
}
|
|
9519
9665
|
get currentSubUnitId() {
|
|
9520
9666
|
return this._currentSubUnitId;
|
|
@@ -9608,6 +9754,7 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
|
|
|
9608
9754
|
this._isCycleDependency = false;
|
|
9609
9755
|
this._totalFormulasToCalculate = 0;
|
|
9610
9756
|
this._completedFormulasCount = 0;
|
|
9757
|
+
this._functionRefInfoOverrideStack = [];
|
|
9611
9758
|
this.clearReferenceAndNumberformatCache();
|
|
9612
9759
|
}
|
|
9613
9760
|
clearReferenceAndNumberformatCache() {
|
|
@@ -9623,6 +9770,15 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
|
|
|
9623
9770
|
this._currentSubUnitId = sheetId;
|
|
9624
9771
|
this._currentUnitId = unitId;
|
|
9625
9772
|
}
|
|
9773
|
+
setFunctionRefInfoOverride(rowCount, columnCount) {
|
|
9774
|
+
this._functionRefInfoOverrideStack.push({
|
|
9775
|
+
rowCount,
|
|
9776
|
+
columnCount
|
|
9777
|
+
});
|
|
9778
|
+
return () => {
|
|
9779
|
+
this._functionRefInfoOverrideStack.pop();
|
|
9780
|
+
};
|
|
9781
|
+
}
|
|
9626
9782
|
clearFunctionDefinitionPrivacyVar() {
|
|
9627
9783
|
this._functionDefinitionPrivacyVar.clear();
|
|
9628
9784
|
}
|
|
@@ -9686,13 +9842,22 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
|
|
|
9686
9842
|
* then it is not treated as an array range and is directly assigned.
|
|
9687
9843
|
*/
|
|
9688
9844
|
if (startRow === endRow && startColumn === endColumn) {
|
|
9689
|
-
const
|
|
9845
|
+
const firstCellRaw = objectValueRefOrArray.getFirstCell();
|
|
9846
|
+
const firstCell = firstCellRaw.isNull() ? NumberValueObject.create(0) : firstCellRaw;
|
|
9690
9847
|
const valueObject = this._getValueObjectOfRuntimeData(firstCell);
|
|
9691
9848
|
sheetData.setValue(row, column, valueObject);
|
|
9692
9849
|
clearArrayUnitData.setValue(row, column, valueObject);
|
|
9693
9850
|
CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column, firstCell.getValue(), row, true);
|
|
9694
9851
|
return;
|
|
9695
9852
|
}
|
|
9853
|
+
if (this._isCurrentSingleCellArrayFormulaRange(unitId, sheetId, row, column)) {
|
|
9854
|
+
const errorObject = this._getValueObjectOfRuntimeData(ErrorValueObject.create("#VALUE!"));
|
|
9855
|
+
sheetData.setValue(row, column, errorObject);
|
|
9856
|
+
clearArrayUnitData.setValue(row, column, errorObject);
|
|
9857
|
+
runtimeArrayUnitData.setValue(row, column, errorObject);
|
|
9858
|
+
CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column, "#VALUE!", row, true);
|
|
9859
|
+
return;
|
|
9860
|
+
}
|
|
9696
9861
|
const arrayRange = {
|
|
9697
9862
|
startRow: row,
|
|
9698
9863
|
startColumn: column,
|
|
@@ -9904,6 +10069,11 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
|
|
|
9904
10069
|
});
|
|
9905
10070
|
return isCellOverlapping;
|
|
9906
10071
|
}
|
|
10072
|
+
_isCurrentSingleCellArrayFormulaRange(unitId, sheetId, row, column) {
|
|
10073
|
+
var _this$_currentConfigS4;
|
|
10074
|
+
const range = (_this$_currentConfigS4 = this._currentConfigService.getArrayFormulaRange()[unitId]) === null || _this$_currentConfigS4 === void 0 || (_this$_currentConfigS4 = _this$_currentConfigS4[sheetId]) === null || _this$_currentConfigS4 === void 0 || (_this$_currentConfigS4 = _this$_currentConfigS4[row]) === null || _this$_currentConfigS4 === void 0 ? void 0 : _this$_currentConfigS4[column];
|
|
10075
|
+
return range != null && range.startRow === range.endRow && range.startColumn === range.endColumn;
|
|
10076
|
+
}
|
|
9907
10077
|
_isInArrayFormulaRange(range, r, c) {
|
|
9908
10078
|
if (range == null) return false;
|
|
9909
10079
|
const { startRow, startColumn, endRow, endColumn } = range;
|
|
@@ -10142,18 +10312,23 @@ const FORMULA_CACHE_LRU_COUNT = 5e3;
|
|
|
10142
10312
|
const FORMULA_AST_CACHE = new FormulaAstLRU(FORMULA_CACHE_LRU_COUNT);
|
|
10143
10313
|
const DIRTY_DEFINED_NAME_SET_CACHE = /* @__PURE__ */ new WeakMap();
|
|
10144
10314
|
const DIRTY_SUPER_TABLE_PATTERN_CACHE = /* @__PURE__ */ new WeakMap();
|
|
10145
|
-
function generateAstNode(unitId, formulaString, lexer, astTreeBuilder, currentConfigService) {
|
|
10146
|
-
|
|
10147
|
-
|
|
10148
|
-
|
|
10149
|
-
|
|
10315
|
+
function generateAstNode(unitId, formulaString, lexer, astTreeBuilder, currentConfigService, subUnitId) {
|
|
10316
|
+
var _ref;
|
|
10317
|
+
if (subUnitId) {
|
|
10318
|
+
currentConfigService.setExecuteUnitId(unitId);
|
|
10319
|
+
currentConfigService.setExecuteSubUnitId(subUnitId);
|
|
10320
|
+
}
|
|
10321
|
+
const cacheKey = `${unitId}:${(_ref = subUnitId !== null && subUnitId !== void 0 ? subUnitId : currentConfigService.getExecuteSubUnitId()) !== null && _ref !== void 0 ? _ref : ""}:${formulaString}`;
|
|
10322
|
+
let astNode = FORMULA_AST_CACHE.get(cacheKey);
|
|
10323
|
+
if (!(checkIsChangedByDefinedName(unitId, formulaString, currentConfigService) || checkIsChangedBySuperTable(unitId, formulaString, currentConfigService)) && astNode && !isDirtyDefinedForNode(astNode, currentConfigService, unitId)) return astNode;
|
|
10324
|
+
const lexerNode = lexer.treeBuilder(formulaString, true, unitId);
|
|
10150
10325
|
if (ERROR_TYPE_SET.has(lexerNode)) return ErrorNode.create(lexerNode);
|
|
10151
10326
|
astNode = astTreeBuilder.parse(lexerNode);
|
|
10152
10327
|
if (astNode == null) {
|
|
10153
10328
|
console.error("generateAstNode astNode is null");
|
|
10154
10329
|
return ErrorNode.create(lexerNode);
|
|
10155
10330
|
}
|
|
10156
|
-
|
|
10331
|
+
FORMULA_AST_CACHE.set(cacheKey, astNode);
|
|
10157
10332
|
return astNode;
|
|
10158
10333
|
}
|
|
10159
10334
|
function checkIsChangedByDefinedName(unitId, formula, currentConfigService) {
|
|
@@ -10184,15 +10359,15 @@ function getNormalizedDirtyDefinedNameSet(unitDefinedNameMap) {
|
|
|
10184
10359
|
function getDirtySuperTableReferencePattern(unitSuperTableMap) {
|
|
10185
10360
|
let tableReferencePattern = DIRTY_SUPER_TABLE_PATTERN_CACHE.get(unitSuperTableMap);
|
|
10186
10361
|
if (tableReferencePattern === void 0) {
|
|
10187
|
-
const
|
|
10188
|
-
tableReferencePattern =
|
|
10362
|
+
const tableNames = Object.keys(unitSuperTableMap).filter((tableName) => tableName.length > 0);
|
|
10363
|
+
tableReferencePattern = tableNames.length > 0 ? regexp.createRegExpFromSafeFragment(`(^|[^A-Za-z0-9_])${regexp.or(...tableNames)}(\\s*\\[|$|[^A-Za-z0-9_])`, "i") : null;
|
|
10189
10364
|
DIRTY_SUPER_TABLE_PATTERN_CACHE.set(unitSuperTableMap, tableReferencePattern);
|
|
10190
10365
|
}
|
|
10191
10366
|
return tableReferencePattern;
|
|
10192
10367
|
}
|
|
10193
|
-
function isDirtyDefinedForNode(node, currentConfigService) {
|
|
10368
|
+
function isDirtyDefinedForNode(node, currentConfigService, unitId) {
|
|
10194
10369
|
const definedNameMap = currentConfigService.getDirtyDefinedNameMap();
|
|
10195
|
-
const executeUnitId =
|
|
10370
|
+
const executeUnitId = unitId;
|
|
10196
10371
|
if (executeUnitId != null && definedNameMap[executeUnitId] != null) {
|
|
10197
10372
|
const names = Object.keys(definedNameMap[executeUnitId]);
|
|
10198
10373
|
for (let i = 0, len = names.length; i < len; i++) {
|
|
@@ -10207,7 +10382,7 @@ function includeDefinedName(tree, node, currentConfigService) {
|
|
|
10207
10382
|
* Detect whether the dirty map contains a defined name.
|
|
10208
10383
|
*/
|
|
10209
10384
|
if (node != null) {
|
|
10210
|
-
if (isDirtyDefinedForNode(node, currentConfigService)) return true;
|
|
10385
|
+
if (isDirtyDefinedForNode(node, currentConfigService, tree.unitId)) return true;
|
|
10211
10386
|
}
|
|
10212
10387
|
return false;
|
|
10213
10388
|
}
|
|
@@ -10317,6 +10492,7 @@ var PrefixNode = class extends BaseAstNode {
|
|
|
10317
10492
|
if (!value.isReferenceObject()) return ErrorValueObject.create("#VALUE!");
|
|
10318
10493
|
const currentValue = value;
|
|
10319
10494
|
if (currentValue.isCell()) return ErrorValueObject.create("#VALUE!");
|
|
10495
|
+
if (this._preserveAtRangeForFormula2LookupArray()) return currentValue;
|
|
10320
10496
|
const runtimeService = this._runtimeService;
|
|
10321
10497
|
const currentRow = runtimeService.currentRow || 0;
|
|
10322
10498
|
const currentColumn = runtimeService.currentColumn || 0;
|
|
@@ -10328,6 +10504,22 @@ var PrefixNode = class extends BaseAstNode {
|
|
|
10328
10504
|
if (currentValue.isTable()) return currentValue.getCellByPosition(currentRow);
|
|
10329
10505
|
return ErrorValueObject.create("#VALUE!");
|
|
10330
10506
|
}
|
|
10507
|
+
_preserveAtRangeForFormula2LookupArray() {
|
|
10508
|
+
let node = this;
|
|
10509
|
+
let parent = node.getParent();
|
|
10510
|
+
let sawCompareOperator = false;
|
|
10511
|
+
while (parent != null) {
|
|
10512
|
+
if (parent.nodeType === 3) sawCompareOperator || (sawCompareOperator = OPERATOR_TOKEN_COMPARE_SET.has(parent.getToken()));
|
|
10513
|
+
if (parent.nodeType === 4) {
|
|
10514
|
+
const functionName = parent.getToken().toUpperCase();
|
|
10515
|
+
if (sawCompareOperator && functionName === "XMATCH") return parent.getChildren().indexOf(node) === 1;
|
|
10516
|
+
return false;
|
|
10517
|
+
}
|
|
10518
|
+
node = parent;
|
|
10519
|
+
parent = parent.getParent();
|
|
10520
|
+
}
|
|
10521
|
+
return false;
|
|
10522
|
+
}
|
|
10331
10523
|
};
|
|
10332
10524
|
let PrefixNodeFactory = class PrefixNodeFactory extends BaseAstNodeFactory {
|
|
10333
10525
|
constructor(_functionService, _runtimeService) {
|
|
@@ -10402,41 +10594,43 @@ var FunctionNode = class extends BaseAstNode {
|
|
|
10402
10594
|
return 4;
|
|
10403
10595
|
}
|
|
10404
10596
|
async executeAsync() {
|
|
10405
|
-
const variants = [];
|
|
10406
10597
|
const children = this.getChildren();
|
|
10407
|
-
const childrenCount = children.length;
|
|
10408
10598
|
this._compatibility();
|
|
10409
|
-
|
|
10410
|
-
const object = children[i].getValue();
|
|
10411
|
-
if (object == null) continue;
|
|
10412
|
-
if (object.isReferenceObject() && !this._functionExecutor.needsReferenceObject) variants.push(object.toArrayValueObject());
|
|
10413
|
-
else variants.push(object);
|
|
10414
|
-
}
|
|
10415
|
-
const resultVariant = await this._calculateAsync(variants);
|
|
10599
|
+
const resultVariant = this._functionExecutor.needsAstChildren ? this._calculateAst(children) : await this._calculateAsync(this._collectVariants(children));
|
|
10416
10600
|
let result;
|
|
10417
10601
|
if (resultVariant.isAsyncObject() || resultVariant.isAsyncArrayObject()) result = await resultVariant.getValue();
|
|
10418
10602
|
else result = resultVariant;
|
|
10603
|
+
result = this._normalizeTopLevelLegacyArrayResult(result);
|
|
10419
10604
|
this._setEmbeddedArrayFormulaToResult(result);
|
|
10420
10605
|
this._setRefData(result);
|
|
10421
10606
|
this.setValue(result);
|
|
10422
10607
|
return Promise.resolve(0);
|
|
10423
10608
|
}
|
|
10424
10609
|
execute() {
|
|
10425
|
-
const variants = [];
|
|
10426
10610
|
const children = this.getChildren();
|
|
10427
|
-
const childrenCount = children.length;
|
|
10428
10611
|
this._compatibility();
|
|
10612
|
+
const resultVariant = this._functionExecutor.needsAstChildren ? this._calculateAst(children) : this._calculate(this._collectVariants(children));
|
|
10613
|
+
const result = this._normalizeTopLevelLegacyArrayResult(resultVariant);
|
|
10614
|
+
this._setEmbeddedArrayFormulaToResult(result);
|
|
10615
|
+
this._setRefData(result);
|
|
10616
|
+
this.setValue(result);
|
|
10617
|
+
}
|
|
10618
|
+
_collectVariants(children) {
|
|
10619
|
+
const variants = [];
|
|
10620
|
+
const childrenCount = children.length;
|
|
10429
10621
|
for (let i = 0; i < childrenCount; i++) {
|
|
10430
|
-
const object = children[i]
|
|
10622
|
+
const object = this._getChildVariant(children[i]);
|
|
10431
10623
|
if (object == null) continue;
|
|
10432
|
-
|
|
10433
|
-
if (object.isReferenceObject() && !this._functionExecutor.needsReferenceObject) variants.push(object.toArrayValueObject());
|
|
10434
|
-
else variants.push(object);
|
|
10624
|
+
variants.push(object);
|
|
10435
10625
|
}
|
|
10436
|
-
|
|
10437
|
-
|
|
10438
|
-
|
|
10439
|
-
|
|
10626
|
+
return variants;
|
|
10627
|
+
}
|
|
10628
|
+
_getChildVariant(child) {
|
|
10629
|
+
const object = child.getValue();
|
|
10630
|
+
if (object == null) return;
|
|
10631
|
+
if (object.isReferenceObject() && this._functionExecutor.needsFilteredOutRows) this._setFilteredOutRows(object);
|
|
10632
|
+
if (object.isReferenceObject() && !this._functionExecutor.needsReferenceObject) return object.toArrayValueObject();
|
|
10633
|
+
return object;
|
|
10440
10634
|
}
|
|
10441
10635
|
isFunctionExecutorArgumentsIgnoreNumberPattern() {
|
|
10442
10636
|
return this._functionExecutor.isArgumentsIgnoreNumberPattern();
|
|
@@ -10451,6 +10645,14 @@ var FunctionNode = class extends BaseAstNode {
|
|
|
10451
10645
|
if (rowCount <= 1 && colCount <= 1) return;
|
|
10452
10646
|
this._runtimeService.setUnitArrayFormulaEmbeddedMap();
|
|
10453
10647
|
}
|
|
10648
|
+
_normalizeTopLevelLegacyArrayResult(result) {
|
|
10649
|
+
const parent = this.getParent();
|
|
10650
|
+
const isTopLevel = parent == null || parent.nodeType === 9;
|
|
10651
|
+
if (!this._functionExecutor.returnsLegacyArrayAsScalar || !isTopLevel || !result.isArray()) return result;
|
|
10652
|
+
const array = result;
|
|
10653
|
+
if (array.getRowCount() <= 1 && array.getColumnCount() <= 1) return result;
|
|
10654
|
+
return array.getFirstCell();
|
|
10655
|
+
}
|
|
10454
10656
|
/**
|
|
10455
10657
|
* Compatibility handling for special functions.
|
|
10456
10658
|
*/
|
|
@@ -10535,6 +10737,16 @@ var FunctionNode = class extends BaseAstNode {
|
|
|
10535
10737
|
}
|
|
10536
10738
|
return resultVariant;
|
|
10537
10739
|
}
|
|
10740
|
+
_calculateAst(children) {
|
|
10741
|
+
const { minParams, maxParams } = this._functionExecutor;
|
|
10742
|
+
if (minParams !== -1 && maxParams !== -1 && (children.length < minParams || children.length > maxParams)) return ErrorValueObject.create("#N/A");
|
|
10743
|
+
this._setRefInfo();
|
|
10744
|
+
this._handleAddressFunction();
|
|
10745
|
+
return this._functionExecutor.calculateAst(children, (node) => {
|
|
10746
|
+
var _this$_getChildVarian;
|
|
10747
|
+
return (_this$_getChildVarian = this._getChildVariant(node)) !== null && _this$_getChildVarian !== void 0 ? _this$_getChildVarian : null;
|
|
10748
|
+
});
|
|
10749
|
+
}
|
|
10538
10750
|
async _calculateAsync(variants) {
|
|
10539
10751
|
const { minParams, maxParams } = this._functionExecutor;
|
|
10540
10752
|
if (minParams !== -1 && maxParams !== -1 && (variants.length < minParams || variants.length > maxParams)) return ErrorValueObject.create("#N/A");
|
|
@@ -10550,15 +10762,15 @@ var FunctionNode = class extends BaseAstNode {
|
|
|
10550
10762
|
return resultVariant;
|
|
10551
10763
|
}
|
|
10552
10764
|
_setDefinedNamesForFunction() {
|
|
10553
|
-
const editorUnitId = this.
|
|
10765
|
+
const editorUnitId = this._runtimeService.currentUnitId;
|
|
10554
10766
|
if (editorUnitId == null) return;
|
|
10555
10767
|
const definedNames = this._definedNamesService.getDefinedNameMap(editorUnitId);
|
|
10556
10768
|
if (definedNames == null) return;
|
|
10557
10769
|
this._functionExecutor.setDefinedNames(definedNames);
|
|
10558
10770
|
}
|
|
10559
10771
|
_setRefInfo() {
|
|
10560
|
-
const { currentUnitId, currentSubUnitId, currentRow, currentColumn } = this._runtimeService;
|
|
10561
|
-
this._functionExecutor.setRefInfo(currentUnitId, currentSubUnitId, currentRow, currentColumn);
|
|
10772
|
+
const { currentUnitId, currentSubUnitId, currentRow, currentColumn, currentRowCount, currentColumnCount } = this._runtimeService;
|
|
10773
|
+
this._functionExecutor.setRefInfo(currentUnitId, currentSubUnitId, currentRow, currentColumn, currentRowCount, currentColumnCount);
|
|
10562
10774
|
if (this._functionExecutor.needsSheetRowColumnCount) {
|
|
10563
10775
|
const { rowCount, columnCount } = this._currentConfigService.getSheetRowColumnCount(currentUnitId, currentSubUnitId);
|
|
10564
10776
|
this._functionExecutor.setSheetRowColumnCount(rowCount, columnCount);
|
|
@@ -10629,7 +10841,7 @@ let FunctionNodeFactory = class FunctionNodeFactory extends BaseAstNodeFactory {
|
|
|
10629
10841
|
const { tokenTrim, minusPrefixNode, atPrefixNode } = prefixHandler(param.getToken().trim(), this._functionService, this._runtimeService);
|
|
10630
10842
|
const isColon = this._isParentUnionNode(param);
|
|
10631
10843
|
if (!Number.isNaN(Number(tokenTrim)) && !isColon) return ErrorNode.create("#VALUE!");
|
|
10632
|
-
const tokenTrimUpper = tokenTrim.toUpperCase();
|
|
10844
|
+
const tokenTrimUpper = normalizeFunctionToken(tokenTrim.toUpperCase());
|
|
10633
10845
|
if (isColon && COLUMN_LIKE_FUNCTION_NAMES.has(tokenTrimUpper)) return;
|
|
10634
10846
|
if (this._functionService.hasExecutor(tokenTrimUpper)) {
|
|
10635
10847
|
const functionNode = this.create(tokenTrimUpper);
|
|
@@ -10651,6 +10863,15 @@ FunctionNodeFactory = __decorate([
|
|
|
10651
10863
|
__decorateParam(4, Inject(Injector)),
|
|
10652
10864
|
__decorateParam(5, Inject(FormulaDataModel))
|
|
10653
10865
|
], FunctionNodeFactory);
|
|
10866
|
+
function normalizeFunctionToken(token) {
|
|
10867
|
+
if (token === "REGEXTEST" || token === "_XLFN.REGEXTEST") return "REGEXMATCH";
|
|
10868
|
+
for (const prefix of [
|
|
10869
|
+
"_XLFN.",
|
|
10870
|
+
"_XLWS.",
|
|
10871
|
+
"_XLETA."
|
|
10872
|
+
]) if (token.startsWith(prefix)) return token.slice(prefix.length);
|
|
10873
|
+
return token;
|
|
10874
|
+
}
|
|
10654
10875
|
|
|
10655
10876
|
//#endregion
|
|
10656
10877
|
//#region src/engine/interpreter/interpreter.ts
|
|
@@ -10701,6 +10922,7 @@ let Interpreter = class Interpreter extends Disposable {
|
|
|
10701
10922
|
}
|
|
10702
10923
|
async _executeAsync(node, refOffsetX = 0, refOffsetY = 0) {
|
|
10703
10924
|
if (this._runtimeService.isStopExecution()) return Promise.resolve(1);
|
|
10925
|
+
if (await this._executeLazyFunctionAsync(node, refOffsetX, refOffsetY)) return Promise.resolve(0);
|
|
10704
10926
|
const children = node.getChildren();
|
|
10705
10927
|
const childrenCount = children.length;
|
|
10706
10928
|
for (let i = 0; i < childrenCount; i++) {
|
|
@@ -10721,6 +10943,7 @@ let Interpreter = class Interpreter extends Disposable {
|
|
|
10721
10943
|
}
|
|
10722
10944
|
_execute(node, refOffsetX = 0, refOffsetY = 0) {
|
|
10723
10945
|
if (this._runtimeService.isStopExecution()) return 1;
|
|
10946
|
+
if (this._executeLazyFunction(node, refOffsetX, refOffsetY)) return 0;
|
|
10724
10947
|
const children = node.getChildren();
|
|
10725
10948
|
const childrenCount = children.length;
|
|
10726
10949
|
for (let i = 0; i < childrenCount; i++) {
|
|
@@ -10738,6 +10961,161 @@ let Interpreter = class Interpreter extends Disposable {
|
|
|
10738
10961
|
node.execute();
|
|
10739
10962
|
return 0;
|
|
10740
10963
|
}
|
|
10964
|
+
async _executeLazyFunctionAsync(node, refOffsetX, refOffsetY) {
|
|
10965
|
+
if (node.nodeType !== 4) return false;
|
|
10966
|
+
const token = node.getToken().toUpperCase();
|
|
10967
|
+
if (token === "IF") return await this._executeLazyIfAsync(node, refOffsetX, refOffsetY);
|
|
10968
|
+
if (token === "IFERROR") return await this._executeLazyIfErrorAsync(node, refOffsetX, refOffsetY);
|
|
10969
|
+
return false;
|
|
10970
|
+
}
|
|
10971
|
+
_executeLazyFunction(node, refOffsetX, refOffsetY) {
|
|
10972
|
+
if (node.nodeType !== 4) return false;
|
|
10973
|
+
const token = node.getToken().toUpperCase();
|
|
10974
|
+
if (token === "IF") return this._executeLazyIf(node, refOffsetX, refOffsetY);
|
|
10975
|
+
if (token === "IFERROR") return this._executeLazyIfError(node, refOffsetX, refOffsetY);
|
|
10976
|
+
return false;
|
|
10977
|
+
}
|
|
10978
|
+
async _executeLazyIfAsync(node, refOffsetX, refOffsetY) {
|
|
10979
|
+
const children = node.getChildren();
|
|
10980
|
+
if (children.length < 2 || children.length > 3) return false;
|
|
10981
|
+
await this._executeAsync(children[0], refOffsetX, refOffsetY);
|
|
10982
|
+
const condition = children[0].getValue();
|
|
10983
|
+
if (condition == null || condition.isReferenceObject() || condition.isArray()) return false;
|
|
10984
|
+
if (condition.isError()) {
|
|
10985
|
+
node.setValue(condition);
|
|
10986
|
+
return true;
|
|
10987
|
+
}
|
|
10988
|
+
const selected = condition.getValue() ? children[1] : children[2];
|
|
10989
|
+
if (selected == null) {
|
|
10990
|
+
node.setValue(BooleanValueObject.create(false));
|
|
10991
|
+
return true;
|
|
10992
|
+
}
|
|
10993
|
+
await this._executeAsync(selected, refOffsetX, refOffsetY);
|
|
10994
|
+
node.setValue(this._toLazyIfSelectedValue(selected.getValue(), node));
|
|
10995
|
+
return true;
|
|
10996
|
+
}
|
|
10997
|
+
_executeLazyIf(node, refOffsetX, refOffsetY) {
|
|
10998
|
+
const children = node.getChildren();
|
|
10999
|
+
if (children.length < 2 || children.length > 3) return false;
|
|
11000
|
+
this._execute(children[0], refOffsetX, refOffsetY);
|
|
11001
|
+
const condition = children[0].getValue();
|
|
11002
|
+
if (condition == null || condition.isReferenceObject() || condition.isArray()) return false;
|
|
11003
|
+
if (condition.isError()) {
|
|
11004
|
+
node.setValue(condition);
|
|
11005
|
+
return true;
|
|
11006
|
+
}
|
|
11007
|
+
const selected = condition.getValue() ? children[1] : children[2];
|
|
11008
|
+
if (selected == null) {
|
|
11009
|
+
node.setValue(BooleanValueObject.create(false));
|
|
11010
|
+
return true;
|
|
11011
|
+
}
|
|
11012
|
+
this._execute(selected, refOffsetX, refOffsetY);
|
|
11013
|
+
node.setValue(this._toLazyIfSelectedValue(selected.getValue(), node));
|
|
11014
|
+
return true;
|
|
11015
|
+
}
|
|
11016
|
+
async _executeLazyIfErrorAsync(node, refOffsetX, refOffsetY) {
|
|
11017
|
+
var _children$1$getValue;
|
|
11018
|
+
const children = node.getChildren();
|
|
11019
|
+
if (children.length !== 2) return false;
|
|
11020
|
+
await this._executeAsync(children[0], refOffsetX, refOffsetY);
|
|
11021
|
+
const rawValue = children[0].getValue();
|
|
11022
|
+
const value = this._toLazyIfErrorValue(rawValue);
|
|
11023
|
+
if (value == null || value.isArray()) return false;
|
|
11024
|
+
if (!value.isError()) {
|
|
11025
|
+
node.setValue(value);
|
|
11026
|
+
return true;
|
|
11027
|
+
}
|
|
11028
|
+
await this._executeAsync(children[1], refOffsetX, refOffsetY);
|
|
11029
|
+
node.setValue((_children$1$getValue = children[1].getValue()) !== null && _children$1$getValue !== void 0 ? _children$1$getValue : ErrorValueObject.create("#VALUE!"));
|
|
11030
|
+
return true;
|
|
11031
|
+
}
|
|
11032
|
+
_executeLazyIfError(node, refOffsetX, refOffsetY) {
|
|
11033
|
+
var _children$1$getValue2;
|
|
11034
|
+
const children = node.getChildren();
|
|
11035
|
+
if (children.length !== 2) return false;
|
|
11036
|
+
this._execute(children[0], refOffsetX, refOffsetY);
|
|
11037
|
+
const rawValue = children[0].getValue();
|
|
11038
|
+
const value = this._toLazyIfErrorValue(rawValue);
|
|
11039
|
+
if (value == null || value.isArray()) return false;
|
|
11040
|
+
if (!value.isError()) {
|
|
11041
|
+
node.setValue(value);
|
|
11042
|
+
return true;
|
|
11043
|
+
}
|
|
11044
|
+
this._execute(children[1], refOffsetX, refOffsetY);
|
|
11045
|
+
node.setValue((_children$1$getValue2 = children[1].getValue()) !== null && _children$1$getValue2 !== void 0 ? _children$1$getValue2 : ErrorValueObject.create("#VALUE!"));
|
|
11046
|
+
return true;
|
|
11047
|
+
}
|
|
11048
|
+
_toLazyIfErrorValue(value) {
|
|
11049
|
+
if (value == null) return null;
|
|
11050
|
+
if (!value.isReferenceObject()) {
|
|
11051
|
+
const baseValue = value;
|
|
11052
|
+
return baseValue.isNull() ? NumberValueObject.create(0) : baseValue;
|
|
11053
|
+
}
|
|
11054
|
+
const reference = value;
|
|
11055
|
+
if (reference.getRowCount() !== 1 || reference.getColumnCount() !== 1) return reference.toArrayValueObject();
|
|
11056
|
+
const cellValue = reference.getCellByPosition();
|
|
11057
|
+
return cellValue.isNull() ? NumberValueObject.create(0) : cellValue;
|
|
11058
|
+
}
|
|
11059
|
+
_toLazyIfSelectedValue(value, node) {
|
|
11060
|
+
if (value == null) return ErrorValueObject.create("#VALUE!");
|
|
11061
|
+
if (value.isReferenceObject()) {
|
|
11062
|
+
const reference = value;
|
|
11063
|
+
if (this._preserveLazyIfSelectedReferenceArray(node)) return reference.toArrayValueObject();
|
|
11064
|
+
value = this._implicitLazyIfReferenceValue(reference);
|
|
11065
|
+
}
|
|
11066
|
+
if (value.isArray()) value = this._implicitLazyIfArrayValue(value);
|
|
11067
|
+
if (!value.isArray()) {
|
|
11068
|
+
const baseValue = value;
|
|
11069
|
+
return baseValue.isNull() ? NumberValueObject.create(0) : baseValue;
|
|
11070
|
+
}
|
|
11071
|
+
return value;
|
|
11072
|
+
}
|
|
11073
|
+
_implicitLazyIfReferenceValue(reference) {
|
|
11074
|
+
const range = reference.getRangePosition();
|
|
11075
|
+
const currentRow = this._runtimeService.currentRow || 0;
|
|
11076
|
+
const currentColumn = this._runtimeService.currentColumn || 0;
|
|
11077
|
+
const { startRow, startColumn, endRow, endColumn } = range;
|
|
11078
|
+
if (startRow === endRow && startColumn === endColumn) return reference.getCellByPosition();
|
|
11079
|
+
if (endRow === startRow && currentColumn >= startColumn && currentColumn <= endColumn) return reference.getCellByColumn(currentColumn);
|
|
11080
|
+
if (startColumn === endColumn && currentRow >= startRow && currentRow <= endRow) return reference.getCellByRow(currentRow);
|
|
11081
|
+
return ErrorValueObject.create("#VALUE!");
|
|
11082
|
+
}
|
|
11083
|
+
_preserveLazyIfSelectedReferenceArray(node) {
|
|
11084
|
+
let child = node;
|
|
11085
|
+
let parent = child.getParent();
|
|
11086
|
+
while (parent != null) {
|
|
11087
|
+
if (parent.nodeType === 4) return parent.getToken().toUpperCase() === "MATCH" && parent.getChildren().indexOf(child) === 1;
|
|
11088
|
+
child = parent;
|
|
11089
|
+
parent = parent.getParent();
|
|
11090
|
+
}
|
|
11091
|
+
return false;
|
|
11092
|
+
}
|
|
11093
|
+
_implicitLazyIfArrayValue(array) {
|
|
11094
|
+
if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return array;
|
|
11095
|
+
const startRow = array.getCurrentRow();
|
|
11096
|
+
const startColumn = array.getCurrentColumn();
|
|
11097
|
+
const rowCount = array.getRowCount();
|
|
11098
|
+
const columnCount = array.getColumnCount();
|
|
11099
|
+
const currentRow = this._runtimeService.currentRow || 0;
|
|
11100
|
+
const currentColumn = this._runtimeService.currentColumn || 0;
|
|
11101
|
+
let rowIndex = -1;
|
|
11102
|
+
let columnIndex = -1;
|
|
11103
|
+
if (rowCount === 1 && columnCount === 1) {
|
|
11104
|
+
rowIndex = 0;
|
|
11105
|
+
columnIndex = 0;
|
|
11106
|
+
} else if (rowCount === 1) {
|
|
11107
|
+
rowIndex = 0;
|
|
11108
|
+
columnIndex = currentColumn - startColumn;
|
|
11109
|
+
} else if (columnCount === 1) {
|
|
11110
|
+
rowIndex = currentRow - startRow;
|
|
11111
|
+
columnIndex = 0;
|
|
11112
|
+
} else {
|
|
11113
|
+
rowIndex = currentRow - startRow;
|
|
11114
|
+
columnIndex = currentColumn - startColumn;
|
|
11115
|
+
}
|
|
11116
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
|
|
11117
|
+
return array.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
|
|
11118
|
+
}
|
|
10741
11119
|
};
|
|
10742
11120
|
Interpreter = __decorate([__decorateParam(0, IFormulaRuntimeService)], Interpreter);
|
|
10743
11121
|
|
|
@@ -10956,9 +11334,10 @@ let LambdaNodeFactory = class LambdaNodeFactory extends BaseAstNodeFactory {
|
|
|
10956
11334
|
for (let i = 0; i < parameterArray.length; i++) {
|
|
10957
11335
|
const parameter = parameterArray[i];
|
|
10958
11336
|
if (parameter instanceof LexerNode) {
|
|
10959
|
-
const variant = parameter
|
|
11337
|
+
const variant = getLambdaParameterName(parameter);
|
|
11338
|
+
if (variant == null) return ErrorNode.create("#VALUE!");
|
|
10960
11339
|
parameter.setToken(DEFAULT_TOKEN_TYPE_LAMBDA_OMIT_PARAMETER);
|
|
10961
|
-
currentLambdaPrivacyVar.set(variant
|
|
11340
|
+
currentLambdaPrivacyVar.set(variant, void 0);
|
|
10962
11341
|
} else return ErrorNode.create("#VALUE!");
|
|
10963
11342
|
}
|
|
10964
11343
|
this._runtimeService.registerFunctionDefinitionPrivacyVar(lambdaId, currentLambdaPrivacyVar);
|
|
@@ -10975,6 +11354,20 @@ let LambdaNodeFactory = class LambdaNodeFactory extends BaseAstNodeFactory {
|
|
|
10975
11354
|
}
|
|
10976
11355
|
};
|
|
10977
11356
|
LambdaNodeFactory = __decorate([__decorateParam(0, IFormulaRuntimeService), __decorateParam(1, Inject(Interpreter))], LambdaNodeFactory);
|
|
11357
|
+
function getLambdaParameterName(parameter) {
|
|
11358
|
+
const children = parameter.getChildren();
|
|
11359
|
+
for (let i = 0; i < children.length; i++) {
|
|
11360
|
+
const child = children[i];
|
|
11361
|
+
if (typeof child === "string") {
|
|
11362
|
+
const token = child.trim();
|
|
11363
|
+
if (token.length > 0) return token;
|
|
11364
|
+
} else {
|
|
11365
|
+
const token = getLambdaParameterName(child);
|
|
11366
|
+
if (token != null) return token;
|
|
11367
|
+
}
|
|
11368
|
+
}
|
|
11369
|
+
return null;
|
|
11370
|
+
}
|
|
10978
11371
|
|
|
10979
11372
|
//#endregion
|
|
10980
11373
|
//#region src/engine/ast-node/lambda-parameter-node.ts
|
|
@@ -11085,12 +11478,17 @@ var OperatorNode = class extends BaseAstNode {
|
|
|
11085
11478
|
}
|
|
11086
11479
|
if (object1 == null) object1 = NullValueObject.create();
|
|
11087
11480
|
if (object2 == null) object2 = NullValueObject.create();
|
|
11088
|
-
if (object1.isReferenceObject()) object1 =
|
|
11089
|
-
if (object2.isReferenceObject()) object2 =
|
|
11481
|
+
if (object1.isReferenceObject()) object1 = this._referenceToOperatorValue(object1);
|
|
11482
|
+
if (object2.isReferenceObject()) object2 = this._referenceToOperatorValue(object2);
|
|
11090
11483
|
const result = this._functionExecutor.calculate(object1, object2);
|
|
11091
11484
|
this._setEmbeddedArrayFormulaToResult(result);
|
|
11092
11485
|
this.setValue(result);
|
|
11093
11486
|
}
|
|
11487
|
+
_referenceToOperatorValue(reference) {
|
|
11488
|
+
const array = reference.toArrayValueObject();
|
|
11489
|
+
if (array.getRowCount() === 1 && array.getColumnCount() === 1) return array.get(0, 0);
|
|
11490
|
+
return array;
|
|
11491
|
+
}
|
|
11094
11492
|
/**
|
|
11095
11493
|
* If it contains an array formula, set the current cell to the cache and send itself as a ref outward
|
|
11096
11494
|
*/
|
|
@@ -11394,12 +11792,15 @@ var TableReferenceObject = class extends BaseReferenceObject {
|
|
|
11394
11792
|
}
|
|
11395
11793
|
/** Column title → column index; returns -1 if not found (caller should handle as parse error) */
|
|
11396
11794
|
_titleToIndex(name, titleMap) {
|
|
11397
|
-
var _titleMap$get;
|
|
11398
11795
|
const key = name.trim();
|
|
11399
11796
|
const hit = titleMap.get(key);
|
|
11400
11797
|
if (hit !== void 0) return hit;
|
|
11401
11798
|
const keyNorm = key.replace(/\u3000/g, " ").trim();
|
|
11402
|
-
|
|
11799
|
+
const normalizedHit = titleMap.get(keyNorm);
|
|
11800
|
+
if (normalizedHit !== void 0) return normalizedHit;
|
|
11801
|
+
const lineBreakNorm = keyNorm.replace(/\r\n?/g, "\n");
|
|
11802
|
+
for (const [title, index] of titleMap.entries()) if (title.replace(/\u3000/g, " ").trim().replace(/\r\n?/g, "\n") === lineBreakNorm) return index;
|
|
11803
|
+
return -1;
|
|
11403
11804
|
}
|
|
11404
11805
|
/** Resolve #This Row's row number; takes first data row (tableStartRow+1) when no context available */
|
|
11405
11806
|
_resolveThisRow(tableStartRow, tableEndRow) {
|
|
@@ -11493,7 +11894,7 @@ let ReferenceNodeFactory = class ReferenceNodeFactory extends BaseAstNodeFactory
|
|
|
11493
11894
|
}
|
|
11494
11895
|
}
|
|
11495
11896
|
_getTableMap() {
|
|
11496
|
-
const unitId = this.
|
|
11897
|
+
const unitId = this._formulaRuntimeService.currentUnitId;
|
|
11497
11898
|
if (!unitId) return;
|
|
11498
11899
|
return this._superTableService.getTableMap(unitId);
|
|
11499
11900
|
}
|
|
@@ -11579,7 +11980,7 @@ var SuffixNode = class extends BaseAstNode {
|
|
|
11579
11980
|
const formulaData = this._currentConfigService.getFormulaData();
|
|
11580
11981
|
const formulaString = formulaData === null || formulaData === void 0 || (_formulaData$unitId = formulaData[unitId]) === null || _formulaData$unitId === void 0 || (_formulaData$unitId = _formulaData$unitId[sheetId]) === null || _formulaData$unitId === void 0 || (_formulaData$unitId = _formulaData$unitId[range.startRow]) === null || _formulaData$unitId === void 0 || (_formulaData$unitId = _formulaData$unitId[range.startColumn]) === null || _formulaData$unitId === void 0 ? void 0 : _formulaData$unitId.f;
|
|
11581
11982
|
if (!formulaString) return ErrorValueObject.create("#VALUE!");
|
|
11582
|
-
this._lexer.treeBuilder(formulaString);
|
|
11983
|
+
this._lexer.treeBuilder(formulaString, true, unitId);
|
|
11583
11984
|
return ErrorValueObject.create("#VALUE!");
|
|
11584
11985
|
/** todo */
|
|
11585
11986
|
}
|
|
@@ -11680,13 +12081,19 @@ var ValueNode = class extends BaseAstNode {
|
|
|
11680
12081
|
return 2;
|
|
11681
12082
|
}
|
|
11682
12083
|
execute() {
|
|
12084
|
+
const token = this.getToken();
|
|
12085
|
+
const tokenTrim = token.trim();
|
|
12086
|
+
if (tokenTrim.startsWith("\"") && tokenTrim.endsWith("\"")) {
|
|
12087
|
+
this.setValue(StringValueObject.create(tokenTrim.slice(1, -1).replace(/""/g, "\"")));
|
|
12088
|
+
return;
|
|
12089
|
+
}
|
|
11683
12090
|
const parent = this.getParent();
|
|
11684
12091
|
let isIgnoreNumberPattern = true;
|
|
11685
12092
|
if ((parent === null || parent === void 0 ? void 0 : parent.nodeType) === 4) {
|
|
11686
12093
|
var _isFunctionExecutorAr, _isFunctionExecutorAr2;
|
|
11687
12094
|
isIgnoreNumberPattern = (_isFunctionExecutorAr = (_isFunctionExecutorAr2 = parent.isFunctionExecutorArgumentsIgnoreNumberPattern) === null || _isFunctionExecutorAr2 === void 0 ? void 0 : _isFunctionExecutorAr2.call(parent)) !== null && _isFunctionExecutorAr !== void 0 ? _isFunctionExecutorAr : true;
|
|
11688
12095
|
}
|
|
11689
|
-
this.setValue(ValueObjectFactory.create(
|
|
12096
|
+
this.setValue(ValueObjectFactory.create(token, isIgnoreNumberPattern));
|
|
11690
12097
|
}
|
|
11691
12098
|
};
|
|
11692
12099
|
var ValueNodeFactory = class extends BaseAstNodeFactory {
|
|
@@ -11852,6 +12259,9 @@ let AstTreeBuilder = class AstTreeBuilder extends Disposable {
|
|
|
11852
12259
|
astNode = getAstNodeTopParent(astNode);
|
|
11853
12260
|
if (astNode == null || (astNode === null || astNode === void 0 ? void 0 : astNode.nodeType) === 7) return astNode;
|
|
11854
12261
|
switch (astNode.nodeType) {
|
|
12262
|
+
case 8:
|
|
12263
|
+
calculateStack.push(astNode);
|
|
12264
|
+
break;
|
|
11855
12265
|
case 4: {
|
|
11856
12266
|
const token = astNode.getToken().trim().toUpperCase();
|
|
11857
12267
|
if (FORCED_RECALCULATION_FUNCTION_NAME.has(token)) astNode.setForcedCalculateFunction();
|
|
@@ -11903,9 +12313,20 @@ let AstTreeBuilder = class AstTreeBuilder extends Disposable {
|
|
|
11903
12313
|
astNode = this._astNodeFactoryList[x].checkAndCreateNodeType(item);
|
|
11904
12314
|
if (astNode != null) break;
|
|
11905
12315
|
}
|
|
11906
|
-
if (astNode == null)
|
|
12316
|
+
if (astNode == null) {
|
|
12317
|
+
const aggregatorNode = this._createGroupByAggregatorTokenNode(item);
|
|
12318
|
+
if (aggregatorNode != null) return aggregatorNode;
|
|
12319
|
+
return new ErrorFunctionNode();
|
|
12320
|
+
}
|
|
11907
12321
|
return astNode;
|
|
11908
12322
|
}
|
|
12323
|
+
_createGroupByAggregatorTokenNode(param) {
|
|
12324
|
+
const token = (typeof param === "string" ? param : param.getToken()).trim().toUpperCase();
|
|
12325
|
+
if (!token.startsWith("_XLETA.")) return null;
|
|
12326
|
+
const name = token.slice(7);
|
|
12327
|
+
if (name !== "SUM" && name !== "COUNT" && name !== "COUNTA" && name !== "PERCENTOF" && name !== "MIN" && name !== "MAX" && name !== "ARRAYTOTEXT") return null;
|
|
12328
|
+
return new BaseAstNode(name);
|
|
12329
|
+
}
|
|
11909
12330
|
_initializeAstNode() {
|
|
11910
12331
|
this._astNodeFactoryList = [
|
|
11911
12332
|
this._astRootNodeFactory,
|
|
@@ -13122,7 +13543,7 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends Dispos
|
|
|
13122
13543
|
return this._dependencyTreeCache.get(treeId);
|
|
13123
13544
|
}
|
|
13124
13545
|
_getTreeNode(tree) {
|
|
13125
|
-
return generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService);
|
|
13546
|
+
return generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService, tree.subUnitId);
|
|
13126
13547
|
}
|
|
13127
13548
|
*_traverse(treeList, skippedTreeIds) {
|
|
13128
13549
|
const stack = treeList;
|
|
@@ -13248,12 +13669,12 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends Dispos
|
|
|
13248
13669
|
for (let i = 0, len = treeList.length; i < len; i++) {
|
|
13249
13670
|
const tree = treeList[i];
|
|
13250
13671
|
if (!tree.formula) continue;
|
|
13672
|
+
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
13251
13673
|
const node = this._getTreeNode(tree);
|
|
13252
13674
|
tree.isDirty = this._includeTree(tree, node);
|
|
13253
13675
|
const addressFunctionNodes = this._getAddressFunctionNodeList(node);
|
|
13254
13676
|
if (addressFunctionNodes.length > 0) tree.addressFunctionNodes = addressFunctionNodes;
|
|
13255
13677
|
if (tree.isVirtual) continue;
|
|
13256
|
-
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
13257
13678
|
const rangeList = await this._getRangeListByNode({
|
|
13258
13679
|
node,
|
|
13259
13680
|
refOffsetX: tree.refOffsetX,
|
|
@@ -13458,13 +13879,13 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends Dispos
|
|
|
13458
13879
|
async _calculateAddressFunctionRuntimeData(treeDependencyCache, preCalculateTreeList) {
|
|
13459
13880
|
while (preCalculateTreeList.length > 0) {
|
|
13460
13881
|
const tree = preCalculateTreeList.pop();
|
|
13882
|
+
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
13461
13883
|
const nodeData = {
|
|
13462
13884
|
node: this._getTreeNode(tree),
|
|
13463
13885
|
refOffsetX: tree.refOffsetX,
|
|
13464
13886
|
refOffsetY: tree.refOffsetY
|
|
13465
13887
|
};
|
|
13466
13888
|
await this._calculateAddressFunction(treeDependencyCache, tree);
|
|
13467
|
-
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
13468
13889
|
let value;
|
|
13469
13890
|
if (this._interpreter.checkAsyncNode(nodeData.node)) value = await this._interpreter.executeAsync(nodeData);
|
|
13470
13891
|
else value = this._interpreter.execute(nodeData);
|
|
@@ -13891,7 +14312,8 @@ let CalculateFormulaService = class CalculateFormulaService extends Disposable {
|
|
|
13891
14312
|
const treeCount = treeList.length;
|
|
13892
14313
|
while (treeList.length > 0) {
|
|
13893
14314
|
const tree = treeList.pop();
|
|
13894
|
-
|
|
14315
|
+
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
14316
|
+
const node = generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService, tree.subUnitId);
|
|
13895
14317
|
const nodeData = {
|
|
13896
14318
|
node,
|
|
13897
14319
|
refOffsetX: tree.refOffsetX,
|
|
@@ -13921,7 +14343,6 @@ let CalculateFormulaService = class CalculateFormulaService extends Disposable {
|
|
|
13921
14343
|
return;
|
|
13922
14344
|
}
|
|
13923
14345
|
}
|
|
13924
|
-
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
13925
14346
|
let value;
|
|
13926
14347
|
if (getDirtyData != null && tree.featureId != null) {
|
|
13927
14348
|
/**
|
|
@@ -14014,8 +14435,9 @@ let CalculateFormulaService = class CalculateFormulaService extends Disposable {
|
|
|
14014
14435
|
}
|
|
14015
14436
|
return result;
|
|
14016
14437
|
}
|
|
14017
|
-
async calculate(formulaString) {
|
|
14018
|
-
const
|
|
14438
|
+
async calculate(formulaString, transformSuffix = true, unitId) {
|
|
14439
|
+
const executeUnitId = unitId || this._runtimeService.currentUnitId || this._currentConfigService.getExecuteUnitId();
|
|
14440
|
+
const lexerNode = this._lexer.treeBuilder(formulaString, transformSuffix, executeUnitId);
|
|
14019
14441
|
if (Object.values(ErrorType).includes(lexerNode)) return;
|
|
14020
14442
|
const astNode = this._astTreeBuilder.parse(lexerNode);
|
|
14021
14443
|
const interpreter = this._interpreter;
|
|
@@ -14203,6 +14625,86 @@ CalculateController = __decorate([
|
|
|
14203
14625
|
__decorateParam(2, Inject(FormulaDataModel))
|
|
14204
14626
|
], CalculateController);
|
|
14205
14627
|
|
|
14628
|
+
//#endregion
|
|
14629
|
+
//#region src/services/active-dirty-manager.service.ts
|
|
14630
|
+
/**
|
|
14631
|
+
* Actively mark as dirty, calculate the dirty area based on the command,
|
|
14632
|
+
* and plugins can register the ref range they affect into the formula engine.
|
|
14633
|
+
*/
|
|
14634
|
+
var ActiveDirtyManagerService = class extends Disposable {
|
|
14635
|
+
constructor(..._args) {
|
|
14636
|
+
super(..._args);
|
|
14637
|
+
_defineProperty(this, "_dirtyConversionMap", /* @__PURE__ */ new Map());
|
|
14638
|
+
}
|
|
14639
|
+
dispose() {
|
|
14640
|
+
this._dirtyConversionMap.clear();
|
|
14641
|
+
}
|
|
14642
|
+
remove(commandId) {
|
|
14643
|
+
this._dirtyConversionMap.delete(commandId);
|
|
14644
|
+
}
|
|
14645
|
+
get(commandId) {
|
|
14646
|
+
return this._dirtyConversionMap.get(commandId);
|
|
14647
|
+
}
|
|
14648
|
+
has(commandId) {
|
|
14649
|
+
return this._dirtyConversionMap.has(commandId);
|
|
14650
|
+
}
|
|
14651
|
+
register(commandId, dirtyConversion) {
|
|
14652
|
+
this._dirtyConversionMap.set(commandId, dirtyConversion);
|
|
14653
|
+
}
|
|
14654
|
+
getDirtyConversionMap() {
|
|
14655
|
+
return this._dirtyConversionMap;
|
|
14656
|
+
}
|
|
14657
|
+
};
|
|
14658
|
+
const IActiveDirtyManagerService = createIdentifier("univer.formula.active-dirty-manager.service");
|
|
14659
|
+
|
|
14660
|
+
//#endregion
|
|
14661
|
+
//#region src/controllers/super-table-active-dirty.controller.ts
|
|
14662
|
+
let SuperTableActiveDirtyController = class SuperTableActiveDirtyController extends Disposable {
|
|
14663
|
+
constructor(_activeDirtyManagerService) {
|
|
14664
|
+
super();
|
|
14665
|
+
this._activeDirtyManagerService = _activeDirtyManagerService;
|
|
14666
|
+
this._initialize();
|
|
14667
|
+
}
|
|
14668
|
+
_initialize() {
|
|
14669
|
+
this._activeDirtyManagerService.register(SetSuperTableMutation.id, {
|
|
14670
|
+
commandId: SetSuperTableMutation.id,
|
|
14671
|
+
getDirtyData: (command) => {
|
|
14672
|
+
const params = command.params;
|
|
14673
|
+
const tableNames = [params.tableName, params.oldTableName].filter((name) => Boolean(name));
|
|
14674
|
+
return {
|
|
14675
|
+
dirtyRanges: [{
|
|
14676
|
+
unitId: params.unitId,
|
|
14677
|
+
sheetId: params.reference.sheetId,
|
|
14678
|
+
range: params.reference.range
|
|
14679
|
+
}],
|
|
14680
|
+
dirtySuperTableMap: { [params.unitId]: Object.fromEntries(tableNames.map((name) => [name, "1"])) },
|
|
14681
|
+
clearDependencyTreeCache: { [params.unitId]: { [params.reference.sheetId]: "1" } }
|
|
14682
|
+
};
|
|
14683
|
+
}
|
|
14684
|
+
});
|
|
14685
|
+
this._activeDirtyManagerService.register(RemoveSuperTableMutation.id, {
|
|
14686
|
+
commandId: RemoveSuperTableMutation.id,
|
|
14687
|
+
getDirtyData: (command) => {
|
|
14688
|
+
const params = command.params;
|
|
14689
|
+
return {
|
|
14690
|
+
dirtyRanges: params.reference ? [{
|
|
14691
|
+
unitId: params.unitId,
|
|
14692
|
+
sheetId: params.reference.sheetId,
|
|
14693
|
+
range: params.reference.range
|
|
14694
|
+
}] : void 0,
|
|
14695
|
+
dirtySuperTableMap: { [params.unitId]: { [params.tableName]: "1" } },
|
|
14696
|
+
clearDependencyTreeCache: params.reference ? { [params.unitId]: { [params.reference.sheetId]: "1" } } : void 0
|
|
14697
|
+
};
|
|
14698
|
+
}
|
|
14699
|
+
});
|
|
14700
|
+
this.disposeWithMe(toDisposable(() => {
|
|
14701
|
+
this._activeDirtyManagerService.remove(SetSuperTableMutation.id);
|
|
14702
|
+
this._activeDirtyManagerService.remove(RemoveSuperTableMutation.id);
|
|
14703
|
+
}));
|
|
14704
|
+
}
|
|
14705
|
+
};
|
|
14706
|
+
SuperTableActiveDirtyController = __decorate([__decorateParam(0, IActiveDirtyManagerService)], SuperTableActiveDirtyController);
|
|
14707
|
+
|
|
14206
14708
|
//#endregion
|
|
14207
14709
|
//#region src/engine/utils/r1c1-reference.ts
|
|
14208
14710
|
const $relativeRegex = /[\[\]]/g;
|
|
@@ -14374,6 +14876,8 @@ var BaseFunction = class {
|
|
|
14374
14876
|
_defineProperty(this, "_subUnitId", void 0);
|
|
14375
14877
|
_defineProperty(this, "_row", -1);
|
|
14376
14878
|
_defineProperty(this, "_column", -1);
|
|
14879
|
+
_defineProperty(this, "_currentFormulaRowCount", 1);
|
|
14880
|
+
_defineProperty(this, "_currentFormulaColumnCount", 1);
|
|
14377
14881
|
_defineProperty(this, "_definedNames", void 0);
|
|
14378
14882
|
_defineProperty(this, "_locale", void 0);
|
|
14379
14883
|
_defineProperty(this, "_sheetOrder", void 0);
|
|
@@ -14437,6 +14941,23 @@ var BaseFunction = class {
|
|
|
14437
14941
|
"needsFilteredOutRows",
|
|
14438
14942
|
false
|
|
14439
14943
|
);
|
|
14944
|
+
_defineProperty(
|
|
14945
|
+
this,
|
|
14946
|
+
/**
|
|
14947
|
+
* Whether the function needs unevaluated AST children.
|
|
14948
|
+
*/
|
|
14949
|
+
"needsAstChildren",
|
|
14950
|
+
false
|
|
14951
|
+
);
|
|
14952
|
+
_defineProperty(
|
|
14953
|
+
this,
|
|
14954
|
+
/**
|
|
14955
|
+
* Legacy CSE-style array functions should write only the first result cell
|
|
14956
|
+
* when they are used as a top-level normal formula.
|
|
14957
|
+
*/
|
|
14958
|
+
"returnsLegacyArrayAsScalar",
|
|
14959
|
+
false
|
|
14960
|
+
);
|
|
14440
14961
|
_defineProperty(
|
|
14441
14962
|
this,
|
|
14442
14963
|
/**
|
|
@@ -14469,6 +14990,12 @@ var BaseFunction = class {
|
|
|
14469
14990
|
get column() {
|
|
14470
14991
|
return this._column;
|
|
14471
14992
|
}
|
|
14993
|
+
get currentFormulaRowCount() {
|
|
14994
|
+
return this._currentFormulaRowCount;
|
|
14995
|
+
}
|
|
14996
|
+
get currentFormulaColumnCount() {
|
|
14997
|
+
return this._currentFormulaColumnCount;
|
|
14998
|
+
}
|
|
14472
14999
|
dispose() {}
|
|
14473
15000
|
/**
|
|
14474
15001
|
* In Excel, to inject a defined name into a function that has positioning capabilities,
|
|
@@ -14479,8 +15006,9 @@ var BaseFunction = class {
|
|
|
14479
15006
|
getDefinedName(name) {
|
|
14480
15007
|
const nameMap = this._definedNames;
|
|
14481
15008
|
if (nameMap == null) return null;
|
|
15009
|
+
const normalizedName = name.toLowerCase();
|
|
14482
15010
|
return Object.values(nameMap).find((value) => {
|
|
14483
|
-
return value.name ===
|
|
15011
|
+
return value.name.toLowerCase() === normalizedName;
|
|
14484
15012
|
});
|
|
14485
15013
|
}
|
|
14486
15014
|
setDefinedNames(definedNames) {
|
|
@@ -14521,11 +15049,13 @@ var BaseFunction = class {
|
|
|
14521
15049
|
isArgumentsIgnoreNumberPattern() {
|
|
14522
15050
|
return false;
|
|
14523
15051
|
}
|
|
14524
|
-
setRefInfo(unitId, subUnitId, row, column) {
|
|
15052
|
+
setRefInfo(unitId, subUnitId, row, column, rowCount = 1, columnCount = 1) {
|
|
14525
15053
|
this._unitId = unitId;
|
|
14526
15054
|
this._subUnitId = subUnitId;
|
|
14527
15055
|
this._row = row;
|
|
14528
15056
|
this._column = column;
|
|
15057
|
+
this._currentFormulaRowCount = rowCount;
|
|
15058
|
+
this._currentFormulaColumnCount = columnCount;
|
|
14529
15059
|
}
|
|
14530
15060
|
calculateCustom(...arg) {
|
|
14531
15061
|
return null;
|
|
@@ -14533,6 +15063,9 @@ var BaseFunction = class {
|
|
|
14533
15063
|
calculate(...arg) {
|
|
14534
15064
|
return ErrorValueObject.create("#VALUE!");
|
|
14535
15065
|
}
|
|
15066
|
+
calculateAst(_children, _getVariant) {
|
|
15067
|
+
return ErrorValueObject.create("#VALUE!");
|
|
15068
|
+
}
|
|
14536
15069
|
checkArrayType(variant) {
|
|
14537
15070
|
return variant.isReferenceObject() || variant.isValueObject() && variant.isArray();
|
|
14538
15071
|
}
|
|
@@ -16630,7 +17163,12 @@ function getArrayValuesByAggregateIgnoreOptions(array, options, formulaDataModel
|
|
|
16630
17163
|
if (ignoreErrorValues) continue;
|
|
16631
17164
|
return valueObject;
|
|
16632
17165
|
}
|
|
16633
|
-
if (!valueObject || valueObject.isNull() || valueObject.
|
|
17166
|
+
if (!valueObject || valueObject.isNull() || valueObject.isString()) continue;
|
|
17167
|
+
if (!array.isArray() && valueObject.isBoolean()) {
|
|
17168
|
+
values.push(valueObject.getValue() ? 1 : 0);
|
|
17169
|
+
continue;
|
|
17170
|
+
}
|
|
17171
|
+
if (valueObject.isBoolean()) continue;
|
|
16634
17172
|
const value = valueObject.getValue();
|
|
16635
17173
|
if (!isRealNum(value)) continue;
|
|
16636
17174
|
values.push(+value);
|
|
@@ -18358,6 +18896,11 @@ var Normsdist = class extends BaseFunction {
|
|
|
18358
18896
|
|
|
18359
18897
|
//#endregion
|
|
18360
18898
|
//#region src/functions/compatibility/rank/index.ts
|
|
18899
|
+
function isSameRankNumber$2(left, right) {
|
|
18900
|
+
if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
|
|
18901
|
+
const scale = Math.max(1, Math.abs(left), Math.abs(right));
|
|
18902
|
+
return Math.abs(left - right) <= Number.EPSILON * scale * 2;
|
|
18903
|
+
}
|
|
18361
18904
|
var Rank = class extends BaseFunction {
|
|
18362
18905
|
constructor(..._args) {
|
|
18363
18906
|
super(..._args);
|
|
@@ -18383,7 +18926,7 @@ var Rank = class extends BaseFunction {
|
|
|
18383
18926
|
const numberValue = +numberObject.getValue();
|
|
18384
18927
|
const orderValue = +orderObject.getValue();
|
|
18385
18928
|
if (Number.isNaN(numberValue) || Number.isNaN(orderValue)) return ErrorValueObject.create("#VALUE!");
|
|
18386
|
-
const result = refNumbers.sort((a, b) => !orderValue ? b - a : a - b).
|
|
18929
|
+
const result = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b).findIndex((refNumber) => isSameRankNumber$2(refNumber, numberValue));
|
|
18387
18930
|
if (result === -1) return ErrorValueObject.create("#N/A");
|
|
18388
18931
|
return NumberValueObject.create(result + 1);
|
|
18389
18932
|
});
|
|
@@ -18394,12 +18937,12 @@ var Rank = class extends BaseFunction {
|
|
|
18394
18937
|
let refHasError = false;
|
|
18395
18938
|
let refErrorObject = ErrorValueObject.create("#N/A");
|
|
18396
18939
|
const refNumbers = [];
|
|
18397
|
-
if (!ref.isReferenceObject()) return {
|
|
18940
|
+
if (!ref.isReferenceObject() && !ref.isArray()) return {
|
|
18398
18941
|
refHasError: true,
|
|
18399
18942
|
refErrorObject,
|
|
18400
18943
|
refNumbers
|
|
18401
18944
|
};
|
|
18402
|
-
ref.toArrayValueObject().iterator((refObject) => {
|
|
18945
|
+
(ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
|
|
18403
18946
|
const _refObject = refObject;
|
|
18404
18947
|
if (_refObject.isError()) {
|
|
18405
18948
|
refHasError = true;
|
|
@@ -19465,7 +20008,8 @@ var Edate = class extends BaseFunction {
|
|
|
19465
20008
|
const year = _startDate.getUTCFullYear();
|
|
19466
20009
|
const month = _startDate.getUTCMonth() + monthsValue;
|
|
19467
20010
|
const day = _startDate.getUTCDate();
|
|
19468
|
-
const
|
|
20011
|
+
const lastDayOfTargetMonth = new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
|
|
20012
|
+
const currentSerial = excelDateSerial(new Date(Date.UTC(year, month, Math.min(day, lastDayOfTargetMonth))));
|
|
19469
20013
|
return NumberValueObject.create(currentSerial, DEFAULT_DATE_FORMAT);
|
|
19470
20014
|
});
|
|
19471
20015
|
}
|
|
@@ -19749,8 +20293,12 @@ var Networkdays = class extends BaseFunction {
|
|
|
19749
20293
|
for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
|
|
19750
20294
|
const cell = holidays.get(r, c);
|
|
19751
20295
|
if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
|
|
20296
|
+
if (cell.isNull()) continue;
|
|
19752
20297
|
const holidaySerialNumber = getDateSerialNumberByObject(cell);
|
|
19753
|
-
if (typeof holidaySerialNumber !== "number")
|
|
20298
|
+
if (typeof holidaySerialNumber !== "number") {
|
|
20299
|
+
if (cell.isString()) continue;
|
|
20300
|
+
return holidaySerialNumber;
|
|
20301
|
+
}
|
|
19754
20302
|
holidaysValueArray.push(holidaySerialNumber);
|
|
19755
20303
|
}
|
|
19756
20304
|
} else {
|
|
@@ -19821,8 +20369,12 @@ var NetworkdaysIntl = class extends BaseFunction {
|
|
|
19821
20369
|
for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
|
|
19822
20370
|
const cell = holidays.get(r, c);
|
|
19823
20371
|
if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
|
|
20372
|
+
if (cell.isNull()) continue;
|
|
19824
20373
|
const holidaySerialNumber = getDateSerialNumberByObject(cell);
|
|
19825
|
-
if (typeof holidaySerialNumber !== "number")
|
|
20374
|
+
if (typeof holidaySerialNumber !== "number") {
|
|
20375
|
+
if (cell.isString()) continue;
|
|
20376
|
+
return holidaySerialNumber;
|
|
20377
|
+
}
|
|
19826
20378
|
holidaysValueArray.push(holidaySerialNumber);
|
|
19827
20379
|
}
|
|
19828
20380
|
} else {
|
|
@@ -20275,8 +20827,12 @@ var Workday = class extends BaseFunction {
|
|
|
20275
20827
|
for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
|
|
20276
20828
|
const cell = holidays.get(r, c);
|
|
20277
20829
|
if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
|
|
20830
|
+
if (cell.isNull()) continue;
|
|
20278
20831
|
const holidaySerialNumber = getDateSerialNumberByObject(cell);
|
|
20279
|
-
if (typeof holidaySerialNumber !== "number")
|
|
20832
|
+
if (typeof holidaySerialNumber !== "number") {
|
|
20833
|
+
if (cell.isString()) continue;
|
|
20834
|
+
return holidaySerialNumber;
|
|
20835
|
+
}
|
|
20280
20836
|
holidaysValueArray.push(holidaySerialNumber);
|
|
20281
20837
|
}
|
|
20282
20838
|
} else {
|
|
@@ -20346,8 +20902,12 @@ var WorkdayIntl = class extends BaseFunction {
|
|
|
20346
20902
|
for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
|
|
20347
20903
|
const cell = holidays.get(r, c);
|
|
20348
20904
|
if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
|
|
20905
|
+
if (cell.isNull()) continue;
|
|
20349
20906
|
const holidaySerialNumber = getDateSerialNumberByObject(cell);
|
|
20350
|
-
if (typeof holidaySerialNumber !== "number")
|
|
20907
|
+
if (typeof holidaySerialNumber !== "number") {
|
|
20908
|
+
if (cell.isString()) continue;
|
|
20909
|
+
return holidaySerialNumber;
|
|
20910
|
+
}
|
|
20351
20911
|
holidaysValueArray.push(holidaySerialNumber);
|
|
20352
20912
|
}
|
|
20353
20913
|
} else {
|
|
@@ -27810,6 +28370,232 @@ var False = class extends BaseFunction {
|
|
|
27810
28370
|
}
|
|
27811
28371
|
};
|
|
27812
28372
|
|
|
28373
|
+
//#endregion
|
|
28374
|
+
//#region src/functions/logical/groupby/index.ts
|
|
28375
|
+
var Groupby = class extends BaseFunction {
|
|
28376
|
+
constructor(..._args) {
|
|
28377
|
+
super(..._args);
|
|
28378
|
+
_defineProperty(this, "minParams", 3);
|
|
28379
|
+
_defineProperty(this, "maxParams", 7);
|
|
28380
|
+
_defineProperty(this, "needsReferenceObject", true);
|
|
28381
|
+
_defineProperty(this, "needsAstChildren", true);
|
|
28382
|
+
}
|
|
28383
|
+
calculateAst(children, getVariant) {
|
|
28384
|
+
const rowFields = this._arrayInput(getVariant(children[0]));
|
|
28385
|
+
if (rowFields instanceof ErrorValueObject) return rowFields;
|
|
28386
|
+
const values = this._arrayInput(getVariant(children[1]));
|
|
28387
|
+
if (values instanceof ErrorValueObject) return values;
|
|
28388
|
+
const aggregators = this._aggregators(children[2]);
|
|
28389
|
+
if (aggregators.length === 0) return ErrorValueObject.create("#VALUE!");
|
|
28390
|
+
if (values.rowCount !== rowFields.rowCount) return ErrorValueObject.create("#VALUE!");
|
|
28391
|
+
const includeTotal = children[4] == null ? true : this._numberValue(getVariant(children[4])) !== 0;
|
|
28392
|
+
const sortColumnValue = children[5] == null ? 0 : this._numberValue(getVariant(children[5]));
|
|
28393
|
+
const sortColumn = sortColumnValue === 0 ? void 0 : Math.trunc(sortColumnValue);
|
|
28394
|
+
const filter = children[6] == null ? void 0 : this._arrayInput(getVariant(children[6]));
|
|
28395
|
+
if (filter instanceof ErrorValueObject) return filter;
|
|
28396
|
+
const groupColumnCount = rowFields.columnCount;
|
|
28397
|
+
const valueColumnCount = values.columnCount;
|
|
28398
|
+
const outputValueColumnCount = this._outputValueColumnCount(valueColumnCount, aggregators.length);
|
|
28399
|
+
const groups = [];
|
|
28400
|
+
const allValues = Array.from({ length: valueColumnCount }, () => []);
|
|
28401
|
+
for (let row = 0; row < rowFields.rowCount; row++) {
|
|
28402
|
+
if (filter != null && !this._truthy(filter.valueAt(row, 0))) continue;
|
|
28403
|
+
const key = [];
|
|
28404
|
+
for (let column = 0; column < groupColumnCount; column++) key.push(rowFields.valueAt(row, column));
|
|
28405
|
+
let group = groups.find((item) => this._keysEqual(item.key, key));
|
|
28406
|
+
if (group == null) {
|
|
28407
|
+
group = {
|
|
28408
|
+
key,
|
|
28409
|
+
values: Array.from({ length: valueColumnCount }, () => [])
|
|
28410
|
+
};
|
|
28411
|
+
groups.push(group);
|
|
28412
|
+
}
|
|
28413
|
+
for (let column = 0; column < valueColumnCount; column++) {
|
|
28414
|
+
const value = values.valueAt(row, column);
|
|
28415
|
+
group.values[column].push(value);
|
|
28416
|
+
allValues[column].push(value);
|
|
28417
|
+
}
|
|
28418
|
+
}
|
|
28419
|
+
this._sortGroups(groups, sortColumn);
|
|
28420
|
+
const includeHeader = aggregators.length > 1;
|
|
28421
|
+
const rowCount = groups.length + (includeHeader ? 1 : 0) + (includeTotal ? 1 : 0);
|
|
28422
|
+
const columnCount = groupColumnCount + outputValueColumnCount;
|
|
28423
|
+
const result = [];
|
|
28424
|
+
if (includeHeader) {
|
|
28425
|
+
const header = [];
|
|
28426
|
+
for (let column = 0; column < groupColumnCount; column++) header.push(StringValueObject.create(""));
|
|
28427
|
+
for (let column = 0; column < outputValueColumnCount; column++) header.push(StringValueObject.create(this._aggregatorHeader(this._aggregatorForOutput(aggregators, valueColumnCount, column))));
|
|
28428
|
+
result.push(header);
|
|
28429
|
+
}
|
|
28430
|
+
for (const group of groups) {
|
|
28431
|
+
const row = [...group.key];
|
|
28432
|
+
for (let column = 0; column < outputValueColumnCount; column++) {
|
|
28433
|
+
const valueColumn = this._valueColumnForOutput(valueColumnCount, aggregators.length, column);
|
|
28434
|
+
const aggregator = this._aggregatorForOutput(aggregators, valueColumnCount, column);
|
|
28435
|
+
row.push(this._applyAggregator(aggregator, group.values[valueColumn], allValues[valueColumn]));
|
|
28436
|
+
}
|
|
28437
|
+
result.push(row);
|
|
28438
|
+
}
|
|
28439
|
+
if (includeTotal) {
|
|
28440
|
+
const row = [];
|
|
28441
|
+
for (let column = 0; column < groupColumnCount; column++) row.push(StringValueObject.create(column === 0 ? "Total" : ""));
|
|
28442
|
+
for (let column = 0; column < outputValueColumnCount; column++) {
|
|
28443
|
+
const valueColumn = this._valueColumnForOutput(valueColumnCount, aggregators.length, column);
|
|
28444
|
+
const aggregator = this._aggregatorForOutput(aggregators, valueColumnCount, column);
|
|
28445
|
+
row.push(this._applyAggregator(aggregator, allValues[valueColumn], allValues[valueColumn]));
|
|
28446
|
+
}
|
|
28447
|
+
result.push(row);
|
|
28448
|
+
}
|
|
28449
|
+
return ArrayValueObject.create({
|
|
28450
|
+
calculateValueList: result,
|
|
28451
|
+
rowCount,
|
|
28452
|
+
columnCount,
|
|
28453
|
+
unitId: this.unitId,
|
|
28454
|
+
sheetId: this.subUnitId,
|
|
28455
|
+
row: this.row,
|
|
28456
|
+
column: this.column
|
|
28457
|
+
});
|
|
28458
|
+
}
|
|
28459
|
+
_arrayInput(variant) {
|
|
28460
|
+
if (variant == null) return ErrorValueObject.create("#VALUE!");
|
|
28461
|
+
let value = variant;
|
|
28462
|
+
if (value.isReferenceObject()) value = value.toArrayValueObject();
|
|
28463
|
+
if (value.isError()) return value;
|
|
28464
|
+
if (value.isArray()) {
|
|
28465
|
+
const array = value;
|
|
28466
|
+
return {
|
|
28467
|
+
rowCount: array.getRowCount(),
|
|
28468
|
+
columnCount: array.getColumnCount(),
|
|
28469
|
+
valueAt: (row, column) => {
|
|
28470
|
+
var _array$get;
|
|
28471
|
+
return (_array$get = array.get(row, column)) !== null && _array$get !== void 0 ? _array$get : NullValueObject.create();
|
|
28472
|
+
}
|
|
28473
|
+
};
|
|
28474
|
+
}
|
|
28475
|
+
return {
|
|
28476
|
+
rowCount: 1,
|
|
28477
|
+
columnCount: 1,
|
|
28478
|
+
valueAt: (row, column) => row === 0 && column === 0 ? value : NullValueObject.create()
|
|
28479
|
+
};
|
|
28480
|
+
}
|
|
28481
|
+
_aggregators(node) {
|
|
28482
|
+
const name = this._normalizedFunctionName(node.getToken());
|
|
28483
|
+
if (name === "GROUPBY") return [];
|
|
28484
|
+
if (name === "HSTACK") return node.getChildren().flatMap((child) => this._aggregators(child));
|
|
28485
|
+
if (this._isAggregatorName(name)) return [name];
|
|
28486
|
+
return [];
|
|
28487
|
+
}
|
|
28488
|
+
_normalizedFunctionName(token) {
|
|
28489
|
+
let normalized = token.toUpperCase();
|
|
28490
|
+
for (;;) {
|
|
28491
|
+
const prefix = [
|
|
28492
|
+
"_XLFN.",
|
|
28493
|
+
"_XLWS.",
|
|
28494
|
+
"_XLETA."
|
|
28495
|
+
].find((item) => normalized.startsWith(item));
|
|
28496
|
+
if (prefix == null) return normalized;
|
|
28497
|
+
normalized = normalized.slice(prefix.length);
|
|
28498
|
+
}
|
|
28499
|
+
}
|
|
28500
|
+
_isAggregatorName(name) {
|
|
28501
|
+
return name === "SUM" || name === "COUNT" || name === "COUNTA" || name === "PERCENTOF" || name === "MIN" || name === "MAX" || name === "ARRAYTOTEXT";
|
|
28502
|
+
}
|
|
28503
|
+
_outputValueColumnCount(valueColumnCount, aggregatorCount) {
|
|
28504
|
+
if (valueColumnCount === 1) return aggregatorCount;
|
|
28505
|
+
if (aggregatorCount === 1 || valueColumnCount === aggregatorCount) return valueColumnCount;
|
|
28506
|
+
return Math.min(valueColumnCount, aggregatorCount);
|
|
28507
|
+
}
|
|
28508
|
+
_valueColumnForOutput(valueColumnCount, aggregatorCount, outputColumn) {
|
|
28509
|
+
if (valueColumnCount === 1) return 0;
|
|
28510
|
+
if (aggregatorCount === 1 || valueColumnCount === aggregatorCount) return Math.min(outputColumn, valueColumnCount - 1);
|
|
28511
|
+
return Math.min(outputColumn, valueColumnCount - 1);
|
|
28512
|
+
}
|
|
28513
|
+
_aggregatorForOutput(aggregators, valueColumnCount, outputColumn) {
|
|
28514
|
+
if (aggregators.length === 1 || valueColumnCount === aggregators.length) return aggregators[Math.min(outputColumn, aggregators.length - 1)];
|
|
28515
|
+
return aggregators[Math.min(outputColumn, aggregators.length - 1)];
|
|
28516
|
+
}
|
|
28517
|
+
_aggregatorHeader(aggregator) {
|
|
28518
|
+
return aggregator === "PERCENTOF" ? "%" : aggregator;
|
|
28519
|
+
}
|
|
28520
|
+
_applyAggregator(aggregator, groupValues, allValues) {
|
|
28521
|
+
switch (aggregator) {
|
|
28522
|
+
case "SUM": return NumberValueObject.create(this._sum(groupValues));
|
|
28523
|
+
case "COUNT": return NumberValueObject.create(groupValues.filter((value) => value.isNumber()).length);
|
|
28524
|
+
case "COUNTA": return NumberValueObject.create(groupValues.filter((value) => !value.isNull() && !(value.isString() && value.getValue() === "")).length);
|
|
28525
|
+
case "PERCENTOF": {
|
|
28526
|
+
const allTotal = this._sum(allValues);
|
|
28527
|
+
if (allTotal === 0) return ErrorValueObject.create("#DIV/0!");
|
|
28528
|
+
return NumberValueObject.create(this._sum(groupValues) / allTotal);
|
|
28529
|
+
}
|
|
28530
|
+
case "MIN": {
|
|
28531
|
+
const values = groupValues.map((value) => this._numericValue(value)).filter((value) => value != null);
|
|
28532
|
+
return NumberValueObject.create(values.length === 0 ? 0 : Math.min(...values));
|
|
28533
|
+
}
|
|
28534
|
+
case "MAX": {
|
|
28535
|
+
const values = groupValues.map((value) => this._numericValue(value)).filter((value) => value != null);
|
|
28536
|
+
return NumberValueObject.create(values.length === 0 ? 0 : Math.max(...values));
|
|
28537
|
+
}
|
|
28538
|
+
case "ARRAYTOTEXT": return StringValueObject.create(groupValues.map((value) => this._textValue(value)).filter(Boolean).join(", "));
|
|
28539
|
+
}
|
|
28540
|
+
}
|
|
28541
|
+
_sum(values) {
|
|
28542
|
+
return values.reduce((sum, value) => {
|
|
28543
|
+
var _this$_numericValue;
|
|
28544
|
+
return sum + ((_this$_numericValue = this._numericValue(value)) !== null && _this$_numericValue !== void 0 ? _this$_numericValue : 0);
|
|
28545
|
+
}, 0);
|
|
28546
|
+
}
|
|
28547
|
+
_numericValue(value) {
|
|
28548
|
+
return value.isNumber() ? Number(value.getValue()) : void 0;
|
|
28549
|
+
}
|
|
28550
|
+
_numberValue(variant) {
|
|
28551
|
+
if (variant == null || variant.isError()) return 0;
|
|
28552
|
+
if (variant.isReferenceObject()) variant = variant.getFirstCell();
|
|
28553
|
+
if (variant.isArray()) {
|
|
28554
|
+
var _get;
|
|
28555
|
+
variant = (_get = variant.get(0, 0)) !== null && _get !== void 0 ? _get : NullValueObject.create();
|
|
28556
|
+
}
|
|
28557
|
+
const value = variant.getValue();
|
|
28558
|
+
return typeof value === "number" ? Math.trunc(value) : Math.trunc(Number(value) || 0);
|
|
28559
|
+
}
|
|
28560
|
+
_truthy(value) {
|
|
28561
|
+
if (value.isError() || value.isNull()) return false;
|
|
28562
|
+
return Boolean(value.getValue());
|
|
28563
|
+
}
|
|
28564
|
+
_keysEqual(left, right) {
|
|
28565
|
+
return left.length === right.length && left.every((value, index) => this._keyValue(value) === this._keyValue(right[index]));
|
|
28566
|
+
}
|
|
28567
|
+
_keyValue(value) {
|
|
28568
|
+
if (value.isError()) return `error:${value.getErrorType()}`;
|
|
28569
|
+
if (value.isNull()) return "null:";
|
|
28570
|
+
return `${typeof value.getValue()}:${String(value.getValue())}`;
|
|
28571
|
+
}
|
|
28572
|
+
_sortGroups(groups, sortColumn) {
|
|
28573
|
+
const descending = sortColumn != null && sortColumn < 0;
|
|
28574
|
+
const sortIndex = sortColumn == null ? void 0 : Math.abs(sortColumn) - 1;
|
|
28575
|
+
groups.sort((left, right) => {
|
|
28576
|
+
const compare = sortIndex != null && sortIndex < left.key.length ? this._compareValue(left.key[sortIndex], right.key[sortIndex]) : this._compareKey(left.key, right.key);
|
|
28577
|
+
return descending ? -compare : compare;
|
|
28578
|
+
});
|
|
28579
|
+
}
|
|
28580
|
+
_compareKey(left, right) {
|
|
28581
|
+
for (let index = 0; index < Math.min(left.length, right.length); index++) {
|
|
28582
|
+
const compare = this._compareValue(left[index], right[index]);
|
|
28583
|
+
if (compare !== 0) return compare;
|
|
28584
|
+
}
|
|
28585
|
+
return left.length - right.length;
|
|
28586
|
+
}
|
|
28587
|
+
_compareValue(left, right) {
|
|
28588
|
+
const leftNumber = this._numericValue(left);
|
|
28589
|
+
const rightNumber = this._numericValue(right);
|
|
28590
|
+
if (leftNumber != null && rightNumber != null) return leftNumber - rightNumber;
|
|
28591
|
+
return this._textValue(left).toUpperCase().localeCompare(this._textValue(right).toUpperCase());
|
|
28592
|
+
}
|
|
28593
|
+
_textValue(value) {
|
|
28594
|
+
if (value.isNull()) return "";
|
|
28595
|
+
return String(value.getValue());
|
|
28596
|
+
}
|
|
28597
|
+
};
|
|
28598
|
+
|
|
27813
28599
|
//#endregion
|
|
27814
28600
|
//#region src/functions/logical/if/index.ts
|
|
27815
28601
|
var If = class extends BaseFunction {
|
|
@@ -27820,12 +28606,18 @@ var If = class extends BaseFunction {
|
|
|
27820
28606
|
}
|
|
27821
28607
|
calculate(logicalTest, valueIfTrue, valueIfFalse = BooleanValueObject.create(false)) {
|
|
27822
28608
|
let _logicalTest = logicalTest;
|
|
28609
|
+
let useLegacyImplicitSelectedValue = false;
|
|
27823
28610
|
if (logicalTest.isArray()) {
|
|
27824
|
-
const
|
|
27825
|
-
const
|
|
27826
|
-
|
|
28611
|
+
const logicalTestArray = logicalTest;
|
|
28612
|
+
const rowCount = logicalTestArray.getRowCount();
|
|
28613
|
+
const columnCount = logicalTestArray.getColumnCount();
|
|
28614
|
+
if (rowCount === 1 && columnCount === 1) _logicalTest = logicalTestArray.get(0, 0);
|
|
28615
|
+
else if (!this._isCurrentArrayFormula() && logicalTestArray.getUnitId() !== "" && logicalTestArray.getSheetId() !== "" && logicalTestArray.getCurrentRow() >= 0 && logicalTestArray.getCurrentColumn() >= 0) {
|
|
28616
|
+
_logicalTest = this._legacyImplicitArrayValue(logicalTestArray);
|
|
28617
|
+
useLegacyImplicitSelectedValue = true;
|
|
28618
|
+
}
|
|
27827
28619
|
}
|
|
27828
|
-
if (!_logicalTest.isArray()) return this._handleSingleObject(_logicalTest, valueIfTrue, valueIfFalse);
|
|
28620
|
+
if (!_logicalTest.isArray()) return this._handleSingleObject(_logicalTest, valueIfTrue, valueIfFalse, useLegacyImplicitSelectedValue);
|
|
27829
28621
|
const maxRowLength = Math.max(_logicalTest.isArray() ? _logicalTest.getRowCount() : 1, valueIfTrue.isArray() ? valueIfTrue.getRowCount() : 1, valueIfFalse.isArray() ? valueIfFalse.getRowCount() : 1);
|
|
27830
28622
|
const maxColumnLength = Math.max(_logicalTest.isArray() ? _logicalTest.getColumnCount() : 1, valueIfTrue.isArray() ? valueIfTrue.getColumnCount() : 1, valueIfFalse.isArray() ? valueIfFalse.getColumnCount() : 1);
|
|
27831
28623
|
const logicalTestArray = expandArrayValueObject(maxRowLength, maxColumnLength, _logicalTest, ErrorValueObject.create("#N/A"));
|
|
@@ -27834,12 +28626,63 @@ var If = class extends BaseFunction {
|
|
|
27834
28626
|
return logicalTestArray.mapValue((logicalTestValue, rowIndex, columnIndex) => {
|
|
27835
28627
|
const valueIfTrueValue = valueIfTrueArray.get(rowIndex, columnIndex);
|
|
27836
28628
|
const valueIfFalseValue = valueIfFalseArray.get(rowIndex, columnIndex);
|
|
27837
|
-
return this._handleSingleObject(logicalTestValue, valueIfTrueValue, valueIfFalseValue);
|
|
28629
|
+
return this._handleSingleObject(logicalTestValue, valueIfTrueValue, valueIfFalseValue, false);
|
|
27838
28630
|
});
|
|
27839
28631
|
}
|
|
27840
|
-
_handleSingleObject(logicalTest, valueIfTrue, valueIfFalse) {
|
|
28632
|
+
_handleSingleObject(logicalTest, valueIfTrue, valueIfFalse, useLegacyImplicitSelectedValue) {
|
|
27841
28633
|
if (logicalTest.isError()) return logicalTest;
|
|
27842
|
-
|
|
28634
|
+
const logicalTestValue = this._coerceLogicalTest(logicalTest);
|
|
28635
|
+
if (logicalTestValue.isError()) return logicalTestValue;
|
|
28636
|
+
let selectedValue = logicalTestValue.getValue() ? valueIfTrue : valueIfFalse;
|
|
28637
|
+
if (useLegacyImplicitSelectedValue) selectedValue = this._legacyImplicitSelectedValue(selectedValue);
|
|
28638
|
+
return this._coerceSelectedValue(selectedValue);
|
|
28639
|
+
}
|
|
28640
|
+
_coerceSelectedValue(value) {
|
|
28641
|
+
return value.isNull() ? NumberValueObject.create(0) : value;
|
|
28642
|
+
}
|
|
28643
|
+
_coerceLogicalTest(logicalTest) {
|
|
28644
|
+
if (logicalTest.isNull()) return BooleanValueObject.create(false);
|
|
28645
|
+
if (logicalTest.isBoolean()) return logicalTest;
|
|
28646
|
+
if (logicalTest.isNumber()) return BooleanValueObject.create(Number(logicalTest.getValue()) !== 0);
|
|
28647
|
+
if (logicalTest.isString()) {
|
|
28648
|
+
const value = `${logicalTest.getValue()}`.trim().toUpperCase();
|
|
28649
|
+
if (value === "TRUE") return BooleanValueObject.create(true);
|
|
28650
|
+
if (value === "FALSE") return BooleanValueObject.create(false);
|
|
28651
|
+
}
|
|
28652
|
+
return ErrorValueObject.create("#VALUE!");
|
|
28653
|
+
}
|
|
28654
|
+
_legacyImplicitSelectedValue(value) {
|
|
28655
|
+
if (!value.isArray()) return value;
|
|
28656
|
+
const array = value;
|
|
28657
|
+
if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return value;
|
|
28658
|
+
return this._legacyImplicitArrayValue(array);
|
|
28659
|
+
}
|
|
28660
|
+
_legacyImplicitArrayValue(logicalTest) {
|
|
28661
|
+
const startRow = logicalTest.getCurrentRow();
|
|
28662
|
+
const startColumn = logicalTest.getCurrentColumn();
|
|
28663
|
+
const rowCount = logicalTest.getRowCount();
|
|
28664
|
+
const columnCount = logicalTest.getColumnCount();
|
|
28665
|
+
if (startRow < 0 || startColumn < 0) return ErrorValueObject.create("#VALUE!");
|
|
28666
|
+
let rowIndex = -1;
|
|
28667
|
+
let columnIndex = -1;
|
|
28668
|
+
if (rowCount === 1 && columnCount === 1) {
|
|
28669
|
+
rowIndex = 0;
|
|
28670
|
+
columnIndex = 0;
|
|
28671
|
+
} else if (rowCount === 1) {
|
|
28672
|
+
rowIndex = 0;
|
|
28673
|
+
columnIndex = this.column - startColumn;
|
|
28674
|
+
} else if (columnCount === 1) {
|
|
28675
|
+
rowIndex = this.row - startRow;
|
|
28676
|
+
columnIndex = 0;
|
|
28677
|
+
} else {
|
|
28678
|
+
rowIndex = this.row - startRow;
|
|
28679
|
+
columnIndex = this.column - startColumn;
|
|
28680
|
+
}
|
|
28681
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
|
|
28682
|
+
return logicalTest.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
|
|
28683
|
+
}
|
|
28684
|
+
_isCurrentArrayFormula() {
|
|
28685
|
+
return this.currentFormulaRowCount > 1 || this.currentFormulaColumnCount > 1;
|
|
27843
28686
|
}
|
|
27844
28687
|
};
|
|
27845
28688
|
|
|
@@ -27850,8 +28693,11 @@ var Iferror = class extends BaseFunction {
|
|
|
27850
28693
|
super(..._args);
|
|
27851
28694
|
_defineProperty(this, "minParams", 2);
|
|
27852
28695
|
_defineProperty(this, "maxParams", 2);
|
|
28696
|
+
_defineProperty(this, "needsReferenceObject", true);
|
|
27853
28697
|
}
|
|
27854
28698
|
calculate(value, valueIfError) {
|
|
28699
|
+
value = this._toValueObject(value);
|
|
28700
|
+
valueIfError = this._toValueObject(valueIfError);
|
|
27855
28701
|
if (!value.isArray()) return value.isError() ? valueIfError : value;
|
|
27856
28702
|
const maxRowLength = Math.max(value.isArray() ? value.getRowCount() : 1, valueIfError.isArray() ? valueIfError.getRowCount() : 1);
|
|
27857
28703
|
const maxColumnLength = Math.max(value.isArray() ? value.getColumnCount() : 1, valueIfError.isArray() ? valueIfError.getColumnCount() : 1);
|
|
@@ -27862,6 +28708,12 @@ var Iferror = class extends BaseFunction {
|
|
|
27862
28708
|
});
|
|
27863
28709
|
return valueArray;
|
|
27864
28710
|
}
|
|
28711
|
+
_toValueObject(value) {
|
|
28712
|
+
if (!value.isReferenceObject()) return value;
|
|
28713
|
+
const reference = value;
|
|
28714
|
+
if (reference.getRowCount() === 1 && reference.getColumnCount() === 1) return reference.getCellByPosition();
|
|
28715
|
+
return reference.toArrayValueObject();
|
|
28716
|
+
}
|
|
27865
28717
|
};
|
|
27866
28718
|
|
|
27867
28719
|
//#endregion
|
|
@@ -28138,6 +28990,23 @@ var Or = class extends BaseFunction {
|
|
|
28138
28990
|
}
|
|
28139
28991
|
};
|
|
28140
28992
|
|
|
28993
|
+
//#endregion
|
|
28994
|
+
//#region src/functions/logical/percentof/index.ts
|
|
28995
|
+
/**
|
|
28996
|
+
* PERCENTOF is an Excel GROUPBY aggregator token. It is evaluated by GROUPBY's
|
|
28997
|
+
* AST path, not as a standalone scalar function.
|
|
28998
|
+
*/
|
|
28999
|
+
var Percentof = class extends BaseFunction {
|
|
29000
|
+
constructor(..._args) {
|
|
29001
|
+
super(..._args);
|
|
29002
|
+
_defineProperty(this, "minParams", 0);
|
|
29003
|
+
_defineProperty(this, "maxParams", 0);
|
|
29004
|
+
}
|
|
29005
|
+
calculate(..._variants) {
|
|
29006
|
+
return ErrorValueObject.create("#VALUE!");
|
|
29007
|
+
}
|
|
29008
|
+
};
|
|
29009
|
+
|
|
28141
29010
|
//#endregion
|
|
28142
29011
|
//#region src/functions/logical/reduce/index.ts
|
|
28143
29012
|
var Reduce = class extends BaseFunction {
|
|
@@ -28421,6 +29290,7 @@ const functionLogical = [
|
|
|
28421
29290
|
[Bycol, "BYCOL"],
|
|
28422
29291
|
[Byrow, "BYROW"],
|
|
28423
29292
|
[False, "FALSE"],
|
|
29293
|
+
[Groupby, "GROUPBY"],
|
|
28424
29294
|
[If, "IF"],
|
|
28425
29295
|
[Iferror, "IFERROR"],
|
|
28426
29296
|
[Ifna, "IFNA"],
|
|
@@ -28431,6 +29301,7 @@ const functionLogical = [
|
|
|
28431
29301
|
[Map$1, "MAP"],
|
|
28432
29302
|
[Not, "NOT"],
|
|
28433
29303
|
[Or, "OR"],
|
|
29304
|
+
[Percentof, "PERCENTOF"],
|
|
28434
29305
|
[Reduce, "REDUCE"],
|
|
28435
29306
|
[Scan, "SCAN"],
|
|
28436
29307
|
[Switch, "SWITCH"],
|
|
@@ -28452,9 +29323,9 @@ var Address = class extends BaseFunction {
|
|
|
28452
29323
|
if (absNumber === null || absNumber === void 0 ? void 0 : absNumber.isError()) return absNumber;
|
|
28453
29324
|
if (a1 === null || a1 === void 0 ? void 0 : a1.isError()) return a1;
|
|
28454
29325
|
if (sheetText === null || sheetText === void 0 ? void 0 : sheetText.isError()) return sheetText;
|
|
28455
|
-
const _absNumber = absNumber
|
|
28456
|
-
const _a1 = a1
|
|
28457
|
-
const _sheetText = sheetText
|
|
29326
|
+
const _absNumber = absNumber == null || absNumber.isNull() ? NumberValueObject.create(1) : absNumber;
|
|
29327
|
+
const _a1 = a1 == null || a1.isNull() ? BooleanValueObject.create(true) : a1;
|
|
29328
|
+
const _sheetText = sheetText == null || sheetText.isNull() ? StringValueObject.create("") : sheetText;
|
|
28458
29329
|
const maxRowLength = Math.max(rowNumber.isArray() ? rowNumber.getRowCount() : 1, columnNumber.isArray() ? columnNumber.getRowCount() : 1, _absNumber.isArray() ? _absNumber.getRowCount() : 1, _a1.isArray() ? _a1.getRowCount() : 1, _sheetText.isArray() ? _sheetText.getRowCount() : 1);
|
|
28459
29330
|
const maxColumnLength = Math.max(rowNumber.isArray() ? rowNumber.getColumnCount() : 1, columnNumber.isArray() ? columnNumber.getColumnCount() : 1, _absNumber.isArray() ? _absNumber.getColumnCount() : 1, _a1.isArray() ? _a1.getColumnCount() : 1, _sheetText.isArray() ? _sheetText.getColumnCount() : 1);
|
|
28460
29331
|
const rowNumArray = expandArrayValueObject(maxRowLength, maxColumnLength, rowNumber, ErrorValueObject.create("#N/A"));
|
|
@@ -28505,6 +29376,20 @@ function transformAbsoluteRefType(number) {
|
|
|
28505
29376
|
}
|
|
28506
29377
|
}
|
|
28507
29378
|
|
|
29379
|
+
//#endregion
|
|
29380
|
+
//#region src/functions/lookup/anchorarray/index.ts
|
|
29381
|
+
var Anchorarray = class extends BaseFunction {
|
|
29382
|
+
constructor(..._args) {
|
|
29383
|
+
super(..._args);
|
|
29384
|
+
_defineProperty(this, "minParams", 1);
|
|
29385
|
+
_defineProperty(this, "maxParams", 1);
|
|
29386
|
+
_defineProperty(this, "needsReferenceObject", true);
|
|
29387
|
+
}
|
|
29388
|
+
calculate(reference) {
|
|
29389
|
+
return reference;
|
|
29390
|
+
}
|
|
29391
|
+
};
|
|
29392
|
+
|
|
28508
29393
|
//#endregion
|
|
28509
29394
|
//#region src/functions/lookup/areas/index.ts
|
|
28510
29395
|
var Areas = class extends BaseFunction {
|
|
@@ -29015,9 +29900,13 @@ var Hlookup = class extends BaseFunction {
|
|
|
29015
29900
|
return this._handleSingleObject(lookupValue, searchArray, resultArray, rangeLookupValue);
|
|
29016
29901
|
}
|
|
29017
29902
|
_handleSingleObject(value, searchArray, resultArray, rangeLookupValue) {
|
|
29018
|
-
if (rangeLookupValue === 0) return this.equalSearch(value, searchArray, resultArray);
|
|
29903
|
+
if (rangeLookupValue === 0) return this._blankResultAsZero(this.equalSearch(value, searchArray, resultArray));
|
|
29019
29904
|
return this.binarySearch(value, searchArray, resultArray);
|
|
29020
29905
|
}
|
|
29906
|
+
_blankResultAsZero(value) {
|
|
29907
|
+
if (value.isNull()) return NumberValueObject.create(0);
|
|
29908
|
+
return value;
|
|
29909
|
+
}
|
|
29021
29910
|
};
|
|
29022
29911
|
|
|
29023
29912
|
//#endregion
|
|
@@ -29289,6 +30178,17 @@ var Index = class extends BaseFunction {
|
|
|
29289
30178
|
|
|
29290
30179
|
//#endregion
|
|
29291
30180
|
//#region src/functions/lookup/indirect/index.ts
|
|
30181
|
+
const INDIRECT_ERROR_LITERALS = [
|
|
30182
|
+
"#NULL!",
|
|
30183
|
+
"#DIV/0!",
|
|
30184
|
+
"#VALUE!",
|
|
30185
|
+
"#REF!",
|
|
30186
|
+
"#NAME?",
|
|
30187
|
+
"#NUM!",
|
|
30188
|
+
"#N/A",
|
|
30189
|
+
"#CYCLE!",
|
|
30190
|
+
"#CALC!"
|
|
30191
|
+
];
|
|
29292
30192
|
var Indirect = class extends BaseFunction {
|
|
29293
30193
|
constructor(..._args) {
|
|
29294
30194
|
super(..._args);
|
|
@@ -29317,6 +30217,8 @@ var Indirect = class extends BaseFunction {
|
|
|
29317
30217
|
_handleSingleObject(refTextObject, a1Value) {
|
|
29318
30218
|
const refTextValue = `${refTextObject.getValue()}`;
|
|
29319
30219
|
if (refTextValue.trim() === "") return ErrorValueObject.create("#REF!");
|
|
30220
|
+
const embeddedError = this._matchErrorLiteral(refTextValue);
|
|
30221
|
+
if (embeddedError != null) return ErrorValueObject.create(embeddedError);
|
|
29320
30222
|
const refTextV = this._convertToDefinedName(refTextValue);
|
|
29321
30223
|
if (a1Value === 0) {
|
|
29322
30224
|
const { range, sheetName, unitId } = deserializeRangeForR1C1(refTextV);
|
|
@@ -29355,6 +30257,10 @@ var Indirect = class extends BaseFunction {
|
|
|
29355
30257
|
if (formulaOrRefString.startsWith("=")) return formulaOrRefString.slice(1);
|
|
29356
30258
|
return formulaOrRefString;
|
|
29357
30259
|
}
|
|
30260
|
+
_matchErrorLiteral(refText) {
|
|
30261
|
+
const normalizedRefText = refText.toUpperCase();
|
|
30262
|
+
return INDIRECT_ERROR_LITERALS.find((errorType) => normalizedRefText.includes(errorType));
|
|
30263
|
+
}
|
|
29358
30264
|
};
|
|
29359
30265
|
|
|
29360
30266
|
//#endregion
|
|
@@ -29422,7 +30328,7 @@ var Match = class extends BaseFunction {
|
|
|
29422
30328
|
const columnCountLookup = lookupArray.getColumnCount();
|
|
29423
30329
|
if (rowCountLookup !== 1 && columnCountLookup !== 1) return ErrorValueObject.create("#N/A");
|
|
29424
30330
|
if (matchType === null || matchType === void 0 ? void 0 : matchType.isError()) return ErrorValueObject.create("#N/A");
|
|
29425
|
-
const matchTypeValue = this.getMatchTypeValue(matchType);
|
|
30331
|
+
const matchTypeValue = (matchType === null || matchType === void 0 ? void 0 : matchType.isNull()) ? 0 : this.getMatchTypeValue(matchType);
|
|
29426
30332
|
if (matchTypeValue == null) return ErrorValueObject.create("#VALUE!");
|
|
29427
30333
|
if (lookupValue.isArray()) return lookupValue.map((value) => this._handleSingleObject(value, lookupArray, matchTypeValue));
|
|
29428
30334
|
return this._handleSingleObject(lookupValue, lookupArray, matchTypeValue);
|
|
@@ -29841,9 +30747,10 @@ var Sort = class extends BaseFunction {
|
|
|
29841
30747
|
}
|
|
29842
30748
|
calculate(array, sortIndex, sortOrder, byCol) {
|
|
29843
30749
|
let _sortIndex = sortIndex !== null && sortIndex !== void 0 ? sortIndex : NumberValueObject.create(1);
|
|
29844
|
-
|
|
30750
|
+
let _sortOrder = sortOrder !== null && sortOrder !== void 0 ? sortOrder : NumberValueObject.create(1);
|
|
29845
30751
|
const _byCol = byCol !== null && byCol !== void 0 ? byCol : BooleanValueObject.create(false);
|
|
29846
30752
|
if (_sortIndex.isNull()) _sortIndex = NumberValueObject.create(1);
|
|
30753
|
+
if (_sortOrder.isNull()) _sortOrder = NumberValueObject.create(1);
|
|
29847
30754
|
if (_byCol.isArray()) {
|
|
29848
30755
|
const byColRowCount = _byCol.getRowCount();
|
|
29849
30756
|
const byColColumnCount = _byCol.getColumnCount();
|
|
@@ -30608,9 +31515,26 @@ var Vlookup = class extends BaseFunction {
|
|
|
30608
31515
|
return this._handleSingleObject(lookupValue, searchArray, resultArray, rangeLookupValue);
|
|
30609
31516
|
}
|
|
30610
31517
|
_handleSingleObject(value, searchArray, resultArray, rangeLookupValue) {
|
|
30611
|
-
if (rangeLookupValue === 0)
|
|
31518
|
+
if (rangeLookupValue === 0) {
|
|
31519
|
+
if (value.isNull()) return this._equalSearchBlankLookupValue(searchArray, resultArray);
|
|
31520
|
+
return this._blankResultAsZero(this.equalSearch(value, searchArray, resultArray));
|
|
31521
|
+
}
|
|
30612
31522
|
return this.binarySearch(value, searchArray, resultArray);
|
|
30613
31523
|
}
|
|
31524
|
+
_equalSearchBlankLookupValue(searchArray, resultArray) {
|
|
31525
|
+
var _resultArrayValue$;
|
|
31526
|
+
const zero = NumberValueObject.create(0);
|
|
31527
|
+
const matched = searchArray.mapValue((value) => {
|
|
31528
|
+
if (value.isNull()) return BooleanValueObject.create(false);
|
|
31529
|
+
return value.isEqual(zero);
|
|
31530
|
+
});
|
|
31531
|
+
const resultArrayValue = resultArray.pickRaw(matched);
|
|
31532
|
+
return this._blankResultAsZero(((_resultArrayValue$ = resultArrayValue[0]) === null || _resultArrayValue$ === void 0 ? void 0 : _resultArrayValue$[0]) || ErrorValueObject.create("#N/A"));
|
|
31533
|
+
}
|
|
31534
|
+
_blankResultAsZero(value) {
|
|
31535
|
+
if (value.isNull()) return NumberValueObject.create(0);
|
|
31536
|
+
return value;
|
|
31537
|
+
}
|
|
30614
31538
|
};
|
|
30615
31539
|
|
|
30616
31540
|
//#endregion
|
|
@@ -30780,7 +31704,8 @@ var Xlookup = class extends BaseFunction {
|
|
|
30780
31704
|
if (matchMode === null || matchMode === void 0 ? void 0 : matchMode.isNull()) _matchMode = NumberValueObject.create(0);
|
|
30781
31705
|
let _searchMode = searchMode !== null && searchMode !== void 0 ? searchMode : NumberValueObject.create(1);
|
|
30782
31706
|
if (searchMode === null || searchMode === void 0 ? void 0 : searchMode.isNull()) _searchMode = NumberValueObject.create(1);
|
|
30783
|
-
|
|
31707
|
+
const _lookupValue = this._legacyImplicitLookupValue(lookupValue);
|
|
31708
|
+
if (_lookupValue.isError()) return _lookupValue;
|
|
30784
31709
|
const rowCountLookup = lookupArray.isArray() ? lookupArray.getRowCount() : 1;
|
|
30785
31710
|
const columnCountLookup = lookupArray.isArray() ? lookupArray.getColumnCount() : 1;
|
|
30786
31711
|
const rowCountReturn = returnArray.isArray() ? returnArray.getRowCount() : 1;
|
|
@@ -30792,7 +31717,7 @@ var Xlookup = class extends BaseFunction {
|
|
|
30792
31717
|
if (matchModeValue instanceof ErrorValueObject) return matchModeValue;
|
|
30793
31718
|
const searchModeValue = this.getIndexNumValue(_searchMode);
|
|
30794
31719
|
if (searchModeValue instanceof ErrorValueObject) return searchModeValue;
|
|
30795
|
-
return this._getResult(
|
|
31720
|
+
return this._getResult(_lookupValue, baseValueObjectToArrayValueObject(lookupArray), baseValueObjectToArrayValueObject(returnArray), _ifNotFound, matchModeValue, searchModeValue, rowCountLookup, columnCountLookup, rowCountReturn, columnCountReturn);
|
|
30796
31721
|
}
|
|
30797
31722
|
_getResult(lookupValue, lookupArray, returnArray, ifNotFound, matchModeValue, searchModeValue, rowCountLookup, columnCountLookup, rowCountReturn, columnCountReturn) {
|
|
30798
31723
|
const lookupValueRowCount = lookupValue.isArray() ? lookupValue.getRowCount() : 1;
|
|
@@ -30807,7 +31732,7 @@ var Xlookup = class extends BaseFunction {
|
|
|
30807
31732
|
if (checkErrorCombination) return checkErrorCombination;
|
|
30808
31733
|
const result = this._handleSingleObject(value, lookupArray, resultArray, matchModeValue, searchModeValue);
|
|
30809
31734
|
if (result.isError()) return ifNotFound;
|
|
30810
|
-
return result;
|
|
31735
|
+
return this._blankResultAsZero(result);
|
|
30811
31736
|
});
|
|
30812
31737
|
}
|
|
30813
31738
|
const _lookupValue = lookupValue.isArray() ? lookupValue.get(0, 0) : lookupValue;
|
|
@@ -30816,7 +31741,7 @@ var Xlookup = class extends BaseFunction {
|
|
|
30816
31741
|
if (checkErrorCombination) return checkErrorCombination;
|
|
30817
31742
|
const result = this._handleSingleObject(_lookupValue, lookupArray, returnArray, matchModeValue, searchModeValue);
|
|
30818
31743
|
if (result.isError()) return ifNotFound;
|
|
30819
|
-
return result;
|
|
31744
|
+
return this._blankResultAsZero(result);
|
|
30820
31745
|
}
|
|
30821
31746
|
let axis = 0;
|
|
30822
31747
|
/**
|
|
@@ -30828,6 +31753,32 @@ var Xlookup = class extends BaseFunction {
|
|
|
30828
31753
|
if (resultArray == null) return ErrorValueObject.create("#N/A");
|
|
30829
31754
|
return resultArray;
|
|
30830
31755
|
}
|
|
31756
|
+
_legacyImplicitLookupValue(lookupValue) {
|
|
31757
|
+
if (!lookupValue.isArray()) return lookupValue;
|
|
31758
|
+
const array = lookupValue;
|
|
31759
|
+
if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return lookupValue;
|
|
31760
|
+
const startRow = array.getCurrentRow();
|
|
31761
|
+
const startColumn = array.getCurrentColumn();
|
|
31762
|
+
const rowCount = array.getRowCount();
|
|
31763
|
+
const columnCount = array.getColumnCount();
|
|
31764
|
+
let rowIndex = -1;
|
|
31765
|
+
let columnIndex = -1;
|
|
31766
|
+
if (rowCount === 1 && columnCount === 1) {
|
|
31767
|
+
rowIndex = 0;
|
|
31768
|
+
columnIndex = 0;
|
|
31769
|
+
} else if (rowCount === 1) {
|
|
31770
|
+
rowIndex = 0;
|
|
31771
|
+
columnIndex = this.column - startColumn;
|
|
31772
|
+
} else if (columnCount === 1) {
|
|
31773
|
+
rowIndex = this.row - startRow;
|
|
31774
|
+
columnIndex = 0;
|
|
31775
|
+
} else {
|
|
31776
|
+
rowIndex = this.row - startRow;
|
|
31777
|
+
columnIndex = this.column - startColumn;
|
|
31778
|
+
}
|
|
31779
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
|
|
31780
|
+
return array.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
|
|
31781
|
+
}
|
|
30831
31782
|
_handleExpandObject(value, searchArray, resultArray, matchModeValue, searchModeValue, axis = 0) {
|
|
30832
31783
|
if ((searchModeValue === 2 || searchModeValue === -2) && matchModeValue !== 2) {
|
|
30833
31784
|
const searchType = getSearchModeValue(searchModeValue);
|
|
@@ -30848,6 +31799,10 @@ var Xlookup = class extends BaseFunction {
|
|
|
30848
31799
|
if (matchModeValue === -1 || matchModeValue === 1) return this.orderSearch(value, searchArray, resultArray, matchModeValue === 1 ? 2 : 1, searchModeValue === -1);
|
|
30849
31800
|
return this.equalSearch(value, searchArray, resultArray, searchModeValue !== -1);
|
|
30850
31801
|
}
|
|
31802
|
+
_blankResultAsZero(value) {
|
|
31803
|
+
if (value.isNull()) return NumberValueObject.create(0);
|
|
31804
|
+
return value;
|
|
31805
|
+
}
|
|
30851
31806
|
/**
|
|
30852
31807
|
* Wildcard matching and binary search cannot appear at the same time
|
|
30853
31808
|
* @param matchModeValue
|
|
@@ -30964,6 +31919,7 @@ var Xmatch = class extends BaseFunction {
|
|
|
30964
31919
|
*/
|
|
30965
31920
|
const functionLookup = [
|
|
30966
31921
|
[Address, "ADDRESS"],
|
|
31922
|
+
[Anchorarray, "ANCHORARRAY"],
|
|
30967
31923
|
[Areas, "AREAS"],
|
|
30968
31924
|
[Choose, "CHOOSE"],
|
|
30969
31925
|
[Choosecols, "CHOOSECOLS"],
|
|
@@ -32069,7 +33025,7 @@ var Int = class extends BaseFunction {
|
|
|
32069
33025
|
let _number = number;
|
|
32070
33026
|
if (_number.isString()) _number = _number.convertToNumberObjectValue();
|
|
32071
33027
|
if (_number.isError()) return _number;
|
|
32072
|
-
const numberValue = Math.floor(+_number.getValue());
|
|
33028
|
+
const numberValue = Math.floor(stripErrorMargin(+_number.getValue()));
|
|
32073
33029
|
return NumberValueObject.create(numberValue);
|
|
32074
33030
|
}
|
|
32075
33031
|
};
|
|
@@ -33421,6 +34377,7 @@ var Sum = class extends BaseFunction {
|
|
|
33421
34377
|
let accumulatorAll = NumberValueObject.create(0);
|
|
33422
34378
|
for (let i = 0; i < variants.length; i++) {
|
|
33423
34379
|
let variant = variants[i];
|
|
34380
|
+
variant = this._legacyImplicitDerivedArray(variant);
|
|
33424
34381
|
if (variant.isString()) variant = variant.convertToNumberObjectValue();
|
|
33425
34382
|
if (variant.isError()) return variant;
|
|
33426
34383
|
if (variant.isArray()) variant = variant.sum();
|
|
@@ -33430,6 +34387,30 @@ var Sum = class extends BaseFunction {
|
|
|
33430
34387
|
}
|
|
33431
34388
|
return accumulatorAll;
|
|
33432
34389
|
}
|
|
34390
|
+
_legacyImplicitDerivedArray(variant) {
|
|
34391
|
+
if (!variant.isArray()) return variant;
|
|
34392
|
+
const array = variant;
|
|
34393
|
+
if (array.usesInvertedIndexCache() || !array.usesLegacyImplicitForAggregate()) return variant;
|
|
34394
|
+
const startRow = array.getCurrentRow();
|
|
34395
|
+
const startColumn = array.getCurrentColumn();
|
|
34396
|
+
if (startRow < 0 || startColumn < 0) return variant;
|
|
34397
|
+
const rowCount = array.getRowCount();
|
|
34398
|
+
const columnCount = array.getColumnCount();
|
|
34399
|
+
let rowIndex = -1;
|
|
34400
|
+
let columnIndex = -1;
|
|
34401
|
+
if (rowCount === 1) {
|
|
34402
|
+
rowIndex = 0;
|
|
34403
|
+
columnIndex = this.column - startColumn;
|
|
34404
|
+
} else if (columnCount === 1) {
|
|
34405
|
+
rowIndex = this.row - startRow;
|
|
34406
|
+
columnIndex = 0;
|
|
34407
|
+
} else {
|
|
34408
|
+
rowIndex = this.row - startRow;
|
|
34409
|
+
columnIndex = this.column - startColumn;
|
|
34410
|
+
}
|
|
34411
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
|
|
34412
|
+
return array.get(rowIndex, columnIndex) || variant;
|
|
34413
|
+
}
|
|
33433
34414
|
};
|
|
33434
34415
|
|
|
33435
34416
|
//#endregion
|
|
@@ -34003,8 +34984,17 @@ var Compare = class extends BaseFunction {
|
|
|
34003
34984
|
calculate(variant1, variant2) {
|
|
34004
34985
|
if (variant1.isError()) return variant1;
|
|
34005
34986
|
if (variant2.isError()) return variant2;
|
|
34987
|
+
const variant1Error = this._coerceErrorLiteral(variant1);
|
|
34988
|
+
if (variant1Error) return variant1Error;
|
|
34989
|
+
const variant2Error = this._coerceErrorLiteral(variant2);
|
|
34990
|
+
if (variant2Error) return variant2Error;
|
|
34006
34991
|
return variant1.compare(variant2, this._compareType);
|
|
34007
34992
|
}
|
|
34993
|
+
_coerceErrorLiteral(variant) {
|
|
34994
|
+
const value = variant.getValue();
|
|
34995
|
+
if (typeof value === "string" && ERROR_TYPE_SET.has(value)) return ErrorValueObject.create(value);
|
|
34996
|
+
return null;
|
|
34997
|
+
}
|
|
34008
34998
|
};
|
|
34009
34999
|
|
|
34010
35000
|
//#endregion
|
|
@@ -34262,6 +35252,7 @@ var Average = class extends BaseFunction {
|
|
|
34262
35252
|
let accumulatorCount = NumberValueObject.create(0);
|
|
34263
35253
|
for (let i = 0; i < variants.length; i++) {
|
|
34264
35254
|
let variant = variants[i];
|
|
35255
|
+
variant = this._legacyImplicitDerivedArray(variant);
|
|
34265
35256
|
if (variant.isString() || variant.isBoolean()) variant = variant.convertToNumberObjectValue();
|
|
34266
35257
|
if (variant.isError()) return variant;
|
|
34267
35258
|
if (variant.isArray()) {
|
|
@@ -34275,6 +35266,30 @@ var Average = class extends BaseFunction {
|
|
|
34275
35266
|
}
|
|
34276
35267
|
return accumulatorSum.divided(accumulatorCount);
|
|
34277
35268
|
}
|
|
35269
|
+
_legacyImplicitDerivedArray(variant) {
|
|
35270
|
+
if (!variant.isArray()) return variant;
|
|
35271
|
+
const array = variant;
|
|
35272
|
+
if (array.usesInvertedIndexCache()) return variant;
|
|
35273
|
+
const startRow = array.getCurrentRow();
|
|
35274
|
+
const startColumn = array.getCurrentColumn();
|
|
35275
|
+
if (startRow < 0 || startColumn < 0) return variant;
|
|
35276
|
+
const rowCount = array.getRowCount();
|
|
35277
|
+
const columnCount = array.getColumnCount();
|
|
35278
|
+
let rowIndex = -1;
|
|
35279
|
+
let columnIndex = -1;
|
|
35280
|
+
if (rowCount === 1) {
|
|
35281
|
+
rowIndex = 0;
|
|
35282
|
+
columnIndex = this.column - startColumn;
|
|
35283
|
+
} else if (columnCount === 1) {
|
|
35284
|
+
rowIndex = this.row - startRow;
|
|
35285
|
+
columnIndex = 0;
|
|
35286
|
+
} else {
|
|
35287
|
+
rowIndex = this.row - startRow;
|
|
35288
|
+
columnIndex = this.column - startColumn;
|
|
35289
|
+
}
|
|
35290
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
|
|
35291
|
+
return array.get(rowIndex, columnIndex) || variant;
|
|
35292
|
+
}
|
|
34278
35293
|
};
|
|
34279
35294
|
|
|
34280
35295
|
//#endregion
|
|
@@ -34807,7 +35822,13 @@ var Countif = class extends BaseFunction {
|
|
|
34807
35822
|
calculate(range, criteria) {
|
|
34808
35823
|
if (!range.isReferenceObject()) return ErrorValueObject.create("#VALUE!");
|
|
34809
35824
|
let _criteria = criteria;
|
|
34810
|
-
if (criteria.isReferenceObject())
|
|
35825
|
+
if (criteria.isReferenceObject()) {
|
|
35826
|
+
_criteria = criteria.toArrayValueObject();
|
|
35827
|
+
if (_criteria.getRowCount() === 1 && _criteria.getColumnCount() === 1) {
|
|
35828
|
+
const firstCriteria = _criteria.get(0, 0);
|
|
35829
|
+
_criteria = firstCriteria.isNull() ? NumberValueObject.create(0) : firstCriteria;
|
|
35830
|
+
}
|
|
35831
|
+
}
|
|
34811
35832
|
if (_criteria.isArray()) {
|
|
34812
35833
|
const resultArray = _criteria.mapValue((criteriaObject) => this._handleSingleObject(range, criteriaObject));
|
|
34813
35834
|
if (resultArray.getRowCount() === 1 && resultArray.getColumnCount() === 1) return resultArray.get(0, 0);
|
|
@@ -34842,7 +35863,7 @@ var Countifs = class extends BaseFunction {
|
|
|
34842
35863
|
_defineProperty(this, "needsReferenceObject", true);
|
|
34843
35864
|
}
|
|
34844
35865
|
calculate(...variants) {
|
|
34845
|
-
const { isError, errorObject, rangeIsDifferentSize, criteriaMaxRowLength, criteriaMaxColumnLength, variants: _variants } = parsePairedRangeAndCriteria(variants);
|
|
35866
|
+
const { isError, errorObject, rangeIsDifferentSize, criteriaMaxRowLength, criteriaMaxColumnLength, variants: _variants } = parsePairedRangeAndCriteria(this._legacyImplicitDerivedCriteria(variants));
|
|
34846
35867
|
if (isError) return errorObject;
|
|
34847
35868
|
if (rangeIsDifferentSize) {
|
|
34848
35869
|
if (criteriaMaxRowLength === 1 && criteriaMaxColumnLength === 1) return ErrorValueObject.create("#VALUE!");
|
|
@@ -34865,6 +35886,32 @@ var Countifs = class extends BaseFunction {
|
|
|
34865
35886
|
column: this.column
|
|
34866
35887
|
});
|
|
34867
35888
|
}
|
|
35889
|
+
_legacyImplicitDerivedCriteria(variants) {
|
|
35890
|
+
return variants.map((variant, index) => {
|
|
35891
|
+
if (index % 2 === 0 || !variant.isArray()) return variant;
|
|
35892
|
+
const array = variant;
|
|
35893
|
+
if (array.usesInvertedIndexCache()) return variant;
|
|
35894
|
+
const startRow = array.getCurrentRow();
|
|
35895
|
+
const startColumn = array.getCurrentColumn();
|
|
35896
|
+
if (startRow < 0 || startColumn < 0) return variant;
|
|
35897
|
+
const rowCount = array.getRowCount();
|
|
35898
|
+
const columnCount = array.getColumnCount();
|
|
35899
|
+
let rowIndex = -1;
|
|
35900
|
+
let columnIndex = -1;
|
|
35901
|
+
if (rowCount === 1) {
|
|
35902
|
+
rowIndex = 0;
|
|
35903
|
+
columnIndex = this.column - startColumn;
|
|
35904
|
+
} else if (columnCount === 1) {
|
|
35905
|
+
rowIndex = this.row - startRow;
|
|
35906
|
+
columnIndex = 0;
|
|
35907
|
+
} else {
|
|
35908
|
+
rowIndex = this.row - startRow;
|
|
35909
|
+
columnIndex = this.column - startColumn;
|
|
35910
|
+
}
|
|
35911
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
|
|
35912
|
+
return array.get(rowIndex, columnIndex) || variant;
|
|
35913
|
+
});
|
|
35914
|
+
}
|
|
34868
35915
|
};
|
|
34869
35916
|
|
|
34870
35917
|
//#endregion
|
|
@@ -35642,6 +36689,7 @@ var Linest = class extends BaseFunction {
|
|
|
35642
36689
|
super(..._args);
|
|
35643
36690
|
_defineProperty(this, "minParams", 1);
|
|
35644
36691
|
_defineProperty(this, "maxParams", 4);
|
|
36692
|
+
_defineProperty(this, "returnsLegacyArrayAsScalar", true);
|
|
35645
36693
|
}
|
|
35646
36694
|
calculate(knownYs, knownXs, constb, stats) {
|
|
35647
36695
|
const { isError, errorObject } = checkKnownsArrayDimensions(knownYs, knownXs);
|
|
@@ -36171,7 +37219,11 @@ var Median = class extends BaseFunction {
|
|
|
36171
37219
|
if (isError) return errorObject;
|
|
36172
37220
|
} else {
|
|
36173
37221
|
if (variant.isError()) return variant;
|
|
36174
|
-
if (variant.isNull()
|
|
37222
|
+
if (variant.isNull()) continue;
|
|
37223
|
+
if (variant.isBoolean()) {
|
|
37224
|
+
values.push(variant.getValue() ? 1 : 0);
|
|
37225
|
+
continue;
|
|
37226
|
+
}
|
|
36175
37227
|
if (variant.isString()) {
|
|
36176
37228
|
const _variant = variant.convertToNumberObjectValue();
|
|
36177
37229
|
if (_variant.isError()) return _variant;
|
|
@@ -36781,6 +37833,11 @@ var QuartileExc = class extends BaseFunction {
|
|
|
36781
37833
|
|
|
36782
37834
|
//#endregion
|
|
36783
37835
|
//#region src/functions/statistical/rank-avg/index.ts
|
|
37836
|
+
function isSameRankNumber$1(left, right) {
|
|
37837
|
+
if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
|
|
37838
|
+
const scale = Math.max(1, Math.abs(left), Math.abs(right));
|
|
37839
|
+
return Math.abs(left - right) <= Number.EPSILON * scale * 2;
|
|
37840
|
+
}
|
|
36784
37841
|
var RankAvg = class extends BaseFunction {
|
|
36785
37842
|
constructor(..._args) {
|
|
36786
37843
|
super(..._args);
|
|
@@ -36812,14 +37869,9 @@ var RankAvg = class extends BaseFunction {
|
|
|
36812
37869
|
return resultArray;
|
|
36813
37870
|
}
|
|
36814
37871
|
_getResult(numberValue, orderValue, refNumbers) {
|
|
36815
|
-
const refOrderNumbers = refNumbers.sort((a, b) => !orderValue ? b - a : a - b);
|
|
36816
|
-
let index = refOrderNumbers.indexOf(numberValue);
|
|
37872
|
+
const refOrderNumbers = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b);
|
|
36817
37873
|
const results = [];
|
|
36818
|
-
|
|
36819
|
-
const start = index + 1;
|
|
36820
|
-
results.push(start);
|
|
36821
|
-
index = refOrderNumbers.indexOf(numberValue, start);
|
|
36822
|
-
}
|
|
37874
|
+
for (let index = 0; index < refOrderNumbers.length; index++) if (isSameRankNumber$1(refOrderNumbers[index], numberValue)) results.push(index + 1);
|
|
36823
37875
|
if (results.length === 0) return ErrorValueObject.create("#N/A");
|
|
36824
37876
|
const result = results.reduce((acc, cur) => acc + cur, 0) / results.length;
|
|
36825
37877
|
return NumberValueObject.create(result);
|
|
@@ -36828,12 +37880,12 @@ var RankAvg = class extends BaseFunction {
|
|
|
36828
37880
|
let refHasError = false;
|
|
36829
37881
|
let refErrorObject = ErrorValueObject.create("#N/A");
|
|
36830
37882
|
const refNumbers = [];
|
|
36831
|
-
if (!ref.isReferenceObject()) return {
|
|
37883
|
+
if (!ref.isReferenceObject() && !ref.isArray()) return {
|
|
36832
37884
|
refHasError: true,
|
|
36833
37885
|
refErrorObject,
|
|
36834
37886
|
refNumbers
|
|
36835
37887
|
};
|
|
36836
|
-
ref.toArrayValueObject().iterator((refObject) => {
|
|
37888
|
+
(ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
|
|
36837
37889
|
const _refObject = refObject;
|
|
36838
37890
|
if (_refObject.isError()) {
|
|
36839
37891
|
refHasError = true;
|
|
@@ -36855,6 +37907,11 @@ var RankAvg = class extends BaseFunction {
|
|
|
36855
37907
|
|
|
36856
37908
|
//#endregion
|
|
36857
37909
|
//#region src/functions/statistical/rank-eq/index.ts
|
|
37910
|
+
function isSameRankNumber(left, right) {
|
|
37911
|
+
if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
|
|
37912
|
+
const scale = Math.max(1, Math.abs(left), Math.abs(right));
|
|
37913
|
+
return Math.abs(left - right) <= Number.EPSILON * scale * 2;
|
|
37914
|
+
}
|
|
36858
37915
|
var RankEq = class extends BaseFunction {
|
|
36859
37916
|
constructor(..._args) {
|
|
36860
37917
|
super(..._args);
|
|
@@ -36880,7 +37937,7 @@ var RankEq = class extends BaseFunction {
|
|
|
36880
37937
|
const numberValue = +numberObject.getValue();
|
|
36881
37938
|
const orderValue = +orderObject.getValue();
|
|
36882
37939
|
if (Number.isNaN(numberValue) || Number.isNaN(orderValue)) return ErrorValueObject.create("#VALUE!");
|
|
36883
|
-
const result = refNumbers.sort((a, b) => !orderValue ? b - a : a - b).
|
|
37940
|
+
const result = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b).findIndex((refNumber) => isSameRankNumber(refNumber, numberValue));
|
|
36884
37941
|
if (result === -1) return ErrorValueObject.create("#N/A");
|
|
36885
37942
|
return NumberValueObject.create(result + 1);
|
|
36886
37943
|
});
|
|
@@ -36891,12 +37948,12 @@ var RankEq = class extends BaseFunction {
|
|
|
36891
37948
|
let refHasError = false;
|
|
36892
37949
|
let refErrorObject = ErrorValueObject.create("#N/A");
|
|
36893
37950
|
const refNumbers = [];
|
|
36894
|
-
if (!ref.isReferenceObject()) return {
|
|
37951
|
+
if (!ref.isReferenceObject() && !ref.isArray()) return {
|
|
36895
37952
|
refHasError: true,
|
|
36896
37953
|
refErrorObject,
|
|
36897
37954
|
refNumbers
|
|
36898
37955
|
};
|
|
36899
|
-
ref.toArrayValueObject().iterator((refObject) => {
|
|
37956
|
+
(ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
|
|
36900
37957
|
const _refObject = refObject;
|
|
36901
37958
|
if (_refObject.isError()) {
|
|
36902
37959
|
refHasError = true;
|
|
@@ -37968,11 +39025,10 @@ var Concat = class extends BaseFunction {
|
|
|
37968
39025
|
isError = valueObject;
|
|
37969
39026
|
return false;
|
|
37970
39027
|
}
|
|
37971
|
-
|
|
37972
|
-
else if (valueObject.isString() || valueObject.isNumber()) concatenatedString += valueObject.getValue();
|
|
39028
|
+
concatenatedString += formatValueForFormulaText(valueObject.getValue());
|
|
37973
39029
|
});
|
|
37974
39030
|
if (isError) return isError;
|
|
37975
|
-
} else if (!textValue.isError() && !textValue.isNull()) concatenatedString += textValue.getValue();
|
|
39031
|
+
} else if (!textValue.isError() && !textValue.isNull()) concatenatedString += formatValueForFormulaText(textValue.getValue());
|
|
37976
39032
|
return StringValueObject.create(concatenatedString);
|
|
37977
39033
|
}
|
|
37978
39034
|
};
|
|
@@ -37999,20 +39055,27 @@ var Concatenate = class extends BaseFunction {
|
|
|
37999
39055
|
}
|
|
38000
39056
|
});
|
|
38001
39057
|
let result = null;
|
|
39058
|
+
const referenceSource = textValues.find((textValue) => {
|
|
39059
|
+
if (!textValue.isArray()) return false;
|
|
39060
|
+
const arrayValue = textValue;
|
|
39061
|
+
return arrayValue.getUnitId() !== "" && arrayValue.getSheetId() !== "" && arrayValue.getCurrentRow() >= 0 && arrayValue.getCurrentColumn() >= 0;
|
|
39062
|
+
});
|
|
38002
39063
|
for (const textValue of textValues) result = expandArrayValueObject(maxRowLength, maxColumnLength, textValue, ErrorValueObject.create("#N/A")).mapValue((textValueObject, rowIndex, columnIndex) => {
|
|
38003
|
-
var
|
|
39064
|
+
var _resultValueObject$ge, _textValueObject$getV;
|
|
38004
39065
|
const resultValueObject = result && result.get(rowIndex, columnIndex);
|
|
38005
39066
|
if (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isError()) return resultValueObject;
|
|
38006
39067
|
if (textValueObject.isError()) return textValueObject;
|
|
38007
|
-
|
|
38008
|
-
|
|
38009
|
-
if (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isBoolean()) resultValue = `${resultValue}`.toLocaleUpperCase();
|
|
38010
|
-
if (textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.isBoolean()) textValue = `${textValue}`.toLocaleUpperCase();
|
|
38011
|
-
const resultValueObjectString = (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isNull()) ? "" : (_resultValue = resultValue) !== null && _resultValue !== void 0 ? _resultValue : "";
|
|
38012
|
-
const textValueObjectString = (textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.isNull()) ? "" : (_textValue = textValue) !== null && _textValue !== void 0 ? _textValue : "";
|
|
39068
|
+
const resultValueObjectString = (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isNull()) ? "" : formatValueForFormulaText((_resultValueObject$ge = resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.getValue()) !== null && _resultValueObject$ge !== void 0 ? _resultValueObject$ge : null);
|
|
39069
|
+
const textValueObjectString = (textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.isNull()) ? "" : formatValueForFormulaText((_textValueObject$getV = textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.getValue()) !== null && _textValueObject$getV !== void 0 ? _textValueObject$getV : null);
|
|
38013
39070
|
return StringValueObject.create(`${resultValueObjectString}${textValueObjectString}`);
|
|
38014
39071
|
});
|
|
38015
39072
|
if (!result) return ErrorValueObject.create("#VALUE!");
|
|
39073
|
+
if (referenceSource && result.isArray()) {
|
|
39074
|
+
const resultArray = result;
|
|
39075
|
+
resultArray.setUnitId(referenceSource.getUnitId());
|
|
39076
|
+
resultArray.setSheetId(referenceSource.getSheetId());
|
|
39077
|
+
resultArray.setCurrent(referenceSource.getCurrentRow(), referenceSource.getCurrentColumn());
|
|
39078
|
+
}
|
|
38016
39079
|
return result;
|
|
38017
39080
|
}
|
|
38018
39081
|
};
|
|
@@ -39779,13 +40842,17 @@ var Text = class extends BaseFunction {
|
|
|
39779
40842
|
}
|
|
39780
40843
|
if (formatTextValue.isNull()) formatTextValue = StringValueObject.create(" ");
|
|
39781
40844
|
const formatTextValueString = `${formatTextValue.getValue()}`;
|
|
39782
|
-
const previewText = getFormatPreview(formatTextValueString, textValueNumber);
|
|
40845
|
+
const previewText = getFormatPreview(normalizeExcelWeekdayFormat(formatTextValueString), textValueNumber);
|
|
39783
40846
|
return StringValueObject.create(formatTextValueString === " " ? previewText.trimEnd() : previewText);
|
|
39784
40847
|
});
|
|
39785
40848
|
if (resultArray.getRowCount() === 1 && resultArray.getColumnCount() === 1) return resultArray.get(0, 0);
|
|
39786
40849
|
return resultArray;
|
|
39787
40850
|
}
|
|
39788
40851
|
};
|
|
40852
|
+
function normalizeExcelWeekdayFormat(formatText) {
|
|
40853
|
+
if (!formatText.includes("Å")) return formatText;
|
|
40854
|
+
return formatText.replace(/\u00C5{4,}/g, "dddd").replace(/\u00C5{1,3}/g, "ddd");
|
|
40855
|
+
}
|
|
39789
40856
|
|
|
39790
40857
|
//#endregion
|
|
39791
40858
|
//#region src/functions/text/textafter/index.ts
|
|
@@ -40160,9 +41227,19 @@ var Textsplit = class extends BaseFunction {
|
|
|
40160
41227
|
const _ignoreEmpty = ignoreEmpty !== null && ignoreEmpty !== void 0 ? ignoreEmpty : NumberValueObject.create(0);
|
|
40161
41228
|
const _matchMode = matchMode !== null && matchMode !== void 0 ? matchMode : NumberValueObject.create(0);
|
|
40162
41229
|
const _padWith = padWith !== null && padWith !== void 0 ? padWith : StringValueObject.create("#N/A");
|
|
40163
|
-
const { _variant: _colDelimiter, values: colDelimiterValue } = this._getStringValues(colDelimiter);
|
|
40164
41230
|
const { _variant, values: rowDelimiterValue } = this._getStringValues(_rowDelimiter, false);
|
|
40165
41231
|
_rowDelimiter = _variant;
|
|
41232
|
+
const allowBlankColDelimiter = rowDelimiter != null && !rowDelimiter.isNull() && !_rowDelimiter.isError() && rowDelimiterValue.length > 0;
|
|
41233
|
+
let _colDelimiter;
|
|
41234
|
+
let colDelimiterValue;
|
|
41235
|
+
if (allowBlankColDelimiter && this._isBlankScalarDelimiter(colDelimiter)) {
|
|
41236
|
+
_colDelimiter = colDelimiter;
|
|
41237
|
+
colDelimiterValue = [];
|
|
41238
|
+
} else {
|
|
41239
|
+
const { _variant: colDelimiterVariant, values } = this._getStringValues(colDelimiter);
|
|
41240
|
+
_colDelimiter = colDelimiterVariant;
|
|
41241
|
+
colDelimiterValue = values;
|
|
41242
|
+
}
|
|
40166
41243
|
const maxRowLength = Math.max(text.isArray() ? text.getRowCount() : 1, _ignoreEmpty.isArray() ? _ignoreEmpty.getRowCount() : 1, _matchMode.isArray() ? _matchMode.getRowCount() : 1);
|
|
40167
41244
|
const maxColumnLength = Math.max(text.isArray() ? text.getColumnCount() : 1, _ignoreEmpty.isArray() ? _ignoreEmpty.getColumnCount() : 1, _matchMode.isArray() ? _matchMode.getColumnCount() : 1);
|
|
40168
41245
|
const textArray = expandArrayValueObject(maxRowLength, maxColumnLength, text, ErrorValueObject.create("#N/A"));
|
|
@@ -40240,7 +41317,7 @@ var Textsplit = class extends BaseFunction {
|
|
|
40240
41317
|
const resultRows = textValue.split(rowDelimiterRegExp);
|
|
40241
41318
|
let resultColsMaxCount = 1;
|
|
40242
41319
|
let result = resultRows.map((row) => {
|
|
40243
|
-
let cols = row.split(colDelimiterRegExp);
|
|
41320
|
+
let cols = colDelimiterValue.length > 0 ? row.split(colDelimiterRegExp) : [row];
|
|
40244
41321
|
if (ignoreEmptyValue) cols = cols.filter((col) => col !== "");
|
|
40245
41322
|
resultColsMaxCount = Math.max(resultColsMaxCount, cols.length);
|
|
40246
41323
|
return cols;
|
|
@@ -40264,7 +41341,10 @@ var Textsplit = class extends BaseFunction {
|
|
|
40264
41341
|
if (valueObject.isNull()) value = "\\s";
|
|
40265
41342
|
if (valueObject.isBoolean()) value = value ? "TRUE" : "FALSE";
|
|
40266
41343
|
value += "";
|
|
40267
|
-
return escapeRegExp(value);
|
|
41344
|
+
return regexp.escapeRegExp(value);
|
|
41345
|
+
}
|
|
41346
|
+
_isBlankScalarDelimiter(valueObject) {
|
|
41347
|
+
return !valueObject.isArray() && (valueObject.isNull() || `${valueObject.getValue()}` === "");
|
|
40268
41348
|
}
|
|
40269
41349
|
};
|
|
40270
41350
|
|
|
@@ -40493,6 +41573,7 @@ const functionText = [
|
|
|
40493
41573
|
[Numbervalue, "NUMBERVALUE"],
|
|
40494
41574
|
[Regexextract, "REGEXEXTRACT"],
|
|
40495
41575
|
[Regexmatch, "REGEXMATCH"],
|
|
41576
|
+
[Regexmatch, "REGEXTEST"],
|
|
40496
41577
|
[Regexreplace, "REGEXREPLACE"],
|
|
40497
41578
|
[Proper, "PROPER"],
|
|
40498
41579
|
[Replace, "REPLACE"],
|
|
@@ -40560,6 +41641,58 @@ var Encodeurl = class extends BaseFunction {
|
|
|
40560
41641
|
}
|
|
40561
41642
|
};
|
|
40562
41643
|
|
|
41644
|
+
//#endregion
|
|
41645
|
+
//#region src/functions/web/filterxml/index.ts
|
|
41646
|
+
var Filterxml = class extends BaseFunction {
|
|
41647
|
+
constructor(..._args) {
|
|
41648
|
+
super(..._args);
|
|
41649
|
+
_defineProperty(this, "minParams", 2);
|
|
41650
|
+
_defineProperty(this, "maxParams", 2);
|
|
41651
|
+
}
|
|
41652
|
+
calculate(xml, xpath) {
|
|
41653
|
+
if (xml.isError()) return xml;
|
|
41654
|
+
if (xpath.isError()) return xpath;
|
|
41655
|
+
const tagName = getDescendantTagName(`${xpath.getValue()}`);
|
|
41656
|
+
if (tagName == null) return ErrorValueObject.create("#VALUE!");
|
|
41657
|
+
const values = extractTagTexts(`${xml.getValue()}`, tagName);
|
|
41658
|
+
if (values.length === 0) return ErrorValueObject.create("#VALUE!");
|
|
41659
|
+
return ArrayValueObject.create({
|
|
41660
|
+
calculateValueList: transformToValueObject(values.map((value) => [value])),
|
|
41661
|
+
rowCount: values.length,
|
|
41662
|
+
columnCount: 1,
|
|
41663
|
+
unitId: "",
|
|
41664
|
+
sheetId: "",
|
|
41665
|
+
row: 0,
|
|
41666
|
+
column: 0
|
|
41667
|
+
});
|
|
41668
|
+
}
|
|
41669
|
+
};
|
|
41670
|
+
function getDescendantTagName(xpath) {
|
|
41671
|
+
const text = xpath.trim();
|
|
41672
|
+
if (!text.startsWith("//")) return null;
|
|
41673
|
+
const tagName = text.slice(2).replace(/\/text\(\)$/, "").trim();
|
|
41674
|
+
return /^[A-Za-z0-9_.-]+$/.test(tagName) ? tagName : null;
|
|
41675
|
+
}
|
|
41676
|
+
function extractTagTexts(xml, tagName) {
|
|
41677
|
+
const open = `<${tagName}>`;
|
|
41678
|
+
const close = `</${tagName}>`;
|
|
41679
|
+
const values = [];
|
|
41680
|
+
let offset = 0;
|
|
41681
|
+
while (offset < xml.length) {
|
|
41682
|
+
const openIndex = xml.indexOf(open, offset);
|
|
41683
|
+
if (openIndex < 0) break;
|
|
41684
|
+
const valueStart = openIndex + open.length;
|
|
41685
|
+
const closeIndex = xml.indexOf(close, valueStart);
|
|
41686
|
+
if (closeIndex < 0) break;
|
|
41687
|
+
values.push(decodeXmlEntities(xml.slice(valueStart, closeIndex)));
|
|
41688
|
+
offset = closeIndex + close.length;
|
|
41689
|
+
}
|
|
41690
|
+
return values;
|
|
41691
|
+
}
|
|
41692
|
+
function decodeXmlEntities(value) {
|
|
41693
|
+
return value.replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&").replace(/"/g, "\"").replace(/'/g, "'");
|
|
41694
|
+
}
|
|
41695
|
+
|
|
40563
41696
|
//#endregion
|
|
40564
41697
|
//#region src/functions/web/function-map.ts
|
|
40565
41698
|
/**
|
|
@@ -40577,7 +41710,7 @@ var Encodeurl = class extends BaseFunction {
|
|
|
40577
41710
|
* See the License for the specific language governing permissions and
|
|
40578
41711
|
* limitations under the License.
|
|
40579
41712
|
*/
|
|
40580
|
-
const functionWeb = [[Encodeurl, "ENCODEURL"]];
|
|
41713
|
+
const functionWeb = [[Encodeurl, "ENCODEURL"], [Filterxml, "FILTERXML"]];
|
|
40581
41714
|
|
|
40582
41715
|
//#endregion
|
|
40583
41716
|
//#region src/functions/index.ts
|
|
@@ -40647,7 +41780,7 @@ function getObjectValue(result, isUseStrip = false) {
|
|
|
40647
41780
|
//#endregion
|
|
40648
41781
|
//#region package.json
|
|
40649
41782
|
var name = "@univerjs/engine-formula";
|
|
40650
|
-
var version = "1.0.0-alpha.
|
|
41783
|
+
var version = "1.0.0-alpha.3";
|
|
40651
41784
|
|
|
40652
41785
|
//#endregion
|
|
40653
41786
|
//#region src/services/global-computing-status.service.ts
|
|
@@ -40938,36 +42071,151 @@ SetOtherFormulaController = __decorate([
|
|
|
40938
42071
|
], SetOtherFormulaController);
|
|
40939
42072
|
|
|
40940
42073
|
//#endregion
|
|
40941
|
-
//#region src/services/
|
|
40942
|
-
|
|
40943
|
-
|
|
40944
|
-
|
|
40945
|
-
|
|
40946
|
-
|
|
40947
|
-
|
|
40948
|
-
|
|
40949
|
-
_defineProperty(this, "
|
|
42074
|
+
//#region src/services/formula-calculation-trigger.service.ts
|
|
42075
|
+
const LOCAL_ONLY = { onlyLocal: true };
|
|
42076
|
+
const CALCULATION_DEBOUNCE_TIME = 100;
|
|
42077
|
+
let FormulaCalculationTriggerService = class FormulaCalculationTriggerService extends Disposable {
|
|
42078
|
+
constructor(_commandService, _activeDirtyManagerService) {
|
|
42079
|
+
super();
|
|
42080
|
+
this._commandService = _commandService;
|
|
42081
|
+
this._activeDirtyManagerService = _activeDirtyManagerService;
|
|
42082
|
+
_defineProperty(this, "_waitingCommandQueue", []);
|
|
42083
|
+
_defineProperty(this, "_executingDirtyData", createEmptyDirtyData());
|
|
42084
|
+
_defineProperty(this, "_timer", void 0);
|
|
42085
|
+
_defineProperty(this, "_executionInProgress", false);
|
|
42086
|
+
_defineProperty(this, "_restartCalculation", false);
|
|
42087
|
+
this._initialize();
|
|
40950
42088
|
}
|
|
40951
42089
|
dispose() {
|
|
40952
|
-
this.
|
|
42090
|
+
clearTimeout(this._timer);
|
|
42091
|
+
this._waitingCommandQueue = [];
|
|
42092
|
+
this._executingDirtyData = createEmptyDirtyData();
|
|
42093
|
+
super.dispose();
|
|
40953
42094
|
}
|
|
40954
|
-
|
|
40955
|
-
this.
|
|
42095
|
+
_initialize() {
|
|
42096
|
+
this.disposeWithMe(this._commandService.onCommandExecuted((command, options) => {
|
|
42097
|
+
var _conversion$shouldTri;
|
|
42098
|
+
if (command.id === SetFormulaCalculationStartMutation.id) {
|
|
42099
|
+
this._executionInProgress = true;
|
|
42100
|
+
return;
|
|
42101
|
+
}
|
|
42102
|
+
if (command.id === SetFormulaCalculationNotificationMutation.id) {
|
|
42103
|
+
this._handleCalculationNotification(command.params);
|
|
42104
|
+
return;
|
|
42105
|
+
}
|
|
42106
|
+
const conversion = this._activeDirtyManagerService.get(command.id);
|
|
42107
|
+
if (!conversion) return;
|
|
42108
|
+
if (((_conversion$shouldTri = conversion.shouldTrigger) === null || _conversion$shouldTri === void 0 ? void 0 : _conversion$shouldTri.call(conversion, command, options)) === false) return;
|
|
42109
|
+
this._waitingCommandQueue.push(command);
|
|
42110
|
+
clearTimeout(this._timer);
|
|
42111
|
+
this._timer = setTimeout(() => this._flush(), CALCULATION_DEBOUNCE_TIME);
|
|
42112
|
+
}));
|
|
40956
42113
|
}
|
|
40957
|
-
|
|
40958
|
-
|
|
42114
|
+
_flush() {
|
|
42115
|
+
const dirtyData = this._generateDirty(this._waitingCommandQueue);
|
|
42116
|
+
this._waitingCommandQueue = [];
|
|
42117
|
+
this._timer = void 0;
|
|
42118
|
+
if (!hasDirtyData(dirtyData)) return;
|
|
42119
|
+
this._executingDirtyData = mergeDirtyData(this._executingDirtyData, dirtyData);
|
|
42120
|
+
if (this._executionInProgress) {
|
|
42121
|
+
this._restartCalculation = true;
|
|
42122
|
+
this._commandService.executeCommand(SetFormulaCalculationStopMutation.id, {}, LOCAL_ONLY);
|
|
42123
|
+
return;
|
|
42124
|
+
}
|
|
42125
|
+
this._startCalculation();
|
|
40959
42126
|
}
|
|
40960
|
-
|
|
40961
|
-
|
|
42127
|
+
_startCalculation() {
|
|
42128
|
+
this._executionInProgress = true;
|
|
42129
|
+
this._commandService.executeCommand(SetFormulaCalculationStartMutation.id, { ...this._executingDirtyData }, LOCAL_ONLY);
|
|
40962
42130
|
}
|
|
40963
|
-
|
|
40964
|
-
|
|
42131
|
+
_handleCalculationNotification(params) {
|
|
42132
|
+
if (params.stageInfo != null) {
|
|
42133
|
+
this._executionInProgress = true;
|
|
42134
|
+
return;
|
|
42135
|
+
}
|
|
42136
|
+
const state = params.functionsExecutedState;
|
|
42137
|
+
if (state == null) return;
|
|
42138
|
+
this._executionInProgress = false;
|
|
42139
|
+
if (state === 1 && this._restartCalculation) {
|
|
42140
|
+
this._restartCalculation = false;
|
|
42141
|
+
this._startCalculation();
|
|
42142
|
+
return;
|
|
42143
|
+
}
|
|
42144
|
+
this._restartCalculation = false;
|
|
42145
|
+
this._executingDirtyData = createEmptyDirtyData();
|
|
40965
42146
|
}
|
|
40966
|
-
|
|
40967
|
-
return
|
|
42147
|
+
_generateDirty(commands) {
|
|
42148
|
+
return commands.reduce((result, command) => {
|
|
42149
|
+
const conversion = this._activeDirtyManagerService.get(command.id);
|
|
42150
|
+
return conversion ? mergeDirtyData(result, conversion.getDirtyData(command)) : result;
|
|
42151
|
+
}, createEmptyDirtyData());
|
|
40968
42152
|
}
|
|
40969
42153
|
};
|
|
40970
|
-
|
|
42154
|
+
FormulaCalculationTriggerService = __decorate([__decorateParam(0, ICommandService), __decorateParam(1, IActiveDirtyManagerService)], FormulaCalculationTriggerService);
|
|
42155
|
+
function createEmptyDirtyData() {
|
|
42156
|
+
return {
|
|
42157
|
+
forceCalculation: false,
|
|
42158
|
+
dirtyRanges: [],
|
|
42159
|
+
dirtyNameMap: {},
|
|
42160
|
+
dirtyDefinedNameMap: {},
|
|
42161
|
+
dirtySuperTableMap: {},
|
|
42162
|
+
dirtyUnitFeatureMap: {},
|
|
42163
|
+
dirtyUnitOtherFormulaMap: {},
|
|
42164
|
+
clearDependencyTreeCache: {}
|
|
42165
|
+
};
|
|
42166
|
+
}
|
|
42167
|
+
function mergeDirtyData(left, right) {
|
|
42168
|
+
var _right$dirtyRanges, _left$dirtySuperTable;
|
|
42169
|
+
const dirtyRanges = [...left.dirtyRanges];
|
|
42170
|
+
mergeDirtyRanges(dirtyRanges, (_right$dirtyRanges = right.dirtyRanges) !== null && _right$dirtyRanges !== void 0 ? _right$dirtyRanges : []);
|
|
42171
|
+
return {
|
|
42172
|
+
dirtyRanges,
|
|
42173
|
+
dirtyNameMap: mergeDirtyUnitStringMap(left.dirtyNameMap, right.dirtyNameMap),
|
|
42174
|
+
dirtyDefinedNameMap: mergeDirtyUnitStringMap(left.dirtyDefinedNameMap, right.dirtyDefinedNameMap),
|
|
42175
|
+
dirtySuperTableMap: mergeDirtyUnitStringMap((_left$dirtySuperTable = left.dirtySuperTableMap) !== null && _left$dirtySuperTable !== void 0 ? _left$dirtySuperTable : {}, right.dirtySuperTableMap),
|
|
42176
|
+
dirtyUnitFeatureMap: mergeDirtyUnitNestedMap(left.dirtyUnitFeatureMap, right.dirtyUnitFeatureMap),
|
|
42177
|
+
dirtyUnitOtherFormulaMap: mergeDirtyUnitNestedMap(left.dirtyUnitOtherFormulaMap, right.dirtyUnitOtherFormulaMap),
|
|
42178
|
+
clearDependencyTreeCache: mergeDirtyUnitStringMap(left.clearDependencyTreeCache, right.clearDependencyTreeCache),
|
|
42179
|
+
forceCalculation: left.forceCalculation || Boolean(right.forceCalculation)
|
|
42180
|
+
};
|
|
42181
|
+
}
|
|
42182
|
+
function mergeDirtyRanges(target, source) {
|
|
42183
|
+
source.forEach((range) => {
|
|
42184
|
+
if (!target.some((item) => item.unitId === range.unitId && item.sheetId === range.sheetId && item.range.startRow === range.range.startRow && item.range.startColumn === range.range.startColumn && item.range.endRow === range.range.endRow && item.range.endColumn === range.range.endColumn)) target.push(range);
|
|
42185
|
+
});
|
|
42186
|
+
}
|
|
42187
|
+
function mergeDirtyUnitStringMap(left, right) {
|
|
42188
|
+
const result = { ...left };
|
|
42189
|
+
Object.entries(right !== null && right !== void 0 ? right : {}).forEach(([unitId, values]) => {
|
|
42190
|
+
result[unitId] = {
|
|
42191
|
+
...result[unitId],
|
|
42192
|
+
...values
|
|
42193
|
+
};
|
|
42194
|
+
});
|
|
42195
|
+
return result;
|
|
42196
|
+
}
|
|
42197
|
+
function mergeDirtyUnitNestedMap(left, right) {
|
|
42198
|
+
const result = { ...left };
|
|
42199
|
+
Object.entries(right !== null && right !== void 0 ? right : {}).forEach(([unitId, sheets]) => {
|
|
42200
|
+
const unitResult = { ...result[unitId] };
|
|
42201
|
+
Object.entries(sheets !== null && sheets !== void 0 ? sheets : {}).forEach(([sheetId, values]) => {
|
|
42202
|
+
unitResult[sheetId] = {
|
|
42203
|
+
...unitResult[sheetId],
|
|
42204
|
+
...values
|
|
42205
|
+
};
|
|
42206
|
+
});
|
|
42207
|
+
result[unitId] = unitResult;
|
|
42208
|
+
});
|
|
42209
|
+
return result;
|
|
42210
|
+
}
|
|
42211
|
+
function hasDirtyData(dirtyData) {
|
|
42212
|
+
return dirtyData.forceCalculation || dirtyData.dirtyRanges.length > 0 || hasNestedValue(dirtyData.dirtyNameMap) || hasNestedValue(dirtyData.dirtyDefinedNameMap) || hasNestedValue(dirtyData.dirtySuperTableMap) || hasNestedValue(dirtyData.dirtyUnitFeatureMap) || hasNestedValue(dirtyData.dirtyUnitOtherFormulaMap) || hasNestedValue(dirtyData.clearDependencyTreeCache);
|
|
42213
|
+
}
|
|
42214
|
+
function hasNestedValue(value) {
|
|
42215
|
+
if (value == null) return false;
|
|
42216
|
+
if (typeof value !== "object") return true;
|
|
42217
|
+
return Object.values(value).some(hasNestedValue);
|
|
42218
|
+
}
|
|
40971
42219
|
|
|
40972
42220
|
//#endregion
|
|
40973
42221
|
//#region src/services/formula-common.ts
|
|
@@ -41169,7 +42417,7 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends Plugin {
|
|
|
41169
42417
|
}
|
|
41170
42418
|
onReady() {
|
|
41171
42419
|
var _this$_config;
|
|
41172
|
-
touchDependencies(this._injector, [[FormulaController]]);
|
|
42420
|
+
touchDependencies(this._injector, [[FormulaController], [SuperTableActiveDirtyController]]);
|
|
41173
42421
|
if (!((_this$_config = this._config) === null || _this$_config === void 0 ? void 0 : _this$_config.notExecuteFormula)) touchDependencies(this._injector, [
|
|
41174
42422
|
[SetOtherFormulaController],
|
|
41175
42423
|
[SetFeatureCalculationController],
|
|
@@ -41187,6 +42435,7 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends Plugin {
|
|
|
41187
42435
|
[IFunctionService, { useClass: FunctionService }],
|
|
41188
42436
|
[IDefinedNamesService, { useClass: DefinedNamesService }],
|
|
41189
42437
|
[IActiveDirtyManagerService, { useClass: ActiveDirtyManagerService }],
|
|
42438
|
+
[FormulaCalculationTriggerService],
|
|
41190
42439
|
[RegisterOtherFormulaService],
|
|
41191
42440
|
[IHyperlinkEngineFormulaService, { useClass: HyperlinkEngineFormulaService }],
|
|
41192
42441
|
[ISheetRowFilteredService, { useClass: SheetRowFilteredService }],
|
|
@@ -41194,6 +42443,7 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends Plugin {
|
|
|
41194
42443
|
[GlobalComputingStatusService],
|
|
41195
42444
|
[FormulaDataModel],
|
|
41196
42445
|
[FormulaController],
|
|
42446
|
+
[SuperTableActiveDirtyController],
|
|
41197
42447
|
[ComputingStatusReporterController]
|
|
41198
42448
|
];
|
|
41199
42449
|
if (shouldPerformComputing) dependencies.push([IOtherFormulaManagerService, { useClass: OtherFormulaManagerService }], [IFormulaRuntimeService, { useClass: FormulaRuntimeService }], [IFormulaCurrentConfigService, { useClass: FormulaCurrentConfigService }], [IFeatureCalculationManagerService, { useClass: FeatureCalculationManagerService }], [CalculateController], [SetOtherFormulaController], [SetDependencyController], [SetFeatureCalculationController], [Interpreter], [AstTreeBuilder], [Lexer], [AstRootNodeFactory], [FunctionNodeFactory], [LambdaNodeFactory], [LambdaParameterNodeFactory], [OperatorNodeFactory], [PrefixNodeFactory], [ReferenceNodeFactory], [SuffixNodeFactory], [UnionNodeFactory], [ValueNodeFactory]);
|
|
@@ -41215,4 +42465,4 @@ _defineProperty(UniverFormulaEnginePlugin, "version", version);
|
|
|
41215
42465
|
UniverFormulaEnginePlugin = __decorate([__decorateParam(1, Inject(Injector)), __decorateParam(2, IConfigService)], UniverFormulaEnginePlugin);
|
|
41216
42466
|
|
|
41217
42467
|
//#endregion
|
|
41218
|
-
export { ALL_IMPLEMENTED_FUNCTIONS, ALL_IMPLEMENTED_FUNCTIONS_SET, ActiveDirtyManagerService, ArrayValueObject, AstRootNodeFactory, AstTreeBuilder, AsyncArrayObject, AsyncCustomFunction, AsyncObject, BaseFunction, BaseReferenceObject, BaseValueObject, BooleanValue, BooleanValueObject, CELL_INVERTED_INDEX_CACHE, CalculateController, CalculateFormulaService, CustomFunction, DEFAULT_CYCLE_REFERENCE_COUNT, DEFAULT_INTERVAL_COUNT, DEFAULT_TOKEN_LAMBDA_FUNCTION_NAME, DEFAULT_TOKEN_LET_FUNCTION_NAME, DEFAULT_TOKEN_TYPE_LAMBDA_PARAMETER, DEFAULT_TOKEN_TYPE_PARAMETER, DEFAULT_TOKEN_TYPE_ROOT, DefinedNamesService, DependencyManagerBaseService, DependencyManagerService, ENGINE_FORMULA_CYCLE_REFERENCE_COUNT, ENGINE_FORMULA_PLUGIN_CONFIG_KEY, ENGINE_FORMULA_RETURN_DEPENDENCY_TREE, ERROR_TYPE_SET, ErrorType, ErrorValueObject, FORMULA_REF_TO_ARRAY_CACHE, FUNCTION_NAMES_ARRAY, FUNCTION_NAMES_COMPATIBILITY, FUNCTION_NAMES_CUBE, FUNCTION_NAMES_DATABASE, FUNCTION_NAMES_DATE, FUNCTION_NAMES_ENGINEERING, FUNCTION_NAMES_FINANCIAL, FUNCTION_NAMES_INFORMATION, FUNCTION_NAMES_LOGICAL, FUNCTION_NAMES_LOOKUP, FUNCTION_NAMES_MATH, FUNCTION_NAMES_STATISTICAL, FUNCTION_NAMES_TEXT, FUNCTION_NAMES_UNIVER, FUNCTION_NAMES_WEB, FeatureCalculationManagerService, FormulaCurrentConfigService, FormulaDataModel, FormulaDependencyGenerator, FormulaDependencyTree, FormulaDependencyTreeModel, FormulaDependencyTreeType, FormulaDependencyTreeVirtual, FormulaExecuteStageType, FormulaExecutedStateType, FormulaResultStatus, FormulaRuntimeService, FunctionNodeFactory, FunctionService, FunctionType, GlobalComputingStatusService, HyperlinkEngineFormulaService, IActiveDirtyManagerService, ICalculateFormulaService, IDefinedNamesService, IDependencyManagerService, IFeatureCalculationManagerService, IFormulaCurrentConfigService, IFormulaDependencyGenerator, IFormulaRuntimeService, IFunctionService, IHyperlinkEngineFormulaService, IOtherFormulaManagerService, ISheetRowFilteredService, ISuperTableService, Interpreter, LambdaNodeFactory, LambdaParameterNodeFactory, LambdaValueObjectObject, Lexer, LexerNode, LexerTreeBuilder, NEW_EXCEL_FUNCTIONS, NullValueObject, NumberValueObject, OPERATOR_TOKEN_SET, OperatorNodeFactory, OtherFormulaBizType, OtherFormulaManagerService, OtherFormulaMarkDirty, PrefixNodeFactory, RangeReferenceObject, ReferenceNodeFactory, RegisterFunctionMutation, RegisterOtherFormulaService, RemoveDefinedNameMutation, RemoveFeatureCalculationMutation, RemoveOtherFormulaMutation, RemoveSuperTableMutation, SUFFIX_TOKEN_SET, SetArrayFormulaDataMutation, SetCellFormulaDependencyCalculationMutation, SetCellFormulaDependencyCalculationResultMutation, SetDefinedNameMutation, SetDefinedNameMutationFactory, SetFeatureCalculationMutation, SetFormulaCalculationNotificationMutation, SetFormulaCalculationResultMutation, SetFormulaCalculationStartMutation, SetFormulaCalculationStopMutation, SetFormulaDataMutation, SetFormulaDependencyCalculationMutation, SetFormulaDependencyCalculationResultMutation, SetFormulaStringBatchCalculationMutation, SetFormulaStringBatchCalculationResultMutation, SetImageFormulaDataMutation, SetOtherFormulaMutation, SetQueryFormulaDependencyAllMutation, SetQueryFormulaDependencyAllResultMutation, SetQueryFormulaDependencyMutation, SetQueryFormulaDependencyResultMutation, SetSuperTableMutation, SetSuperTableOptionMutation, SetTriggerFormulaCalculationStartMutation, SheetRowFilteredService, StringValueObject, SuffixNodeFactory, SuperTableService, UnionNodeFactory, UniverFormulaEnginePlugin, ValueNodeFactory, ValueObjectFactory, compareToken, convertUnitDataToRuntime, deserializeRangeForR1C1, deserializeRangeWithSheet, deserializeRangeWithSheetWithCache, excelDateSerial, extractFormulaError, functionArray, functionCompatibility, functionCube, functionDatabase, functionDate, functionEngineering, functionFinancial, functionInformation, functionLogical, functionLookup, functionMath, functionMeta, functionStatistical, functionText, functionUniver, functionWeb, generateAstNode, generateExecuteAstNodeData, generateRandomDependencyTreeId, generateStringWithSequence, getAbsoluteRefTypeWitString, getAbsoluteRefTypeWithSingleString, getObjectValue, getRangeWithRefsString, handleNumfmtInCell, handleRefStringInfo, includeFormulaLexerToken, initSheetFormulaData, isFormulaLexerToken, isInDirtyRange, isReferenceString, isReferenceStringWithEffectiveColumn, isReferenceStrings, matchRefDrawToken, matchToken, needsQuoting, normalizeSheetName, operatorToken, prefixToken, quoteSheetName, sequenceNodeType, serializeRange, serializeRangeToRefString, serializeRangeWithSheet, serializeRangeWithSpreadsheet, singleReferenceToGrid, splitTableStructuredRef, strip, stripErrorMargin, unquoteSheetName };
|
|
42468
|
+
export { ALL_IMPLEMENTED_FUNCTIONS, ALL_IMPLEMENTED_FUNCTIONS_SET, ActiveDirtyManagerService, ArrayValueObject, AstRootNodeFactory, AstTreeBuilder, AsyncArrayObject, AsyncCustomFunction, AsyncObject, BaseFunction, BaseReferenceObject, BaseValueObject, BooleanValue, BooleanValueObject, CELL_INVERTED_INDEX_CACHE, CalculateController, CalculateFormulaService, CustomFunction, DEFAULT_CYCLE_REFERENCE_COUNT, DEFAULT_INTERVAL_COUNT, DEFAULT_TOKEN_LAMBDA_FUNCTION_NAME, DEFAULT_TOKEN_LET_FUNCTION_NAME, DEFAULT_TOKEN_TYPE_LAMBDA_PARAMETER, DEFAULT_TOKEN_TYPE_PARAMETER, DEFAULT_TOKEN_TYPE_ROOT, DefinedNamesService, DependencyManagerBaseService, DependencyManagerService, ENGINE_FORMULA_CYCLE_REFERENCE_COUNT, ENGINE_FORMULA_PLUGIN_CONFIG_KEY, ENGINE_FORMULA_RETURN_DEPENDENCY_TREE, ERROR_TYPE_SET, ErrorType, ErrorValueObject, FORMULA_REF_TO_ARRAY_CACHE, FUNCTION_NAMES_ARRAY, FUNCTION_NAMES_COMPATIBILITY, FUNCTION_NAMES_CUBE, FUNCTION_NAMES_DATABASE, FUNCTION_NAMES_DATE, FUNCTION_NAMES_ENGINEERING, FUNCTION_NAMES_FINANCIAL, FUNCTION_NAMES_INFORMATION, FUNCTION_NAMES_LOGICAL, FUNCTION_NAMES_LOOKUP, FUNCTION_NAMES_MATH, FUNCTION_NAMES_STATISTICAL, FUNCTION_NAMES_TEXT, FUNCTION_NAMES_UNIVER, FUNCTION_NAMES_WEB, FeatureCalculationManagerService, FormulaCalculationTriggerService, FormulaCurrentConfigService, FormulaDataModel, FormulaDependencyGenerator, FormulaDependencyTree, FormulaDependencyTreeModel, FormulaDependencyTreeType, FormulaDependencyTreeVirtual, FormulaExecuteStageType, FormulaExecutedStateType, FormulaResultStatus, FormulaRuntimeService, FunctionNodeFactory, FunctionService, FunctionType, GlobalComputingStatusService, HyperlinkEngineFormulaService, IActiveDirtyManagerService, ICalculateFormulaService, IDefinedNamesService, IDependencyManagerService, IFeatureCalculationManagerService, IFormulaCurrentConfigService, IFormulaDependencyGenerator, IFormulaRuntimeService, IFunctionService, IHyperlinkEngineFormulaService, IOtherFormulaManagerService, ISheetRowFilteredService, ISuperTableService, Interpreter, LambdaNodeFactory, LambdaParameterNodeFactory, LambdaValueObjectObject, Lexer, LexerNode, LexerTreeBuilder, NEW_EXCEL_FUNCTIONS, NullValueObject, NumberValueObject, OPERATOR_TOKEN_SET, OperatorNodeFactory, OtherFormulaBizType, OtherFormulaManagerService, OtherFormulaMarkDirty, PrefixNodeFactory, RangeReferenceObject, ReferenceNodeFactory, RegisterFunctionMutation, RegisterOtherFormulaService, RemoveDefinedNameMutation, RemoveFeatureCalculationMutation, RemoveOtherFormulaMutation, RemoveSuperTableMutation, SUFFIX_TOKEN_SET, SetArrayFormulaDataMutation, SetCellFormulaDependencyCalculationMutation, SetCellFormulaDependencyCalculationResultMutation, SetDefinedNameMutation, SetDefinedNameMutationFactory, SetFeatureCalculationMutation, SetFormulaCalculationNotificationMutation, SetFormulaCalculationResultMutation, SetFormulaCalculationStartMutation, SetFormulaCalculationStopMutation, SetFormulaDataMutation, SetFormulaDependencyCalculationMutation, SetFormulaDependencyCalculationResultMutation, SetFormulaStringBatchCalculationMutation, SetFormulaStringBatchCalculationResultMutation, SetImageFormulaDataMutation, SetOtherFormulaMutation, SetQueryFormulaDependencyAllMutation, SetQueryFormulaDependencyAllResultMutation, SetQueryFormulaDependencyMutation, SetQueryFormulaDependencyResultMutation, SetSuperTableMutation, SetSuperTableOptionMutation, SetTriggerFormulaCalculationStartMutation, SheetRowFilteredService, StringValueObject, SuffixNodeFactory, SuperTableActiveDirtyController, SuperTableService, UnionNodeFactory, UniverFormulaEnginePlugin, ValueNodeFactory, ValueObjectFactory, compareToken, convertUnitDataToRuntime, deserializeRangeForR1C1, deserializeRangeWithSheet, deserializeRangeWithSheetWithCache, excelDateSerial, extractFormulaError, functionArray, functionCompatibility, functionCube, functionDatabase, functionDate, functionEngineering, functionFinancial, functionInformation, functionLogical, functionLookup, functionMath, functionMeta, functionStatistical, functionText, functionUniver, functionWeb, generateAstNode, generateExecuteAstNodeData, generateRandomDependencyTreeId, generateStringWithSequence, getAbsoluteRefTypeWitString, getAbsoluteRefTypeWithSingleString, getObjectValue, getRangeWithRefsString, handleNumfmtInCell, handleRefStringInfo, includeFormulaLexerToken, initSheetFormulaData, isFormulaLexerToken, isInDirtyRange, isReferenceString, isReferenceStringWithEffectiveColumn, isReferenceStrings, matchRefDrawToken, matchToken, needsQuoting, normalizeSheetName, operatorToken, prefixToken, quoteSheetName, sequenceNodeType, serializeRange, serializeRangeToRefString, serializeRangeWithSheet, serializeRangeWithSpreadsheet, singleReferenceToGrid, splitTableStructuredRef, strip, stripErrorMargin, unquoteSheetName };
|