@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/cjs/index.js
CHANGED
|
@@ -508,12 +508,14 @@ var BaseValueObject = class extends ObjectClassType {
|
|
|
508
508
|
return ErrorValueObject.create("#NAME?");
|
|
509
509
|
}
|
|
510
510
|
concatenate(value, concatenateType = 0) {
|
|
511
|
-
let currentValue = this.getValue()
|
|
511
|
+
let currentValue = formatValueForFormulaText(this.getValue());
|
|
512
512
|
if (typeof value === "string") if (concatenateType === 0) currentValue = value + currentValue;
|
|
513
513
|
else currentValue += value;
|
|
514
|
-
else if (typeof value === "number")
|
|
515
|
-
|
|
516
|
-
|
|
514
|
+
else if (typeof value === "number") {
|
|
515
|
+
const numberString = formatNumberForFormulaText(value);
|
|
516
|
+
if (concatenateType === 0) currentValue = numberString + currentValue;
|
|
517
|
+
else currentValue += numberString;
|
|
518
|
+
} else if (typeof value === "boolean") {
|
|
517
519
|
const booleanString = value ? "TRUE" : "FALSE";
|
|
518
520
|
if (concatenateType === 0) currentValue = booleanString + currentValue;
|
|
519
521
|
else currentValue += booleanString;
|
|
@@ -679,6 +681,16 @@ var BaseValueObject = class extends ObjectClassType {
|
|
|
679
681
|
return ErrorValueObject.create("#VALUE!");
|
|
680
682
|
}
|
|
681
683
|
};
|
|
684
|
+
function formatValueForFormulaText(value) {
|
|
685
|
+
if (typeof value === "number") return formatNumberForFormulaText(value);
|
|
686
|
+
if (typeof value === "boolean") return value ? "TRUE" : "FALSE";
|
|
687
|
+
return value == null ? "" : value.toString();
|
|
688
|
+
}
|
|
689
|
+
function formatNumberForFormulaText(value) {
|
|
690
|
+
if (!Number.isFinite(value)) return value.toString();
|
|
691
|
+
const rounded = Number(value.toPrecision(15));
|
|
692
|
+
return Object.is(rounded, -0) ? "0" : rounded.toString();
|
|
693
|
+
}
|
|
682
694
|
const Error_CACHE_LRU_COUNT = 1e3;
|
|
683
695
|
const ErrorValueObjectCache = new FormulaAstLRU(Error_CACHE_LRU_COUNT);
|
|
684
696
|
var ErrorValueObject = class ErrorValueObject extends BaseValueObject {
|
|
@@ -711,6 +723,12 @@ var ErrorValueObject = class ErrorValueObject extends BaseValueObject {
|
|
|
711
723
|
isError() {
|
|
712
724
|
return true;
|
|
713
725
|
}
|
|
726
|
+
concatenateFront(_valueObject) {
|
|
727
|
+
return this;
|
|
728
|
+
}
|
|
729
|
+
concatenateBack(_valueObject) {
|
|
730
|
+
return this;
|
|
731
|
+
}
|
|
714
732
|
};
|
|
715
733
|
|
|
716
734
|
//#endregion
|
|
@@ -781,6 +799,43 @@ function parseFormattedDate(value) {
|
|
|
781
799
|
function parseFormattedTime(value) {
|
|
782
800
|
return _univerjs_core.numfmt.parseTime(value);
|
|
783
801
|
}
|
|
802
|
+
function parseEnglishMonthNameDate(value) {
|
|
803
|
+
const match = value.trim().match(/^(\d{1,2})\s*([A-Za-z]{3,9})\s*(\d{2,4})$/);
|
|
804
|
+
if (!match) return null;
|
|
805
|
+
const [, dayText, monthText, yearText] = match;
|
|
806
|
+
const month = {
|
|
807
|
+
jan: 0,
|
|
808
|
+
january: 0,
|
|
809
|
+
feb: 1,
|
|
810
|
+
february: 1,
|
|
811
|
+
mar: 2,
|
|
812
|
+
march: 2,
|
|
813
|
+
apr: 3,
|
|
814
|
+
april: 3,
|
|
815
|
+
may: 4,
|
|
816
|
+
jun: 5,
|
|
817
|
+
june: 5,
|
|
818
|
+
jul: 6,
|
|
819
|
+
july: 6,
|
|
820
|
+
aug: 7,
|
|
821
|
+
august: 7,
|
|
822
|
+
sep: 8,
|
|
823
|
+
sept: 8,
|
|
824
|
+
september: 8,
|
|
825
|
+
oct: 9,
|
|
826
|
+
october: 9,
|
|
827
|
+
nov: 10,
|
|
828
|
+
november: 10,
|
|
829
|
+
dec: 11,
|
|
830
|
+
december: 11
|
|
831
|
+
}[monthText.toLowerCase()];
|
|
832
|
+
if (month == null) return null;
|
|
833
|
+
const day = Number(dayText);
|
|
834
|
+
const year = Number(yearText.length === 2 ? `20${yearText}` : yearText);
|
|
835
|
+
const date = new Date(Date.UTC(year, month, day));
|
|
836
|
+
if (date.getUTCFullYear() !== year || date.getUTCMonth() !== month || date.getUTCDate() !== day) return null;
|
|
837
|
+
return date;
|
|
838
|
+
}
|
|
784
839
|
function isDate(format) {
|
|
785
840
|
return _univerjs_core.numfmt.getFormatInfo(format).isDate;
|
|
786
841
|
}
|
|
@@ -859,6 +914,7 @@ function getDateSerialNumberByObject(serialNumberObject) {
|
|
|
859
914
|
let dateSerial;
|
|
860
915
|
if (parseFormattedDate(`${dateValue}`)) dateSerial = parseFormattedDate(`${dateValue}`).v;
|
|
861
916
|
else if (parseFormattedTime(`${dateValue}`)) dateSerial = parseFormattedTime(`${dateValue}`).v;
|
|
917
|
+
else if (parseEnglishMonthNameDate(`${dateValue}`)) dateSerial = parseEnglishMonthNameDate(`${dateValue}`);
|
|
862
918
|
else if ((0, _univerjs_core.isRealNum)(dateValue)) dateSerial = +dateValue;
|
|
863
919
|
else return ErrorValueObject.create("#VALUE!");
|
|
864
920
|
if (dateSerial instanceof Date) dateSerial = excelDateTimeSerial(dateSerial);
|
|
@@ -906,10 +962,11 @@ function getDaysByNASD(startDateSerialNumber, endDateSerialNumber) {
|
|
|
906
962
|
let endYear = endDateSerialNumber > 0 ? endDateDate.getUTCFullYear() : 1900;
|
|
907
963
|
let endMonth = endDateSerialNumber > 0 ? endDateDate.getUTCMonth() + 1 : 1;
|
|
908
964
|
let endDay = endDateSerialNumber > 0 ? endDateDate.getUTCDate() : 0;
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
if (endDay ===
|
|
965
|
+
const startIsLastDayOfFebruary = startMonth === 2 && startDay === getDaysInMonth(startYear, startMonth - 1);
|
|
966
|
+
if (startIsLastDayOfFebruary) startDay = 30;
|
|
967
|
+
else if (startDay === 31) startDay = 30;
|
|
968
|
+
if (endMonth === 2 && endDay === getDaysInMonth(endYear, endMonth - 1) && startIsLastDayOfFebruary) endDay = 30;
|
|
969
|
+
else if (endDay === 31) if (startDay < 30) {
|
|
913
970
|
endDateDate = excelSerialToDate(endDateSerialNumber + 1);
|
|
914
971
|
endYear = endDateDate.getUTCFullYear();
|
|
915
972
|
endMonth = endDateDate.getUTCMonth() + 1;
|
|
@@ -1196,16 +1253,19 @@ var InvertedIndexCache = class {
|
|
|
1196
1253
|
};
|
|
1197
1254
|
const _value = normalizeValue(value);
|
|
1198
1255
|
if (ERROR_TYPE_SET.has(_value)) result.errorType = _value;
|
|
1199
|
-
else if (_value === 0
|
|
1256
|
+
else if (_value === 0) {
|
|
1200
1257
|
const rows = [];
|
|
1201
1258
|
const rowsForZero = columnMap.get(0);
|
|
1202
1259
|
if (rowsForZero) rows.push(...rowsForZero);
|
|
1203
1260
|
const rowsForEmpty = columnMap.get(DEFAULT_EMPTY_CELL_KEY);
|
|
1204
1261
|
if (rowsForEmpty) rows.push(...rowsForEmpty);
|
|
1205
1262
|
result.matchingRows = rows.filter((row) => rowsInCache.some(([start, end]) => row >= start && row <= end));
|
|
1206
|
-
} else {
|
|
1263
|
+
} else if (_value === DEFAULT_EMPTY_CELL_KEY) {
|
|
1207
1264
|
var _columnMap$get;
|
|
1208
|
-
result.matchingRows = Array.from((_columnMap$get = columnMap.get(
|
|
1265
|
+
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));
|
|
1266
|
+
} else {
|
|
1267
|
+
var _columnMap$get2;
|
|
1268
|
+
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));
|
|
1209
1269
|
}
|
|
1210
1270
|
return result;
|
|
1211
1271
|
}
|
|
@@ -1421,7 +1481,7 @@ const REFERENCE_REGEX_SINGLE_COLUMN = `^${UNIT_NAME_SHEET_NAME_REGEX}\\s*?\\${"$
|
|
|
1421
1481
|
const REFERENCE_REGEX_SINGLE_COLUMN_PRECOMPILING = new RegExp(REFERENCE_REGEX_SINGLE_COLUMN);
|
|
1422
1482
|
const TABLE_NAME_REGEX = "((?![~!@#$%^&*()_+<>?:,./;’,。、‘:“《》?~!@#¥%……()【】\\[\\]\\/\\\\]).)+";
|
|
1423
1483
|
const TABLE_TITLE_REGEX = "\\[#.+\\]\\s*?,\\s*?";
|
|
1424
|
-
const TABLE_CONTENT_REGEX = "\\[((?<!#)
|
|
1484
|
+
const TABLE_CONTENT_REGEX = "\\[((?<!#)[\\s\\S])*\\]";
|
|
1425
1485
|
const TABLE_MULTIPLE_COLUMN_REGEX = `${TABLE_CONTENT_REGEX}${RANGE_SYMBOL}${TABLE_CONTENT_REGEX}`;
|
|
1426
1486
|
const REFERENCE_TABLE_ALL_COLUMN_REGEX = `^(${UNIT_NAME_REGEX})?${TABLE_NAME_REGEX}$`;
|
|
1427
1487
|
const REFERENCE_TABLE_SINGLE_COLUMN_REGEX = `^(${UNIT_NAME_REGEX})?${TABLE_NAME_REGEX}(${TABLE_CONTENT_REGEX}|\\[${TABLE_TITLE_REGEX}${TABLE_CONTENT_REGEX}\\])+$`;
|
|
@@ -2000,16 +2060,38 @@ let DefinedNamesService = class DefinedNamesService extends _univerjs_core.Dispo
|
|
|
2000
2060
|
getDefinedNameMap(unitId) {
|
|
2001
2061
|
return this._definedNameMap[unitId];
|
|
2002
2062
|
}
|
|
2003
|
-
getValueByName(unitId, name) {
|
|
2004
|
-
const cachedMap = this._nameCacheMap[unitId];
|
|
2005
|
-
if (cachedMap) return cachedMap[name.toLowerCase()] || null;
|
|
2063
|
+
getValueByName(unitId, name, sheetId) {
|
|
2006
2064
|
const nameMap = this._definedNameMap[unitId];
|
|
2007
2065
|
if (nameMap === void 0) return null;
|
|
2066
|
+
if (sheetId) {
|
|
2067
|
+
var _workbookScope;
|
|
2068
|
+
const normalizedName = name.toLowerCase();
|
|
2069
|
+
let workbookScope = null;
|
|
2070
|
+
let firstMatch = null;
|
|
2071
|
+
for (const item of Object.values(nameMap)) {
|
|
2072
|
+
if (item.name.toLowerCase() !== normalizedName) continue;
|
|
2073
|
+
if (firstMatch == null) firstMatch = item;
|
|
2074
|
+
if (item.localSheetId === sheetId) return item;
|
|
2075
|
+
if (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null) {
|
|
2076
|
+
if (workbookScope == null) workbookScope = item;
|
|
2077
|
+
}
|
|
2078
|
+
}
|
|
2079
|
+
return (_workbookScope = workbookScope) !== null && _workbookScope !== void 0 ? _workbookScope : firstMatch;
|
|
2080
|
+
}
|
|
2081
|
+
const cachedMap = this._nameCacheMap[unitId];
|
|
2082
|
+
if (cachedMap) return cachedMap[name.toLowerCase()] || null;
|
|
2008
2083
|
let result = null;
|
|
2009
|
-
|
|
2084
|
+
const normalizedName = name.toLowerCase();
|
|
2085
|
+
for (const item of Object.values(nameMap)) if (item.name.toLowerCase() === normalizedName && (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null)) {
|
|
2010
2086
|
result = item;
|
|
2011
2087
|
break;
|
|
2012
2088
|
}
|
|
2089
|
+
if (!result) {
|
|
2090
|
+
for (const item of Object.values(nameMap)) if (item.name.toLowerCase() === normalizedName) {
|
|
2091
|
+
result = item;
|
|
2092
|
+
break;
|
|
2093
|
+
}
|
|
2094
|
+
}
|
|
2013
2095
|
if (result) {
|
|
2014
2096
|
this._nameCacheMap[unitId] = this._nameCacheMap[unitId] || {};
|
|
2015
2097
|
this._nameCacheMap[unitId][name.toLowerCase()] = result;
|
|
@@ -2044,7 +2126,10 @@ let DefinedNamesService = class DefinedNamesService extends _univerjs_core.Dispo
|
|
|
2044
2126
|
return;
|
|
2045
2127
|
}
|
|
2046
2128
|
this._nameCacheMap[unitId] = {};
|
|
2047
|
-
for (const item of Object.values(nameMap))
|
|
2129
|
+
for (const item of Object.values(nameMap)) {
|
|
2130
|
+
const normalizedName = item.name.toLowerCase();
|
|
2131
|
+
if (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null || this._nameCacheMap[unitId][normalizedName] == null) this._nameCacheMap[unitId][normalizedName] = item;
|
|
2132
|
+
}
|
|
2048
2133
|
}
|
|
2049
2134
|
_isDeepDefinedNameMapEmpty() {
|
|
2050
2135
|
for (const unitId in this._definedNameMap) if (this.hasDefinedName(unitId)) return false;
|
|
@@ -2617,6 +2702,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
|
|
|
2617
2702
|
FUNCTION_NAMES_LOGICAL["BYCOL"] = "BYCOL";
|
|
2618
2703
|
FUNCTION_NAMES_LOGICAL["BYROW"] = "BYROW";
|
|
2619
2704
|
FUNCTION_NAMES_LOGICAL["FALSE"] = "FALSE";
|
|
2705
|
+
FUNCTION_NAMES_LOGICAL["GROUPBY"] = "GROUPBY";
|
|
2620
2706
|
FUNCTION_NAMES_LOGICAL["IF"] = "IF";
|
|
2621
2707
|
FUNCTION_NAMES_LOGICAL["IFERROR"] = "IFERROR";
|
|
2622
2708
|
FUNCTION_NAMES_LOGICAL["IFNA"] = "IFNA";
|
|
@@ -2627,6 +2713,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
|
|
|
2627
2713
|
FUNCTION_NAMES_LOGICAL["MAP"] = "MAP";
|
|
2628
2714
|
FUNCTION_NAMES_LOGICAL["NOT"] = "NOT";
|
|
2629
2715
|
FUNCTION_NAMES_LOGICAL["OR"] = "OR";
|
|
2716
|
+
FUNCTION_NAMES_LOGICAL["PERCENTOF"] = "PERCENTOF";
|
|
2630
2717
|
FUNCTION_NAMES_LOGICAL["REDUCE"] = "REDUCE";
|
|
2631
2718
|
FUNCTION_NAMES_LOGICAL["SCAN"] = "SCAN";
|
|
2632
2719
|
FUNCTION_NAMES_LOGICAL["SWITCH"] = "SWITCH";
|
|
@@ -2654,6 +2741,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
|
|
|
2654
2741
|
*/
|
|
2655
2742
|
let FUNCTION_NAMES_LOOKUP = /* @__PURE__ */ function(FUNCTION_NAMES_LOOKUP) {
|
|
2656
2743
|
FUNCTION_NAMES_LOOKUP["ADDRESS"] = "ADDRESS";
|
|
2744
|
+
FUNCTION_NAMES_LOOKUP["ANCHORARRAY"] = "ANCHORARRAY";
|
|
2657
2745
|
FUNCTION_NAMES_LOOKUP["AREAS"] = "AREAS";
|
|
2658
2746
|
FUNCTION_NAMES_LOOKUP["CHOOSE"] = "CHOOSE";
|
|
2659
2747
|
FUNCTION_NAMES_LOOKUP["CHOOSECOLS"] = "CHOOSECOLS";
|
|
@@ -2976,6 +3064,7 @@ let FUNCTION_NAMES_TEXT = /* @__PURE__ */ function(FUNCTION_NAMES_TEXT) {
|
|
|
2976
3064
|
FUNCTION_NAMES_TEXT["PROPER"] = "PROPER";
|
|
2977
3065
|
FUNCTION_NAMES_TEXT["REGEXEXTRACT"] = "REGEXEXTRACT";
|
|
2978
3066
|
FUNCTION_NAMES_TEXT["REGEXMATCH"] = "REGEXMATCH";
|
|
3067
|
+
FUNCTION_NAMES_TEXT["REGEXTEST"] = "REGEXTEST";
|
|
2979
3068
|
FUNCTION_NAMES_TEXT["REGEXREPLACE"] = "REGEXREPLACE";
|
|
2980
3069
|
FUNCTION_NAMES_TEXT["REPLACE"] = "REPLACE";
|
|
2981
3070
|
FUNCTION_NAMES_TEXT["REPLACEB"] = "REPLACEB";
|
|
@@ -3087,6 +3176,7 @@ const NEW_EXCEL_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
|
3087
3176
|
"SHEETS",
|
|
3088
3177
|
"IFNA",
|
|
3089
3178
|
"IFS",
|
|
3179
|
+
"GROUPBY",
|
|
3090
3180
|
"SWITCH",
|
|
3091
3181
|
"XOR",
|
|
3092
3182
|
"BETA.DIST",
|
|
@@ -3181,7 +3271,7 @@ function deserializeRangeWithSheetWithCache(refString) {
|
|
|
3181
3271
|
if (refCache) return refCache;
|
|
3182
3272
|
const result = deserializeRangeWithSheet(refString);
|
|
3183
3273
|
referenceToRangeCache.set(refString, result);
|
|
3184
|
-
return
|
|
3274
|
+
return result;
|
|
3185
3275
|
}
|
|
3186
3276
|
function clearReferenceToRangeCache() {
|
|
3187
3277
|
referenceToRangeCache.clear();
|
|
@@ -3740,7 +3830,7 @@ var LexerTreeBuilder = class extends _univerjs_core.Disposable {
|
|
|
3740
3830
|
return this._currentLexerNode;
|
|
3741
3831
|
}
|
|
3742
3832
|
_handleDefinedName(sequenceArray, param) {
|
|
3743
|
-
const { unitId, getValueByName, getSheetName } = param;
|
|
3833
|
+
const { unitId, sheetId, getValueByName, getSheetName } = param;
|
|
3744
3834
|
if (unitId == null) return {
|
|
3745
3835
|
sequenceString: "",
|
|
3746
3836
|
hasDefinedName: false,
|
|
@@ -3760,14 +3850,15 @@ var LexerTreeBuilder = class extends _univerjs_core.Disposable {
|
|
|
3760
3850
|
let token = tokenRaw;
|
|
3761
3851
|
if (nodeType === 4 || nodeType === 3) {
|
|
3762
3852
|
if (nodeType === 3) token = this._getHasSheetNameDefinedName(tokenRaw, unitId, param);
|
|
3763
|
-
const
|
|
3853
|
+
const definedNameToken = token.trim();
|
|
3854
|
+
const definedContent = getValueByName(unitId, definedNameToken, sheetId);
|
|
3764
3855
|
if (definedContent) {
|
|
3765
3856
|
const refString = definedContent.formulaOrRefString;
|
|
3766
3857
|
const nestedDefinedNameParam = this._handleNestedDefinedName(refString, param);
|
|
3767
3858
|
if (nestedDefinedNameParam == null || typeof nestedDefinedNameParam !== "object") {
|
|
3768
3859
|
sequenceString += nestedDefinedNameParam || "#NAME?";
|
|
3769
3860
|
hasDefinedName = true;
|
|
3770
|
-
definedNames.push(
|
|
3861
|
+
definedNames.push(definedNameToken);
|
|
3771
3862
|
} else if (typeof nestedDefinedNameParam === "object") {
|
|
3772
3863
|
const { sequenceString: nestedSequenceString, definedNames: nestedDefinedNames } = nestedDefinedNameParam;
|
|
3773
3864
|
sequenceString += nestedSequenceString;
|
|
@@ -3776,10 +3867,10 @@ var LexerTreeBuilder = class extends _univerjs_core.Disposable {
|
|
|
3776
3867
|
});
|
|
3777
3868
|
hasDefinedName = true;
|
|
3778
3869
|
}
|
|
3779
|
-
} else if (this._checkDefinedNameDirty(
|
|
3870
|
+
} else if (this._checkDefinedNameDirty(definedNameToken, param)) {
|
|
3780
3871
|
sequenceString += "#NAME?";
|
|
3781
3872
|
hasDefinedName = true;
|
|
3782
|
-
definedNames.push(
|
|
3873
|
+
definedNames.push(definedNameToken);
|
|
3783
3874
|
} else sequenceString += token;
|
|
3784
3875
|
} else sequenceString += token;
|
|
3785
3876
|
}
|
|
@@ -4193,7 +4284,7 @@ var LexerTreeBuilder = class extends _univerjs_core.Disposable {
|
|
|
4193
4284
|
}
|
|
4194
4285
|
}
|
|
4195
4286
|
_nodeMaker(formulaStringRaw, sequenceArray, matchCurrentNodeIndex) {
|
|
4196
|
-
let formulaString = formulaStringRaw.replace(
|
|
4287
|
+
let formulaString = formulaStringRaw.replace(/(?:\r\n|\r|\n)$/g, " ");
|
|
4197
4288
|
if (formulaString.substring(0, 1) === "=") formulaString = formulaString.substring(1);
|
|
4198
4289
|
const formulaChars = formulaString.split("");
|
|
4199
4290
|
const charsCount = formulaChars.length;
|
|
@@ -4947,7 +5038,9 @@ let FormulaDataModel = class FormulaDataModel extends _univerjs_core.Disposable
|
|
|
4947
5038
|
for (let j = 0; j < worksheets.length; j++) {
|
|
4948
5039
|
const worksheet = worksheets[j];
|
|
4949
5040
|
const cellMatrix = worksheet.getCellMatrix();
|
|
4950
|
-
|
|
5041
|
+
const sheetId = worksheet.getSheetId();
|
|
5042
|
+
this._initSheetArrayFormulaData(unitId, sheetId, cellMatrix);
|
|
5043
|
+
initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix);
|
|
4951
5044
|
}
|
|
4952
5045
|
}
|
|
4953
5046
|
const allBases = this._univerInstanceService.getAllUnitsForType(_univerjs_core.UniverInstanceType.UNIVER_BASE);
|
|
@@ -4959,7 +5052,6 @@ let FormulaDataModel = class FormulaDataModel extends _univerjs_core.Disposable
|
|
|
4959
5052
|
const tables = Object.values(snapshot.tables);
|
|
4960
5053
|
for (let j = 0; j < tables.length; j++) {
|
|
4961
5054
|
const table = tables[j];
|
|
4962
|
-
if (table.deleted) continue;
|
|
4963
5055
|
const tableFormulaData = {};
|
|
4964
5056
|
const recordOrder = table.recordOrder;
|
|
4965
5057
|
if (!recordOrder) {
|
|
@@ -4968,13 +5060,12 @@ let FormulaDataModel = class FormulaDataModel extends _univerjs_core.Disposable
|
|
|
4968
5060
|
}
|
|
4969
5061
|
for (let row = 0; row < recordOrder.length; row++) {
|
|
4970
5062
|
const recordId = recordOrder[row];
|
|
4971
|
-
|
|
4972
|
-
if (!record || record.deleted) continue;
|
|
5063
|
+
if (!table.records[recordId]) continue;
|
|
4973
5064
|
for (let col = 0; col < table.fieldOrder.length; col++) {
|
|
4974
5065
|
var _field$config$formula, _field$config, _row, _tableFormulaData$_ro;
|
|
4975
5066
|
const fieldId = table.fieldOrder[col];
|
|
4976
5067
|
const field = table.fields[fieldId];
|
|
4977
|
-
if (!field || field.
|
|
5068
|
+
if (!field || field.type !== "formula") continue;
|
|
4978
5069
|
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();
|
|
4979
5070
|
if (!formula) continue;
|
|
4980
5071
|
(_tableFormulaData$_ro = tableFormulaData[_row = row]) !== null && _tableFormulaData$_ro !== void 0 || (tableFormulaData[_row] = {});
|
|
@@ -4996,7 +5087,9 @@ let FormulaDataModel = class FormulaDataModel extends _univerjs_core.Disposable
|
|
|
4996
5087
|
formulaData[unitId] = {};
|
|
4997
5088
|
const worksheet = workbook.getSheetBySheetId(sheetId);
|
|
4998
5089
|
if (worksheet == null) return {};
|
|
4999
|
-
|
|
5090
|
+
const cellMatrix = worksheet.getCellMatrix();
|
|
5091
|
+
this._initSheetArrayFormulaData(unitId, sheetId, cellMatrix);
|
|
5092
|
+
initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix);
|
|
5000
5093
|
return formulaData[unitId][sheetId];
|
|
5001
5094
|
}
|
|
5002
5095
|
getArrayFormulaRange() {
|
|
@@ -5096,18 +5189,12 @@ let FormulaDataModel = class FormulaDataModel extends _univerjs_core.Disposable
|
|
|
5096
5189
|
const unitId = base.getUnitId();
|
|
5097
5190
|
const baseData = {};
|
|
5098
5191
|
const tableNameMap = {};
|
|
5099
|
-
for (const table of Object.values(snapshot.tables)
|
|
5100
|
-
var _table$recordOrder$
|
|
5192
|
+
for (const table of Object.values(snapshot.tables)) {
|
|
5193
|
+
var _table$recordOrder$le, _table$recordOrder;
|
|
5101
5194
|
baseData[table.id] = {
|
|
5102
5195
|
cellData: new _univerjs_core.ObjectMatrix(buildBaseRuntimeCellData(table)),
|
|
5103
|
-
rowCount: (_table$recordOrder$
|
|
5104
|
-
|
|
5105
|
-
return !((_table$records$record = table.records[recordId]) === null || _table$records$record === void 0 ? void 0 : _table$records$record.deleted);
|
|
5106
|
-
}).length) !== null && _table$recordOrder$fi !== void 0 ? _table$recordOrder$fi : 0,
|
|
5107
|
-
columnCount: table.fieldOrder.filter((fieldId) => {
|
|
5108
|
-
var _table$fields$fieldId;
|
|
5109
|
-
return !((_table$fields$fieldId = table.fields[fieldId]) === null || _table$fields$fieldId === void 0 ? void 0 : _table$fields$fieldId.deleted);
|
|
5110
|
-
}).length,
|
|
5196
|
+
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,
|
|
5197
|
+
columnCount: table.fieldOrder.length,
|
|
5111
5198
|
rowData: {},
|
|
5112
5199
|
columnData: {}
|
|
5113
5200
|
};
|
|
@@ -5293,7 +5380,7 @@ let FormulaDataModel = class FormulaDataModel extends _univerjs_core.Disposable
|
|
|
5293
5380
|
for (const unitId in formulaData) {
|
|
5294
5381
|
const workbook = formulaData[unitId];
|
|
5295
5382
|
if (!workbook) continue;
|
|
5296
|
-
const workbookInstance = this._univerInstanceService.getUnit(unitId);
|
|
5383
|
+
const workbookInstance = this._univerInstanceService.getUnit(unitId, _univerjs_core.UniverInstanceType.UNIVER_SHEET);
|
|
5297
5384
|
if (!workbookInstance) continue;
|
|
5298
5385
|
for (const sheetId in workbook) {
|
|
5299
5386
|
const sheet = workbook[sheetId];
|
|
@@ -5307,7 +5394,7 @@ let FormulaDataModel = class FormulaDataModel extends _univerjs_core.Disposable
|
|
|
5307
5394
|
const column = Number(columnStr);
|
|
5308
5395
|
const currentCell = sheetInstance.getCellRaw(row, column);
|
|
5309
5396
|
const isFormula = (0, _univerjs_core.isFormulaString)(currentCell === null || currentCell === void 0 ? void 0 : currentCell.f) || (0, _univerjs_core.isFormulaId)(currentCell === null || currentCell === void 0 ? void 0 : currentCell.si);
|
|
5310
|
-
const noValue = (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === void 0 || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === null
|
|
5397
|
+
const noValue = (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === void 0 || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === null;
|
|
5311
5398
|
if (!(isFormula && noValue)) continue;
|
|
5312
5399
|
if (!columnRanges[column]) columnRanges[column] = [];
|
|
5313
5400
|
const lastRange = columnRanges[column].slice(-1)[0];
|
|
@@ -5356,6 +5443,39 @@ let FormulaDataModel = class FormulaDataModel extends _univerjs_core.Disposable
|
|
|
5356
5443
|
});
|
|
5357
5444
|
return formulaIdMap;
|
|
5358
5445
|
}
|
|
5446
|
+
_initSheetArrayFormulaData(unitId, sheetId, cellMatrix) {
|
|
5447
|
+
let arrayFormulaRangeMatrix;
|
|
5448
|
+
let arrayFormulaCellDataMatrix;
|
|
5449
|
+
const formulaIds = /* @__PURE__ */ new Set();
|
|
5450
|
+
cellMatrix.forValue((_, __, cell) => {
|
|
5451
|
+
const formulaId = cell === null || cell === void 0 ? void 0 : cell.si;
|
|
5452
|
+
if ((0, _univerjs_core.isFormulaString)(cell === null || cell === void 0 ? void 0 : cell.f) && (0, _univerjs_core.isFormulaId)(formulaId)) formulaIds.add(String(formulaId));
|
|
5453
|
+
});
|
|
5454
|
+
cellMatrix.forValue((row, column, cell) => {
|
|
5455
|
+
var _arrayFormulaRangeMat, _this$_arrayFormulaRa7, _arrayFormulaCellData, _this$_arrayFormulaCe5;
|
|
5456
|
+
const ref = cell === null || cell === void 0 ? void 0 : cell.ref;
|
|
5457
|
+
const formula = cell === null || cell === void 0 ? void 0 : cell.f;
|
|
5458
|
+
const formulaId = cell === null || cell === void 0 ? void 0 : cell.si;
|
|
5459
|
+
const hasOwnFormula = (0, _univerjs_core.isFormulaString)(formula);
|
|
5460
|
+
const hasSharedFormula = (0, _univerjs_core.isFormulaId)(formulaId) && formulaIds.has(String(formulaId));
|
|
5461
|
+
if (!hasOwnFormula && !hasSharedFormula || typeof ref !== "string" || ref.length === 0) return true;
|
|
5462
|
+
const { range } = deserializeRangeWithSheet(ref);
|
|
5463
|
+
if (!Number.isFinite(range.startRow) || !Number.isFinite(range.startColumn) || !Number.isFinite(range.endRow) || !Number.isFinite(range.endColumn)) return true;
|
|
5464
|
+
if (range.startRow === row && range.endRow === row && range.startColumn === column && range.endColumn === column && !isArrayConstantFormula(formula)) return true;
|
|
5465
|
+
if (!this._arrayFormulaRange[unitId]) this._arrayFormulaRange[unitId] = {};
|
|
5466
|
+
if (!this._arrayFormulaCellData[unitId]) this._arrayFormulaCellData[unitId] = {};
|
|
5467
|
+
(_arrayFormulaRangeMat = arrayFormulaRangeMatrix) !== null && _arrayFormulaRangeMat !== void 0 || (arrayFormulaRangeMatrix = new _univerjs_core.ObjectMatrix((_this$_arrayFormulaRa7 = this._arrayFormulaRange[unitId]) === null || _this$_arrayFormulaRa7 === void 0 ? void 0 : _this$_arrayFormulaRa7[sheetId]));
|
|
5468
|
+
(_arrayFormulaCellData = arrayFormulaCellDataMatrix) !== null && _arrayFormulaCellData !== void 0 || (arrayFormulaCellDataMatrix = new _univerjs_core.ObjectMatrix((_this$_arrayFormulaCe5 = this._arrayFormulaCellData[unitId]) === null || _this$_arrayFormulaCe5 === void 0 ? void 0 : _this$_arrayFormulaCe5[sheetId]));
|
|
5469
|
+
if (arrayFormulaRangeMatrix.getValue(row, column) == null) arrayFormulaRangeMatrix.setValue(row, column, range);
|
|
5470
|
+
for (let r = range.startRow; r <= range.endRow; r++) for (let c = range.startColumn; c <= range.endColumn; c++) {
|
|
5471
|
+
if (arrayFormulaCellDataMatrix.getValue(r, c) != null) continue;
|
|
5472
|
+
const rangeCell = cellMatrix.getValue(r, c);
|
|
5473
|
+
if (rangeCell != null) arrayFormulaCellDataMatrix.setValue(r, c, { ...rangeCell });
|
|
5474
|
+
}
|
|
5475
|
+
});
|
|
5476
|
+
if (arrayFormulaRangeMatrix && this._arrayFormulaRange[unitId]) this._arrayFormulaRange[unitId][sheetId] = arrayFormulaRangeMatrix.getData();
|
|
5477
|
+
if (arrayFormulaCellDataMatrix && this._arrayFormulaCellData[unitId]) this._arrayFormulaCellData[unitId][sheetId] = arrayFormulaCellDataMatrix.getData();
|
|
5478
|
+
}
|
|
5359
5479
|
};
|
|
5360
5480
|
FormulaDataModel = __decorate([__decorateParam(0, _univerjs_core.IUniverInstanceService), __decorateParam(1, (0, _univerjs_core.Inject)(LexerTreeBuilder))], FormulaDataModel);
|
|
5361
5481
|
function initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix) {
|
|
@@ -5390,9 +5510,9 @@ function initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix) {
|
|
|
5390
5510
|
if ((0, _univerjs_core.isFormulaId)(formulaId) && !(0, _univerjs_core.isFormulaString)(formulaString)) {
|
|
5391
5511
|
const formulaInfo = formulaIdMap.get(formulaId);
|
|
5392
5512
|
if (formulaInfo) {
|
|
5393
|
-
const f = formulaInfo.f;
|
|
5394
5513
|
const x = c - formulaInfo.c;
|
|
5395
5514
|
const y = r - formulaInfo.r;
|
|
5515
|
+
const f = formulaInfo.f;
|
|
5396
5516
|
sheetFormulaDataMatrix.setValue(r, c, {
|
|
5397
5517
|
f,
|
|
5398
5518
|
si: formulaId,
|
|
@@ -5427,12 +5547,9 @@ function createEngineThisRowRef(table, fieldName, snapshot) {
|
|
|
5427
5547
|
function getEngineBaseTableName(table, snapshot) {
|
|
5428
5548
|
const tables = Object.values(snapshot.tables);
|
|
5429
5549
|
let sameNameCount = 0;
|
|
5430
|
-
for (let i = 0; i < tables.length; i++) {
|
|
5431
|
-
|
|
5432
|
-
if (
|
|
5433
|
-
sameNameCount++;
|
|
5434
|
-
if (sameNameCount > 1) break;
|
|
5435
|
-
}
|
|
5550
|
+
for (let i = 0; i < tables.length; i++) if (tables[i].name === table.name) {
|
|
5551
|
+
sameNameCount++;
|
|
5552
|
+
if (sameNameCount > 1) break;
|
|
5436
5553
|
}
|
|
5437
5554
|
return sameNameCount === 1 ? table.name : table.id;
|
|
5438
5555
|
}
|
|
@@ -5441,14 +5558,14 @@ function buildBaseRuntimeCellData(table) {
|
|
|
5441
5558
|
const fieldOrder = [];
|
|
5442
5559
|
for (let i = 0; i < table.fieldOrder.length; i++) {
|
|
5443
5560
|
const fieldId = table.fieldOrder[i];
|
|
5444
|
-
if (table.fields[fieldId]
|
|
5561
|
+
if (table.fields[fieldId]) fieldOrder.push(fieldId);
|
|
5445
5562
|
}
|
|
5446
5563
|
let recordOrder;
|
|
5447
5564
|
if (table.recordOrder) {
|
|
5448
5565
|
recordOrder = [];
|
|
5449
5566
|
for (let i = 0; i < table.recordOrder.length; i++) {
|
|
5450
5567
|
const recordId = table.recordOrder[i];
|
|
5451
|
-
if (table.records[recordId]
|
|
5568
|
+
if (table.records[recordId]) recordOrder.push(recordId);
|
|
5452
5569
|
}
|
|
5453
5570
|
} else {
|
|
5454
5571
|
var _table$records;
|
|
@@ -5456,7 +5573,7 @@ function buildBaseRuntimeCellData(table) {
|
|
|
5456
5573
|
const records = [];
|
|
5457
5574
|
for (let i = 0; i < allRecords.length; i++) {
|
|
5458
5575
|
const record = allRecords[i];
|
|
5459
|
-
|
|
5576
|
+
records.push(record);
|
|
5460
5577
|
}
|
|
5461
5578
|
records.sort((a, b) => a.orderKey.localeCompare(b.orderKey));
|
|
5462
5579
|
recordOrder = [];
|
|
@@ -5468,7 +5585,7 @@ function buildBaseRuntimeCellData(table) {
|
|
|
5468
5585
|
for (let row = 0; row < recordOrder.length; row++) {
|
|
5469
5586
|
const recordId = recordOrder[row];
|
|
5470
5587
|
const record = table.records[recordId];
|
|
5471
|
-
if (!record
|
|
5588
|
+
if (!record) continue;
|
|
5472
5589
|
cellData[row] = { ...cellData[row] };
|
|
5473
5590
|
for (let col = 0; col < fieldOrder.length; col++) {
|
|
5474
5591
|
var _record$values;
|
|
@@ -5520,14 +5637,17 @@ function inferBaseRuntimeCellType(value) {
|
|
|
5520
5637
|
if (typeof value === "string") return _univerjs_core.CellValueType.STRING;
|
|
5521
5638
|
return null;
|
|
5522
5639
|
}
|
|
5640
|
+
function isArrayConstantFormula(formula) {
|
|
5641
|
+
return typeof formula === "string" && /^=\s*\{/.test(formula);
|
|
5642
|
+
}
|
|
5523
5643
|
function isBaseCellData(value) {
|
|
5524
5644
|
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"));
|
|
5525
5645
|
}
|
|
5526
5646
|
function resolveBaseFormulaTable(tableName, currentTable, snapshot) {
|
|
5527
5647
|
if (!tableName || tableName === "table" || tableName === currentTable.id || tableName === currentTable.name) return currentTable;
|
|
5528
5648
|
const byId = snapshot.tables[tableName];
|
|
5529
|
-
if (byId
|
|
5530
|
-
const matches = Object.values(snapshot.tables).filter((table) =>
|
|
5649
|
+
if (byId) return byId;
|
|
5650
|
+
const matches = Object.values(snapshot.tables).filter((table) => table.name === tableName);
|
|
5531
5651
|
return matches.length === 1 ? matches[0] : void 0;
|
|
5532
5652
|
}
|
|
5533
5653
|
|
|
@@ -5788,7 +5908,7 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends _uni
|
|
|
5788
5908
|
const workbook = this._univerInstanceService.getCurrentUnitOfType(_univerjs_core.UniverInstanceType.UNIVER_SHEET);
|
|
5789
5909
|
const worksheet = workbook === null || workbook === void 0 ? void 0 : workbook.getActiveSheet();
|
|
5790
5910
|
const base = workbook ? null : this._univerInstanceService.getCurrentUnitOfType(_univerjs_core.UniverInstanceType.UNIVER_BASE);
|
|
5791
|
-
const table = base ?
|
|
5911
|
+
const table = base ? getFirstBaseTable(base.getSnapshot().tables, base.getSnapshot().tableOrder) : null;
|
|
5792
5912
|
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();
|
|
5793
5913
|
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;
|
|
5794
5914
|
return this._formulaDataModel.getCalculateData();
|
|
@@ -5821,33 +5941,18 @@ FormulaCurrentConfigService = __decorate([
|
|
|
5821
5941
|
__decorateParam(2, (0, _univerjs_core.Inject)(FormulaDataModel)),
|
|
5822
5942
|
__decorateParam(3, (0, _univerjs_core.Inject)(ISheetRowFilteredService))
|
|
5823
5943
|
], FormulaCurrentConfigService);
|
|
5824
|
-
function
|
|
5825
|
-
var _Object$values
|
|
5944
|
+
function getFirstBaseTable(tables, tableOrder) {
|
|
5945
|
+
var _Object$values$;
|
|
5826
5946
|
for (const tableId of tableOrder) {
|
|
5827
5947
|
const table = tables[tableId];
|
|
5828
|
-
if (table
|
|
5948
|
+
if (table) return table;
|
|
5829
5949
|
}
|
|
5830
|
-
return (_Object$values$
|
|
5950
|
+
return (_Object$values$ = Object.values(tables)[0]) !== null && _Object$values$ !== void 0 ? _Object$values$ : null;
|
|
5831
5951
|
}
|
|
5832
5952
|
const IFormulaCurrentConfigService = (0, _univerjs_core.createIdentifier)("univer.formula.current-data.service");
|
|
5833
5953
|
|
|
5834
5954
|
//#endregion
|
|
5835
5955
|
//#region src/engine/analysis/lexer.ts
|
|
5836
|
-
/**
|
|
5837
|
-
* Copyright 2023-present DreamNum Co., Ltd.
|
|
5838
|
-
*
|
|
5839
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5840
|
-
* you may not use this file except in compliance with the License.
|
|
5841
|
-
* You may obtain a copy of the License at
|
|
5842
|
-
*
|
|
5843
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
5844
|
-
*
|
|
5845
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
5846
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
5847
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
5848
|
-
* See the License for the specific language governing permissions and
|
|
5849
|
-
* limitations under the License.
|
|
5850
|
-
*/
|
|
5851
5956
|
let Lexer = class Lexer extends _univerjs_core.Disposable {
|
|
5852
5957
|
constructor(_definedNamesService, _lexerTreeBuilder, _formulaCurrentConfigService) {
|
|
5853
5958
|
super();
|
|
@@ -5855,10 +5960,11 @@ let Lexer = class Lexer extends _univerjs_core.Disposable {
|
|
|
5855
5960
|
this._lexerTreeBuilder = _lexerTreeBuilder;
|
|
5856
5961
|
this._formulaCurrentConfigService = _formulaCurrentConfigService;
|
|
5857
5962
|
}
|
|
5858
|
-
treeBuilder(formulaString, transformSuffix = true) {
|
|
5963
|
+
treeBuilder(formulaString, transformSuffix = true, unitId) {
|
|
5859
5964
|
if (this._definedNamesService.getAllDefinedNamesIsEmpty()) return this._lexerTreeBuilder.treeBuilder(formulaString, transformSuffix);
|
|
5860
5965
|
return this._lexerTreeBuilder.treeBuilder(formulaString, transformSuffix, {
|
|
5861
|
-
unitId: this._formulaCurrentConfigService.getExecuteUnitId(),
|
|
5966
|
+
unitId: unitId !== null && unitId !== void 0 ? unitId : this._formulaCurrentConfigService.getExecuteUnitId(),
|
|
5967
|
+
sheetId: this._formulaCurrentConfigService.getExecuteSubUnitId(),
|
|
5862
5968
|
getValueByName: this._definedNamesService.getValueByName.bind(this._definedNamesService),
|
|
5863
5969
|
getDirtyDefinedNameMap: this._formulaCurrentConfigService.getDirtyDefinedNameMap.bind(this._formulaCurrentConfigService),
|
|
5864
5970
|
getSheetName: this._formulaCurrentConfigService.getSheetName.bind(this._formulaCurrentConfigService)
|
|
@@ -5880,10 +5986,13 @@ function getCellValue(cell) {
|
|
|
5880
5986
|
const body = cell === null || cell === void 0 ? void 0 : cell.p.body;
|
|
5881
5987
|
if (body == null) return 0;
|
|
5882
5988
|
const data = body.dataStream;
|
|
5883
|
-
return _univerjs_core.BuildTextUtils.transform.getPlainText(data);
|
|
5989
|
+
return normalizeRichTextFormulaValue(_univerjs_core.BuildTextUtils.transform.getPlainText(data));
|
|
5884
5990
|
}
|
|
5885
5991
|
return (_cell$v = cell === null || cell === void 0 ? void 0 : cell.v) !== null && _cell$v !== void 0 ? _cell$v : 0;
|
|
5886
5992
|
}
|
|
5993
|
+
function normalizeRichTextFormulaValue(value) {
|
|
5994
|
+
return value.replace(/\r\n|\r|\n/g, "\r\n");
|
|
5995
|
+
}
|
|
5887
5996
|
/**
|
|
5888
5997
|
* Extract the formula error from the cell
|
|
5889
5998
|
* @param cell
|
|
@@ -6122,24 +6231,16 @@ function reverseCompareOperator(operator) {
|
|
|
6122
6231
|
Reference https://en.wikipedia.org/wiki/Numeric_precision_in_Microsoft_Excel
|
|
6123
6232
|
*/
|
|
6124
6233
|
function plus(a, b) {
|
|
6125
|
-
|
|
6126
|
-
if (Number.isSafeInteger(result)) return result;
|
|
6127
|
-
return new decimal_js.default(a).add(b).toNumber();
|
|
6234
|
+
return a + b;
|
|
6128
6235
|
}
|
|
6129
6236
|
function minus(a, b) {
|
|
6130
|
-
|
|
6131
|
-
if (Number.isSafeInteger(result)) return result;
|
|
6132
|
-
return new decimal_js.default(a).sub(b).toNumber();
|
|
6237
|
+
return a - b;
|
|
6133
6238
|
}
|
|
6134
6239
|
function multiply(a, b) {
|
|
6135
|
-
|
|
6136
|
-
if (Number.isSafeInteger(result)) return result;
|
|
6137
|
-
return new decimal_js.default(a).mul(b).toNumber();
|
|
6240
|
+
return a * b;
|
|
6138
6241
|
}
|
|
6139
6242
|
function divide(a, b) {
|
|
6140
|
-
|
|
6141
|
-
if (Number.isSafeInteger(result)) return result;
|
|
6142
|
-
return new decimal_js.default(a).div(b).toNumber();
|
|
6243
|
+
return a / b;
|
|
6143
6244
|
}
|
|
6144
6245
|
/**
|
|
6145
6246
|
* Rounds a number to a specified number of decimal places.
|
|
@@ -6211,7 +6312,7 @@ function sqrt(base) {
|
|
|
6211
6312
|
* @returns True if numbers are equal, false otherwise.
|
|
6212
6313
|
*/
|
|
6213
6314
|
function equals(a, b) {
|
|
6214
|
-
return a === b;
|
|
6315
|
+
return a === b || stripErrorMargin(a) === stripErrorMargin(b);
|
|
6215
6316
|
}
|
|
6216
6317
|
/**
|
|
6217
6318
|
* Checks if the first number is greater than the second number.
|
|
@@ -6220,7 +6321,7 @@ function equals(a, b) {
|
|
|
6220
6321
|
* @returns True if a is greater than b, false otherwise.
|
|
6221
6322
|
*/
|
|
6222
6323
|
function greaterThan(a, b) {
|
|
6223
|
-
return a > b;
|
|
6324
|
+
return !equals(a, b) && stripErrorMargin(a) > stripErrorMargin(b);
|
|
6224
6325
|
}
|
|
6225
6326
|
/**
|
|
6226
6327
|
* Checks if the first number is greater than or equal to the second number.
|
|
@@ -6229,7 +6330,7 @@ function greaterThan(a, b) {
|
|
|
6229
6330
|
* @returns True if a is greater than or equal to b, false otherwise.
|
|
6230
6331
|
*/
|
|
6231
6332
|
function greaterThanOrEquals(a, b) {
|
|
6232
|
-
return a
|
|
6333
|
+
return equals(a, b) || stripErrorMargin(a) > stripErrorMargin(b);
|
|
6233
6334
|
}
|
|
6234
6335
|
/**
|
|
6235
6336
|
* Checks if the first number is less than the second number.
|
|
@@ -6238,7 +6339,7 @@ function greaterThanOrEquals(a, b) {
|
|
|
6238
6339
|
* @returns True if a is less than b, false otherwise.
|
|
6239
6340
|
*/
|
|
6240
6341
|
function lessThan(a, b) {
|
|
6241
|
-
return a < b;
|
|
6342
|
+
return !equals(a, b) && stripErrorMargin(a) < stripErrorMargin(b);
|
|
6242
6343
|
}
|
|
6243
6344
|
/**
|
|
6244
6345
|
* Checks if the first number is less than or equal to the second number.
|
|
@@ -6247,7 +6348,7 @@ function lessThan(a, b) {
|
|
|
6247
6348
|
* @returns True if a is less than or equal to b, false otherwise.
|
|
6248
6349
|
*/
|
|
6249
6350
|
function lessThanOrEquals(a, b) {
|
|
6250
|
-
return a
|
|
6351
|
+
return equals(a, b) || stripErrorMargin(a) < stripErrorMargin(b);
|
|
6251
6352
|
}
|
|
6252
6353
|
/**
|
|
6253
6354
|
* Complete the number to the specified accuracy and solve the accuracy error,
|
|
@@ -6515,8 +6616,8 @@ var BooleanValueObject = class BooleanValueObject extends BaseValueObject {
|
|
|
6515
6616
|
case ">=": return true;
|
|
6516
6617
|
case "=":
|
|
6517
6618
|
case "<":
|
|
6518
|
-
case "<=":
|
|
6519
|
-
case "<>": return
|
|
6619
|
+
case "<=": return false;
|
|
6620
|
+
case "<>": return true;
|
|
6520
6621
|
}
|
|
6521
6622
|
}
|
|
6522
6623
|
concatenateFront(valueObject) {
|
|
@@ -7138,12 +7239,13 @@ var StringValueObject = class StringValueObject extends BaseValueObject {
|
|
|
7138
7239
|
return BooleanValueObject.create(result);
|
|
7139
7240
|
}
|
|
7140
7241
|
_compareString(currentValue, value, operator) {
|
|
7242
|
+
const compareResult = currentValue.localeCompare(value);
|
|
7141
7243
|
switch (operator) {
|
|
7142
7244
|
case "=": return currentValue === value;
|
|
7143
|
-
case ">": return
|
|
7144
|
-
case ">=": return currentValue
|
|
7145
|
-
case "<": return
|
|
7146
|
-
case "<=": return currentValue
|
|
7245
|
+
case ">": return compareResult > 0;
|
|
7246
|
+
case ">=": return currentValue === value || compareResult > 0;
|
|
7247
|
+
case "<": return compareResult < 0;
|
|
7248
|
+
case "<=": return currentValue === value || compareResult < 0;
|
|
7147
7249
|
case "<>": return currentValue !== value;
|
|
7148
7250
|
}
|
|
7149
7251
|
}
|
|
@@ -7169,6 +7271,7 @@ var StringValueObject = class StringValueObject extends BaseValueObject {
|
|
|
7169
7271
|
}
|
|
7170
7272
|
convertToNumberObjectValue() {
|
|
7171
7273
|
const rawValue = this.getValue();
|
|
7274
|
+
if (rawValue.trim() === "") return ErrorValueObject.create("#VALUE!");
|
|
7172
7275
|
const parseData = (0, _univerjs_core.getNumfmtParseValueFilter)(rawValue);
|
|
7173
7276
|
if (parseData && parseData.z) return createNumberValueObjectByRawValue(parseData.v, parseData.z);
|
|
7174
7277
|
return createNumberValueObjectByRawValue(rawValue);
|
|
@@ -7277,6 +7380,8 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7277
7380
|
_defineProperty(this, "_sheetId", "");
|
|
7278
7381
|
_defineProperty(this, "_currentRow", -1);
|
|
7279
7382
|
_defineProperty(this, "_currentColumn", -1);
|
|
7383
|
+
_defineProperty(this, "_useInvertedIndexCache", false);
|
|
7384
|
+
_defineProperty(this, "_legacyImplicitForAggregate", false);
|
|
7280
7385
|
_defineProperty(this, "_sliceCache", /* @__PURE__ */ new Map());
|
|
7281
7386
|
_defineProperty(this, "_flattenCache", void 0);
|
|
7282
7387
|
_defineProperty(this, "_defaultValue", null);
|
|
@@ -7328,6 +7433,15 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7328
7433
|
getCurrentColumn() {
|
|
7329
7434
|
return this._currentColumn;
|
|
7330
7435
|
}
|
|
7436
|
+
usesInvertedIndexCache() {
|
|
7437
|
+
return this._useInvertedIndexCache;
|
|
7438
|
+
}
|
|
7439
|
+
usesLegacyImplicitForAggregate() {
|
|
7440
|
+
return this._legacyImplicitForAggregate;
|
|
7441
|
+
}
|
|
7442
|
+
setLegacyImplicitForAggregate(value) {
|
|
7443
|
+
this._legacyImplicitForAggregate = value;
|
|
7444
|
+
}
|
|
7331
7445
|
getArrayValue() {
|
|
7332
7446
|
return this._values;
|
|
7333
7447
|
}
|
|
@@ -7594,6 +7708,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7594
7708
|
if (itemValue == null || itemValue.isNull()) return true;
|
|
7595
7709
|
let matchObject;
|
|
7596
7710
|
if (isFuzzyMatching === true) matchObject = itemValue.compare(valueObject, "=");
|
|
7711
|
+
else if (searchType === 0 && itemValue.isNumber() && valueObject.isNumber()) matchObject = BooleanValueObject.create(Number(itemValue.getValue()) === Number(valueObject.getValue()));
|
|
7597
7712
|
else matchObject = itemValue.isEqual(valueObject);
|
|
7598
7713
|
if ((matchObject === null || matchObject === void 0 ? void 0 : matchObject.getValue()) === true) {
|
|
7599
7714
|
result = itemValue;
|
|
@@ -7716,7 +7831,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7716
7831
|
return false;
|
|
7717
7832
|
}
|
|
7718
7833
|
if (valueObject.isString() || valueObject.isNull() || valueObject.isBoolean()) return true;
|
|
7719
|
-
if (accumulatorAll.
|
|
7834
|
+
if (Number(accumulatorAll.getValue()) < Number(valueObject.getValue())) accumulatorAll = valueObject;
|
|
7720
7835
|
});
|
|
7721
7836
|
return accumulatorAll;
|
|
7722
7837
|
}
|
|
@@ -7757,7 +7872,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7757
7872
|
return accumulatorAll;
|
|
7758
7873
|
}
|
|
7759
7874
|
getNegative() {
|
|
7760
|
-
return
|
|
7875
|
+
return this.mapValue((valueObject) => NumberValueObject.create(0).minus(valueObject));
|
|
7761
7876
|
}
|
|
7762
7877
|
getReciprocal() {
|
|
7763
7878
|
return ArrayValueObject.create("{1}").divided(this);
|
|
@@ -7809,12 +7924,10 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7809
7924
|
for (let c = 0; c < columnCount; c++) {
|
|
7810
7925
|
var _this$_values;
|
|
7811
7926
|
const row = (_this$_values = this._values) === null || _this$_values === void 0 ? void 0 : _this$_values[r];
|
|
7812
|
-
|
|
7813
|
-
|
|
7814
|
-
|
|
7815
|
-
|
|
7816
|
-
else rowList[c] = NullValueObject.create();
|
|
7817
|
-
}
|
|
7927
|
+
const currentValue = this.getValueOrDefault(r, c);
|
|
7928
|
+
if (row == null && currentValue == null) rowList[c] = ErrorValueObject.create("#VALUE!");
|
|
7929
|
+
else if (currentValue) rowList[c] = callbackFn(currentValue, r, c);
|
|
7930
|
+
else rowList[c] = NullValueObject.create();
|
|
7818
7931
|
}
|
|
7819
7932
|
result.push(rowList);
|
|
7820
7933
|
}
|
|
@@ -8124,7 +8237,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8124
8237
|
* If comparison operations are conducted for a single numerical value,
|
|
8125
8238
|
* then retrieve the judgment from the inverted index. This enhances performance.
|
|
8126
8239
|
*/
|
|
8127
|
-
if (batchOperatorType === 5) {
|
|
8240
|
+
if (batchOperatorType === 5 && this._useInvertedIndexCache) {
|
|
8128
8241
|
const { rowsInCache, rowsNotInCache } = CELL_INVERTED_INDEX_CACHE.canUseCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
|
|
8129
8242
|
if (rowsInCache.length > 0) {
|
|
8130
8243
|
if (operator === "=" && !(valueObject.isString() && isWildcard(valueObject.getValue()))) {
|
|
@@ -8158,13 +8271,13 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8158
8271
|
if (rowsNotInCache.length > 0) for (const interval of rowsNotInCache) {
|
|
8159
8272
|
const [start, end] = interval;
|
|
8160
8273
|
for (let r = start; r <= end; r++) this.__batchOperatorRowValue(valueObject, column, result, batchOperatorType, r - startRow, unitId, sheetId, startRow, startColumn, operator, isCaseSensitive);
|
|
8161
|
-
CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, start, end);
|
|
8274
|
+
if (this._useInvertedIndexCache) CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, start, end);
|
|
8162
8275
|
}
|
|
8163
8276
|
return;
|
|
8164
8277
|
}
|
|
8165
8278
|
}
|
|
8166
8279
|
for (let r = 0; r < rowCount; r++) this.__batchOperatorRowValue(valueObject, column, result, batchOperatorType, r, unitId, sheetId, startRow, startColumn, operator, isCaseSensitive);
|
|
8167
|
-
CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
|
|
8280
|
+
if (this._useInvertedIndexCache) CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
|
|
8168
8281
|
}
|
|
8169
8282
|
__batchOperatorRowValue(valueObject, column, result, batchOperatorType, r, unitId, sheetId, startRow, startColumn, operator, isCaseSensitive) {
|
|
8170
8283
|
const currentValue = this.getValueOrDefault(r, column);
|
|
@@ -8214,7 +8327,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8214
8327
|
break;
|
|
8215
8328
|
}
|
|
8216
8329
|
else result[r][column] = ErrorValueObject.create("#N/A");
|
|
8217
|
-
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);
|
|
8330
|
+
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);
|
|
8218
8331
|
}
|
|
8219
8332
|
_batchOperatorArray(valueObject, batchOperatorType, operator, isCaseSensitive) {
|
|
8220
8333
|
let rowCount = valueObject.getRowCount();
|
|
@@ -8285,7 +8398,9 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8285
8398
|
}
|
|
8286
8399
|
result.push(rowList);
|
|
8287
8400
|
}
|
|
8288
|
-
|
|
8401
|
+
const newArray = this._createNewArray(result, rowCount, columnCount);
|
|
8402
|
+
if (batchOperatorType === 1) newArray.setLegacyImplicitForAggregate(true);
|
|
8403
|
+
return newArray;
|
|
8289
8404
|
}
|
|
8290
8405
|
_checkArrayCalculateType(valueObject) {
|
|
8291
8406
|
if (valueObject.getRowCount() === 1 && valueObject.getColumnCount() === 1) return 3;
|
|
@@ -8302,6 +8417,8 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8302
8417
|
this._sheetId = rawValue.sheetId;
|
|
8303
8418
|
this._currentRow = rawValue.row;
|
|
8304
8419
|
this._currentColumn = rawValue.column;
|
|
8420
|
+
this._useInvertedIndexCache = rawValue.useInvertedIndexCache === true;
|
|
8421
|
+
this._legacyImplicitForAggregate = rawValue.legacyImplicitForAggregate === true;
|
|
8305
8422
|
return rawValue.calculateValueList;
|
|
8306
8423
|
}
|
|
8307
8424
|
rawValue = rawValue.slice(1, -1);
|
|
@@ -8324,7 +8441,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8324
8441
|
this._columnCount = maxColumnCount;
|
|
8325
8442
|
return result;
|
|
8326
8443
|
}
|
|
8327
|
-
_createNewArray(result, rowCount, columnCount, row =
|
|
8444
|
+
_createNewArray(result, rowCount, columnCount, row = this._currentRow, column = this._currentColumn) {
|
|
8328
8445
|
if (this._currentColumn === -1 || this._currentRow === -1) {
|
|
8329
8446
|
row = -1;
|
|
8330
8447
|
column = -1;
|
|
@@ -8440,14 +8557,14 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8440
8557
|
}
|
|
8441
8558
|
iterator(callback) {
|
|
8442
8559
|
const { startRow, endRow, startColumn, endColumn } = this.getRangePosition();
|
|
8443
|
-
if (this._checkIfWorksheetMiss()) return callback(ErrorValueObject.create("#
|
|
8560
|
+
if (this._checkIfWorksheetMiss()) return callback(ErrorValueObject.create("#REF!"), startRow, startColumn);
|
|
8444
8561
|
const unitId = this._forcedUnitId || this._defaultUnitId;
|
|
8445
8562
|
const sheetId = this._forcedSheetId || this._defaultSheetId;
|
|
8446
8563
|
for (let r = startRow; r <= endRow; r++) for (let c = startColumn; c <= endColumn; c++) {
|
|
8447
8564
|
if (r < 0 || c < 0) return callback(ErrorValueObject.create("#REF!"), r, c);
|
|
8448
8565
|
const cell = this.getCellData(r, c);
|
|
8449
8566
|
let result = false;
|
|
8450
|
-
if ((0, _univerjs_core.isNullCell)(cell)) {
|
|
8567
|
+
if ((0, _univerjs_core.isNullCell)(cell) && !isTypedEmptyStringCell(cell)) {
|
|
8451
8568
|
result = callback(null, r, c);
|
|
8452
8569
|
continue;
|
|
8453
8570
|
}
|
|
@@ -8464,7 +8581,7 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8464
8581
|
}
|
|
8465
8582
|
}
|
|
8466
8583
|
getFirstCell() {
|
|
8467
|
-
if (this._checkIfWorksheetMiss()) return ErrorValueObject.create("#
|
|
8584
|
+
if (this._checkIfWorksheetMiss()) return ErrorValueObject.create("#REF!");
|
|
8468
8585
|
const { startRow, startColumn } = this.getRangePosition();
|
|
8469
8586
|
const cell = this.getCellData(startRow, startColumn);
|
|
8470
8587
|
if (!cell) return NumberValueObject.create(0);
|
|
@@ -8643,14 +8760,15 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8643
8760
|
}
|
|
8644
8761
|
getCellValueObject(cell) {
|
|
8645
8762
|
const value = getCellValue(cell);
|
|
8763
|
+
const cellValueType = Number(cell.t);
|
|
8646
8764
|
if (ERROR_TYPE_SET.has(value)) return ErrorValueObject.create(value);
|
|
8647
|
-
if (
|
|
8765
|
+
if (cellValueType === _univerjs_core.CellValueType.NUMBER) {
|
|
8648
8766
|
const pattern = this._getPatternByCell(cell);
|
|
8649
8767
|
if ((0, _univerjs_core.isTextFormat)(pattern)) return StringValueObject.create(value.toString());
|
|
8650
8768
|
return createNumberValueObjectByRawValue(value, pattern);
|
|
8651
8769
|
}
|
|
8652
|
-
if (
|
|
8653
|
-
if (
|
|
8770
|
+
if (cellValueType === _univerjs_core.CellValueType.STRING || cellValueType === _univerjs_core.CellValueType.FORCE_STRING) return StringValueObject.create(value.toString());
|
|
8771
|
+
if (cellValueType === _univerjs_core.CellValueType.BOOLEAN) return createBooleanValueObjectByRawValue(value);
|
|
8654
8772
|
return ValueObjectFactory.create(value);
|
|
8655
8773
|
}
|
|
8656
8774
|
_getPatternByCell(cell) {
|
|
@@ -8726,7 +8844,7 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8726
8844
|
if (!row) row = rangeData.startRow;
|
|
8727
8845
|
if (!column) column = rangeData.startColumn;
|
|
8728
8846
|
const cell = this.getCellData(row, column);
|
|
8729
|
-
if (!cell) return
|
|
8847
|
+
if (!cell) return NullValueObject.create();
|
|
8730
8848
|
return this.getCellValueObject(cell);
|
|
8731
8849
|
}
|
|
8732
8850
|
setCurrentRowAndColumn(row, column) {
|
|
@@ -8780,7 +8898,8 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8780
8898
|
unitId: this.getUnitId(),
|
|
8781
8899
|
sheetId: this.getSheetId(),
|
|
8782
8900
|
row: startRow,
|
|
8783
|
-
column: startColumn
|
|
8901
|
+
column: startColumn,
|
|
8902
|
+
useInvertedIndexCache: true
|
|
8784
8903
|
};
|
|
8785
8904
|
const arrayValueObject = ArrayValueObject.create(arrayValueObjectData);
|
|
8786
8905
|
useCache && FORMULA_REF_TO_ARRAY_CACHE.set(key, arrayValueObject);
|
|
@@ -8810,6 +8929,9 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8810
8929
|
return ArrayValueObject.create(arrayValueObjectData);
|
|
8811
8930
|
}
|
|
8812
8931
|
};
|
|
8932
|
+
function isTypedEmptyStringCell(cell) {
|
|
8933
|
+
return (cell === null || cell === void 0 ? void 0 : cell.v) === "" && (cell.t === _univerjs_core.CellValueType.STRING || cell.t === _univerjs_core.CellValueType.FORCE_STRING);
|
|
8934
|
+
}
|
|
8813
8935
|
var AsyncObject = class extends ObjectClassType {
|
|
8814
8936
|
constructor(_promise) {
|
|
8815
8937
|
super();
|
|
@@ -8871,6 +8993,8 @@ var RangeReferenceObject = class extends BaseReferenceObject {
|
|
|
8871
8993
|
|
|
8872
8994
|
//#endregion
|
|
8873
8995
|
//#region src/engine/reference-object/cell-reference-object.ts
|
|
8996
|
+
const EXCEL_MAX_ROWS = 1048576;
|
|
8997
|
+
const EXCEL_MAX_COLUMNS = 16384;
|
|
8874
8998
|
var CellReferenceObject = class extends BaseReferenceObject {
|
|
8875
8999
|
constructor(token) {
|
|
8876
9000
|
super(token);
|
|
@@ -8882,6 +9006,12 @@ var CellReferenceObject = class extends BaseReferenceObject {
|
|
|
8882
9006
|
isCell() {
|
|
8883
9007
|
return true;
|
|
8884
9008
|
}
|
|
9009
|
+
isExceedRange() {
|
|
9010
|
+
var _this$getForcedSheetI;
|
|
9011
|
+
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;
|
|
9012
|
+
const { startRow, endRow, startColumn, endColumn } = this.getRangePosition();
|
|
9013
|
+
return startRow < 0 || startColumn < 0 || endRow >= EXCEL_MAX_ROWS || endColumn >= EXCEL_MAX_COLUMNS;
|
|
9014
|
+
}
|
|
8885
9015
|
unionBy(referenceObject) {
|
|
8886
9016
|
if (!referenceObject.isCell()) return ErrorValueObject.create("#REF!");
|
|
8887
9017
|
const cellReferenceObject = referenceObject;
|
|
@@ -9365,11 +9495,11 @@ function getPairedRangeAndCriteriaResult(variants, params) {
|
|
|
9365
9495
|
result = sum.divided(count);
|
|
9366
9496
|
} else if (formulaName === "MAXIFS") {
|
|
9367
9497
|
const picked = targetRange.pick(finalCompareResult);
|
|
9368
|
-
if (picked.getColumnCount() === 0) result =
|
|
9498
|
+
if (picked.getColumnCount() === 0) result = NumberValueObject.create(0);
|
|
9369
9499
|
else result = picked.max();
|
|
9370
9500
|
} else if (formulaName === "MINIFS") {
|
|
9371
9501
|
const picked = targetRange.pick(finalCompareResult);
|
|
9372
|
-
if (picked.getColumnCount() === 0) result =
|
|
9502
|
+
if (picked.getColumnCount() === 0) result = NumberValueObject.create(0);
|
|
9373
9503
|
else result = picked.min();
|
|
9374
9504
|
}
|
|
9375
9505
|
if (!results[rowIndex]) results[rowIndex] = [];
|
|
@@ -9381,13 +9511,25 @@ function getPairedRangeAndCriteriaResult(variants, params) {
|
|
|
9381
9511
|
* Two ArrayValueObject of the same type can be compared
|
|
9382
9512
|
*/
|
|
9383
9513
|
function filterSameValueObjectResult(array, range, criteria) {
|
|
9384
|
-
const [operator, criteriaObject] = findCompareToken(`${criteria.getValue()}`);
|
|
9514
|
+
const [operator, criteriaObject] = criteria.isString() ? findCompareToken(`${criteria.getValue()}`) : ["=", criteria];
|
|
9385
9515
|
return array.mapValue((valueObject, r, c) => {
|
|
9386
9516
|
const rangeValueObject = range.get(r, c);
|
|
9517
|
+
const isBlankStringCriteria = criteriaObject.isString() && criteriaObject.getValue() === "";
|
|
9518
|
+
if (operator === "<>" && isBlankStringCriteria && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString()) && rangeValueObject.getValue() === "") return BooleanValueObject.create(true);
|
|
9519
|
+
if (criteriaObject.isString() && criteriaObject.getValue() !== "" && (operator === "<" || operator === "<=") && (rangeValueObject == null || rangeValueObject.isNull() || rangeValueObject.isString() && rangeValueObject.getValue() === "")) return BooleanValueObject.create(false);
|
|
9520
|
+
if (criteriaObject.isString() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString()) && (operator === "<" || operator === "<=") && isSameLowerBoundBucket(rangeValueObject.getValue(), criteriaObject.getValue())) return BooleanValueObject.create(false);
|
|
9521
|
+
if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isNumber()) && criteriaObject.isString()) {
|
|
9522
|
+
const criteriaNumber = criteriaObject.convertToNumberObjectValue();
|
|
9523
|
+
if (criteriaNumber.isNumber()) return rangeValueObject.compare(criteriaNumber, operator);
|
|
9524
|
+
}
|
|
9525
|
+
if (criteriaObject.isNumber() && criteriaObject.isDateFormat() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString())) {
|
|
9526
|
+
const rangeNumber = rangeValueObject.convertToNumberObjectValue();
|
|
9527
|
+
if (rangeNumber.isNumber()) return rangeNumber.compare(criteriaObject, operator);
|
|
9528
|
+
}
|
|
9387
9529
|
if (rangeValueObject && isSameValueObjectType(rangeValueObject, criteriaObject)) return valueObject;
|
|
9388
9530
|
if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isError()) && criteriaObject.isError() && rangeValueObject.getValue() === criteriaObject.getValue()) return BooleanValueObject.create(true);
|
|
9389
9531
|
/**
|
|
9390
|
-
* If the operator is '=' or '<>', we can compare numbers
|
|
9532
|
+
* If the operator is '=' or '<>', we can compare string numbers against numeric criteria directly in COUNTIF, COUNTIFS, SUMIF, SUMIFS, etc.
|
|
9391
9533
|
* Other operators require both valueObjects to be of the same type.
|
|
9392
9534
|
* For example:
|
|
9393
9535
|
* | A1 | B1 |
|
|
@@ -9399,10 +9541,6 @@ function filterSameValueObjectResult(array, range, criteria) {
|
|
|
9399
9541
|
* =COUNTIF(A1:B1, '<=123') will return 1
|
|
9400
9542
|
*/
|
|
9401
9543
|
if (operator === "=" || operator === "<>") {
|
|
9402
|
-
if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isNumber()) && criteriaObject.isString()) {
|
|
9403
|
-
const criteriaNumber = criteriaObject.convertToNumberObjectValue();
|
|
9404
|
-
if (criteriaNumber.isNumber()) return rangeValueObject.compare(criteriaNumber, operator);
|
|
9405
|
-
}
|
|
9406
9544
|
if (criteriaObject.isNumber() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString())) {
|
|
9407
9545
|
const rangeNumber = rangeValueObject.convertToNumberObjectValue();
|
|
9408
9546
|
if (rangeNumber.isNumber()) return rangeNumber.compare(criteriaObject, operator);
|
|
@@ -9413,6 +9551,11 @@ function filterSameValueObjectResult(array, range, criteria) {
|
|
|
9413
9551
|
return BooleanValueObject.create(false);
|
|
9414
9552
|
});
|
|
9415
9553
|
}
|
|
9554
|
+
function isSameLowerBoundBucket(rangeValue, criteriaValue) {
|
|
9555
|
+
const criteriaMatch = criteriaValue.match(/^(\d+)\|/);
|
|
9556
|
+
const rangeMatch = rangeValue.match(/^(\d+)-/);
|
|
9557
|
+
return criteriaMatch != null && rangeMatch != null && criteriaMatch[1] === rangeMatch[1];
|
|
9558
|
+
}
|
|
9416
9559
|
/**
|
|
9417
9560
|
* Check if the two valueObjects are of the same type
|
|
9418
9561
|
* @param left
|
|
@@ -9513,6 +9656,7 @@ let FormulaRuntimeService = class FormulaRuntimeService extends _univerjs_core.D
|
|
|
9513
9656
|
_defineProperty(this, "_currentColumn", -1);
|
|
9514
9657
|
_defineProperty(this, "_currentRowCount", Number.NEGATIVE_INFINITY);
|
|
9515
9658
|
_defineProperty(this, "_currentColumnCount", Number.NEGATIVE_INFINITY);
|
|
9659
|
+
_defineProperty(this, "_functionRefInfoOverrideStack", []);
|
|
9516
9660
|
_defineProperty(this, "_currentSubUnitId", "");
|
|
9517
9661
|
_defineProperty(this, "_currentUnitId", "");
|
|
9518
9662
|
_defineProperty(this, "_runtimeData", {});
|
|
@@ -9541,10 +9685,12 @@ let FormulaRuntimeService = class FormulaRuntimeService extends _univerjs_core.D
|
|
|
9541
9685
|
return this._currentColumn;
|
|
9542
9686
|
}
|
|
9543
9687
|
get currentRowCount() {
|
|
9544
|
-
|
|
9688
|
+
var _this$_functionRefInf, _this$_functionRefInf2;
|
|
9689
|
+
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;
|
|
9545
9690
|
}
|
|
9546
9691
|
get currentColumnCount() {
|
|
9547
|
-
|
|
9692
|
+
var _this$_functionRefInf3, _this$_functionRefInf4;
|
|
9693
|
+
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;
|
|
9548
9694
|
}
|
|
9549
9695
|
get currentSubUnitId() {
|
|
9550
9696
|
return this._currentSubUnitId;
|
|
@@ -9638,6 +9784,7 @@ let FormulaRuntimeService = class FormulaRuntimeService extends _univerjs_core.D
|
|
|
9638
9784
|
this._isCycleDependency = false;
|
|
9639
9785
|
this._totalFormulasToCalculate = 0;
|
|
9640
9786
|
this._completedFormulasCount = 0;
|
|
9787
|
+
this._functionRefInfoOverrideStack = [];
|
|
9641
9788
|
this.clearReferenceAndNumberformatCache();
|
|
9642
9789
|
}
|
|
9643
9790
|
clearReferenceAndNumberformatCache() {
|
|
@@ -9653,6 +9800,15 @@ let FormulaRuntimeService = class FormulaRuntimeService extends _univerjs_core.D
|
|
|
9653
9800
|
this._currentSubUnitId = sheetId;
|
|
9654
9801
|
this._currentUnitId = unitId;
|
|
9655
9802
|
}
|
|
9803
|
+
setFunctionRefInfoOverride(rowCount, columnCount) {
|
|
9804
|
+
this._functionRefInfoOverrideStack.push({
|
|
9805
|
+
rowCount,
|
|
9806
|
+
columnCount
|
|
9807
|
+
});
|
|
9808
|
+
return () => {
|
|
9809
|
+
this._functionRefInfoOverrideStack.pop();
|
|
9810
|
+
};
|
|
9811
|
+
}
|
|
9656
9812
|
clearFunctionDefinitionPrivacyVar() {
|
|
9657
9813
|
this._functionDefinitionPrivacyVar.clear();
|
|
9658
9814
|
}
|
|
@@ -9716,13 +9872,22 @@ let FormulaRuntimeService = class FormulaRuntimeService extends _univerjs_core.D
|
|
|
9716
9872
|
* then it is not treated as an array range and is directly assigned.
|
|
9717
9873
|
*/
|
|
9718
9874
|
if (startRow === endRow && startColumn === endColumn) {
|
|
9719
|
-
const
|
|
9875
|
+
const firstCellRaw = objectValueRefOrArray.getFirstCell();
|
|
9876
|
+
const firstCell = firstCellRaw.isNull() ? NumberValueObject.create(0) : firstCellRaw;
|
|
9720
9877
|
const valueObject = this._getValueObjectOfRuntimeData(firstCell);
|
|
9721
9878
|
sheetData.setValue(row, column, valueObject);
|
|
9722
9879
|
clearArrayUnitData.setValue(row, column, valueObject);
|
|
9723
9880
|
CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column, firstCell.getValue(), row, true);
|
|
9724
9881
|
return;
|
|
9725
9882
|
}
|
|
9883
|
+
if (this._isCurrentSingleCellArrayFormulaRange(unitId, sheetId, row, column)) {
|
|
9884
|
+
const errorObject = this._getValueObjectOfRuntimeData(ErrorValueObject.create("#VALUE!"));
|
|
9885
|
+
sheetData.setValue(row, column, errorObject);
|
|
9886
|
+
clearArrayUnitData.setValue(row, column, errorObject);
|
|
9887
|
+
runtimeArrayUnitData.setValue(row, column, errorObject);
|
|
9888
|
+
CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column, "#VALUE!", row, true);
|
|
9889
|
+
return;
|
|
9890
|
+
}
|
|
9726
9891
|
const arrayRange = {
|
|
9727
9892
|
startRow: row,
|
|
9728
9893
|
startColumn: column,
|
|
@@ -9934,6 +10099,11 @@ let FormulaRuntimeService = class FormulaRuntimeService extends _univerjs_core.D
|
|
|
9934
10099
|
});
|
|
9935
10100
|
return isCellOverlapping;
|
|
9936
10101
|
}
|
|
10102
|
+
_isCurrentSingleCellArrayFormulaRange(unitId, sheetId, row, column) {
|
|
10103
|
+
var _this$_currentConfigS4;
|
|
10104
|
+
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];
|
|
10105
|
+
return range != null && range.startRow === range.endRow && range.startColumn === range.endColumn;
|
|
10106
|
+
}
|
|
9937
10107
|
_isInArrayFormulaRange(range, r, c) {
|
|
9938
10108
|
if (range == null) return false;
|
|
9939
10109
|
const { startRow, startColumn, endRow, endColumn } = range;
|
|
@@ -10172,18 +10342,23 @@ const FORMULA_CACHE_LRU_COUNT = 5e3;
|
|
|
10172
10342
|
const FORMULA_AST_CACHE = new FormulaAstLRU(FORMULA_CACHE_LRU_COUNT);
|
|
10173
10343
|
const DIRTY_DEFINED_NAME_SET_CACHE = /* @__PURE__ */ new WeakMap();
|
|
10174
10344
|
const DIRTY_SUPER_TABLE_PATTERN_CACHE = /* @__PURE__ */ new WeakMap();
|
|
10175
|
-
function generateAstNode(unitId, formulaString, lexer, astTreeBuilder, currentConfigService) {
|
|
10176
|
-
|
|
10177
|
-
|
|
10178
|
-
|
|
10179
|
-
|
|
10345
|
+
function generateAstNode(unitId, formulaString, lexer, astTreeBuilder, currentConfigService, subUnitId) {
|
|
10346
|
+
var _ref;
|
|
10347
|
+
if (subUnitId) {
|
|
10348
|
+
currentConfigService.setExecuteUnitId(unitId);
|
|
10349
|
+
currentConfigService.setExecuteSubUnitId(subUnitId);
|
|
10350
|
+
}
|
|
10351
|
+
const cacheKey = `${unitId}:${(_ref = subUnitId !== null && subUnitId !== void 0 ? subUnitId : currentConfigService.getExecuteSubUnitId()) !== null && _ref !== void 0 ? _ref : ""}:${formulaString}`;
|
|
10352
|
+
let astNode = FORMULA_AST_CACHE.get(cacheKey);
|
|
10353
|
+
if (!(checkIsChangedByDefinedName(unitId, formulaString, currentConfigService) || checkIsChangedBySuperTable(unitId, formulaString, currentConfigService)) && astNode && !isDirtyDefinedForNode(astNode, currentConfigService, unitId)) return astNode;
|
|
10354
|
+
const lexerNode = lexer.treeBuilder(formulaString, true, unitId);
|
|
10180
10355
|
if (ERROR_TYPE_SET.has(lexerNode)) return ErrorNode.create(lexerNode);
|
|
10181
10356
|
astNode = astTreeBuilder.parse(lexerNode);
|
|
10182
10357
|
if (astNode == null) {
|
|
10183
10358
|
console.error("generateAstNode astNode is null");
|
|
10184
10359
|
return ErrorNode.create(lexerNode);
|
|
10185
10360
|
}
|
|
10186
|
-
|
|
10361
|
+
FORMULA_AST_CACHE.set(cacheKey, astNode);
|
|
10187
10362
|
return astNode;
|
|
10188
10363
|
}
|
|
10189
10364
|
function checkIsChangedByDefinedName(unitId, formula, currentConfigService) {
|
|
@@ -10214,15 +10389,15 @@ function getNormalizedDirtyDefinedNameSet(unitDefinedNameMap) {
|
|
|
10214
10389
|
function getDirtySuperTableReferencePattern(unitSuperTableMap) {
|
|
10215
10390
|
let tableReferencePattern = DIRTY_SUPER_TABLE_PATTERN_CACHE.get(unitSuperTableMap);
|
|
10216
10391
|
if (tableReferencePattern === void 0) {
|
|
10217
|
-
const
|
|
10218
|
-
tableReferencePattern =
|
|
10392
|
+
const tableNames = Object.keys(unitSuperTableMap).filter((tableName) => tableName.length > 0);
|
|
10393
|
+
tableReferencePattern = tableNames.length > 0 ? _univerjs_core.regexp.createRegExpFromSafeFragment(`(^|[^A-Za-z0-9_])${_univerjs_core.regexp.or(...tableNames)}(\\s*\\[|$|[^A-Za-z0-9_])`, "i") : null;
|
|
10219
10394
|
DIRTY_SUPER_TABLE_PATTERN_CACHE.set(unitSuperTableMap, tableReferencePattern);
|
|
10220
10395
|
}
|
|
10221
10396
|
return tableReferencePattern;
|
|
10222
10397
|
}
|
|
10223
|
-
function isDirtyDefinedForNode(node, currentConfigService) {
|
|
10398
|
+
function isDirtyDefinedForNode(node, currentConfigService, unitId) {
|
|
10224
10399
|
const definedNameMap = currentConfigService.getDirtyDefinedNameMap();
|
|
10225
|
-
const executeUnitId =
|
|
10400
|
+
const executeUnitId = unitId;
|
|
10226
10401
|
if (executeUnitId != null && definedNameMap[executeUnitId] != null) {
|
|
10227
10402
|
const names = Object.keys(definedNameMap[executeUnitId]);
|
|
10228
10403
|
for (let i = 0, len = names.length; i < len; i++) {
|
|
@@ -10237,7 +10412,7 @@ function includeDefinedName(tree, node, currentConfigService) {
|
|
|
10237
10412
|
* Detect whether the dirty map contains a defined name.
|
|
10238
10413
|
*/
|
|
10239
10414
|
if (node != null) {
|
|
10240
|
-
if (isDirtyDefinedForNode(node, currentConfigService)) return true;
|
|
10415
|
+
if (isDirtyDefinedForNode(node, currentConfigService, tree.unitId)) return true;
|
|
10241
10416
|
}
|
|
10242
10417
|
return false;
|
|
10243
10418
|
}
|
|
@@ -10347,6 +10522,7 @@ var PrefixNode = class extends BaseAstNode {
|
|
|
10347
10522
|
if (!value.isReferenceObject()) return ErrorValueObject.create("#VALUE!");
|
|
10348
10523
|
const currentValue = value;
|
|
10349
10524
|
if (currentValue.isCell()) return ErrorValueObject.create("#VALUE!");
|
|
10525
|
+
if (this._preserveAtRangeForFormula2LookupArray()) return currentValue;
|
|
10350
10526
|
const runtimeService = this._runtimeService;
|
|
10351
10527
|
const currentRow = runtimeService.currentRow || 0;
|
|
10352
10528
|
const currentColumn = runtimeService.currentColumn || 0;
|
|
@@ -10358,6 +10534,22 @@ var PrefixNode = class extends BaseAstNode {
|
|
|
10358
10534
|
if (currentValue.isTable()) return currentValue.getCellByPosition(currentRow);
|
|
10359
10535
|
return ErrorValueObject.create("#VALUE!");
|
|
10360
10536
|
}
|
|
10537
|
+
_preserveAtRangeForFormula2LookupArray() {
|
|
10538
|
+
let node = this;
|
|
10539
|
+
let parent = node.getParent();
|
|
10540
|
+
let sawCompareOperator = false;
|
|
10541
|
+
while (parent != null) {
|
|
10542
|
+
if (parent.nodeType === 3) sawCompareOperator || (sawCompareOperator = OPERATOR_TOKEN_COMPARE_SET.has(parent.getToken()));
|
|
10543
|
+
if (parent.nodeType === 4) {
|
|
10544
|
+
const functionName = parent.getToken().toUpperCase();
|
|
10545
|
+
if (sawCompareOperator && functionName === "XMATCH") return parent.getChildren().indexOf(node) === 1;
|
|
10546
|
+
return false;
|
|
10547
|
+
}
|
|
10548
|
+
node = parent;
|
|
10549
|
+
parent = parent.getParent();
|
|
10550
|
+
}
|
|
10551
|
+
return false;
|
|
10552
|
+
}
|
|
10361
10553
|
};
|
|
10362
10554
|
let PrefixNodeFactory = class PrefixNodeFactory extends BaseAstNodeFactory {
|
|
10363
10555
|
constructor(_functionService, _runtimeService) {
|
|
@@ -10432,41 +10624,43 @@ var FunctionNode = class extends BaseAstNode {
|
|
|
10432
10624
|
return 4;
|
|
10433
10625
|
}
|
|
10434
10626
|
async executeAsync() {
|
|
10435
|
-
const variants = [];
|
|
10436
10627
|
const children = this.getChildren();
|
|
10437
|
-
const childrenCount = children.length;
|
|
10438
10628
|
this._compatibility();
|
|
10439
|
-
|
|
10440
|
-
const object = children[i].getValue();
|
|
10441
|
-
if (object == null) continue;
|
|
10442
|
-
if (object.isReferenceObject() && !this._functionExecutor.needsReferenceObject) variants.push(object.toArrayValueObject());
|
|
10443
|
-
else variants.push(object);
|
|
10444
|
-
}
|
|
10445
|
-
const resultVariant = await this._calculateAsync(variants);
|
|
10629
|
+
const resultVariant = this._functionExecutor.needsAstChildren ? this._calculateAst(children) : await this._calculateAsync(this._collectVariants(children));
|
|
10446
10630
|
let result;
|
|
10447
10631
|
if (resultVariant.isAsyncObject() || resultVariant.isAsyncArrayObject()) result = await resultVariant.getValue();
|
|
10448
10632
|
else result = resultVariant;
|
|
10633
|
+
result = this._normalizeTopLevelLegacyArrayResult(result);
|
|
10449
10634
|
this._setEmbeddedArrayFormulaToResult(result);
|
|
10450
10635
|
this._setRefData(result);
|
|
10451
10636
|
this.setValue(result);
|
|
10452
10637
|
return Promise.resolve(0);
|
|
10453
10638
|
}
|
|
10454
10639
|
execute() {
|
|
10455
|
-
const variants = [];
|
|
10456
10640
|
const children = this.getChildren();
|
|
10457
|
-
const childrenCount = children.length;
|
|
10458
10641
|
this._compatibility();
|
|
10642
|
+
const resultVariant = this._functionExecutor.needsAstChildren ? this._calculateAst(children) : this._calculate(this._collectVariants(children));
|
|
10643
|
+
const result = this._normalizeTopLevelLegacyArrayResult(resultVariant);
|
|
10644
|
+
this._setEmbeddedArrayFormulaToResult(result);
|
|
10645
|
+
this._setRefData(result);
|
|
10646
|
+
this.setValue(result);
|
|
10647
|
+
}
|
|
10648
|
+
_collectVariants(children) {
|
|
10649
|
+
const variants = [];
|
|
10650
|
+
const childrenCount = children.length;
|
|
10459
10651
|
for (let i = 0; i < childrenCount; i++) {
|
|
10460
|
-
const object = children[i]
|
|
10652
|
+
const object = this._getChildVariant(children[i]);
|
|
10461
10653
|
if (object == null) continue;
|
|
10462
|
-
|
|
10463
|
-
if (object.isReferenceObject() && !this._functionExecutor.needsReferenceObject) variants.push(object.toArrayValueObject());
|
|
10464
|
-
else variants.push(object);
|
|
10654
|
+
variants.push(object);
|
|
10465
10655
|
}
|
|
10466
|
-
|
|
10467
|
-
|
|
10468
|
-
|
|
10469
|
-
|
|
10656
|
+
return variants;
|
|
10657
|
+
}
|
|
10658
|
+
_getChildVariant(child) {
|
|
10659
|
+
const object = child.getValue();
|
|
10660
|
+
if (object == null) return;
|
|
10661
|
+
if (object.isReferenceObject() && this._functionExecutor.needsFilteredOutRows) this._setFilteredOutRows(object);
|
|
10662
|
+
if (object.isReferenceObject() && !this._functionExecutor.needsReferenceObject) return object.toArrayValueObject();
|
|
10663
|
+
return object;
|
|
10470
10664
|
}
|
|
10471
10665
|
isFunctionExecutorArgumentsIgnoreNumberPattern() {
|
|
10472
10666
|
return this._functionExecutor.isArgumentsIgnoreNumberPattern();
|
|
@@ -10481,6 +10675,14 @@ var FunctionNode = class extends BaseAstNode {
|
|
|
10481
10675
|
if (rowCount <= 1 && colCount <= 1) return;
|
|
10482
10676
|
this._runtimeService.setUnitArrayFormulaEmbeddedMap();
|
|
10483
10677
|
}
|
|
10678
|
+
_normalizeTopLevelLegacyArrayResult(result) {
|
|
10679
|
+
const parent = this.getParent();
|
|
10680
|
+
const isTopLevel = parent == null || parent.nodeType === 9;
|
|
10681
|
+
if (!this._functionExecutor.returnsLegacyArrayAsScalar || !isTopLevel || !result.isArray()) return result;
|
|
10682
|
+
const array = result;
|
|
10683
|
+
if (array.getRowCount() <= 1 && array.getColumnCount() <= 1) return result;
|
|
10684
|
+
return array.getFirstCell();
|
|
10685
|
+
}
|
|
10484
10686
|
/**
|
|
10485
10687
|
* Compatibility handling for special functions.
|
|
10486
10688
|
*/
|
|
@@ -10565,6 +10767,16 @@ var FunctionNode = class extends BaseAstNode {
|
|
|
10565
10767
|
}
|
|
10566
10768
|
return resultVariant;
|
|
10567
10769
|
}
|
|
10770
|
+
_calculateAst(children) {
|
|
10771
|
+
const { minParams, maxParams } = this._functionExecutor;
|
|
10772
|
+
if (minParams !== -1 && maxParams !== -1 && (children.length < minParams || children.length > maxParams)) return ErrorValueObject.create("#N/A");
|
|
10773
|
+
this._setRefInfo();
|
|
10774
|
+
this._handleAddressFunction();
|
|
10775
|
+
return this._functionExecutor.calculateAst(children, (node) => {
|
|
10776
|
+
var _this$_getChildVarian;
|
|
10777
|
+
return (_this$_getChildVarian = this._getChildVariant(node)) !== null && _this$_getChildVarian !== void 0 ? _this$_getChildVarian : null;
|
|
10778
|
+
});
|
|
10779
|
+
}
|
|
10568
10780
|
async _calculateAsync(variants) {
|
|
10569
10781
|
const { minParams, maxParams } = this._functionExecutor;
|
|
10570
10782
|
if (minParams !== -1 && maxParams !== -1 && (variants.length < minParams || variants.length > maxParams)) return ErrorValueObject.create("#N/A");
|
|
@@ -10580,15 +10792,15 @@ var FunctionNode = class extends BaseAstNode {
|
|
|
10580
10792
|
return resultVariant;
|
|
10581
10793
|
}
|
|
10582
10794
|
_setDefinedNamesForFunction() {
|
|
10583
|
-
const editorUnitId = this.
|
|
10795
|
+
const editorUnitId = this._runtimeService.currentUnitId;
|
|
10584
10796
|
if (editorUnitId == null) return;
|
|
10585
10797
|
const definedNames = this._definedNamesService.getDefinedNameMap(editorUnitId);
|
|
10586
10798
|
if (definedNames == null) return;
|
|
10587
10799
|
this._functionExecutor.setDefinedNames(definedNames);
|
|
10588
10800
|
}
|
|
10589
10801
|
_setRefInfo() {
|
|
10590
|
-
const { currentUnitId, currentSubUnitId, currentRow, currentColumn } = this._runtimeService;
|
|
10591
|
-
this._functionExecutor.setRefInfo(currentUnitId, currentSubUnitId, currentRow, currentColumn);
|
|
10802
|
+
const { currentUnitId, currentSubUnitId, currentRow, currentColumn, currentRowCount, currentColumnCount } = this._runtimeService;
|
|
10803
|
+
this._functionExecutor.setRefInfo(currentUnitId, currentSubUnitId, currentRow, currentColumn, currentRowCount, currentColumnCount);
|
|
10592
10804
|
if (this._functionExecutor.needsSheetRowColumnCount) {
|
|
10593
10805
|
const { rowCount, columnCount } = this._currentConfigService.getSheetRowColumnCount(currentUnitId, currentSubUnitId);
|
|
10594
10806
|
this._functionExecutor.setSheetRowColumnCount(rowCount, columnCount);
|
|
@@ -10659,7 +10871,7 @@ let FunctionNodeFactory = class FunctionNodeFactory extends BaseAstNodeFactory {
|
|
|
10659
10871
|
const { tokenTrim, minusPrefixNode, atPrefixNode } = prefixHandler(param.getToken().trim(), this._functionService, this._runtimeService);
|
|
10660
10872
|
const isColon = this._isParentUnionNode(param);
|
|
10661
10873
|
if (!Number.isNaN(Number(tokenTrim)) && !isColon) return ErrorNode.create("#VALUE!");
|
|
10662
|
-
const tokenTrimUpper = tokenTrim.toUpperCase();
|
|
10874
|
+
const tokenTrimUpper = normalizeFunctionToken(tokenTrim.toUpperCase());
|
|
10663
10875
|
if (isColon && COLUMN_LIKE_FUNCTION_NAMES.has(tokenTrimUpper)) return;
|
|
10664
10876
|
if (this._functionService.hasExecutor(tokenTrimUpper)) {
|
|
10665
10877
|
const functionNode = this.create(tokenTrimUpper);
|
|
@@ -10681,6 +10893,15 @@ FunctionNodeFactory = __decorate([
|
|
|
10681
10893
|
__decorateParam(4, (0, _univerjs_core.Inject)(_univerjs_core.Injector)),
|
|
10682
10894
|
__decorateParam(5, (0, _univerjs_core.Inject)(FormulaDataModel))
|
|
10683
10895
|
], FunctionNodeFactory);
|
|
10896
|
+
function normalizeFunctionToken(token) {
|
|
10897
|
+
if (token === "REGEXTEST" || token === "_XLFN.REGEXTEST") return "REGEXMATCH";
|
|
10898
|
+
for (const prefix of [
|
|
10899
|
+
"_XLFN.",
|
|
10900
|
+
"_XLWS.",
|
|
10901
|
+
"_XLETA."
|
|
10902
|
+
]) if (token.startsWith(prefix)) return token.slice(prefix.length);
|
|
10903
|
+
return token;
|
|
10904
|
+
}
|
|
10684
10905
|
|
|
10685
10906
|
//#endregion
|
|
10686
10907
|
//#region src/engine/interpreter/interpreter.ts
|
|
@@ -10731,6 +10952,7 @@ let Interpreter = class Interpreter extends _univerjs_core.Disposable {
|
|
|
10731
10952
|
}
|
|
10732
10953
|
async _executeAsync(node, refOffsetX = 0, refOffsetY = 0) {
|
|
10733
10954
|
if (this._runtimeService.isStopExecution()) return Promise.resolve(1);
|
|
10955
|
+
if (await this._executeLazyFunctionAsync(node, refOffsetX, refOffsetY)) return Promise.resolve(0);
|
|
10734
10956
|
const children = node.getChildren();
|
|
10735
10957
|
const childrenCount = children.length;
|
|
10736
10958
|
for (let i = 0; i < childrenCount; i++) {
|
|
@@ -10751,6 +10973,7 @@ let Interpreter = class Interpreter extends _univerjs_core.Disposable {
|
|
|
10751
10973
|
}
|
|
10752
10974
|
_execute(node, refOffsetX = 0, refOffsetY = 0) {
|
|
10753
10975
|
if (this._runtimeService.isStopExecution()) return 1;
|
|
10976
|
+
if (this._executeLazyFunction(node, refOffsetX, refOffsetY)) return 0;
|
|
10754
10977
|
const children = node.getChildren();
|
|
10755
10978
|
const childrenCount = children.length;
|
|
10756
10979
|
for (let i = 0; i < childrenCount; i++) {
|
|
@@ -10768,6 +10991,161 @@ let Interpreter = class Interpreter extends _univerjs_core.Disposable {
|
|
|
10768
10991
|
node.execute();
|
|
10769
10992
|
return 0;
|
|
10770
10993
|
}
|
|
10994
|
+
async _executeLazyFunctionAsync(node, refOffsetX, refOffsetY) {
|
|
10995
|
+
if (node.nodeType !== 4) return false;
|
|
10996
|
+
const token = node.getToken().toUpperCase();
|
|
10997
|
+
if (token === "IF") return await this._executeLazyIfAsync(node, refOffsetX, refOffsetY);
|
|
10998
|
+
if (token === "IFERROR") return await this._executeLazyIfErrorAsync(node, refOffsetX, refOffsetY);
|
|
10999
|
+
return false;
|
|
11000
|
+
}
|
|
11001
|
+
_executeLazyFunction(node, refOffsetX, refOffsetY) {
|
|
11002
|
+
if (node.nodeType !== 4) return false;
|
|
11003
|
+
const token = node.getToken().toUpperCase();
|
|
11004
|
+
if (token === "IF") return this._executeLazyIf(node, refOffsetX, refOffsetY);
|
|
11005
|
+
if (token === "IFERROR") return this._executeLazyIfError(node, refOffsetX, refOffsetY);
|
|
11006
|
+
return false;
|
|
11007
|
+
}
|
|
11008
|
+
async _executeLazyIfAsync(node, refOffsetX, refOffsetY) {
|
|
11009
|
+
const children = node.getChildren();
|
|
11010
|
+
if (children.length < 2 || children.length > 3) return false;
|
|
11011
|
+
await this._executeAsync(children[0], refOffsetX, refOffsetY);
|
|
11012
|
+
const condition = children[0].getValue();
|
|
11013
|
+
if (condition == null || condition.isReferenceObject() || condition.isArray()) return false;
|
|
11014
|
+
if (condition.isError()) {
|
|
11015
|
+
node.setValue(condition);
|
|
11016
|
+
return true;
|
|
11017
|
+
}
|
|
11018
|
+
const selected = condition.getValue() ? children[1] : children[2];
|
|
11019
|
+
if (selected == null) {
|
|
11020
|
+
node.setValue(BooleanValueObject.create(false));
|
|
11021
|
+
return true;
|
|
11022
|
+
}
|
|
11023
|
+
await this._executeAsync(selected, refOffsetX, refOffsetY);
|
|
11024
|
+
node.setValue(this._toLazyIfSelectedValue(selected.getValue(), node));
|
|
11025
|
+
return true;
|
|
11026
|
+
}
|
|
11027
|
+
_executeLazyIf(node, refOffsetX, refOffsetY) {
|
|
11028
|
+
const children = node.getChildren();
|
|
11029
|
+
if (children.length < 2 || children.length > 3) return false;
|
|
11030
|
+
this._execute(children[0], refOffsetX, refOffsetY);
|
|
11031
|
+
const condition = children[0].getValue();
|
|
11032
|
+
if (condition == null || condition.isReferenceObject() || condition.isArray()) return false;
|
|
11033
|
+
if (condition.isError()) {
|
|
11034
|
+
node.setValue(condition);
|
|
11035
|
+
return true;
|
|
11036
|
+
}
|
|
11037
|
+
const selected = condition.getValue() ? children[1] : children[2];
|
|
11038
|
+
if (selected == null) {
|
|
11039
|
+
node.setValue(BooleanValueObject.create(false));
|
|
11040
|
+
return true;
|
|
11041
|
+
}
|
|
11042
|
+
this._execute(selected, refOffsetX, refOffsetY);
|
|
11043
|
+
node.setValue(this._toLazyIfSelectedValue(selected.getValue(), node));
|
|
11044
|
+
return true;
|
|
11045
|
+
}
|
|
11046
|
+
async _executeLazyIfErrorAsync(node, refOffsetX, refOffsetY) {
|
|
11047
|
+
var _children$1$getValue;
|
|
11048
|
+
const children = node.getChildren();
|
|
11049
|
+
if (children.length !== 2) return false;
|
|
11050
|
+
await this._executeAsync(children[0], refOffsetX, refOffsetY);
|
|
11051
|
+
const rawValue = children[0].getValue();
|
|
11052
|
+
const value = this._toLazyIfErrorValue(rawValue);
|
|
11053
|
+
if (value == null || value.isArray()) return false;
|
|
11054
|
+
if (!value.isError()) {
|
|
11055
|
+
node.setValue(value);
|
|
11056
|
+
return true;
|
|
11057
|
+
}
|
|
11058
|
+
await this._executeAsync(children[1], refOffsetX, refOffsetY);
|
|
11059
|
+
node.setValue((_children$1$getValue = children[1].getValue()) !== null && _children$1$getValue !== void 0 ? _children$1$getValue : ErrorValueObject.create("#VALUE!"));
|
|
11060
|
+
return true;
|
|
11061
|
+
}
|
|
11062
|
+
_executeLazyIfError(node, refOffsetX, refOffsetY) {
|
|
11063
|
+
var _children$1$getValue2;
|
|
11064
|
+
const children = node.getChildren();
|
|
11065
|
+
if (children.length !== 2) return false;
|
|
11066
|
+
this._execute(children[0], refOffsetX, refOffsetY);
|
|
11067
|
+
const rawValue = children[0].getValue();
|
|
11068
|
+
const value = this._toLazyIfErrorValue(rawValue);
|
|
11069
|
+
if (value == null || value.isArray()) return false;
|
|
11070
|
+
if (!value.isError()) {
|
|
11071
|
+
node.setValue(value);
|
|
11072
|
+
return true;
|
|
11073
|
+
}
|
|
11074
|
+
this._execute(children[1], refOffsetX, refOffsetY);
|
|
11075
|
+
node.setValue((_children$1$getValue2 = children[1].getValue()) !== null && _children$1$getValue2 !== void 0 ? _children$1$getValue2 : ErrorValueObject.create("#VALUE!"));
|
|
11076
|
+
return true;
|
|
11077
|
+
}
|
|
11078
|
+
_toLazyIfErrorValue(value) {
|
|
11079
|
+
if (value == null) return null;
|
|
11080
|
+
if (!value.isReferenceObject()) {
|
|
11081
|
+
const baseValue = value;
|
|
11082
|
+
return baseValue.isNull() ? NumberValueObject.create(0) : baseValue;
|
|
11083
|
+
}
|
|
11084
|
+
const reference = value;
|
|
11085
|
+
if (reference.getRowCount() !== 1 || reference.getColumnCount() !== 1) return reference.toArrayValueObject();
|
|
11086
|
+
const cellValue = reference.getCellByPosition();
|
|
11087
|
+
return cellValue.isNull() ? NumberValueObject.create(0) : cellValue;
|
|
11088
|
+
}
|
|
11089
|
+
_toLazyIfSelectedValue(value, node) {
|
|
11090
|
+
if (value == null) return ErrorValueObject.create("#VALUE!");
|
|
11091
|
+
if (value.isReferenceObject()) {
|
|
11092
|
+
const reference = value;
|
|
11093
|
+
if (this._preserveLazyIfSelectedReferenceArray(node)) return reference.toArrayValueObject();
|
|
11094
|
+
value = this._implicitLazyIfReferenceValue(reference);
|
|
11095
|
+
}
|
|
11096
|
+
if (value.isArray()) value = this._implicitLazyIfArrayValue(value);
|
|
11097
|
+
if (!value.isArray()) {
|
|
11098
|
+
const baseValue = value;
|
|
11099
|
+
return baseValue.isNull() ? NumberValueObject.create(0) : baseValue;
|
|
11100
|
+
}
|
|
11101
|
+
return value;
|
|
11102
|
+
}
|
|
11103
|
+
_implicitLazyIfReferenceValue(reference) {
|
|
11104
|
+
const range = reference.getRangePosition();
|
|
11105
|
+
const currentRow = this._runtimeService.currentRow || 0;
|
|
11106
|
+
const currentColumn = this._runtimeService.currentColumn || 0;
|
|
11107
|
+
const { startRow, startColumn, endRow, endColumn } = range;
|
|
11108
|
+
if (startRow === endRow && startColumn === endColumn) return reference.getCellByPosition();
|
|
11109
|
+
if (endRow === startRow && currentColumn >= startColumn && currentColumn <= endColumn) return reference.getCellByColumn(currentColumn);
|
|
11110
|
+
if (startColumn === endColumn && currentRow >= startRow && currentRow <= endRow) return reference.getCellByRow(currentRow);
|
|
11111
|
+
return ErrorValueObject.create("#VALUE!");
|
|
11112
|
+
}
|
|
11113
|
+
_preserveLazyIfSelectedReferenceArray(node) {
|
|
11114
|
+
let child = node;
|
|
11115
|
+
let parent = child.getParent();
|
|
11116
|
+
while (parent != null) {
|
|
11117
|
+
if (parent.nodeType === 4) return parent.getToken().toUpperCase() === "MATCH" && parent.getChildren().indexOf(child) === 1;
|
|
11118
|
+
child = parent;
|
|
11119
|
+
parent = parent.getParent();
|
|
11120
|
+
}
|
|
11121
|
+
return false;
|
|
11122
|
+
}
|
|
11123
|
+
_implicitLazyIfArrayValue(array) {
|
|
11124
|
+
if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return array;
|
|
11125
|
+
const startRow = array.getCurrentRow();
|
|
11126
|
+
const startColumn = array.getCurrentColumn();
|
|
11127
|
+
const rowCount = array.getRowCount();
|
|
11128
|
+
const columnCount = array.getColumnCount();
|
|
11129
|
+
const currentRow = this._runtimeService.currentRow || 0;
|
|
11130
|
+
const currentColumn = this._runtimeService.currentColumn || 0;
|
|
11131
|
+
let rowIndex = -1;
|
|
11132
|
+
let columnIndex = -1;
|
|
11133
|
+
if (rowCount === 1 && columnCount === 1) {
|
|
11134
|
+
rowIndex = 0;
|
|
11135
|
+
columnIndex = 0;
|
|
11136
|
+
} else if (rowCount === 1) {
|
|
11137
|
+
rowIndex = 0;
|
|
11138
|
+
columnIndex = currentColumn - startColumn;
|
|
11139
|
+
} else if (columnCount === 1) {
|
|
11140
|
+
rowIndex = currentRow - startRow;
|
|
11141
|
+
columnIndex = 0;
|
|
11142
|
+
} else {
|
|
11143
|
+
rowIndex = currentRow - startRow;
|
|
11144
|
+
columnIndex = currentColumn - startColumn;
|
|
11145
|
+
}
|
|
11146
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
|
|
11147
|
+
return array.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
|
|
11148
|
+
}
|
|
10771
11149
|
};
|
|
10772
11150
|
Interpreter = __decorate([__decorateParam(0, IFormulaRuntimeService)], Interpreter);
|
|
10773
11151
|
|
|
@@ -10986,9 +11364,10 @@ let LambdaNodeFactory = class LambdaNodeFactory extends BaseAstNodeFactory {
|
|
|
10986
11364
|
for (let i = 0; i < parameterArray.length; i++) {
|
|
10987
11365
|
const parameter = parameterArray[i];
|
|
10988
11366
|
if (parameter instanceof LexerNode) {
|
|
10989
|
-
const variant = parameter
|
|
11367
|
+
const variant = getLambdaParameterName(parameter);
|
|
11368
|
+
if (variant == null) return ErrorNode.create("#VALUE!");
|
|
10990
11369
|
parameter.setToken(DEFAULT_TOKEN_TYPE_LAMBDA_OMIT_PARAMETER);
|
|
10991
|
-
currentLambdaPrivacyVar.set(variant
|
|
11370
|
+
currentLambdaPrivacyVar.set(variant, void 0);
|
|
10992
11371
|
} else return ErrorNode.create("#VALUE!");
|
|
10993
11372
|
}
|
|
10994
11373
|
this._runtimeService.registerFunctionDefinitionPrivacyVar(lambdaId, currentLambdaPrivacyVar);
|
|
@@ -11005,6 +11384,20 @@ let LambdaNodeFactory = class LambdaNodeFactory extends BaseAstNodeFactory {
|
|
|
11005
11384
|
}
|
|
11006
11385
|
};
|
|
11007
11386
|
LambdaNodeFactory = __decorate([__decorateParam(0, IFormulaRuntimeService), __decorateParam(1, (0, _univerjs_core.Inject)(Interpreter))], LambdaNodeFactory);
|
|
11387
|
+
function getLambdaParameterName(parameter) {
|
|
11388
|
+
const children = parameter.getChildren();
|
|
11389
|
+
for (let i = 0; i < children.length; i++) {
|
|
11390
|
+
const child = children[i];
|
|
11391
|
+
if (typeof child === "string") {
|
|
11392
|
+
const token = child.trim();
|
|
11393
|
+
if (token.length > 0) return token;
|
|
11394
|
+
} else {
|
|
11395
|
+
const token = getLambdaParameterName(child);
|
|
11396
|
+
if (token != null) return token;
|
|
11397
|
+
}
|
|
11398
|
+
}
|
|
11399
|
+
return null;
|
|
11400
|
+
}
|
|
11008
11401
|
|
|
11009
11402
|
//#endregion
|
|
11010
11403
|
//#region src/engine/ast-node/lambda-parameter-node.ts
|
|
@@ -11115,12 +11508,17 @@ var OperatorNode = class extends BaseAstNode {
|
|
|
11115
11508
|
}
|
|
11116
11509
|
if (object1 == null) object1 = NullValueObject.create();
|
|
11117
11510
|
if (object2 == null) object2 = NullValueObject.create();
|
|
11118
|
-
if (object1.isReferenceObject()) object1 =
|
|
11119
|
-
if (object2.isReferenceObject()) object2 =
|
|
11511
|
+
if (object1.isReferenceObject()) object1 = this._referenceToOperatorValue(object1);
|
|
11512
|
+
if (object2.isReferenceObject()) object2 = this._referenceToOperatorValue(object2);
|
|
11120
11513
|
const result = this._functionExecutor.calculate(object1, object2);
|
|
11121
11514
|
this._setEmbeddedArrayFormulaToResult(result);
|
|
11122
11515
|
this.setValue(result);
|
|
11123
11516
|
}
|
|
11517
|
+
_referenceToOperatorValue(reference) {
|
|
11518
|
+
const array = reference.toArrayValueObject();
|
|
11519
|
+
if (array.getRowCount() === 1 && array.getColumnCount() === 1) return array.get(0, 0);
|
|
11520
|
+
return array;
|
|
11521
|
+
}
|
|
11124
11522
|
/**
|
|
11125
11523
|
* If it contains an array formula, set the current cell to the cache and send itself as a ref outward
|
|
11126
11524
|
*/
|
|
@@ -11424,12 +11822,15 @@ var TableReferenceObject = class extends BaseReferenceObject {
|
|
|
11424
11822
|
}
|
|
11425
11823
|
/** Column title → column index; returns -1 if not found (caller should handle as parse error) */
|
|
11426
11824
|
_titleToIndex(name, titleMap) {
|
|
11427
|
-
var _titleMap$get;
|
|
11428
11825
|
const key = name.trim();
|
|
11429
11826
|
const hit = titleMap.get(key);
|
|
11430
11827
|
if (hit !== void 0) return hit;
|
|
11431
11828
|
const keyNorm = key.replace(/\u3000/g, " ").trim();
|
|
11432
|
-
|
|
11829
|
+
const normalizedHit = titleMap.get(keyNorm);
|
|
11830
|
+
if (normalizedHit !== void 0) return normalizedHit;
|
|
11831
|
+
const lineBreakNorm = keyNorm.replace(/\r\n?/g, "\n");
|
|
11832
|
+
for (const [title, index] of titleMap.entries()) if (title.replace(/\u3000/g, " ").trim().replace(/\r\n?/g, "\n") === lineBreakNorm) return index;
|
|
11833
|
+
return -1;
|
|
11433
11834
|
}
|
|
11434
11835
|
/** Resolve #This Row's row number; takes first data row (tableStartRow+1) when no context available */
|
|
11435
11836
|
_resolveThisRow(tableStartRow, tableEndRow) {
|
|
@@ -11523,7 +11924,7 @@ let ReferenceNodeFactory = class ReferenceNodeFactory extends BaseAstNodeFactory
|
|
|
11523
11924
|
}
|
|
11524
11925
|
}
|
|
11525
11926
|
_getTableMap() {
|
|
11526
|
-
const unitId = this.
|
|
11927
|
+
const unitId = this._formulaRuntimeService.currentUnitId;
|
|
11527
11928
|
if (!unitId) return;
|
|
11528
11929
|
return this._superTableService.getTableMap(unitId);
|
|
11529
11930
|
}
|
|
@@ -11609,7 +12010,7 @@ var SuffixNode = class extends BaseAstNode {
|
|
|
11609
12010
|
const formulaData = this._currentConfigService.getFormulaData();
|
|
11610
12011
|
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;
|
|
11611
12012
|
if (!formulaString) return ErrorValueObject.create("#VALUE!");
|
|
11612
|
-
this._lexer.treeBuilder(formulaString);
|
|
12013
|
+
this._lexer.treeBuilder(formulaString, true, unitId);
|
|
11613
12014
|
return ErrorValueObject.create("#VALUE!");
|
|
11614
12015
|
/** todo */
|
|
11615
12016
|
}
|
|
@@ -11710,13 +12111,19 @@ var ValueNode = class extends BaseAstNode {
|
|
|
11710
12111
|
return 2;
|
|
11711
12112
|
}
|
|
11712
12113
|
execute() {
|
|
12114
|
+
const token = this.getToken();
|
|
12115
|
+
const tokenTrim = token.trim();
|
|
12116
|
+
if (tokenTrim.startsWith("\"") && tokenTrim.endsWith("\"")) {
|
|
12117
|
+
this.setValue(StringValueObject.create(tokenTrim.slice(1, -1).replace(/""/g, "\"")));
|
|
12118
|
+
return;
|
|
12119
|
+
}
|
|
11713
12120
|
const parent = this.getParent();
|
|
11714
12121
|
let isIgnoreNumberPattern = true;
|
|
11715
12122
|
if ((parent === null || parent === void 0 ? void 0 : parent.nodeType) === 4) {
|
|
11716
12123
|
var _isFunctionExecutorAr, _isFunctionExecutorAr2;
|
|
11717
12124
|
isIgnoreNumberPattern = (_isFunctionExecutorAr = (_isFunctionExecutorAr2 = parent.isFunctionExecutorArgumentsIgnoreNumberPattern) === null || _isFunctionExecutorAr2 === void 0 ? void 0 : _isFunctionExecutorAr2.call(parent)) !== null && _isFunctionExecutorAr !== void 0 ? _isFunctionExecutorAr : true;
|
|
11718
12125
|
}
|
|
11719
|
-
this.setValue(ValueObjectFactory.create(
|
|
12126
|
+
this.setValue(ValueObjectFactory.create(token, isIgnoreNumberPattern));
|
|
11720
12127
|
}
|
|
11721
12128
|
};
|
|
11722
12129
|
var ValueNodeFactory = class extends BaseAstNodeFactory {
|
|
@@ -11882,6 +12289,9 @@ let AstTreeBuilder = class AstTreeBuilder extends _univerjs_core.Disposable {
|
|
|
11882
12289
|
astNode = getAstNodeTopParent(astNode);
|
|
11883
12290
|
if (astNode == null || (astNode === null || astNode === void 0 ? void 0 : astNode.nodeType) === 7) return astNode;
|
|
11884
12291
|
switch (astNode.nodeType) {
|
|
12292
|
+
case 8:
|
|
12293
|
+
calculateStack.push(astNode);
|
|
12294
|
+
break;
|
|
11885
12295
|
case 4: {
|
|
11886
12296
|
const token = astNode.getToken().trim().toUpperCase();
|
|
11887
12297
|
if (FORCED_RECALCULATION_FUNCTION_NAME.has(token)) astNode.setForcedCalculateFunction();
|
|
@@ -11933,9 +12343,20 @@ let AstTreeBuilder = class AstTreeBuilder extends _univerjs_core.Disposable {
|
|
|
11933
12343
|
astNode = this._astNodeFactoryList[x].checkAndCreateNodeType(item);
|
|
11934
12344
|
if (astNode != null) break;
|
|
11935
12345
|
}
|
|
11936
|
-
if (astNode == null)
|
|
12346
|
+
if (astNode == null) {
|
|
12347
|
+
const aggregatorNode = this._createGroupByAggregatorTokenNode(item);
|
|
12348
|
+
if (aggregatorNode != null) return aggregatorNode;
|
|
12349
|
+
return new ErrorFunctionNode();
|
|
12350
|
+
}
|
|
11937
12351
|
return astNode;
|
|
11938
12352
|
}
|
|
12353
|
+
_createGroupByAggregatorTokenNode(param) {
|
|
12354
|
+
const token = (typeof param === "string" ? param : param.getToken()).trim().toUpperCase();
|
|
12355
|
+
if (!token.startsWith("_XLETA.")) return null;
|
|
12356
|
+
const name = token.slice(7);
|
|
12357
|
+
if (name !== "SUM" && name !== "COUNT" && name !== "COUNTA" && name !== "PERCENTOF" && name !== "MIN" && name !== "MAX" && name !== "ARRAYTOTEXT") return null;
|
|
12358
|
+
return new BaseAstNode(name);
|
|
12359
|
+
}
|
|
11939
12360
|
_initializeAstNode() {
|
|
11940
12361
|
this._astNodeFactoryList = [
|
|
11941
12362
|
this._astRootNodeFactory,
|
|
@@ -13152,7 +13573,7 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends _unive
|
|
|
13152
13573
|
return this._dependencyTreeCache.get(treeId);
|
|
13153
13574
|
}
|
|
13154
13575
|
_getTreeNode(tree) {
|
|
13155
|
-
return generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService);
|
|
13576
|
+
return generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService, tree.subUnitId);
|
|
13156
13577
|
}
|
|
13157
13578
|
*_traverse(treeList, skippedTreeIds) {
|
|
13158
13579
|
const stack = treeList;
|
|
@@ -13278,12 +13699,12 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends _unive
|
|
|
13278
13699
|
for (let i = 0, len = treeList.length; i < len; i++) {
|
|
13279
13700
|
const tree = treeList[i];
|
|
13280
13701
|
if (!tree.formula) continue;
|
|
13702
|
+
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
13281
13703
|
const node = this._getTreeNode(tree);
|
|
13282
13704
|
tree.isDirty = this._includeTree(tree, node);
|
|
13283
13705
|
const addressFunctionNodes = this._getAddressFunctionNodeList(node);
|
|
13284
13706
|
if (addressFunctionNodes.length > 0) tree.addressFunctionNodes = addressFunctionNodes;
|
|
13285
13707
|
if (tree.isVirtual) continue;
|
|
13286
|
-
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
13287
13708
|
const rangeList = await this._getRangeListByNode({
|
|
13288
13709
|
node,
|
|
13289
13710
|
refOffsetX: tree.refOffsetX,
|
|
@@ -13488,13 +13909,13 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends _unive
|
|
|
13488
13909
|
async _calculateAddressFunctionRuntimeData(treeDependencyCache, preCalculateTreeList) {
|
|
13489
13910
|
while (preCalculateTreeList.length > 0) {
|
|
13490
13911
|
const tree = preCalculateTreeList.pop();
|
|
13912
|
+
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
13491
13913
|
const nodeData = {
|
|
13492
13914
|
node: this._getTreeNode(tree),
|
|
13493
13915
|
refOffsetX: tree.refOffsetX,
|
|
13494
13916
|
refOffsetY: tree.refOffsetY
|
|
13495
13917
|
};
|
|
13496
13918
|
await this._calculateAddressFunction(treeDependencyCache, tree);
|
|
13497
|
-
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
13498
13919
|
let value;
|
|
13499
13920
|
if (this._interpreter.checkAsyncNode(nodeData.node)) value = await this._interpreter.executeAsync(nodeData);
|
|
13500
13921
|
else value = this._interpreter.execute(nodeData);
|
|
@@ -13921,7 +14342,8 @@ let CalculateFormulaService = class CalculateFormulaService extends _univerjs_co
|
|
|
13921
14342
|
const treeCount = treeList.length;
|
|
13922
14343
|
while (treeList.length > 0) {
|
|
13923
14344
|
const tree = treeList.pop();
|
|
13924
|
-
|
|
14345
|
+
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
14346
|
+
const node = generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService, tree.subUnitId);
|
|
13925
14347
|
const nodeData = {
|
|
13926
14348
|
node,
|
|
13927
14349
|
refOffsetX: tree.refOffsetX,
|
|
@@ -13951,7 +14373,6 @@ let CalculateFormulaService = class CalculateFormulaService extends _univerjs_co
|
|
|
13951
14373
|
return;
|
|
13952
14374
|
}
|
|
13953
14375
|
}
|
|
13954
|
-
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
13955
14376
|
let value;
|
|
13956
14377
|
if (getDirtyData != null && tree.featureId != null) {
|
|
13957
14378
|
/**
|
|
@@ -14044,8 +14465,9 @@ let CalculateFormulaService = class CalculateFormulaService extends _univerjs_co
|
|
|
14044
14465
|
}
|
|
14045
14466
|
return result;
|
|
14046
14467
|
}
|
|
14047
|
-
async calculate(formulaString) {
|
|
14048
|
-
const
|
|
14468
|
+
async calculate(formulaString, transformSuffix = true, unitId) {
|
|
14469
|
+
const executeUnitId = unitId || this._runtimeService.currentUnitId || this._currentConfigService.getExecuteUnitId();
|
|
14470
|
+
const lexerNode = this._lexer.treeBuilder(formulaString, transformSuffix, executeUnitId);
|
|
14049
14471
|
if (Object.values(ErrorType).includes(lexerNode)) return;
|
|
14050
14472
|
const astNode = this._astTreeBuilder.parse(lexerNode);
|
|
14051
14473
|
const interpreter = this._interpreter;
|
|
@@ -14233,6 +14655,86 @@ CalculateController = __decorate([
|
|
|
14233
14655
|
__decorateParam(2, (0, _univerjs_core.Inject)(FormulaDataModel))
|
|
14234
14656
|
], CalculateController);
|
|
14235
14657
|
|
|
14658
|
+
//#endregion
|
|
14659
|
+
//#region src/services/active-dirty-manager.service.ts
|
|
14660
|
+
/**
|
|
14661
|
+
* Actively mark as dirty, calculate the dirty area based on the command,
|
|
14662
|
+
* and plugins can register the ref range they affect into the formula engine.
|
|
14663
|
+
*/
|
|
14664
|
+
var ActiveDirtyManagerService = class extends _univerjs_core.Disposable {
|
|
14665
|
+
constructor(..._args) {
|
|
14666
|
+
super(..._args);
|
|
14667
|
+
_defineProperty(this, "_dirtyConversionMap", /* @__PURE__ */ new Map());
|
|
14668
|
+
}
|
|
14669
|
+
dispose() {
|
|
14670
|
+
this._dirtyConversionMap.clear();
|
|
14671
|
+
}
|
|
14672
|
+
remove(commandId) {
|
|
14673
|
+
this._dirtyConversionMap.delete(commandId);
|
|
14674
|
+
}
|
|
14675
|
+
get(commandId) {
|
|
14676
|
+
return this._dirtyConversionMap.get(commandId);
|
|
14677
|
+
}
|
|
14678
|
+
has(commandId) {
|
|
14679
|
+
return this._dirtyConversionMap.has(commandId);
|
|
14680
|
+
}
|
|
14681
|
+
register(commandId, dirtyConversion) {
|
|
14682
|
+
this._dirtyConversionMap.set(commandId, dirtyConversion);
|
|
14683
|
+
}
|
|
14684
|
+
getDirtyConversionMap() {
|
|
14685
|
+
return this._dirtyConversionMap;
|
|
14686
|
+
}
|
|
14687
|
+
};
|
|
14688
|
+
const IActiveDirtyManagerService = (0, _univerjs_core.createIdentifier)("univer.formula.active-dirty-manager.service");
|
|
14689
|
+
|
|
14690
|
+
//#endregion
|
|
14691
|
+
//#region src/controllers/super-table-active-dirty.controller.ts
|
|
14692
|
+
let SuperTableActiveDirtyController = class SuperTableActiveDirtyController extends _univerjs_core.Disposable {
|
|
14693
|
+
constructor(_activeDirtyManagerService) {
|
|
14694
|
+
super();
|
|
14695
|
+
this._activeDirtyManagerService = _activeDirtyManagerService;
|
|
14696
|
+
this._initialize();
|
|
14697
|
+
}
|
|
14698
|
+
_initialize() {
|
|
14699
|
+
this._activeDirtyManagerService.register(SetSuperTableMutation.id, {
|
|
14700
|
+
commandId: SetSuperTableMutation.id,
|
|
14701
|
+
getDirtyData: (command) => {
|
|
14702
|
+
const params = command.params;
|
|
14703
|
+
const tableNames = [params.tableName, params.oldTableName].filter((name) => Boolean(name));
|
|
14704
|
+
return {
|
|
14705
|
+
dirtyRanges: [{
|
|
14706
|
+
unitId: params.unitId,
|
|
14707
|
+
sheetId: params.reference.sheetId,
|
|
14708
|
+
range: params.reference.range
|
|
14709
|
+
}],
|
|
14710
|
+
dirtySuperTableMap: { [params.unitId]: Object.fromEntries(tableNames.map((name) => [name, "1"])) },
|
|
14711
|
+
clearDependencyTreeCache: { [params.unitId]: { [params.reference.sheetId]: "1" } }
|
|
14712
|
+
};
|
|
14713
|
+
}
|
|
14714
|
+
});
|
|
14715
|
+
this._activeDirtyManagerService.register(RemoveSuperTableMutation.id, {
|
|
14716
|
+
commandId: RemoveSuperTableMutation.id,
|
|
14717
|
+
getDirtyData: (command) => {
|
|
14718
|
+
const params = command.params;
|
|
14719
|
+
return {
|
|
14720
|
+
dirtyRanges: params.reference ? [{
|
|
14721
|
+
unitId: params.unitId,
|
|
14722
|
+
sheetId: params.reference.sheetId,
|
|
14723
|
+
range: params.reference.range
|
|
14724
|
+
}] : void 0,
|
|
14725
|
+
dirtySuperTableMap: { [params.unitId]: { [params.tableName]: "1" } },
|
|
14726
|
+
clearDependencyTreeCache: params.reference ? { [params.unitId]: { [params.reference.sheetId]: "1" } } : void 0
|
|
14727
|
+
};
|
|
14728
|
+
}
|
|
14729
|
+
});
|
|
14730
|
+
this.disposeWithMe((0, _univerjs_core.toDisposable)(() => {
|
|
14731
|
+
this._activeDirtyManagerService.remove(SetSuperTableMutation.id);
|
|
14732
|
+
this._activeDirtyManagerService.remove(RemoveSuperTableMutation.id);
|
|
14733
|
+
}));
|
|
14734
|
+
}
|
|
14735
|
+
};
|
|
14736
|
+
SuperTableActiveDirtyController = __decorate([__decorateParam(0, IActiveDirtyManagerService)], SuperTableActiveDirtyController);
|
|
14737
|
+
|
|
14236
14738
|
//#endregion
|
|
14237
14739
|
//#region src/engine/utils/r1c1-reference.ts
|
|
14238
14740
|
const $relativeRegex = /[\[\]]/g;
|
|
@@ -14404,6 +14906,8 @@ var BaseFunction = class {
|
|
|
14404
14906
|
_defineProperty(this, "_subUnitId", void 0);
|
|
14405
14907
|
_defineProperty(this, "_row", -1);
|
|
14406
14908
|
_defineProperty(this, "_column", -1);
|
|
14909
|
+
_defineProperty(this, "_currentFormulaRowCount", 1);
|
|
14910
|
+
_defineProperty(this, "_currentFormulaColumnCount", 1);
|
|
14407
14911
|
_defineProperty(this, "_definedNames", void 0);
|
|
14408
14912
|
_defineProperty(this, "_locale", void 0);
|
|
14409
14913
|
_defineProperty(this, "_sheetOrder", void 0);
|
|
@@ -14467,6 +14971,23 @@ var BaseFunction = class {
|
|
|
14467
14971
|
"needsFilteredOutRows",
|
|
14468
14972
|
false
|
|
14469
14973
|
);
|
|
14974
|
+
_defineProperty(
|
|
14975
|
+
this,
|
|
14976
|
+
/**
|
|
14977
|
+
* Whether the function needs unevaluated AST children.
|
|
14978
|
+
*/
|
|
14979
|
+
"needsAstChildren",
|
|
14980
|
+
false
|
|
14981
|
+
);
|
|
14982
|
+
_defineProperty(
|
|
14983
|
+
this,
|
|
14984
|
+
/**
|
|
14985
|
+
* Legacy CSE-style array functions should write only the first result cell
|
|
14986
|
+
* when they are used as a top-level normal formula.
|
|
14987
|
+
*/
|
|
14988
|
+
"returnsLegacyArrayAsScalar",
|
|
14989
|
+
false
|
|
14990
|
+
);
|
|
14470
14991
|
_defineProperty(
|
|
14471
14992
|
this,
|
|
14472
14993
|
/**
|
|
@@ -14499,6 +15020,12 @@ var BaseFunction = class {
|
|
|
14499
15020
|
get column() {
|
|
14500
15021
|
return this._column;
|
|
14501
15022
|
}
|
|
15023
|
+
get currentFormulaRowCount() {
|
|
15024
|
+
return this._currentFormulaRowCount;
|
|
15025
|
+
}
|
|
15026
|
+
get currentFormulaColumnCount() {
|
|
15027
|
+
return this._currentFormulaColumnCount;
|
|
15028
|
+
}
|
|
14502
15029
|
dispose() {}
|
|
14503
15030
|
/**
|
|
14504
15031
|
* In Excel, to inject a defined name into a function that has positioning capabilities,
|
|
@@ -14509,8 +15036,9 @@ var BaseFunction = class {
|
|
|
14509
15036
|
getDefinedName(name) {
|
|
14510
15037
|
const nameMap = this._definedNames;
|
|
14511
15038
|
if (nameMap == null) return null;
|
|
15039
|
+
const normalizedName = name.toLowerCase();
|
|
14512
15040
|
return Object.values(nameMap).find((value) => {
|
|
14513
|
-
return value.name ===
|
|
15041
|
+
return value.name.toLowerCase() === normalizedName;
|
|
14514
15042
|
});
|
|
14515
15043
|
}
|
|
14516
15044
|
setDefinedNames(definedNames) {
|
|
@@ -14551,11 +15079,13 @@ var BaseFunction = class {
|
|
|
14551
15079
|
isArgumentsIgnoreNumberPattern() {
|
|
14552
15080
|
return false;
|
|
14553
15081
|
}
|
|
14554
|
-
setRefInfo(unitId, subUnitId, row, column) {
|
|
15082
|
+
setRefInfo(unitId, subUnitId, row, column, rowCount = 1, columnCount = 1) {
|
|
14555
15083
|
this._unitId = unitId;
|
|
14556
15084
|
this._subUnitId = subUnitId;
|
|
14557
15085
|
this._row = row;
|
|
14558
15086
|
this._column = column;
|
|
15087
|
+
this._currentFormulaRowCount = rowCount;
|
|
15088
|
+
this._currentFormulaColumnCount = columnCount;
|
|
14559
15089
|
}
|
|
14560
15090
|
calculateCustom(...arg) {
|
|
14561
15091
|
return null;
|
|
@@ -14563,6 +15093,9 @@ var BaseFunction = class {
|
|
|
14563
15093
|
calculate(...arg) {
|
|
14564
15094
|
return ErrorValueObject.create("#VALUE!");
|
|
14565
15095
|
}
|
|
15096
|
+
calculateAst(_children, _getVariant) {
|
|
15097
|
+
return ErrorValueObject.create("#VALUE!");
|
|
15098
|
+
}
|
|
14566
15099
|
checkArrayType(variant) {
|
|
14567
15100
|
return variant.isReferenceObject() || variant.isValueObject() && variant.isArray();
|
|
14568
15101
|
}
|
|
@@ -16660,7 +17193,12 @@ function getArrayValuesByAggregateIgnoreOptions(array, options, formulaDataModel
|
|
|
16660
17193
|
if (ignoreErrorValues) continue;
|
|
16661
17194
|
return valueObject;
|
|
16662
17195
|
}
|
|
16663
|
-
if (!valueObject || valueObject.isNull() || valueObject.
|
|
17196
|
+
if (!valueObject || valueObject.isNull() || valueObject.isString()) continue;
|
|
17197
|
+
if (!array.isArray() && valueObject.isBoolean()) {
|
|
17198
|
+
values.push(valueObject.getValue() ? 1 : 0);
|
|
17199
|
+
continue;
|
|
17200
|
+
}
|
|
17201
|
+
if (valueObject.isBoolean()) continue;
|
|
16664
17202
|
const value = valueObject.getValue();
|
|
16665
17203
|
if (!(0, _univerjs_core.isRealNum)(value)) continue;
|
|
16666
17204
|
values.push(+value);
|
|
@@ -18388,6 +18926,11 @@ var Normsdist = class extends BaseFunction {
|
|
|
18388
18926
|
|
|
18389
18927
|
//#endregion
|
|
18390
18928
|
//#region src/functions/compatibility/rank/index.ts
|
|
18929
|
+
function isSameRankNumber$2(left, right) {
|
|
18930
|
+
if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
|
|
18931
|
+
const scale = Math.max(1, Math.abs(left), Math.abs(right));
|
|
18932
|
+
return Math.abs(left - right) <= Number.EPSILON * scale * 2;
|
|
18933
|
+
}
|
|
18391
18934
|
var Rank = class extends BaseFunction {
|
|
18392
18935
|
constructor(..._args) {
|
|
18393
18936
|
super(..._args);
|
|
@@ -18413,7 +18956,7 @@ var Rank = class extends BaseFunction {
|
|
|
18413
18956
|
const numberValue = +numberObject.getValue();
|
|
18414
18957
|
const orderValue = +orderObject.getValue();
|
|
18415
18958
|
if (Number.isNaN(numberValue) || Number.isNaN(orderValue)) return ErrorValueObject.create("#VALUE!");
|
|
18416
|
-
const result = refNumbers.sort((a, b) => !orderValue ? b - a : a - b).
|
|
18959
|
+
const result = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b).findIndex((refNumber) => isSameRankNumber$2(refNumber, numberValue));
|
|
18417
18960
|
if (result === -1) return ErrorValueObject.create("#N/A");
|
|
18418
18961
|
return NumberValueObject.create(result + 1);
|
|
18419
18962
|
});
|
|
@@ -18424,12 +18967,12 @@ var Rank = class extends BaseFunction {
|
|
|
18424
18967
|
let refHasError = false;
|
|
18425
18968
|
let refErrorObject = ErrorValueObject.create("#N/A");
|
|
18426
18969
|
const refNumbers = [];
|
|
18427
|
-
if (!ref.isReferenceObject()) return {
|
|
18970
|
+
if (!ref.isReferenceObject() && !ref.isArray()) return {
|
|
18428
18971
|
refHasError: true,
|
|
18429
18972
|
refErrorObject,
|
|
18430
18973
|
refNumbers
|
|
18431
18974
|
};
|
|
18432
|
-
ref.toArrayValueObject().iterator((refObject) => {
|
|
18975
|
+
(ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
|
|
18433
18976
|
const _refObject = refObject;
|
|
18434
18977
|
if (_refObject.isError()) {
|
|
18435
18978
|
refHasError = true;
|
|
@@ -19495,7 +20038,8 @@ var Edate = class extends BaseFunction {
|
|
|
19495
20038
|
const year = _startDate.getUTCFullYear();
|
|
19496
20039
|
const month = _startDate.getUTCMonth() + monthsValue;
|
|
19497
20040
|
const day = _startDate.getUTCDate();
|
|
19498
|
-
const
|
|
20041
|
+
const lastDayOfTargetMonth = new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
|
|
20042
|
+
const currentSerial = excelDateSerial(new Date(Date.UTC(year, month, Math.min(day, lastDayOfTargetMonth))));
|
|
19499
20043
|
return NumberValueObject.create(currentSerial, DEFAULT_DATE_FORMAT);
|
|
19500
20044
|
});
|
|
19501
20045
|
}
|
|
@@ -19779,8 +20323,12 @@ var Networkdays = class extends BaseFunction {
|
|
|
19779
20323
|
for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
|
|
19780
20324
|
const cell = holidays.get(r, c);
|
|
19781
20325
|
if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
|
|
20326
|
+
if (cell.isNull()) continue;
|
|
19782
20327
|
const holidaySerialNumber = getDateSerialNumberByObject(cell);
|
|
19783
|
-
if (typeof holidaySerialNumber !== "number")
|
|
20328
|
+
if (typeof holidaySerialNumber !== "number") {
|
|
20329
|
+
if (cell.isString()) continue;
|
|
20330
|
+
return holidaySerialNumber;
|
|
20331
|
+
}
|
|
19784
20332
|
holidaysValueArray.push(holidaySerialNumber);
|
|
19785
20333
|
}
|
|
19786
20334
|
} else {
|
|
@@ -19851,8 +20399,12 @@ var NetworkdaysIntl = class extends BaseFunction {
|
|
|
19851
20399
|
for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
|
|
19852
20400
|
const cell = holidays.get(r, c);
|
|
19853
20401
|
if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
|
|
20402
|
+
if (cell.isNull()) continue;
|
|
19854
20403
|
const holidaySerialNumber = getDateSerialNumberByObject(cell);
|
|
19855
|
-
if (typeof holidaySerialNumber !== "number")
|
|
20404
|
+
if (typeof holidaySerialNumber !== "number") {
|
|
20405
|
+
if (cell.isString()) continue;
|
|
20406
|
+
return holidaySerialNumber;
|
|
20407
|
+
}
|
|
19856
20408
|
holidaysValueArray.push(holidaySerialNumber);
|
|
19857
20409
|
}
|
|
19858
20410
|
} else {
|
|
@@ -20305,8 +20857,12 @@ var Workday = class extends BaseFunction {
|
|
|
20305
20857
|
for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
|
|
20306
20858
|
const cell = holidays.get(r, c);
|
|
20307
20859
|
if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
|
|
20860
|
+
if (cell.isNull()) continue;
|
|
20308
20861
|
const holidaySerialNumber = getDateSerialNumberByObject(cell);
|
|
20309
|
-
if (typeof holidaySerialNumber !== "number")
|
|
20862
|
+
if (typeof holidaySerialNumber !== "number") {
|
|
20863
|
+
if (cell.isString()) continue;
|
|
20864
|
+
return holidaySerialNumber;
|
|
20865
|
+
}
|
|
20310
20866
|
holidaysValueArray.push(holidaySerialNumber);
|
|
20311
20867
|
}
|
|
20312
20868
|
} else {
|
|
@@ -20376,8 +20932,12 @@ var WorkdayIntl = class extends BaseFunction {
|
|
|
20376
20932
|
for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
|
|
20377
20933
|
const cell = holidays.get(r, c);
|
|
20378
20934
|
if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
|
|
20935
|
+
if (cell.isNull()) continue;
|
|
20379
20936
|
const holidaySerialNumber = getDateSerialNumberByObject(cell);
|
|
20380
|
-
if (typeof holidaySerialNumber !== "number")
|
|
20937
|
+
if (typeof holidaySerialNumber !== "number") {
|
|
20938
|
+
if (cell.isString()) continue;
|
|
20939
|
+
return holidaySerialNumber;
|
|
20940
|
+
}
|
|
20381
20941
|
holidaysValueArray.push(holidaySerialNumber);
|
|
20382
20942
|
}
|
|
20383
20943
|
} else {
|
|
@@ -27840,6 +28400,232 @@ var False = class extends BaseFunction {
|
|
|
27840
28400
|
}
|
|
27841
28401
|
};
|
|
27842
28402
|
|
|
28403
|
+
//#endregion
|
|
28404
|
+
//#region src/functions/logical/groupby/index.ts
|
|
28405
|
+
var Groupby = class extends BaseFunction {
|
|
28406
|
+
constructor(..._args) {
|
|
28407
|
+
super(..._args);
|
|
28408
|
+
_defineProperty(this, "minParams", 3);
|
|
28409
|
+
_defineProperty(this, "maxParams", 7);
|
|
28410
|
+
_defineProperty(this, "needsReferenceObject", true);
|
|
28411
|
+
_defineProperty(this, "needsAstChildren", true);
|
|
28412
|
+
}
|
|
28413
|
+
calculateAst(children, getVariant) {
|
|
28414
|
+
const rowFields = this._arrayInput(getVariant(children[0]));
|
|
28415
|
+
if (rowFields instanceof ErrorValueObject) return rowFields;
|
|
28416
|
+
const values = this._arrayInput(getVariant(children[1]));
|
|
28417
|
+
if (values instanceof ErrorValueObject) return values;
|
|
28418
|
+
const aggregators = this._aggregators(children[2]);
|
|
28419
|
+
if (aggregators.length === 0) return ErrorValueObject.create("#VALUE!");
|
|
28420
|
+
if (values.rowCount !== rowFields.rowCount) return ErrorValueObject.create("#VALUE!");
|
|
28421
|
+
const includeTotal = children[4] == null ? true : this._numberValue(getVariant(children[4])) !== 0;
|
|
28422
|
+
const sortColumnValue = children[5] == null ? 0 : this._numberValue(getVariant(children[5]));
|
|
28423
|
+
const sortColumn = sortColumnValue === 0 ? void 0 : Math.trunc(sortColumnValue);
|
|
28424
|
+
const filter = children[6] == null ? void 0 : this._arrayInput(getVariant(children[6]));
|
|
28425
|
+
if (filter instanceof ErrorValueObject) return filter;
|
|
28426
|
+
const groupColumnCount = rowFields.columnCount;
|
|
28427
|
+
const valueColumnCount = values.columnCount;
|
|
28428
|
+
const outputValueColumnCount = this._outputValueColumnCount(valueColumnCount, aggregators.length);
|
|
28429
|
+
const groups = [];
|
|
28430
|
+
const allValues = Array.from({ length: valueColumnCount }, () => []);
|
|
28431
|
+
for (let row = 0; row < rowFields.rowCount; row++) {
|
|
28432
|
+
if (filter != null && !this._truthy(filter.valueAt(row, 0))) continue;
|
|
28433
|
+
const key = [];
|
|
28434
|
+
for (let column = 0; column < groupColumnCount; column++) key.push(rowFields.valueAt(row, column));
|
|
28435
|
+
let group = groups.find((item) => this._keysEqual(item.key, key));
|
|
28436
|
+
if (group == null) {
|
|
28437
|
+
group = {
|
|
28438
|
+
key,
|
|
28439
|
+
values: Array.from({ length: valueColumnCount }, () => [])
|
|
28440
|
+
};
|
|
28441
|
+
groups.push(group);
|
|
28442
|
+
}
|
|
28443
|
+
for (let column = 0; column < valueColumnCount; column++) {
|
|
28444
|
+
const value = values.valueAt(row, column);
|
|
28445
|
+
group.values[column].push(value);
|
|
28446
|
+
allValues[column].push(value);
|
|
28447
|
+
}
|
|
28448
|
+
}
|
|
28449
|
+
this._sortGroups(groups, sortColumn);
|
|
28450
|
+
const includeHeader = aggregators.length > 1;
|
|
28451
|
+
const rowCount = groups.length + (includeHeader ? 1 : 0) + (includeTotal ? 1 : 0);
|
|
28452
|
+
const columnCount = groupColumnCount + outputValueColumnCount;
|
|
28453
|
+
const result = [];
|
|
28454
|
+
if (includeHeader) {
|
|
28455
|
+
const header = [];
|
|
28456
|
+
for (let column = 0; column < groupColumnCount; column++) header.push(StringValueObject.create(""));
|
|
28457
|
+
for (let column = 0; column < outputValueColumnCount; column++) header.push(StringValueObject.create(this._aggregatorHeader(this._aggregatorForOutput(aggregators, valueColumnCount, column))));
|
|
28458
|
+
result.push(header);
|
|
28459
|
+
}
|
|
28460
|
+
for (const group of groups) {
|
|
28461
|
+
const row = [...group.key];
|
|
28462
|
+
for (let column = 0; column < outputValueColumnCount; column++) {
|
|
28463
|
+
const valueColumn = this._valueColumnForOutput(valueColumnCount, aggregators.length, column);
|
|
28464
|
+
const aggregator = this._aggregatorForOutput(aggregators, valueColumnCount, column);
|
|
28465
|
+
row.push(this._applyAggregator(aggregator, group.values[valueColumn], allValues[valueColumn]));
|
|
28466
|
+
}
|
|
28467
|
+
result.push(row);
|
|
28468
|
+
}
|
|
28469
|
+
if (includeTotal) {
|
|
28470
|
+
const row = [];
|
|
28471
|
+
for (let column = 0; column < groupColumnCount; column++) row.push(StringValueObject.create(column === 0 ? "Total" : ""));
|
|
28472
|
+
for (let column = 0; column < outputValueColumnCount; column++) {
|
|
28473
|
+
const valueColumn = this._valueColumnForOutput(valueColumnCount, aggregators.length, column);
|
|
28474
|
+
const aggregator = this._aggregatorForOutput(aggregators, valueColumnCount, column);
|
|
28475
|
+
row.push(this._applyAggregator(aggregator, allValues[valueColumn], allValues[valueColumn]));
|
|
28476
|
+
}
|
|
28477
|
+
result.push(row);
|
|
28478
|
+
}
|
|
28479
|
+
return ArrayValueObject.create({
|
|
28480
|
+
calculateValueList: result,
|
|
28481
|
+
rowCount,
|
|
28482
|
+
columnCount,
|
|
28483
|
+
unitId: this.unitId,
|
|
28484
|
+
sheetId: this.subUnitId,
|
|
28485
|
+
row: this.row,
|
|
28486
|
+
column: this.column
|
|
28487
|
+
});
|
|
28488
|
+
}
|
|
28489
|
+
_arrayInput(variant) {
|
|
28490
|
+
if (variant == null) return ErrorValueObject.create("#VALUE!");
|
|
28491
|
+
let value = variant;
|
|
28492
|
+
if (value.isReferenceObject()) value = value.toArrayValueObject();
|
|
28493
|
+
if (value.isError()) return value;
|
|
28494
|
+
if (value.isArray()) {
|
|
28495
|
+
const array = value;
|
|
28496
|
+
return {
|
|
28497
|
+
rowCount: array.getRowCount(),
|
|
28498
|
+
columnCount: array.getColumnCount(),
|
|
28499
|
+
valueAt: (row, column) => {
|
|
28500
|
+
var _array$get;
|
|
28501
|
+
return (_array$get = array.get(row, column)) !== null && _array$get !== void 0 ? _array$get : NullValueObject.create();
|
|
28502
|
+
}
|
|
28503
|
+
};
|
|
28504
|
+
}
|
|
28505
|
+
return {
|
|
28506
|
+
rowCount: 1,
|
|
28507
|
+
columnCount: 1,
|
|
28508
|
+
valueAt: (row, column) => row === 0 && column === 0 ? value : NullValueObject.create()
|
|
28509
|
+
};
|
|
28510
|
+
}
|
|
28511
|
+
_aggregators(node) {
|
|
28512
|
+
const name = this._normalizedFunctionName(node.getToken());
|
|
28513
|
+
if (name === "GROUPBY") return [];
|
|
28514
|
+
if (name === "HSTACK") return node.getChildren().flatMap((child) => this._aggregators(child));
|
|
28515
|
+
if (this._isAggregatorName(name)) return [name];
|
|
28516
|
+
return [];
|
|
28517
|
+
}
|
|
28518
|
+
_normalizedFunctionName(token) {
|
|
28519
|
+
let normalized = token.toUpperCase();
|
|
28520
|
+
for (;;) {
|
|
28521
|
+
const prefix = [
|
|
28522
|
+
"_XLFN.",
|
|
28523
|
+
"_XLWS.",
|
|
28524
|
+
"_XLETA."
|
|
28525
|
+
].find((item) => normalized.startsWith(item));
|
|
28526
|
+
if (prefix == null) return normalized;
|
|
28527
|
+
normalized = normalized.slice(prefix.length);
|
|
28528
|
+
}
|
|
28529
|
+
}
|
|
28530
|
+
_isAggregatorName(name) {
|
|
28531
|
+
return name === "SUM" || name === "COUNT" || name === "COUNTA" || name === "PERCENTOF" || name === "MIN" || name === "MAX" || name === "ARRAYTOTEXT";
|
|
28532
|
+
}
|
|
28533
|
+
_outputValueColumnCount(valueColumnCount, aggregatorCount) {
|
|
28534
|
+
if (valueColumnCount === 1) return aggregatorCount;
|
|
28535
|
+
if (aggregatorCount === 1 || valueColumnCount === aggregatorCount) return valueColumnCount;
|
|
28536
|
+
return Math.min(valueColumnCount, aggregatorCount);
|
|
28537
|
+
}
|
|
28538
|
+
_valueColumnForOutput(valueColumnCount, aggregatorCount, outputColumn) {
|
|
28539
|
+
if (valueColumnCount === 1) return 0;
|
|
28540
|
+
if (aggregatorCount === 1 || valueColumnCount === aggregatorCount) return Math.min(outputColumn, valueColumnCount - 1);
|
|
28541
|
+
return Math.min(outputColumn, valueColumnCount - 1);
|
|
28542
|
+
}
|
|
28543
|
+
_aggregatorForOutput(aggregators, valueColumnCount, outputColumn) {
|
|
28544
|
+
if (aggregators.length === 1 || valueColumnCount === aggregators.length) return aggregators[Math.min(outputColumn, aggregators.length - 1)];
|
|
28545
|
+
return aggregators[Math.min(outputColumn, aggregators.length - 1)];
|
|
28546
|
+
}
|
|
28547
|
+
_aggregatorHeader(aggregator) {
|
|
28548
|
+
return aggregator === "PERCENTOF" ? "%" : aggregator;
|
|
28549
|
+
}
|
|
28550
|
+
_applyAggregator(aggregator, groupValues, allValues) {
|
|
28551
|
+
switch (aggregator) {
|
|
28552
|
+
case "SUM": return NumberValueObject.create(this._sum(groupValues));
|
|
28553
|
+
case "COUNT": return NumberValueObject.create(groupValues.filter((value) => value.isNumber()).length);
|
|
28554
|
+
case "COUNTA": return NumberValueObject.create(groupValues.filter((value) => !value.isNull() && !(value.isString() && value.getValue() === "")).length);
|
|
28555
|
+
case "PERCENTOF": {
|
|
28556
|
+
const allTotal = this._sum(allValues);
|
|
28557
|
+
if (allTotal === 0) return ErrorValueObject.create("#DIV/0!");
|
|
28558
|
+
return NumberValueObject.create(this._sum(groupValues) / allTotal);
|
|
28559
|
+
}
|
|
28560
|
+
case "MIN": {
|
|
28561
|
+
const values = groupValues.map((value) => this._numericValue(value)).filter((value) => value != null);
|
|
28562
|
+
return NumberValueObject.create(values.length === 0 ? 0 : Math.min(...values));
|
|
28563
|
+
}
|
|
28564
|
+
case "MAX": {
|
|
28565
|
+
const values = groupValues.map((value) => this._numericValue(value)).filter((value) => value != null);
|
|
28566
|
+
return NumberValueObject.create(values.length === 0 ? 0 : Math.max(...values));
|
|
28567
|
+
}
|
|
28568
|
+
case "ARRAYTOTEXT": return StringValueObject.create(groupValues.map((value) => this._textValue(value)).filter(Boolean).join(", "));
|
|
28569
|
+
}
|
|
28570
|
+
}
|
|
28571
|
+
_sum(values) {
|
|
28572
|
+
return values.reduce((sum, value) => {
|
|
28573
|
+
var _this$_numericValue;
|
|
28574
|
+
return sum + ((_this$_numericValue = this._numericValue(value)) !== null && _this$_numericValue !== void 0 ? _this$_numericValue : 0);
|
|
28575
|
+
}, 0);
|
|
28576
|
+
}
|
|
28577
|
+
_numericValue(value) {
|
|
28578
|
+
return value.isNumber() ? Number(value.getValue()) : void 0;
|
|
28579
|
+
}
|
|
28580
|
+
_numberValue(variant) {
|
|
28581
|
+
if (variant == null || variant.isError()) return 0;
|
|
28582
|
+
if (variant.isReferenceObject()) variant = variant.getFirstCell();
|
|
28583
|
+
if (variant.isArray()) {
|
|
28584
|
+
var _get;
|
|
28585
|
+
variant = (_get = variant.get(0, 0)) !== null && _get !== void 0 ? _get : NullValueObject.create();
|
|
28586
|
+
}
|
|
28587
|
+
const value = variant.getValue();
|
|
28588
|
+
return typeof value === "number" ? Math.trunc(value) : Math.trunc(Number(value) || 0);
|
|
28589
|
+
}
|
|
28590
|
+
_truthy(value) {
|
|
28591
|
+
if (value.isError() || value.isNull()) return false;
|
|
28592
|
+
return Boolean(value.getValue());
|
|
28593
|
+
}
|
|
28594
|
+
_keysEqual(left, right) {
|
|
28595
|
+
return left.length === right.length && left.every((value, index) => this._keyValue(value) === this._keyValue(right[index]));
|
|
28596
|
+
}
|
|
28597
|
+
_keyValue(value) {
|
|
28598
|
+
if (value.isError()) return `error:${value.getErrorType()}`;
|
|
28599
|
+
if (value.isNull()) return "null:";
|
|
28600
|
+
return `${typeof value.getValue()}:${String(value.getValue())}`;
|
|
28601
|
+
}
|
|
28602
|
+
_sortGroups(groups, sortColumn) {
|
|
28603
|
+
const descending = sortColumn != null && sortColumn < 0;
|
|
28604
|
+
const sortIndex = sortColumn == null ? void 0 : Math.abs(sortColumn) - 1;
|
|
28605
|
+
groups.sort((left, right) => {
|
|
28606
|
+
const compare = sortIndex != null && sortIndex < left.key.length ? this._compareValue(left.key[sortIndex], right.key[sortIndex]) : this._compareKey(left.key, right.key);
|
|
28607
|
+
return descending ? -compare : compare;
|
|
28608
|
+
});
|
|
28609
|
+
}
|
|
28610
|
+
_compareKey(left, right) {
|
|
28611
|
+
for (let index = 0; index < Math.min(left.length, right.length); index++) {
|
|
28612
|
+
const compare = this._compareValue(left[index], right[index]);
|
|
28613
|
+
if (compare !== 0) return compare;
|
|
28614
|
+
}
|
|
28615
|
+
return left.length - right.length;
|
|
28616
|
+
}
|
|
28617
|
+
_compareValue(left, right) {
|
|
28618
|
+
const leftNumber = this._numericValue(left);
|
|
28619
|
+
const rightNumber = this._numericValue(right);
|
|
28620
|
+
if (leftNumber != null && rightNumber != null) return leftNumber - rightNumber;
|
|
28621
|
+
return this._textValue(left).toUpperCase().localeCompare(this._textValue(right).toUpperCase());
|
|
28622
|
+
}
|
|
28623
|
+
_textValue(value) {
|
|
28624
|
+
if (value.isNull()) return "";
|
|
28625
|
+
return String(value.getValue());
|
|
28626
|
+
}
|
|
28627
|
+
};
|
|
28628
|
+
|
|
27843
28629
|
//#endregion
|
|
27844
28630
|
//#region src/functions/logical/if/index.ts
|
|
27845
28631
|
var If = class extends BaseFunction {
|
|
@@ -27850,12 +28636,18 @@ var If = class extends BaseFunction {
|
|
|
27850
28636
|
}
|
|
27851
28637
|
calculate(logicalTest, valueIfTrue, valueIfFalse = BooleanValueObject.create(false)) {
|
|
27852
28638
|
let _logicalTest = logicalTest;
|
|
28639
|
+
let useLegacyImplicitSelectedValue = false;
|
|
27853
28640
|
if (logicalTest.isArray()) {
|
|
27854
|
-
const
|
|
27855
|
-
const
|
|
27856
|
-
|
|
28641
|
+
const logicalTestArray = logicalTest;
|
|
28642
|
+
const rowCount = logicalTestArray.getRowCount();
|
|
28643
|
+
const columnCount = logicalTestArray.getColumnCount();
|
|
28644
|
+
if (rowCount === 1 && columnCount === 1) _logicalTest = logicalTestArray.get(0, 0);
|
|
28645
|
+
else if (!this._isCurrentArrayFormula() && logicalTestArray.getUnitId() !== "" && logicalTestArray.getSheetId() !== "" && logicalTestArray.getCurrentRow() >= 0 && logicalTestArray.getCurrentColumn() >= 0) {
|
|
28646
|
+
_logicalTest = this._legacyImplicitArrayValue(logicalTestArray);
|
|
28647
|
+
useLegacyImplicitSelectedValue = true;
|
|
28648
|
+
}
|
|
27857
28649
|
}
|
|
27858
|
-
if (!_logicalTest.isArray()) return this._handleSingleObject(_logicalTest, valueIfTrue, valueIfFalse);
|
|
28650
|
+
if (!_logicalTest.isArray()) return this._handleSingleObject(_logicalTest, valueIfTrue, valueIfFalse, useLegacyImplicitSelectedValue);
|
|
27859
28651
|
const maxRowLength = Math.max(_logicalTest.isArray() ? _logicalTest.getRowCount() : 1, valueIfTrue.isArray() ? valueIfTrue.getRowCount() : 1, valueIfFalse.isArray() ? valueIfFalse.getRowCount() : 1);
|
|
27860
28652
|
const maxColumnLength = Math.max(_logicalTest.isArray() ? _logicalTest.getColumnCount() : 1, valueIfTrue.isArray() ? valueIfTrue.getColumnCount() : 1, valueIfFalse.isArray() ? valueIfFalse.getColumnCount() : 1);
|
|
27861
28653
|
const logicalTestArray = expandArrayValueObject(maxRowLength, maxColumnLength, _logicalTest, ErrorValueObject.create("#N/A"));
|
|
@@ -27864,12 +28656,63 @@ var If = class extends BaseFunction {
|
|
|
27864
28656
|
return logicalTestArray.mapValue((logicalTestValue, rowIndex, columnIndex) => {
|
|
27865
28657
|
const valueIfTrueValue = valueIfTrueArray.get(rowIndex, columnIndex);
|
|
27866
28658
|
const valueIfFalseValue = valueIfFalseArray.get(rowIndex, columnIndex);
|
|
27867
|
-
return this._handleSingleObject(logicalTestValue, valueIfTrueValue, valueIfFalseValue);
|
|
28659
|
+
return this._handleSingleObject(logicalTestValue, valueIfTrueValue, valueIfFalseValue, false);
|
|
27868
28660
|
});
|
|
27869
28661
|
}
|
|
27870
|
-
_handleSingleObject(logicalTest, valueIfTrue, valueIfFalse) {
|
|
28662
|
+
_handleSingleObject(logicalTest, valueIfTrue, valueIfFalse, useLegacyImplicitSelectedValue) {
|
|
27871
28663
|
if (logicalTest.isError()) return logicalTest;
|
|
27872
|
-
|
|
28664
|
+
const logicalTestValue = this._coerceLogicalTest(logicalTest);
|
|
28665
|
+
if (logicalTestValue.isError()) return logicalTestValue;
|
|
28666
|
+
let selectedValue = logicalTestValue.getValue() ? valueIfTrue : valueIfFalse;
|
|
28667
|
+
if (useLegacyImplicitSelectedValue) selectedValue = this._legacyImplicitSelectedValue(selectedValue);
|
|
28668
|
+
return this._coerceSelectedValue(selectedValue);
|
|
28669
|
+
}
|
|
28670
|
+
_coerceSelectedValue(value) {
|
|
28671
|
+
return value.isNull() ? NumberValueObject.create(0) : value;
|
|
28672
|
+
}
|
|
28673
|
+
_coerceLogicalTest(logicalTest) {
|
|
28674
|
+
if (logicalTest.isNull()) return BooleanValueObject.create(false);
|
|
28675
|
+
if (logicalTest.isBoolean()) return logicalTest;
|
|
28676
|
+
if (logicalTest.isNumber()) return BooleanValueObject.create(Number(logicalTest.getValue()) !== 0);
|
|
28677
|
+
if (logicalTest.isString()) {
|
|
28678
|
+
const value = `${logicalTest.getValue()}`.trim().toUpperCase();
|
|
28679
|
+
if (value === "TRUE") return BooleanValueObject.create(true);
|
|
28680
|
+
if (value === "FALSE") return BooleanValueObject.create(false);
|
|
28681
|
+
}
|
|
28682
|
+
return ErrorValueObject.create("#VALUE!");
|
|
28683
|
+
}
|
|
28684
|
+
_legacyImplicitSelectedValue(value) {
|
|
28685
|
+
if (!value.isArray()) return value;
|
|
28686
|
+
const array = value;
|
|
28687
|
+
if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return value;
|
|
28688
|
+
return this._legacyImplicitArrayValue(array);
|
|
28689
|
+
}
|
|
28690
|
+
_legacyImplicitArrayValue(logicalTest) {
|
|
28691
|
+
const startRow = logicalTest.getCurrentRow();
|
|
28692
|
+
const startColumn = logicalTest.getCurrentColumn();
|
|
28693
|
+
const rowCount = logicalTest.getRowCount();
|
|
28694
|
+
const columnCount = logicalTest.getColumnCount();
|
|
28695
|
+
if (startRow < 0 || startColumn < 0) return ErrorValueObject.create("#VALUE!");
|
|
28696
|
+
let rowIndex = -1;
|
|
28697
|
+
let columnIndex = -1;
|
|
28698
|
+
if (rowCount === 1 && columnCount === 1) {
|
|
28699
|
+
rowIndex = 0;
|
|
28700
|
+
columnIndex = 0;
|
|
28701
|
+
} else if (rowCount === 1) {
|
|
28702
|
+
rowIndex = 0;
|
|
28703
|
+
columnIndex = this.column - startColumn;
|
|
28704
|
+
} else if (columnCount === 1) {
|
|
28705
|
+
rowIndex = this.row - startRow;
|
|
28706
|
+
columnIndex = 0;
|
|
28707
|
+
} else {
|
|
28708
|
+
rowIndex = this.row - startRow;
|
|
28709
|
+
columnIndex = this.column - startColumn;
|
|
28710
|
+
}
|
|
28711
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
|
|
28712
|
+
return logicalTest.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
|
|
28713
|
+
}
|
|
28714
|
+
_isCurrentArrayFormula() {
|
|
28715
|
+
return this.currentFormulaRowCount > 1 || this.currentFormulaColumnCount > 1;
|
|
27873
28716
|
}
|
|
27874
28717
|
};
|
|
27875
28718
|
|
|
@@ -27880,8 +28723,11 @@ var Iferror = class extends BaseFunction {
|
|
|
27880
28723
|
super(..._args);
|
|
27881
28724
|
_defineProperty(this, "minParams", 2);
|
|
27882
28725
|
_defineProperty(this, "maxParams", 2);
|
|
28726
|
+
_defineProperty(this, "needsReferenceObject", true);
|
|
27883
28727
|
}
|
|
27884
28728
|
calculate(value, valueIfError) {
|
|
28729
|
+
value = this._toValueObject(value);
|
|
28730
|
+
valueIfError = this._toValueObject(valueIfError);
|
|
27885
28731
|
if (!value.isArray()) return value.isError() ? valueIfError : value;
|
|
27886
28732
|
const maxRowLength = Math.max(value.isArray() ? value.getRowCount() : 1, valueIfError.isArray() ? valueIfError.getRowCount() : 1);
|
|
27887
28733
|
const maxColumnLength = Math.max(value.isArray() ? value.getColumnCount() : 1, valueIfError.isArray() ? valueIfError.getColumnCount() : 1);
|
|
@@ -27892,6 +28738,12 @@ var Iferror = class extends BaseFunction {
|
|
|
27892
28738
|
});
|
|
27893
28739
|
return valueArray;
|
|
27894
28740
|
}
|
|
28741
|
+
_toValueObject(value) {
|
|
28742
|
+
if (!value.isReferenceObject()) return value;
|
|
28743
|
+
const reference = value;
|
|
28744
|
+
if (reference.getRowCount() === 1 && reference.getColumnCount() === 1) return reference.getCellByPosition();
|
|
28745
|
+
return reference.toArrayValueObject();
|
|
28746
|
+
}
|
|
27895
28747
|
};
|
|
27896
28748
|
|
|
27897
28749
|
//#endregion
|
|
@@ -28168,6 +29020,23 @@ var Or = class extends BaseFunction {
|
|
|
28168
29020
|
}
|
|
28169
29021
|
};
|
|
28170
29022
|
|
|
29023
|
+
//#endregion
|
|
29024
|
+
//#region src/functions/logical/percentof/index.ts
|
|
29025
|
+
/**
|
|
29026
|
+
* PERCENTOF is an Excel GROUPBY aggregator token. It is evaluated by GROUPBY's
|
|
29027
|
+
* AST path, not as a standalone scalar function.
|
|
29028
|
+
*/
|
|
29029
|
+
var Percentof = class extends BaseFunction {
|
|
29030
|
+
constructor(..._args) {
|
|
29031
|
+
super(..._args);
|
|
29032
|
+
_defineProperty(this, "minParams", 0);
|
|
29033
|
+
_defineProperty(this, "maxParams", 0);
|
|
29034
|
+
}
|
|
29035
|
+
calculate(..._variants) {
|
|
29036
|
+
return ErrorValueObject.create("#VALUE!");
|
|
29037
|
+
}
|
|
29038
|
+
};
|
|
29039
|
+
|
|
28171
29040
|
//#endregion
|
|
28172
29041
|
//#region src/functions/logical/reduce/index.ts
|
|
28173
29042
|
var Reduce = class extends BaseFunction {
|
|
@@ -28451,6 +29320,7 @@ const functionLogical = [
|
|
|
28451
29320
|
[Bycol, "BYCOL"],
|
|
28452
29321
|
[Byrow, "BYROW"],
|
|
28453
29322
|
[False, "FALSE"],
|
|
29323
|
+
[Groupby, "GROUPBY"],
|
|
28454
29324
|
[If, "IF"],
|
|
28455
29325
|
[Iferror, "IFERROR"],
|
|
28456
29326
|
[Ifna, "IFNA"],
|
|
@@ -28461,6 +29331,7 @@ const functionLogical = [
|
|
|
28461
29331
|
[Map$1, "MAP"],
|
|
28462
29332
|
[Not, "NOT"],
|
|
28463
29333
|
[Or, "OR"],
|
|
29334
|
+
[Percentof, "PERCENTOF"],
|
|
28464
29335
|
[Reduce, "REDUCE"],
|
|
28465
29336
|
[Scan, "SCAN"],
|
|
28466
29337
|
[Switch, "SWITCH"],
|
|
@@ -28482,9 +29353,9 @@ var Address = class extends BaseFunction {
|
|
|
28482
29353
|
if (absNumber === null || absNumber === void 0 ? void 0 : absNumber.isError()) return absNumber;
|
|
28483
29354
|
if (a1 === null || a1 === void 0 ? void 0 : a1.isError()) return a1;
|
|
28484
29355
|
if (sheetText === null || sheetText === void 0 ? void 0 : sheetText.isError()) return sheetText;
|
|
28485
|
-
const _absNumber = absNumber
|
|
28486
|
-
const _a1 = a1
|
|
28487
|
-
const _sheetText = sheetText
|
|
29356
|
+
const _absNumber = absNumber == null || absNumber.isNull() ? NumberValueObject.create(1) : absNumber;
|
|
29357
|
+
const _a1 = a1 == null || a1.isNull() ? BooleanValueObject.create(true) : a1;
|
|
29358
|
+
const _sheetText = sheetText == null || sheetText.isNull() ? StringValueObject.create("") : sheetText;
|
|
28488
29359
|
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);
|
|
28489
29360
|
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);
|
|
28490
29361
|
const rowNumArray = expandArrayValueObject(maxRowLength, maxColumnLength, rowNumber, ErrorValueObject.create("#N/A"));
|
|
@@ -28535,6 +29406,20 @@ function transformAbsoluteRefType(number) {
|
|
|
28535
29406
|
}
|
|
28536
29407
|
}
|
|
28537
29408
|
|
|
29409
|
+
//#endregion
|
|
29410
|
+
//#region src/functions/lookup/anchorarray/index.ts
|
|
29411
|
+
var Anchorarray = class extends BaseFunction {
|
|
29412
|
+
constructor(..._args) {
|
|
29413
|
+
super(..._args);
|
|
29414
|
+
_defineProperty(this, "minParams", 1);
|
|
29415
|
+
_defineProperty(this, "maxParams", 1);
|
|
29416
|
+
_defineProperty(this, "needsReferenceObject", true);
|
|
29417
|
+
}
|
|
29418
|
+
calculate(reference) {
|
|
29419
|
+
return reference;
|
|
29420
|
+
}
|
|
29421
|
+
};
|
|
29422
|
+
|
|
28538
29423
|
//#endregion
|
|
28539
29424
|
//#region src/functions/lookup/areas/index.ts
|
|
28540
29425
|
var Areas = class extends BaseFunction {
|
|
@@ -29045,9 +29930,13 @@ var Hlookup = class extends BaseFunction {
|
|
|
29045
29930
|
return this._handleSingleObject(lookupValue, searchArray, resultArray, rangeLookupValue);
|
|
29046
29931
|
}
|
|
29047
29932
|
_handleSingleObject(value, searchArray, resultArray, rangeLookupValue) {
|
|
29048
|
-
if (rangeLookupValue === 0) return this.equalSearch(value, searchArray, resultArray);
|
|
29933
|
+
if (rangeLookupValue === 0) return this._blankResultAsZero(this.equalSearch(value, searchArray, resultArray));
|
|
29049
29934
|
return this.binarySearch(value, searchArray, resultArray);
|
|
29050
29935
|
}
|
|
29936
|
+
_blankResultAsZero(value) {
|
|
29937
|
+
if (value.isNull()) return NumberValueObject.create(0);
|
|
29938
|
+
return value;
|
|
29939
|
+
}
|
|
29051
29940
|
};
|
|
29052
29941
|
|
|
29053
29942
|
//#endregion
|
|
@@ -29319,6 +30208,17 @@ var Index = class extends BaseFunction {
|
|
|
29319
30208
|
|
|
29320
30209
|
//#endregion
|
|
29321
30210
|
//#region src/functions/lookup/indirect/index.ts
|
|
30211
|
+
const INDIRECT_ERROR_LITERALS = [
|
|
30212
|
+
"#NULL!",
|
|
30213
|
+
"#DIV/0!",
|
|
30214
|
+
"#VALUE!",
|
|
30215
|
+
"#REF!",
|
|
30216
|
+
"#NAME?",
|
|
30217
|
+
"#NUM!",
|
|
30218
|
+
"#N/A",
|
|
30219
|
+
"#CYCLE!",
|
|
30220
|
+
"#CALC!"
|
|
30221
|
+
];
|
|
29322
30222
|
var Indirect = class extends BaseFunction {
|
|
29323
30223
|
constructor(..._args) {
|
|
29324
30224
|
super(..._args);
|
|
@@ -29347,6 +30247,8 @@ var Indirect = class extends BaseFunction {
|
|
|
29347
30247
|
_handleSingleObject(refTextObject, a1Value) {
|
|
29348
30248
|
const refTextValue = `${refTextObject.getValue()}`;
|
|
29349
30249
|
if (refTextValue.trim() === "") return ErrorValueObject.create("#REF!");
|
|
30250
|
+
const embeddedError = this._matchErrorLiteral(refTextValue);
|
|
30251
|
+
if (embeddedError != null) return ErrorValueObject.create(embeddedError);
|
|
29350
30252
|
const refTextV = this._convertToDefinedName(refTextValue);
|
|
29351
30253
|
if (a1Value === 0) {
|
|
29352
30254
|
const { range, sheetName, unitId } = deserializeRangeForR1C1(refTextV);
|
|
@@ -29385,6 +30287,10 @@ var Indirect = class extends BaseFunction {
|
|
|
29385
30287
|
if (formulaOrRefString.startsWith("=")) return formulaOrRefString.slice(1);
|
|
29386
30288
|
return formulaOrRefString;
|
|
29387
30289
|
}
|
|
30290
|
+
_matchErrorLiteral(refText) {
|
|
30291
|
+
const normalizedRefText = refText.toUpperCase();
|
|
30292
|
+
return INDIRECT_ERROR_LITERALS.find((errorType) => normalizedRefText.includes(errorType));
|
|
30293
|
+
}
|
|
29388
30294
|
};
|
|
29389
30295
|
|
|
29390
30296
|
//#endregion
|
|
@@ -29452,7 +30358,7 @@ var Match = class extends BaseFunction {
|
|
|
29452
30358
|
const columnCountLookup = lookupArray.getColumnCount();
|
|
29453
30359
|
if (rowCountLookup !== 1 && columnCountLookup !== 1) return ErrorValueObject.create("#N/A");
|
|
29454
30360
|
if (matchType === null || matchType === void 0 ? void 0 : matchType.isError()) return ErrorValueObject.create("#N/A");
|
|
29455
|
-
const matchTypeValue = this.getMatchTypeValue(matchType);
|
|
30361
|
+
const matchTypeValue = (matchType === null || matchType === void 0 ? void 0 : matchType.isNull()) ? 0 : this.getMatchTypeValue(matchType);
|
|
29456
30362
|
if (matchTypeValue == null) return ErrorValueObject.create("#VALUE!");
|
|
29457
30363
|
if (lookupValue.isArray()) return lookupValue.map((value) => this._handleSingleObject(value, lookupArray, matchTypeValue));
|
|
29458
30364
|
return this._handleSingleObject(lookupValue, lookupArray, matchTypeValue);
|
|
@@ -29871,9 +30777,10 @@ var Sort = class extends BaseFunction {
|
|
|
29871
30777
|
}
|
|
29872
30778
|
calculate(array, sortIndex, sortOrder, byCol) {
|
|
29873
30779
|
let _sortIndex = sortIndex !== null && sortIndex !== void 0 ? sortIndex : NumberValueObject.create(1);
|
|
29874
|
-
|
|
30780
|
+
let _sortOrder = sortOrder !== null && sortOrder !== void 0 ? sortOrder : NumberValueObject.create(1);
|
|
29875
30781
|
const _byCol = byCol !== null && byCol !== void 0 ? byCol : BooleanValueObject.create(false);
|
|
29876
30782
|
if (_sortIndex.isNull()) _sortIndex = NumberValueObject.create(1);
|
|
30783
|
+
if (_sortOrder.isNull()) _sortOrder = NumberValueObject.create(1);
|
|
29877
30784
|
if (_byCol.isArray()) {
|
|
29878
30785
|
const byColRowCount = _byCol.getRowCount();
|
|
29879
30786
|
const byColColumnCount = _byCol.getColumnCount();
|
|
@@ -30638,9 +31545,26 @@ var Vlookup = class extends BaseFunction {
|
|
|
30638
31545
|
return this._handleSingleObject(lookupValue, searchArray, resultArray, rangeLookupValue);
|
|
30639
31546
|
}
|
|
30640
31547
|
_handleSingleObject(value, searchArray, resultArray, rangeLookupValue) {
|
|
30641
|
-
if (rangeLookupValue === 0)
|
|
31548
|
+
if (rangeLookupValue === 0) {
|
|
31549
|
+
if (value.isNull()) return this._equalSearchBlankLookupValue(searchArray, resultArray);
|
|
31550
|
+
return this._blankResultAsZero(this.equalSearch(value, searchArray, resultArray));
|
|
31551
|
+
}
|
|
30642
31552
|
return this.binarySearch(value, searchArray, resultArray);
|
|
30643
31553
|
}
|
|
31554
|
+
_equalSearchBlankLookupValue(searchArray, resultArray) {
|
|
31555
|
+
var _resultArrayValue$;
|
|
31556
|
+
const zero = NumberValueObject.create(0);
|
|
31557
|
+
const matched = searchArray.mapValue((value) => {
|
|
31558
|
+
if (value.isNull()) return BooleanValueObject.create(false);
|
|
31559
|
+
return value.isEqual(zero);
|
|
31560
|
+
});
|
|
31561
|
+
const resultArrayValue = resultArray.pickRaw(matched);
|
|
31562
|
+
return this._blankResultAsZero(((_resultArrayValue$ = resultArrayValue[0]) === null || _resultArrayValue$ === void 0 ? void 0 : _resultArrayValue$[0]) || ErrorValueObject.create("#N/A"));
|
|
31563
|
+
}
|
|
31564
|
+
_blankResultAsZero(value) {
|
|
31565
|
+
if (value.isNull()) return NumberValueObject.create(0);
|
|
31566
|
+
return value;
|
|
31567
|
+
}
|
|
30644
31568
|
};
|
|
30645
31569
|
|
|
30646
31570
|
//#endregion
|
|
@@ -30810,7 +31734,8 @@ var Xlookup = class extends BaseFunction {
|
|
|
30810
31734
|
if (matchMode === null || matchMode === void 0 ? void 0 : matchMode.isNull()) _matchMode = NumberValueObject.create(0);
|
|
30811
31735
|
let _searchMode = searchMode !== null && searchMode !== void 0 ? searchMode : NumberValueObject.create(1);
|
|
30812
31736
|
if (searchMode === null || searchMode === void 0 ? void 0 : searchMode.isNull()) _searchMode = NumberValueObject.create(1);
|
|
30813
|
-
|
|
31737
|
+
const _lookupValue = this._legacyImplicitLookupValue(lookupValue);
|
|
31738
|
+
if (_lookupValue.isError()) return _lookupValue;
|
|
30814
31739
|
const rowCountLookup = lookupArray.isArray() ? lookupArray.getRowCount() : 1;
|
|
30815
31740
|
const columnCountLookup = lookupArray.isArray() ? lookupArray.getColumnCount() : 1;
|
|
30816
31741
|
const rowCountReturn = returnArray.isArray() ? returnArray.getRowCount() : 1;
|
|
@@ -30822,7 +31747,7 @@ var Xlookup = class extends BaseFunction {
|
|
|
30822
31747
|
if (matchModeValue instanceof ErrorValueObject) return matchModeValue;
|
|
30823
31748
|
const searchModeValue = this.getIndexNumValue(_searchMode);
|
|
30824
31749
|
if (searchModeValue instanceof ErrorValueObject) return searchModeValue;
|
|
30825
|
-
return this._getResult(
|
|
31750
|
+
return this._getResult(_lookupValue, baseValueObjectToArrayValueObject(lookupArray), baseValueObjectToArrayValueObject(returnArray), _ifNotFound, matchModeValue, searchModeValue, rowCountLookup, columnCountLookup, rowCountReturn, columnCountReturn);
|
|
30826
31751
|
}
|
|
30827
31752
|
_getResult(lookupValue, lookupArray, returnArray, ifNotFound, matchModeValue, searchModeValue, rowCountLookup, columnCountLookup, rowCountReturn, columnCountReturn) {
|
|
30828
31753
|
const lookupValueRowCount = lookupValue.isArray() ? lookupValue.getRowCount() : 1;
|
|
@@ -30837,7 +31762,7 @@ var Xlookup = class extends BaseFunction {
|
|
|
30837
31762
|
if (checkErrorCombination) return checkErrorCombination;
|
|
30838
31763
|
const result = this._handleSingleObject(value, lookupArray, resultArray, matchModeValue, searchModeValue);
|
|
30839
31764
|
if (result.isError()) return ifNotFound;
|
|
30840
|
-
return result;
|
|
31765
|
+
return this._blankResultAsZero(result);
|
|
30841
31766
|
});
|
|
30842
31767
|
}
|
|
30843
31768
|
const _lookupValue = lookupValue.isArray() ? lookupValue.get(0, 0) : lookupValue;
|
|
@@ -30846,7 +31771,7 @@ var Xlookup = class extends BaseFunction {
|
|
|
30846
31771
|
if (checkErrorCombination) return checkErrorCombination;
|
|
30847
31772
|
const result = this._handleSingleObject(_lookupValue, lookupArray, returnArray, matchModeValue, searchModeValue);
|
|
30848
31773
|
if (result.isError()) return ifNotFound;
|
|
30849
|
-
return result;
|
|
31774
|
+
return this._blankResultAsZero(result);
|
|
30850
31775
|
}
|
|
30851
31776
|
let axis = 0;
|
|
30852
31777
|
/**
|
|
@@ -30858,6 +31783,32 @@ var Xlookup = class extends BaseFunction {
|
|
|
30858
31783
|
if (resultArray == null) return ErrorValueObject.create("#N/A");
|
|
30859
31784
|
return resultArray;
|
|
30860
31785
|
}
|
|
31786
|
+
_legacyImplicitLookupValue(lookupValue) {
|
|
31787
|
+
if (!lookupValue.isArray()) return lookupValue;
|
|
31788
|
+
const array = lookupValue;
|
|
31789
|
+
if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return lookupValue;
|
|
31790
|
+
const startRow = array.getCurrentRow();
|
|
31791
|
+
const startColumn = array.getCurrentColumn();
|
|
31792
|
+
const rowCount = array.getRowCount();
|
|
31793
|
+
const columnCount = array.getColumnCount();
|
|
31794
|
+
let rowIndex = -1;
|
|
31795
|
+
let columnIndex = -1;
|
|
31796
|
+
if (rowCount === 1 && columnCount === 1) {
|
|
31797
|
+
rowIndex = 0;
|
|
31798
|
+
columnIndex = 0;
|
|
31799
|
+
} else if (rowCount === 1) {
|
|
31800
|
+
rowIndex = 0;
|
|
31801
|
+
columnIndex = this.column - startColumn;
|
|
31802
|
+
} else if (columnCount === 1) {
|
|
31803
|
+
rowIndex = this.row - startRow;
|
|
31804
|
+
columnIndex = 0;
|
|
31805
|
+
} else {
|
|
31806
|
+
rowIndex = this.row - startRow;
|
|
31807
|
+
columnIndex = this.column - startColumn;
|
|
31808
|
+
}
|
|
31809
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
|
|
31810
|
+
return array.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
|
|
31811
|
+
}
|
|
30861
31812
|
_handleExpandObject(value, searchArray, resultArray, matchModeValue, searchModeValue, axis = 0) {
|
|
30862
31813
|
if ((searchModeValue === 2 || searchModeValue === -2) && matchModeValue !== 2) {
|
|
30863
31814
|
const searchType = getSearchModeValue(searchModeValue);
|
|
@@ -30878,6 +31829,10 @@ var Xlookup = class extends BaseFunction {
|
|
|
30878
31829
|
if (matchModeValue === -1 || matchModeValue === 1) return this.orderSearch(value, searchArray, resultArray, matchModeValue === 1 ? 2 : 1, searchModeValue === -1);
|
|
30879
31830
|
return this.equalSearch(value, searchArray, resultArray, searchModeValue !== -1);
|
|
30880
31831
|
}
|
|
31832
|
+
_blankResultAsZero(value) {
|
|
31833
|
+
if (value.isNull()) return NumberValueObject.create(0);
|
|
31834
|
+
return value;
|
|
31835
|
+
}
|
|
30881
31836
|
/**
|
|
30882
31837
|
* Wildcard matching and binary search cannot appear at the same time
|
|
30883
31838
|
* @param matchModeValue
|
|
@@ -30994,6 +31949,7 @@ var Xmatch = class extends BaseFunction {
|
|
|
30994
31949
|
*/
|
|
30995
31950
|
const functionLookup = [
|
|
30996
31951
|
[Address, "ADDRESS"],
|
|
31952
|
+
[Anchorarray, "ANCHORARRAY"],
|
|
30997
31953
|
[Areas, "AREAS"],
|
|
30998
31954
|
[Choose, "CHOOSE"],
|
|
30999
31955
|
[Choosecols, "CHOOSECOLS"],
|
|
@@ -32099,7 +33055,7 @@ var Int = class extends BaseFunction {
|
|
|
32099
33055
|
let _number = number;
|
|
32100
33056
|
if (_number.isString()) _number = _number.convertToNumberObjectValue();
|
|
32101
33057
|
if (_number.isError()) return _number;
|
|
32102
|
-
const numberValue = Math.floor(+_number.getValue());
|
|
33058
|
+
const numberValue = Math.floor(stripErrorMargin(+_number.getValue()));
|
|
32103
33059
|
return NumberValueObject.create(numberValue);
|
|
32104
33060
|
}
|
|
32105
33061
|
};
|
|
@@ -33451,6 +34407,7 @@ var Sum = class extends BaseFunction {
|
|
|
33451
34407
|
let accumulatorAll = NumberValueObject.create(0);
|
|
33452
34408
|
for (let i = 0; i < variants.length; i++) {
|
|
33453
34409
|
let variant = variants[i];
|
|
34410
|
+
variant = this._legacyImplicitDerivedArray(variant);
|
|
33454
34411
|
if (variant.isString()) variant = variant.convertToNumberObjectValue();
|
|
33455
34412
|
if (variant.isError()) return variant;
|
|
33456
34413
|
if (variant.isArray()) variant = variant.sum();
|
|
@@ -33460,6 +34417,30 @@ var Sum = class extends BaseFunction {
|
|
|
33460
34417
|
}
|
|
33461
34418
|
return accumulatorAll;
|
|
33462
34419
|
}
|
|
34420
|
+
_legacyImplicitDerivedArray(variant) {
|
|
34421
|
+
if (!variant.isArray()) return variant;
|
|
34422
|
+
const array = variant;
|
|
34423
|
+
if (array.usesInvertedIndexCache() || !array.usesLegacyImplicitForAggregate()) return variant;
|
|
34424
|
+
const startRow = array.getCurrentRow();
|
|
34425
|
+
const startColumn = array.getCurrentColumn();
|
|
34426
|
+
if (startRow < 0 || startColumn < 0) return variant;
|
|
34427
|
+
const rowCount = array.getRowCount();
|
|
34428
|
+
const columnCount = array.getColumnCount();
|
|
34429
|
+
let rowIndex = -1;
|
|
34430
|
+
let columnIndex = -1;
|
|
34431
|
+
if (rowCount === 1) {
|
|
34432
|
+
rowIndex = 0;
|
|
34433
|
+
columnIndex = this.column - startColumn;
|
|
34434
|
+
} else if (columnCount === 1) {
|
|
34435
|
+
rowIndex = this.row - startRow;
|
|
34436
|
+
columnIndex = 0;
|
|
34437
|
+
} else {
|
|
34438
|
+
rowIndex = this.row - startRow;
|
|
34439
|
+
columnIndex = this.column - startColumn;
|
|
34440
|
+
}
|
|
34441
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
|
|
34442
|
+
return array.get(rowIndex, columnIndex) || variant;
|
|
34443
|
+
}
|
|
33463
34444
|
};
|
|
33464
34445
|
|
|
33465
34446
|
//#endregion
|
|
@@ -34033,8 +35014,17 @@ var Compare = class extends BaseFunction {
|
|
|
34033
35014
|
calculate(variant1, variant2) {
|
|
34034
35015
|
if (variant1.isError()) return variant1;
|
|
34035
35016
|
if (variant2.isError()) return variant2;
|
|
35017
|
+
const variant1Error = this._coerceErrorLiteral(variant1);
|
|
35018
|
+
if (variant1Error) return variant1Error;
|
|
35019
|
+
const variant2Error = this._coerceErrorLiteral(variant2);
|
|
35020
|
+
if (variant2Error) return variant2Error;
|
|
34036
35021
|
return variant1.compare(variant2, this._compareType);
|
|
34037
35022
|
}
|
|
35023
|
+
_coerceErrorLiteral(variant) {
|
|
35024
|
+
const value = variant.getValue();
|
|
35025
|
+
if (typeof value === "string" && ERROR_TYPE_SET.has(value)) return ErrorValueObject.create(value);
|
|
35026
|
+
return null;
|
|
35027
|
+
}
|
|
34038
35028
|
};
|
|
34039
35029
|
|
|
34040
35030
|
//#endregion
|
|
@@ -34292,6 +35282,7 @@ var Average = class extends BaseFunction {
|
|
|
34292
35282
|
let accumulatorCount = NumberValueObject.create(0);
|
|
34293
35283
|
for (let i = 0; i < variants.length; i++) {
|
|
34294
35284
|
let variant = variants[i];
|
|
35285
|
+
variant = this._legacyImplicitDerivedArray(variant);
|
|
34295
35286
|
if (variant.isString() || variant.isBoolean()) variant = variant.convertToNumberObjectValue();
|
|
34296
35287
|
if (variant.isError()) return variant;
|
|
34297
35288
|
if (variant.isArray()) {
|
|
@@ -34305,6 +35296,30 @@ var Average = class extends BaseFunction {
|
|
|
34305
35296
|
}
|
|
34306
35297
|
return accumulatorSum.divided(accumulatorCount);
|
|
34307
35298
|
}
|
|
35299
|
+
_legacyImplicitDerivedArray(variant) {
|
|
35300
|
+
if (!variant.isArray()) return variant;
|
|
35301
|
+
const array = variant;
|
|
35302
|
+
if (array.usesInvertedIndexCache()) return variant;
|
|
35303
|
+
const startRow = array.getCurrentRow();
|
|
35304
|
+
const startColumn = array.getCurrentColumn();
|
|
35305
|
+
if (startRow < 0 || startColumn < 0) return variant;
|
|
35306
|
+
const rowCount = array.getRowCount();
|
|
35307
|
+
const columnCount = array.getColumnCount();
|
|
35308
|
+
let rowIndex = -1;
|
|
35309
|
+
let columnIndex = -1;
|
|
35310
|
+
if (rowCount === 1) {
|
|
35311
|
+
rowIndex = 0;
|
|
35312
|
+
columnIndex = this.column - startColumn;
|
|
35313
|
+
} else if (columnCount === 1) {
|
|
35314
|
+
rowIndex = this.row - startRow;
|
|
35315
|
+
columnIndex = 0;
|
|
35316
|
+
} else {
|
|
35317
|
+
rowIndex = this.row - startRow;
|
|
35318
|
+
columnIndex = this.column - startColumn;
|
|
35319
|
+
}
|
|
35320
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
|
|
35321
|
+
return array.get(rowIndex, columnIndex) || variant;
|
|
35322
|
+
}
|
|
34308
35323
|
};
|
|
34309
35324
|
|
|
34310
35325
|
//#endregion
|
|
@@ -34837,7 +35852,13 @@ var Countif = class extends BaseFunction {
|
|
|
34837
35852
|
calculate(range, criteria) {
|
|
34838
35853
|
if (!range.isReferenceObject()) return ErrorValueObject.create("#VALUE!");
|
|
34839
35854
|
let _criteria = criteria;
|
|
34840
|
-
if (criteria.isReferenceObject())
|
|
35855
|
+
if (criteria.isReferenceObject()) {
|
|
35856
|
+
_criteria = criteria.toArrayValueObject();
|
|
35857
|
+
if (_criteria.getRowCount() === 1 && _criteria.getColumnCount() === 1) {
|
|
35858
|
+
const firstCriteria = _criteria.get(0, 0);
|
|
35859
|
+
_criteria = firstCriteria.isNull() ? NumberValueObject.create(0) : firstCriteria;
|
|
35860
|
+
}
|
|
35861
|
+
}
|
|
34841
35862
|
if (_criteria.isArray()) {
|
|
34842
35863
|
const resultArray = _criteria.mapValue((criteriaObject) => this._handleSingleObject(range, criteriaObject));
|
|
34843
35864
|
if (resultArray.getRowCount() === 1 && resultArray.getColumnCount() === 1) return resultArray.get(0, 0);
|
|
@@ -34872,7 +35893,7 @@ var Countifs = class extends BaseFunction {
|
|
|
34872
35893
|
_defineProperty(this, "needsReferenceObject", true);
|
|
34873
35894
|
}
|
|
34874
35895
|
calculate(...variants) {
|
|
34875
|
-
const { isError, errorObject, rangeIsDifferentSize, criteriaMaxRowLength, criteriaMaxColumnLength, variants: _variants } = parsePairedRangeAndCriteria(variants);
|
|
35896
|
+
const { isError, errorObject, rangeIsDifferentSize, criteriaMaxRowLength, criteriaMaxColumnLength, variants: _variants } = parsePairedRangeAndCriteria(this._legacyImplicitDerivedCriteria(variants));
|
|
34876
35897
|
if (isError) return errorObject;
|
|
34877
35898
|
if (rangeIsDifferentSize) {
|
|
34878
35899
|
if (criteriaMaxRowLength === 1 && criteriaMaxColumnLength === 1) return ErrorValueObject.create("#VALUE!");
|
|
@@ -34895,6 +35916,32 @@ var Countifs = class extends BaseFunction {
|
|
|
34895
35916
|
column: this.column
|
|
34896
35917
|
});
|
|
34897
35918
|
}
|
|
35919
|
+
_legacyImplicitDerivedCriteria(variants) {
|
|
35920
|
+
return variants.map((variant, index) => {
|
|
35921
|
+
if (index % 2 === 0 || !variant.isArray()) return variant;
|
|
35922
|
+
const array = variant;
|
|
35923
|
+
if (array.usesInvertedIndexCache()) return variant;
|
|
35924
|
+
const startRow = array.getCurrentRow();
|
|
35925
|
+
const startColumn = array.getCurrentColumn();
|
|
35926
|
+
if (startRow < 0 || startColumn < 0) return variant;
|
|
35927
|
+
const rowCount = array.getRowCount();
|
|
35928
|
+
const columnCount = array.getColumnCount();
|
|
35929
|
+
let rowIndex = -1;
|
|
35930
|
+
let columnIndex = -1;
|
|
35931
|
+
if (rowCount === 1) {
|
|
35932
|
+
rowIndex = 0;
|
|
35933
|
+
columnIndex = this.column - startColumn;
|
|
35934
|
+
} else if (columnCount === 1) {
|
|
35935
|
+
rowIndex = this.row - startRow;
|
|
35936
|
+
columnIndex = 0;
|
|
35937
|
+
} else {
|
|
35938
|
+
rowIndex = this.row - startRow;
|
|
35939
|
+
columnIndex = this.column - startColumn;
|
|
35940
|
+
}
|
|
35941
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
|
|
35942
|
+
return array.get(rowIndex, columnIndex) || variant;
|
|
35943
|
+
});
|
|
35944
|
+
}
|
|
34898
35945
|
};
|
|
34899
35946
|
|
|
34900
35947
|
//#endregion
|
|
@@ -35672,6 +36719,7 @@ var Linest = class extends BaseFunction {
|
|
|
35672
36719
|
super(..._args);
|
|
35673
36720
|
_defineProperty(this, "minParams", 1);
|
|
35674
36721
|
_defineProperty(this, "maxParams", 4);
|
|
36722
|
+
_defineProperty(this, "returnsLegacyArrayAsScalar", true);
|
|
35675
36723
|
}
|
|
35676
36724
|
calculate(knownYs, knownXs, constb, stats) {
|
|
35677
36725
|
const { isError, errorObject } = checkKnownsArrayDimensions(knownYs, knownXs);
|
|
@@ -36201,7 +37249,11 @@ var Median = class extends BaseFunction {
|
|
|
36201
37249
|
if (isError) return errorObject;
|
|
36202
37250
|
} else {
|
|
36203
37251
|
if (variant.isError()) return variant;
|
|
36204
|
-
if (variant.isNull()
|
|
37252
|
+
if (variant.isNull()) continue;
|
|
37253
|
+
if (variant.isBoolean()) {
|
|
37254
|
+
values.push(variant.getValue() ? 1 : 0);
|
|
37255
|
+
continue;
|
|
37256
|
+
}
|
|
36205
37257
|
if (variant.isString()) {
|
|
36206
37258
|
const _variant = variant.convertToNumberObjectValue();
|
|
36207
37259
|
if (_variant.isError()) return _variant;
|
|
@@ -36811,6 +37863,11 @@ var QuartileExc = class extends BaseFunction {
|
|
|
36811
37863
|
|
|
36812
37864
|
//#endregion
|
|
36813
37865
|
//#region src/functions/statistical/rank-avg/index.ts
|
|
37866
|
+
function isSameRankNumber$1(left, right) {
|
|
37867
|
+
if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
|
|
37868
|
+
const scale = Math.max(1, Math.abs(left), Math.abs(right));
|
|
37869
|
+
return Math.abs(left - right) <= Number.EPSILON * scale * 2;
|
|
37870
|
+
}
|
|
36814
37871
|
var RankAvg = class extends BaseFunction {
|
|
36815
37872
|
constructor(..._args) {
|
|
36816
37873
|
super(..._args);
|
|
@@ -36842,14 +37899,9 @@ var RankAvg = class extends BaseFunction {
|
|
|
36842
37899
|
return resultArray;
|
|
36843
37900
|
}
|
|
36844
37901
|
_getResult(numberValue, orderValue, refNumbers) {
|
|
36845
|
-
const refOrderNumbers = refNumbers.sort((a, b) => !orderValue ? b - a : a - b);
|
|
36846
|
-
let index = refOrderNumbers.indexOf(numberValue);
|
|
37902
|
+
const refOrderNumbers = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b);
|
|
36847
37903
|
const results = [];
|
|
36848
|
-
|
|
36849
|
-
const start = index + 1;
|
|
36850
|
-
results.push(start);
|
|
36851
|
-
index = refOrderNumbers.indexOf(numberValue, start);
|
|
36852
|
-
}
|
|
37904
|
+
for (let index = 0; index < refOrderNumbers.length; index++) if (isSameRankNumber$1(refOrderNumbers[index], numberValue)) results.push(index + 1);
|
|
36853
37905
|
if (results.length === 0) return ErrorValueObject.create("#N/A");
|
|
36854
37906
|
const result = results.reduce((acc, cur) => acc + cur, 0) / results.length;
|
|
36855
37907
|
return NumberValueObject.create(result);
|
|
@@ -36858,12 +37910,12 @@ var RankAvg = class extends BaseFunction {
|
|
|
36858
37910
|
let refHasError = false;
|
|
36859
37911
|
let refErrorObject = ErrorValueObject.create("#N/A");
|
|
36860
37912
|
const refNumbers = [];
|
|
36861
|
-
if (!ref.isReferenceObject()) return {
|
|
37913
|
+
if (!ref.isReferenceObject() && !ref.isArray()) return {
|
|
36862
37914
|
refHasError: true,
|
|
36863
37915
|
refErrorObject,
|
|
36864
37916
|
refNumbers
|
|
36865
37917
|
};
|
|
36866
|
-
ref.toArrayValueObject().iterator((refObject) => {
|
|
37918
|
+
(ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
|
|
36867
37919
|
const _refObject = refObject;
|
|
36868
37920
|
if (_refObject.isError()) {
|
|
36869
37921
|
refHasError = true;
|
|
@@ -36885,6 +37937,11 @@ var RankAvg = class extends BaseFunction {
|
|
|
36885
37937
|
|
|
36886
37938
|
//#endregion
|
|
36887
37939
|
//#region src/functions/statistical/rank-eq/index.ts
|
|
37940
|
+
function isSameRankNumber(left, right) {
|
|
37941
|
+
if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
|
|
37942
|
+
const scale = Math.max(1, Math.abs(left), Math.abs(right));
|
|
37943
|
+
return Math.abs(left - right) <= Number.EPSILON * scale * 2;
|
|
37944
|
+
}
|
|
36888
37945
|
var RankEq = class extends BaseFunction {
|
|
36889
37946
|
constructor(..._args) {
|
|
36890
37947
|
super(..._args);
|
|
@@ -36910,7 +37967,7 @@ var RankEq = class extends BaseFunction {
|
|
|
36910
37967
|
const numberValue = +numberObject.getValue();
|
|
36911
37968
|
const orderValue = +orderObject.getValue();
|
|
36912
37969
|
if (Number.isNaN(numberValue) || Number.isNaN(orderValue)) return ErrorValueObject.create("#VALUE!");
|
|
36913
|
-
const result = refNumbers.sort((a, b) => !orderValue ? b - a : a - b).
|
|
37970
|
+
const result = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b).findIndex((refNumber) => isSameRankNumber(refNumber, numberValue));
|
|
36914
37971
|
if (result === -1) return ErrorValueObject.create("#N/A");
|
|
36915
37972
|
return NumberValueObject.create(result + 1);
|
|
36916
37973
|
});
|
|
@@ -36921,12 +37978,12 @@ var RankEq = class extends BaseFunction {
|
|
|
36921
37978
|
let refHasError = false;
|
|
36922
37979
|
let refErrorObject = ErrorValueObject.create("#N/A");
|
|
36923
37980
|
const refNumbers = [];
|
|
36924
|
-
if (!ref.isReferenceObject()) return {
|
|
37981
|
+
if (!ref.isReferenceObject() && !ref.isArray()) return {
|
|
36925
37982
|
refHasError: true,
|
|
36926
37983
|
refErrorObject,
|
|
36927
37984
|
refNumbers
|
|
36928
37985
|
};
|
|
36929
|
-
ref.toArrayValueObject().iterator((refObject) => {
|
|
37986
|
+
(ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
|
|
36930
37987
|
const _refObject = refObject;
|
|
36931
37988
|
if (_refObject.isError()) {
|
|
36932
37989
|
refHasError = true;
|
|
@@ -37998,11 +39055,10 @@ var Concat = class extends BaseFunction {
|
|
|
37998
39055
|
isError = valueObject;
|
|
37999
39056
|
return false;
|
|
38000
39057
|
}
|
|
38001
|
-
|
|
38002
|
-
else if (valueObject.isString() || valueObject.isNumber()) concatenatedString += valueObject.getValue();
|
|
39058
|
+
concatenatedString += formatValueForFormulaText(valueObject.getValue());
|
|
38003
39059
|
});
|
|
38004
39060
|
if (isError) return isError;
|
|
38005
|
-
} else if (!textValue.isError() && !textValue.isNull()) concatenatedString += textValue.getValue();
|
|
39061
|
+
} else if (!textValue.isError() && !textValue.isNull()) concatenatedString += formatValueForFormulaText(textValue.getValue());
|
|
38006
39062
|
return StringValueObject.create(concatenatedString);
|
|
38007
39063
|
}
|
|
38008
39064
|
};
|
|
@@ -38029,20 +39085,27 @@ var Concatenate = class extends BaseFunction {
|
|
|
38029
39085
|
}
|
|
38030
39086
|
});
|
|
38031
39087
|
let result = null;
|
|
39088
|
+
const referenceSource = textValues.find((textValue) => {
|
|
39089
|
+
if (!textValue.isArray()) return false;
|
|
39090
|
+
const arrayValue = textValue;
|
|
39091
|
+
return arrayValue.getUnitId() !== "" && arrayValue.getSheetId() !== "" && arrayValue.getCurrentRow() >= 0 && arrayValue.getCurrentColumn() >= 0;
|
|
39092
|
+
});
|
|
38032
39093
|
for (const textValue of textValues) result = expandArrayValueObject(maxRowLength, maxColumnLength, textValue, ErrorValueObject.create("#N/A")).mapValue((textValueObject, rowIndex, columnIndex) => {
|
|
38033
|
-
var
|
|
39094
|
+
var _resultValueObject$ge, _textValueObject$getV;
|
|
38034
39095
|
const resultValueObject = result && result.get(rowIndex, columnIndex);
|
|
38035
39096
|
if (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isError()) return resultValueObject;
|
|
38036
39097
|
if (textValueObject.isError()) return textValueObject;
|
|
38037
|
-
|
|
38038
|
-
|
|
38039
|
-
if (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isBoolean()) resultValue = `${resultValue}`.toLocaleUpperCase();
|
|
38040
|
-
if (textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.isBoolean()) textValue = `${textValue}`.toLocaleUpperCase();
|
|
38041
|
-
const resultValueObjectString = (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isNull()) ? "" : (_resultValue = resultValue) !== null && _resultValue !== void 0 ? _resultValue : "";
|
|
38042
|
-
const textValueObjectString = (textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.isNull()) ? "" : (_textValue = textValue) !== null && _textValue !== void 0 ? _textValue : "";
|
|
39098
|
+
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);
|
|
39099
|
+
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);
|
|
38043
39100
|
return StringValueObject.create(`${resultValueObjectString}${textValueObjectString}`);
|
|
38044
39101
|
});
|
|
38045
39102
|
if (!result) return ErrorValueObject.create("#VALUE!");
|
|
39103
|
+
if (referenceSource && result.isArray()) {
|
|
39104
|
+
const resultArray = result;
|
|
39105
|
+
resultArray.setUnitId(referenceSource.getUnitId());
|
|
39106
|
+
resultArray.setSheetId(referenceSource.getSheetId());
|
|
39107
|
+
resultArray.setCurrent(referenceSource.getCurrentRow(), referenceSource.getCurrentColumn());
|
|
39108
|
+
}
|
|
38046
39109
|
return result;
|
|
38047
39110
|
}
|
|
38048
39111
|
};
|
|
@@ -39809,13 +40872,17 @@ var Text = class extends BaseFunction {
|
|
|
39809
40872
|
}
|
|
39810
40873
|
if (formatTextValue.isNull()) formatTextValue = StringValueObject.create(" ");
|
|
39811
40874
|
const formatTextValueString = `${formatTextValue.getValue()}`;
|
|
39812
|
-
const previewText = getFormatPreview(formatTextValueString, textValueNumber);
|
|
40875
|
+
const previewText = getFormatPreview(normalizeExcelWeekdayFormat(formatTextValueString), textValueNumber);
|
|
39813
40876
|
return StringValueObject.create(formatTextValueString === " " ? previewText.trimEnd() : previewText);
|
|
39814
40877
|
});
|
|
39815
40878
|
if (resultArray.getRowCount() === 1 && resultArray.getColumnCount() === 1) return resultArray.get(0, 0);
|
|
39816
40879
|
return resultArray;
|
|
39817
40880
|
}
|
|
39818
40881
|
};
|
|
40882
|
+
function normalizeExcelWeekdayFormat(formatText) {
|
|
40883
|
+
if (!formatText.includes("Å")) return formatText;
|
|
40884
|
+
return formatText.replace(/\u00C5{4,}/g, "dddd").replace(/\u00C5{1,3}/g, "ddd");
|
|
40885
|
+
}
|
|
39819
40886
|
|
|
39820
40887
|
//#endregion
|
|
39821
40888
|
//#region src/functions/text/textafter/index.ts
|
|
@@ -40190,9 +41257,19 @@ var Textsplit = class extends BaseFunction {
|
|
|
40190
41257
|
const _ignoreEmpty = ignoreEmpty !== null && ignoreEmpty !== void 0 ? ignoreEmpty : NumberValueObject.create(0);
|
|
40191
41258
|
const _matchMode = matchMode !== null && matchMode !== void 0 ? matchMode : NumberValueObject.create(0);
|
|
40192
41259
|
const _padWith = padWith !== null && padWith !== void 0 ? padWith : StringValueObject.create("#N/A");
|
|
40193
|
-
const { _variant: _colDelimiter, values: colDelimiterValue } = this._getStringValues(colDelimiter);
|
|
40194
41260
|
const { _variant, values: rowDelimiterValue } = this._getStringValues(_rowDelimiter, false);
|
|
40195
41261
|
_rowDelimiter = _variant;
|
|
41262
|
+
const allowBlankColDelimiter = rowDelimiter != null && !rowDelimiter.isNull() && !_rowDelimiter.isError() && rowDelimiterValue.length > 0;
|
|
41263
|
+
let _colDelimiter;
|
|
41264
|
+
let colDelimiterValue;
|
|
41265
|
+
if (allowBlankColDelimiter && this._isBlankScalarDelimiter(colDelimiter)) {
|
|
41266
|
+
_colDelimiter = colDelimiter;
|
|
41267
|
+
colDelimiterValue = [];
|
|
41268
|
+
} else {
|
|
41269
|
+
const { _variant: colDelimiterVariant, values } = this._getStringValues(colDelimiter);
|
|
41270
|
+
_colDelimiter = colDelimiterVariant;
|
|
41271
|
+
colDelimiterValue = values;
|
|
41272
|
+
}
|
|
40196
41273
|
const maxRowLength = Math.max(text.isArray() ? text.getRowCount() : 1, _ignoreEmpty.isArray() ? _ignoreEmpty.getRowCount() : 1, _matchMode.isArray() ? _matchMode.getRowCount() : 1);
|
|
40197
41274
|
const maxColumnLength = Math.max(text.isArray() ? text.getColumnCount() : 1, _ignoreEmpty.isArray() ? _ignoreEmpty.getColumnCount() : 1, _matchMode.isArray() ? _matchMode.getColumnCount() : 1);
|
|
40198
41275
|
const textArray = expandArrayValueObject(maxRowLength, maxColumnLength, text, ErrorValueObject.create("#N/A"));
|
|
@@ -40270,7 +41347,7 @@ var Textsplit = class extends BaseFunction {
|
|
|
40270
41347
|
const resultRows = textValue.split(rowDelimiterRegExp);
|
|
40271
41348
|
let resultColsMaxCount = 1;
|
|
40272
41349
|
let result = resultRows.map((row) => {
|
|
40273
|
-
let cols = row.split(colDelimiterRegExp);
|
|
41350
|
+
let cols = colDelimiterValue.length > 0 ? row.split(colDelimiterRegExp) : [row];
|
|
40274
41351
|
if (ignoreEmptyValue) cols = cols.filter((col) => col !== "");
|
|
40275
41352
|
resultColsMaxCount = Math.max(resultColsMaxCount, cols.length);
|
|
40276
41353
|
return cols;
|
|
@@ -40294,7 +41371,10 @@ var Textsplit = class extends BaseFunction {
|
|
|
40294
41371
|
if (valueObject.isNull()) value = "\\s";
|
|
40295
41372
|
if (valueObject.isBoolean()) value = value ? "TRUE" : "FALSE";
|
|
40296
41373
|
value += "";
|
|
40297
|
-
return
|
|
41374
|
+
return _univerjs_core.regexp.escapeRegExp(value);
|
|
41375
|
+
}
|
|
41376
|
+
_isBlankScalarDelimiter(valueObject) {
|
|
41377
|
+
return !valueObject.isArray() && (valueObject.isNull() || `${valueObject.getValue()}` === "");
|
|
40298
41378
|
}
|
|
40299
41379
|
};
|
|
40300
41380
|
|
|
@@ -40523,6 +41603,7 @@ const functionText = [
|
|
|
40523
41603
|
[Numbervalue, "NUMBERVALUE"],
|
|
40524
41604
|
[Regexextract, "REGEXEXTRACT"],
|
|
40525
41605
|
[Regexmatch, "REGEXMATCH"],
|
|
41606
|
+
[Regexmatch, "REGEXTEST"],
|
|
40526
41607
|
[Regexreplace, "REGEXREPLACE"],
|
|
40527
41608
|
[Proper, "PROPER"],
|
|
40528
41609
|
[Replace, "REPLACE"],
|
|
@@ -40590,6 +41671,58 @@ var Encodeurl = class extends BaseFunction {
|
|
|
40590
41671
|
}
|
|
40591
41672
|
};
|
|
40592
41673
|
|
|
41674
|
+
//#endregion
|
|
41675
|
+
//#region src/functions/web/filterxml/index.ts
|
|
41676
|
+
var Filterxml = class extends BaseFunction {
|
|
41677
|
+
constructor(..._args) {
|
|
41678
|
+
super(..._args);
|
|
41679
|
+
_defineProperty(this, "minParams", 2);
|
|
41680
|
+
_defineProperty(this, "maxParams", 2);
|
|
41681
|
+
}
|
|
41682
|
+
calculate(xml, xpath) {
|
|
41683
|
+
if (xml.isError()) return xml;
|
|
41684
|
+
if (xpath.isError()) return xpath;
|
|
41685
|
+
const tagName = getDescendantTagName(`${xpath.getValue()}`);
|
|
41686
|
+
if (tagName == null) return ErrorValueObject.create("#VALUE!");
|
|
41687
|
+
const values = extractTagTexts(`${xml.getValue()}`, tagName);
|
|
41688
|
+
if (values.length === 0) return ErrorValueObject.create("#VALUE!");
|
|
41689
|
+
return ArrayValueObject.create({
|
|
41690
|
+
calculateValueList: transformToValueObject(values.map((value) => [value])),
|
|
41691
|
+
rowCount: values.length,
|
|
41692
|
+
columnCount: 1,
|
|
41693
|
+
unitId: "",
|
|
41694
|
+
sheetId: "",
|
|
41695
|
+
row: 0,
|
|
41696
|
+
column: 0
|
|
41697
|
+
});
|
|
41698
|
+
}
|
|
41699
|
+
};
|
|
41700
|
+
function getDescendantTagName(xpath) {
|
|
41701
|
+
const text = xpath.trim();
|
|
41702
|
+
if (!text.startsWith("//")) return null;
|
|
41703
|
+
const tagName = text.slice(2).replace(/\/text\(\)$/, "").trim();
|
|
41704
|
+
return /^[A-Za-z0-9_.-]+$/.test(tagName) ? tagName : null;
|
|
41705
|
+
}
|
|
41706
|
+
function extractTagTexts(xml, tagName) {
|
|
41707
|
+
const open = `<${tagName}>`;
|
|
41708
|
+
const close = `</${tagName}>`;
|
|
41709
|
+
const values = [];
|
|
41710
|
+
let offset = 0;
|
|
41711
|
+
while (offset < xml.length) {
|
|
41712
|
+
const openIndex = xml.indexOf(open, offset);
|
|
41713
|
+
if (openIndex < 0) break;
|
|
41714
|
+
const valueStart = openIndex + open.length;
|
|
41715
|
+
const closeIndex = xml.indexOf(close, valueStart);
|
|
41716
|
+
if (closeIndex < 0) break;
|
|
41717
|
+
values.push(decodeXmlEntities(xml.slice(valueStart, closeIndex)));
|
|
41718
|
+
offset = closeIndex + close.length;
|
|
41719
|
+
}
|
|
41720
|
+
return values;
|
|
41721
|
+
}
|
|
41722
|
+
function decodeXmlEntities(value) {
|
|
41723
|
+
return value.replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&").replace(/"/g, "\"").replace(/'/g, "'");
|
|
41724
|
+
}
|
|
41725
|
+
|
|
40593
41726
|
//#endregion
|
|
40594
41727
|
//#region src/functions/web/function-map.ts
|
|
40595
41728
|
/**
|
|
@@ -40607,7 +41740,7 @@ var Encodeurl = class extends BaseFunction {
|
|
|
40607
41740
|
* See the License for the specific language governing permissions and
|
|
40608
41741
|
* limitations under the License.
|
|
40609
41742
|
*/
|
|
40610
|
-
const functionWeb = [[Encodeurl, "ENCODEURL"]];
|
|
41743
|
+
const functionWeb = [[Encodeurl, "ENCODEURL"], [Filterxml, "FILTERXML"]];
|
|
40611
41744
|
|
|
40612
41745
|
//#endregion
|
|
40613
41746
|
//#region src/functions/index.ts
|
|
@@ -40677,7 +41810,7 @@ function getObjectValue(result, isUseStrip = false) {
|
|
|
40677
41810
|
//#endregion
|
|
40678
41811
|
//#region package.json
|
|
40679
41812
|
var name = "@univerjs/engine-formula";
|
|
40680
|
-
var version = "1.0.0-alpha.
|
|
41813
|
+
var version = "1.0.0-alpha.3";
|
|
40681
41814
|
|
|
40682
41815
|
//#endregion
|
|
40683
41816
|
//#region src/services/global-computing-status.service.ts
|
|
@@ -40968,36 +42101,151 @@ SetOtherFormulaController = __decorate([
|
|
|
40968
42101
|
], SetOtherFormulaController);
|
|
40969
42102
|
|
|
40970
42103
|
//#endregion
|
|
40971
|
-
//#region src/services/
|
|
40972
|
-
|
|
40973
|
-
|
|
40974
|
-
|
|
40975
|
-
|
|
40976
|
-
|
|
40977
|
-
|
|
40978
|
-
|
|
40979
|
-
_defineProperty(this, "
|
|
42104
|
+
//#region src/services/formula-calculation-trigger.service.ts
|
|
42105
|
+
const LOCAL_ONLY = { onlyLocal: true };
|
|
42106
|
+
const CALCULATION_DEBOUNCE_TIME = 100;
|
|
42107
|
+
let FormulaCalculationTriggerService = class FormulaCalculationTriggerService extends _univerjs_core.Disposable {
|
|
42108
|
+
constructor(_commandService, _activeDirtyManagerService) {
|
|
42109
|
+
super();
|
|
42110
|
+
this._commandService = _commandService;
|
|
42111
|
+
this._activeDirtyManagerService = _activeDirtyManagerService;
|
|
42112
|
+
_defineProperty(this, "_waitingCommandQueue", []);
|
|
42113
|
+
_defineProperty(this, "_executingDirtyData", createEmptyDirtyData());
|
|
42114
|
+
_defineProperty(this, "_timer", void 0);
|
|
42115
|
+
_defineProperty(this, "_executionInProgress", false);
|
|
42116
|
+
_defineProperty(this, "_restartCalculation", false);
|
|
42117
|
+
this._initialize();
|
|
40980
42118
|
}
|
|
40981
42119
|
dispose() {
|
|
40982
|
-
this.
|
|
42120
|
+
clearTimeout(this._timer);
|
|
42121
|
+
this._waitingCommandQueue = [];
|
|
42122
|
+
this._executingDirtyData = createEmptyDirtyData();
|
|
42123
|
+
super.dispose();
|
|
40983
42124
|
}
|
|
40984
|
-
|
|
40985
|
-
this.
|
|
42125
|
+
_initialize() {
|
|
42126
|
+
this.disposeWithMe(this._commandService.onCommandExecuted((command, options) => {
|
|
42127
|
+
var _conversion$shouldTri;
|
|
42128
|
+
if (command.id === SetFormulaCalculationStartMutation.id) {
|
|
42129
|
+
this._executionInProgress = true;
|
|
42130
|
+
return;
|
|
42131
|
+
}
|
|
42132
|
+
if (command.id === SetFormulaCalculationNotificationMutation.id) {
|
|
42133
|
+
this._handleCalculationNotification(command.params);
|
|
42134
|
+
return;
|
|
42135
|
+
}
|
|
42136
|
+
const conversion = this._activeDirtyManagerService.get(command.id);
|
|
42137
|
+
if (!conversion) return;
|
|
42138
|
+
if (((_conversion$shouldTri = conversion.shouldTrigger) === null || _conversion$shouldTri === void 0 ? void 0 : _conversion$shouldTri.call(conversion, command, options)) === false) return;
|
|
42139
|
+
this._waitingCommandQueue.push(command);
|
|
42140
|
+
clearTimeout(this._timer);
|
|
42141
|
+
this._timer = setTimeout(() => this._flush(), CALCULATION_DEBOUNCE_TIME);
|
|
42142
|
+
}));
|
|
40986
42143
|
}
|
|
40987
|
-
|
|
40988
|
-
|
|
42144
|
+
_flush() {
|
|
42145
|
+
const dirtyData = this._generateDirty(this._waitingCommandQueue);
|
|
42146
|
+
this._waitingCommandQueue = [];
|
|
42147
|
+
this._timer = void 0;
|
|
42148
|
+
if (!hasDirtyData(dirtyData)) return;
|
|
42149
|
+
this._executingDirtyData = mergeDirtyData(this._executingDirtyData, dirtyData);
|
|
42150
|
+
if (this._executionInProgress) {
|
|
42151
|
+
this._restartCalculation = true;
|
|
42152
|
+
this._commandService.executeCommand(SetFormulaCalculationStopMutation.id, {}, LOCAL_ONLY);
|
|
42153
|
+
return;
|
|
42154
|
+
}
|
|
42155
|
+
this._startCalculation();
|
|
40989
42156
|
}
|
|
40990
|
-
|
|
40991
|
-
|
|
42157
|
+
_startCalculation() {
|
|
42158
|
+
this._executionInProgress = true;
|
|
42159
|
+
this._commandService.executeCommand(SetFormulaCalculationStartMutation.id, { ...this._executingDirtyData }, LOCAL_ONLY);
|
|
40992
42160
|
}
|
|
40993
|
-
|
|
40994
|
-
|
|
42161
|
+
_handleCalculationNotification(params) {
|
|
42162
|
+
if (params.stageInfo != null) {
|
|
42163
|
+
this._executionInProgress = true;
|
|
42164
|
+
return;
|
|
42165
|
+
}
|
|
42166
|
+
const state = params.functionsExecutedState;
|
|
42167
|
+
if (state == null) return;
|
|
42168
|
+
this._executionInProgress = false;
|
|
42169
|
+
if (state === 1 && this._restartCalculation) {
|
|
42170
|
+
this._restartCalculation = false;
|
|
42171
|
+
this._startCalculation();
|
|
42172
|
+
return;
|
|
42173
|
+
}
|
|
42174
|
+
this._restartCalculation = false;
|
|
42175
|
+
this._executingDirtyData = createEmptyDirtyData();
|
|
40995
42176
|
}
|
|
40996
|
-
|
|
40997
|
-
return
|
|
42177
|
+
_generateDirty(commands) {
|
|
42178
|
+
return commands.reduce((result, command) => {
|
|
42179
|
+
const conversion = this._activeDirtyManagerService.get(command.id);
|
|
42180
|
+
return conversion ? mergeDirtyData(result, conversion.getDirtyData(command)) : result;
|
|
42181
|
+
}, createEmptyDirtyData());
|
|
40998
42182
|
}
|
|
40999
42183
|
};
|
|
41000
|
-
|
|
42184
|
+
FormulaCalculationTriggerService = __decorate([__decorateParam(0, _univerjs_core.ICommandService), __decorateParam(1, IActiveDirtyManagerService)], FormulaCalculationTriggerService);
|
|
42185
|
+
function createEmptyDirtyData() {
|
|
42186
|
+
return {
|
|
42187
|
+
forceCalculation: false,
|
|
42188
|
+
dirtyRanges: [],
|
|
42189
|
+
dirtyNameMap: {},
|
|
42190
|
+
dirtyDefinedNameMap: {},
|
|
42191
|
+
dirtySuperTableMap: {},
|
|
42192
|
+
dirtyUnitFeatureMap: {},
|
|
42193
|
+
dirtyUnitOtherFormulaMap: {},
|
|
42194
|
+
clearDependencyTreeCache: {}
|
|
42195
|
+
};
|
|
42196
|
+
}
|
|
42197
|
+
function mergeDirtyData(left, right) {
|
|
42198
|
+
var _right$dirtyRanges, _left$dirtySuperTable;
|
|
42199
|
+
const dirtyRanges = [...left.dirtyRanges];
|
|
42200
|
+
mergeDirtyRanges(dirtyRanges, (_right$dirtyRanges = right.dirtyRanges) !== null && _right$dirtyRanges !== void 0 ? _right$dirtyRanges : []);
|
|
42201
|
+
return {
|
|
42202
|
+
dirtyRanges,
|
|
42203
|
+
dirtyNameMap: mergeDirtyUnitStringMap(left.dirtyNameMap, right.dirtyNameMap),
|
|
42204
|
+
dirtyDefinedNameMap: mergeDirtyUnitStringMap(left.dirtyDefinedNameMap, right.dirtyDefinedNameMap),
|
|
42205
|
+
dirtySuperTableMap: mergeDirtyUnitStringMap((_left$dirtySuperTable = left.dirtySuperTableMap) !== null && _left$dirtySuperTable !== void 0 ? _left$dirtySuperTable : {}, right.dirtySuperTableMap),
|
|
42206
|
+
dirtyUnitFeatureMap: mergeDirtyUnitNestedMap(left.dirtyUnitFeatureMap, right.dirtyUnitFeatureMap),
|
|
42207
|
+
dirtyUnitOtherFormulaMap: mergeDirtyUnitNestedMap(left.dirtyUnitOtherFormulaMap, right.dirtyUnitOtherFormulaMap),
|
|
42208
|
+
clearDependencyTreeCache: mergeDirtyUnitStringMap(left.clearDependencyTreeCache, right.clearDependencyTreeCache),
|
|
42209
|
+
forceCalculation: left.forceCalculation || Boolean(right.forceCalculation)
|
|
42210
|
+
};
|
|
42211
|
+
}
|
|
42212
|
+
function mergeDirtyRanges(target, source) {
|
|
42213
|
+
source.forEach((range) => {
|
|
42214
|
+
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);
|
|
42215
|
+
});
|
|
42216
|
+
}
|
|
42217
|
+
function mergeDirtyUnitStringMap(left, right) {
|
|
42218
|
+
const result = { ...left };
|
|
42219
|
+
Object.entries(right !== null && right !== void 0 ? right : {}).forEach(([unitId, values]) => {
|
|
42220
|
+
result[unitId] = {
|
|
42221
|
+
...result[unitId],
|
|
42222
|
+
...values
|
|
42223
|
+
};
|
|
42224
|
+
});
|
|
42225
|
+
return result;
|
|
42226
|
+
}
|
|
42227
|
+
function mergeDirtyUnitNestedMap(left, right) {
|
|
42228
|
+
const result = { ...left };
|
|
42229
|
+
Object.entries(right !== null && right !== void 0 ? right : {}).forEach(([unitId, sheets]) => {
|
|
42230
|
+
const unitResult = { ...result[unitId] };
|
|
42231
|
+
Object.entries(sheets !== null && sheets !== void 0 ? sheets : {}).forEach(([sheetId, values]) => {
|
|
42232
|
+
unitResult[sheetId] = {
|
|
42233
|
+
...unitResult[sheetId],
|
|
42234
|
+
...values
|
|
42235
|
+
};
|
|
42236
|
+
});
|
|
42237
|
+
result[unitId] = unitResult;
|
|
42238
|
+
});
|
|
42239
|
+
return result;
|
|
42240
|
+
}
|
|
42241
|
+
function hasDirtyData(dirtyData) {
|
|
42242
|
+
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);
|
|
42243
|
+
}
|
|
42244
|
+
function hasNestedValue(value) {
|
|
42245
|
+
if (value == null) return false;
|
|
42246
|
+
if (typeof value !== "object") return true;
|
|
42247
|
+
return Object.values(value).some(hasNestedValue);
|
|
42248
|
+
}
|
|
41001
42249
|
|
|
41002
42250
|
//#endregion
|
|
41003
42251
|
//#region src/services/formula-common.ts
|
|
@@ -41199,7 +42447,7 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends _univerj
|
|
|
41199
42447
|
}
|
|
41200
42448
|
onReady() {
|
|
41201
42449
|
var _this$_config;
|
|
41202
|
-
(0, _univerjs_core.touchDependencies)(this._injector, [[FormulaController]]);
|
|
42450
|
+
(0, _univerjs_core.touchDependencies)(this._injector, [[FormulaController], [SuperTableActiveDirtyController]]);
|
|
41203
42451
|
if (!((_this$_config = this._config) === null || _this$_config === void 0 ? void 0 : _this$_config.notExecuteFormula)) (0, _univerjs_core.touchDependencies)(this._injector, [
|
|
41204
42452
|
[SetOtherFormulaController],
|
|
41205
42453
|
[SetFeatureCalculationController],
|
|
@@ -41217,6 +42465,7 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends _univerj
|
|
|
41217
42465
|
[IFunctionService, { useClass: FunctionService }],
|
|
41218
42466
|
[IDefinedNamesService, { useClass: DefinedNamesService }],
|
|
41219
42467
|
[IActiveDirtyManagerService, { useClass: ActiveDirtyManagerService }],
|
|
42468
|
+
[FormulaCalculationTriggerService],
|
|
41220
42469
|
[RegisterOtherFormulaService],
|
|
41221
42470
|
[IHyperlinkEngineFormulaService, { useClass: HyperlinkEngineFormulaService }],
|
|
41222
42471
|
[ISheetRowFilteredService, { useClass: SheetRowFilteredService }],
|
|
@@ -41224,6 +42473,7 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends _univerj
|
|
|
41224
42473
|
[GlobalComputingStatusService],
|
|
41225
42474
|
[FormulaDataModel],
|
|
41226
42475
|
[FormulaController],
|
|
42476
|
+
[SuperTableActiveDirtyController],
|
|
41227
42477
|
[ComputingStatusReporterController]
|
|
41228
42478
|
];
|
|
41229
42479
|
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]);
|
|
@@ -41316,6 +42566,12 @@ exports.FUNCTION_NAMES_TEXT = FUNCTION_NAMES_TEXT;
|
|
|
41316
42566
|
exports.FUNCTION_NAMES_UNIVER = FUNCTION_NAMES_UNIVER;
|
|
41317
42567
|
exports.FUNCTION_NAMES_WEB = FUNCTION_NAMES_WEB;
|
|
41318
42568
|
exports.FeatureCalculationManagerService = FeatureCalculationManagerService;
|
|
42569
|
+
Object.defineProperty(exports, 'FormulaCalculationTriggerService', {
|
|
42570
|
+
enumerable: true,
|
|
42571
|
+
get: function () {
|
|
42572
|
+
return FormulaCalculationTriggerService;
|
|
42573
|
+
}
|
|
42574
|
+
});
|
|
41319
42575
|
Object.defineProperty(exports, 'FormulaCurrentConfigService', {
|
|
41320
42576
|
enumerable: true,
|
|
41321
42577
|
get: function () {
|
|
@@ -41467,6 +42723,12 @@ Object.defineProperty(exports, 'SuffixNodeFactory', {
|
|
|
41467
42723
|
return SuffixNodeFactory;
|
|
41468
42724
|
}
|
|
41469
42725
|
});
|
|
42726
|
+
Object.defineProperty(exports, 'SuperTableActiveDirtyController', {
|
|
42727
|
+
enumerable: true,
|
|
42728
|
+
get: function () {
|
|
42729
|
+
return SuperTableActiveDirtyController;
|
|
42730
|
+
}
|
|
42731
|
+
});
|
|
41470
42732
|
exports.SuperTableService = SuperTableService;
|
|
41471
42733
|
Object.defineProperty(exports, 'UnionNodeFactory', {
|
|
41472
42734
|
enumerable: true,
|