@univerjs/engine-formula 1.0.0-alpha.2 → 1.0.0-alpha.4
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 +2017 -356
- package/lib/es/facade.js +9 -5
- package/lib/es/index.js +1999 -359
- package/lib/facade.js +9 -5
- package/lib/index.js +1999 -359
- package/lib/types/basics/common.d.ts +16 -1
- package/lib/types/basics/date.d.ts +2 -2
- package/lib/types/basics/regex.d.ts +4 -4
- package/lib/types/commands/mutations/set-super-table.mutation.d.ts +4 -1
- package/lib/types/controllers/formula-calculation-trigger.controller.d.ts +20 -0
- package/lib/types/controllers/super-table-active-dirty.controller.d.ts +22 -0
- package/lib/types/engine/analysis/lexer-node.d.ts +3 -3
- 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 +9 -2
- 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/ast-node/reference-node.d.ts +14 -4
- package/lib/types/engine/interpreter/interpreter.d.ts +11 -0
- package/lib/types/engine/reference-object/base-reference-object.d.ts +3 -0
- package/lib/types/engine/reference-object/cell-reference-object.d.ts +1 -0
- package/lib/types/engine/reference-object/table-reference-object.d.ts +2 -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/utils/reference.d.ts +3 -5
- package/lib/types/engine/utils/unit-qualifier.d.ts +32 -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 +21 -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 +2 -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 +7 -2
- package/lib/types/models/formula-data.model.d.ts +4 -2
- 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/current-data.service.d.ts +6 -1
- package/lib/types/services/defined-names.service.d.ts +2 -2
- package/lib/types/services/formula-calculation-trigger.service.d.ts +43 -0
- package/lib/types/services/runtime.service.d.ts +6 -0
- package/lib/types/services/unit-reference-resolver.service.d.ts +39 -0
- package/lib/umd/index.js +5 -2
- package/package.json +5 -5
package/lib/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { AbsoluteRefType, AsyncLock, BooleanNumber, BuildTextUtils, CellValueType, CommandType, DataStreamTreeTokenType, Disposable, DisposableCollection, ICommandService, IConfigService, IUniverInstanceService, Inject, Injector, LRUMap, LifecycleService, LocaleService, LocaleType, MAX_COLUMN_COUNT, MAX_ROW_COUNT, ObjectMatrix, Optional, Plugin, RANGE_TYPE, RTree, Rectangle, RichTextBuilder, Styles, Tools, UniverInstanceType, cellToRange, columnLabelToNumber, createIdentifier,
|
|
1
|
+
import { AbsoluteRefType, AsyncLock, BooleanNumber, BuildTextUtils, CellValueType, CommandType, DataStreamTreeTokenType, Disposable, DisposableCollection, ICommandService, IConfigService, IUniverInstanceService, Inject, Injector, LRUMap, LifecycleService, LifecycleStages, LocaleService, LocaleType, MAX_COLUMN_COUNT, MAX_ROW_COUNT, ObjectMatrix, Optional, Plugin, RANGE_TYPE, RTree, Rectangle, RichTextBuilder, Styles, Tools, UniverInstanceType, cellToRange, columnLabelToNumber, createIdentifier, generateRandomId, getNumfmtParseValueFilter, hashAlgorithm, isFormulaId, isFormulaString, isNodeEnv, isNullCell, isRealNum, isTextFormat, isValidRange, merge, moveRangeByOffset, numfmt, regexp, requestImmediateMacroTask, sortRules, toDisposable, touchDependencies } from "@univerjs/core";
|
|
2
2
|
import IntervalTree from "@flatten-js/interval-tree";
|
|
3
|
-
import { BehaviorSubject, Observable, Subject, bufferWhen, combineLatest, distinctUntilChanged, filter, map, shareReplay, skip } from "rxjs";
|
|
3
|
+
import { BehaviorSubject, Observable, Subject, bufferWhen, combineLatest, distinctUntilChanged, filter, map, shareReplay, skip, take } from "rxjs";
|
|
4
4
|
import Decimal from "decimal.js";
|
|
5
5
|
import { DataSyncPrimaryController } from "@univerjs/rpc";
|
|
6
6
|
|
|
@@ -478,12 +478,14 @@ var BaseValueObject = class extends ObjectClassType {
|
|
|
478
478
|
return ErrorValueObject.create("#NAME?");
|
|
479
479
|
}
|
|
480
480
|
concatenate(value, concatenateType = 0) {
|
|
481
|
-
let currentValue = this.getValue()
|
|
481
|
+
let currentValue = formatValueForFormulaText(this.getValue());
|
|
482
482
|
if (typeof value === "string") if (concatenateType === 0) currentValue = value + currentValue;
|
|
483
483
|
else currentValue += value;
|
|
484
|
-
else if (typeof value === "number")
|
|
485
|
-
|
|
486
|
-
|
|
484
|
+
else if (typeof value === "number") {
|
|
485
|
+
const numberString = formatNumberForFormulaText(value);
|
|
486
|
+
if (concatenateType === 0) currentValue = numberString + currentValue;
|
|
487
|
+
else currentValue += numberString;
|
|
488
|
+
} else if (typeof value === "boolean") {
|
|
487
489
|
const booleanString = value ? "TRUE" : "FALSE";
|
|
488
490
|
if (concatenateType === 0) currentValue = booleanString + currentValue;
|
|
489
491
|
else currentValue += booleanString;
|
|
@@ -649,6 +651,16 @@ var BaseValueObject = class extends ObjectClassType {
|
|
|
649
651
|
return ErrorValueObject.create("#VALUE!");
|
|
650
652
|
}
|
|
651
653
|
};
|
|
654
|
+
function formatValueForFormulaText(value) {
|
|
655
|
+
if (typeof value === "number") return formatNumberForFormulaText(value);
|
|
656
|
+
if (typeof value === "boolean") return value ? "TRUE" : "FALSE";
|
|
657
|
+
return value == null ? "" : value.toString();
|
|
658
|
+
}
|
|
659
|
+
function formatNumberForFormulaText(value) {
|
|
660
|
+
if (!Number.isFinite(value)) return value.toString();
|
|
661
|
+
const rounded = Number(value.toPrecision(15));
|
|
662
|
+
return Object.is(rounded, -0) ? "0" : rounded.toString();
|
|
663
|
+
}
|
|
652
664
|
const Error_CACHE_LRU_COUNT = 1e3;
|
|
653
665
|
const ErrorValueObjectCache = new FormulaAstLRU(Error_CACHE_LRU_COUNT);
|
|
654
666
|
var ErrorValueObject = class ErrorValueObject extends BaseValueObject {
|
|
@@ -681,6 +693,12 @@ var ErrorValueObject = class ErrorValueObject extends BaseValueObject {
|
|
|
681
693
|
isError() {
|
|
682
694
|
return true;
|
|
683
695
|
}
|
|
696
|
+
concatenateFront(_valueObject) {
|
|
697
|
+
return this;
|
|
698
|
+
}
|
|
699
|
+
concatenateBack(_valueObject) {
|
|
700
|
+
return this;
|
|
701
|
+
}
|
|
684
702
|
};
|
|
685
703
|
|
|
686
704
|
//#endregion
|
|
@@ -751,6 +769,43 @@ function parseFormattedDate(value) {
|
|
|
751
769
|
function parseFormattedTime(value) {
|
|
752
770
|
return numfmt.parseTime(value);
|
|
753
771
|
}
|
|
772
|
+
function parseEnglishMonthNameDate(value) {
|
|
773
|
+
const match = value.trim().match(/^(\d{1,2})\s*([A-Za-z]{3,9})\s*(\d{2,4})$/);
|
|
774
|
+
if (!match) return null;
|
|
775
|
+
const [, dayText, monthText, yearText] = match;
|
|
776
|
+
const month = {
|
|
777
|
+
jan: 0,
|
|
778
|
+
january: 0,
|
|
779
|
+
feb: 1,
|
|
780
|
+
february: 1,
|
|
781
|
+
mar: 2,
|
|
782
|
+
march: 2,
|
|
783
|
+
apr: 3,
|
|
784
|
+
april: 3,
|
|
785
|
+
may: 4,
|
|
786
|
+
jun: 5,
|
|
787
|
+
june: 5,
|
|
788
|
+
jul: 6,
|
|
789
|
+
july: 6,
|
|
790
|
+
aug: 7,
|
|
791
|
+
august: 7,
|
|
792
|
+
sep: 8,
|
|
793
|
+
sept: 8,
|
|
794
|
+
september: 8,
|
|
795
|
+
oct: 9,
|
|
796
|
+
october: 9,
|
|
797
|
+
nov: 10,
|
|
798
|
+
november: 10,
|
|
799
|
+
dec: 11,
|
|
800
|
+
december: 11
|
|
801
|
+
}[monthText.toLowerCase()];
|
|
802
|
+
if (month == null) return null;
|
|
803
|
+
const day = Number(dayText);
|
|
804
|
+
const year = Number(yearText.length === 2 ? `20${yearText}` : yearText);
|
|
805
|
+
const date = new Date(Date.UTC(year, month, day));
|
|
806
|
+
if (date.getUTCFullYear() !== year || date.getUTCMonth() !== month || date.getUTCDate() !== day) return null;
|
|
807
|
+
return date;
|
|
808
|
+
}
|
|
754
809
|
function isDate(format) {
|
|
755
810
|
return numfmt.getFormatInfo(format).isDate;
|
|
756
811
|
}
|
|
@@ -829,6 +884,7 @@ function getDateSerialNumberByObject(serialNumberObject) {
|
|
|
829
884
|
let dateSerial;
|
|
830
885
|
if (parseFormattedDate(`${dateValue}`)) dateSerial = parseFormattedDate(`${dateValue}`).v;
|
|
831
886
|
else if (parseFormattedTime(`${dateValue}`)) dateSerial = parseFormattedTime(`${dateValue}`).v;
|
|
887
|
+
else if (parseEnglishMonthNameDate(`${dateValue}`)) dateSerial = parseEnglishMonthNameDate(`${dateValue}`);
|
|
832
888
|
else if (isRealNum(dateValue)) dateSerial = +dateValue;
|
|
833
889
|
else return ErrorValueObject.create("#VALUE!");
|
|
834
890
|
if (dateSerial instanceof Date) dateSerial = excelDateTimeSerial(dateSerial);
|
|
@@ -876,10 +932,11 @@ function getDaysByNASD(startDateSerialNumber, endDateSerialNumber) {
|
|
|
876
932
|
let endYear = endDateSerialNumber > 0 ? endDateDate.getUTCFullYear() : 1900;
|
|
877
933
|
let endMonth = endDateSerialNumber > 0 ? endDateDate.getUTCMonth() + 1 : 1;
|
|
878
934
|
let endDay = endDateSerialNumber > 0 ? endDateDate.getUTCDate() : 0;
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
if (endDay ===
|
|
935
|
+
const startIsLastDayOfFebruary = startMonth === 2 && startDay === getDaysInMonth(startYear, startMonth - 1);
|
|
936
|
+
if (startIsLastDayOfFebruary) startDay = 30;
|
|
937
|
+
else if (startDay === 31) startDay = 30;
|
|
938
|
+
if (endMonth === 2 && endDay === getDaysInMonth(endYear, endMonth - 1) && startIsLastDayOfFebruary) endDay = 30;
|
|
939
|
+
else if (endDay === 31) if (startDay < 30) {
|
|
883
940
|
endDateDate = excelSerialToDate(endDateSerialNumber + 1);
|
|
884
941
|
endYear = endDateDate.getUTCFullYear();
|
|
885
942
|
endMonth = endDateDate.getUTCMonth() + 1;
|
|
@@ -1166,16 +1223,19 @@ var InvertedIndexCache = class {
|
|
|
1166
1223
|
};
|
|
1167
1224
|
const _value = normalizeValue(value);
|
|
1168
1225
|
if (ERROR_TYPE_SET.has(_value)) result.errorType = _value;
|
|
1169
|
-
else if (_value === 0
|
|
1226
|
+
else if (_value === 0) {
|
|
1170
1227
|
const rows = [];
|
|
1171
1228
|
const rowsForZero = columnMap.get(0);
|
|
1172
1229
|
if (rowsForZero) rows.push(...rowsForZero);
|
|
1173
1230
|
const rowsForEmpty = columnMap.get(DEFAULT_EMPTY_CELL_KEY);
|
|
1174
1231
|
if (rowsForEmpty) rows.push(...rowsForEmpty);
|
|
1175
1232
|
result.matchingRows = rows.filter((row) => rowsInCache.some(([start, end]) => row >= start && row <= end));
|
|
1176
|
-
} else {
|
|
1233
|
+
} else if (_value === DEFAULT_EMPTY_CELL_KEY) {
|
|
1177
1234
|
var _columnMap$get;
|
|
1178
|
-
result.matchingRows = Array.from((_columnMap$get = columnMap.get(
|
|
1235
|
+
result.matchingRows = Array.from((_columnMap$get = columnMap.get(DEFAULT_EMPTY_CELL_KEY)) !== null && _columnMap$get !== void 0 ? _columnMap$get : []).filter((row) => rowsInCache.some(([start, end]) => row >= start && row <= end));
|
|
1236
|
+
} else {
|
|
1237
|
+
var _columnMap$get2;
|
|
1238
|
+
result.matchingRows = Array.from((_columnMap$get2 = columnMap.get(_value)) !== null && _columnMap$get2 !== void 0 ? _columnMap$get2 : []).filter((row) => rowsInCache.some(([start, end]) => row >= start && row <= end));
|
|
1179
1239
|
}
|
|
1180
1240
|
return result;
|
|
1181
1241
|
}
|
|
@@ -1391,12 +1451,13 @@ const REFERENCE_REGEX_SINGLE_COLUMN = `^${UNIT_NAME_SHEET_NAME_REGEX}\\s*?\\${"$
|
|
|
1391
1451
|
const REFERENCE_REGEX_SINGLE_COLUMN_PRECOMPILING = new RegExp(REFERENCE_REGEX_SINGLE_COLUMN);
|
|
1392
1452
|
const TABLE_NAME_REGEX = "((?![~!@#$%^&*()_+<>?:,./;’,。、‘:“《》?~!@#¥%……()【】\\[\\]\\/\\\\]).)+";
|
|
1393
1453
|
const TABLE_TITLE_REGEX = "\\[#.+\\]\\s*?,\\s*?";
|
|
1394
|
-
const TABLE_CONTENT_REGEX = "\\[((?<!#)
|
|
1454
|
+
const TABLE_CONTENT_REGEX = "\\[((?<!#)[\\s\\S])*\\]";
|
|
1395
1455
|
const TABLE_MULTIPLE_COLUMN_REGEX = `${TABLE_CONTENT_REGEX}${RANGE_SYMBOL}${TABLE_CONTENT_REGEX}`;
|
|
1396
|
-
const
|
|
1397
|
-
const
|
|
1398
|
-
const
|
|
1399
|
-
const
|
|
1456
|
+
const TABLE_UNIT_QUALIFIER_REGEX = `(?:(?:${UNIT_NAME_REGEX}|'(?:[^']|'')+'|[^\\s!\\[\\]]+)!)?(?:${UNIT_NAME_REGEX})?`;
|
|
1457
|
+
const REFERENCE_TABLE_ALL_COLUMN_REGEX = `^${TABLE_UNIT_QUALIFIER_REGEX}${TABLE_NAME_REGEX}$`;
|
|
1458
|
+
const REFERENCE_TABLE_SINGLE_COLUMN_REGEX = `^${TABLE_UNIT_QUALIFIER_REGEX}${TABLE_NAME_REGEX}(${TABLE_CONTENT_REGEX}|\\[${TABLE_TITLE_REGEX}${TABLE_CONTENT_REGEX}\\])+$`;
|
|
1459
|
+
const REFERENCE_TABLE_MULTIPLE_COLUMN_REGEX = `^${TABLE_UNIT_QUALIFIER_REGEX}${TABLE_NAME_REGEX}(\\[${TABLE_MULTIPLE_COLUMN_REGEX}\\])?$|^${TABLE_UNIT_QUALIFIER_REGEX}${TABLE_NAME_REGEX}(\\[${TABLE_TITLE_REGEX}${TABLE_MULTIPLE_COLUMN_REGEX}\\])?$`;
|
|
1460
|
+
const REFERENCE_TABLE_TITLE_ONLY_ANY_HASH_REGEX = `^${TABLE_UNIT_QUALIFIER_REGEX}${TABLE_NAME_REGEX}\\[\\s*#([^\\]]+)\\s*\\]$`;
|
|
1400
1461
|
const REFERENCE_TABLE_ALL_COLUMN_REGEX_PRECOMPILING = new RegExp(REFERENCE_TABLE_ALL_COLUMN_REGEX);
|
|
1401
1462
|
const REFERENCE_TABLE_SINGLE_COLUMN_REGEX_PRECOMPILING = new RegExp(REFERENCE_TABLE_SINGLE_COLUMN_REGEX);
|
|
1402
1463
|
const REFERENCE_TABLE_MULTIPLE_COLUMN_REGEX_PRECOMPILING = new RegExp(REFERENCE_TABLE_MULTIPLE_COLUMN_REGEX);
|
|
@@ -1647,10 +1708,10 @@ function singleReferenceToGrid(refBody) {
|
|
|
1647
1708
|
}
|
|
1648
1709
|
function handleRefStringInfo(refString) {
|
|
1649
1710
|
const unitIdMatch = UNIT_NAME_REGEX_PRECOMPILING.exec(refString);
|
|
1650
|
-
let
|
|
1711
|
+
let unitQualifier = "";
|
|
1651
1712
|
if (unitIdMatch != null) {
|
|
1652
|
-
|
|
1653
|
-
|
|
1713
|
+
unitQualifier = unitIdMatch[0].trim();
|
|
1714
|
+
unitQualifier = unquoteSheetName(unitQualifier.slice(1, unitQualifier.length - 1));
|
|
1654
1715
|
refString = refString.replace(UNIT_NAME_REGEX_PRECOMPILING, "");
|
|
1655
1716
|
}
|
|
1656
1717
|
const sheetNameIndex = refString.indexOf("!");
|
|
@@ -1665,11 +1726,13 @@ function handleRefStringInfo(refString) {
|
|
|
1665
1726
|
return {
|
|
1666
1727
|
refBody,
|
|
1667
1728
|
sheetName,
|
|
1668
|
-
|
|
1729
|
+
unitQualifier,
|
|
1730
|
+
/** @deprecated Use unitQualifier. Kept for reference-grid compatibility. */
|
|
1731
|
+
unitId: unitQualifier
|
|
1669
1732
|
};
|
|
1670
1733
|
}
|
|
1671
1734
|
function deserializeRangeWithSheet(refString) {
|
|
1672
|
-
const { refBody, sheetName,
|
|
1735
|
+
const { refBody, sheetName, unitQualifier } = handleRefStringInfo(refString);
|
|
1673
1736
|
const colonIndex = refBody.indexOf(":");
|
|
1674
1737
|
if (colonIndex === -1) {
|
|
1675
1738
|
const grid = singleReferenceToGrid(refBody);
|
|
@@ -1677,7 +1740,7 @@ function deserializeRangeWithSheet(refString) {
|
|
|
1677
1740
|
const column = grid.column;
|
|
1678
1741
|
const absoluteRefType = grid.absoluteRefType;
|
|
1679
1742
|
return {
|
|
1680
|
-
unitId,
|
|
1743
|
+
unitId: unitQualifier,
|
|
1681
1744
|
sheetName,
|
|
1682
1745
|
range: {
|
|
1683
1746
|
startRow: row,
|
|
@@ -1701,7 +1764,7 @@ function deserializeRangeWithSheet(refString) {
|
|
|
1701
1764
|
if (Number.isNaN(startRow) && Number.isNaN(endRow)) rangeType = RANGE_TYPE.COLUMN;
|
|
1702
1765
|
else if (Number.isNaN(startColumn) && Number.isNaN(endColumn)) rangeType = RANGE_TYPE.ROW;
|
|
1703
1766
|
return {
|
|
1704
|
-
unitId,
|
|
1767
|
+
unitId: unitQualifier,
|
|
1705
1768
|
sheetName,
|
|
1706
1769
|
range: {
|
|
1707
1770
|
startRow,
|
|
@@ -1835,14 +1898,49 @@ function startsWithNonAlphabetic(name) {
|
|
|
1835
1898
|
return !/^\p{Letter}/u.test(name.charAt(0));
|
|
1836
1899
|
}
|
|
1837
1900
|
function splitTableStructuredRef(ref) {
|
|
1838
|
-
|
|
1901
|
+
let unitQualifier = "";
|
|
1902
|
+
let tableRef = ref.trim();
|
|
1903
|
+
let quoteOpen = false;
|
|
1904
|
+
let bracketDepth = 0;
|
|
1905
|
+
let qualifierEnd = -1;
|
|
1906
|
+
for (let i = 0; i < tableRef.length; i++) {
|
|
1907
|
+
const char = tableRef[i];
|
|
1908
|
+
if (char === "'") {
|
|
1909
|
+
if (quoteOpen && tableRef[i + 1] === "'") {
|
|
1910
|
+
i++;
|
|
1911
|
+
continue;
|
|
1912
|
+
}
|
|
1913
|
+
quoteOpen = !quoteOpen;
|
|
1914
|
+
} else if (!quoteOpen && char === "[") bracketDepth++;
|
|
1915
|
+
else if (!quoteOpen && char === "]") bracketDepth--;
|
|
1916
|
+
else if (!quoteOpen && bracketDepth === 0 && char === "!") {
|
|
1917
|
+
qualifierEnd = i;
|
|
1918
|
+
break;
|
|
1919
|
+
}
|
|
1920
|
+
}
|
|
1921
|
+
if (qualifierEnd >= 0) {
|
|
1922
|
+
unitQualifier = tableRef.slice(0, qualifierEnd).trim();
|
|
1923
|
+
tableRef = tableRef.slice(qualifierEnd + 1);
|
|
1924
|
+
if (unitQualifier.startsWith("'") && unitQualifier.endsWith("'")) unitQualifier = unitQualifier.slice(1, -1);
|
|
1925
|
+
if (unitQualifier.startsWith("[") && unitQualifier.endsWith("]")) unitQualifier = unitQualifier.slice(1, -1);
|
|
1926
|
+
unitQualifier = unquoteSheetName(unitQualifier);
|
|
1927
|
+
} else if (tableRef.startsWith("[")) {
|
|
1928
|
+
const legacyQualifierEnd = tableRef.indexOf("]");
|
|
1929
|
+
if (legacyQualifierEnd > 0) {
|
|
1930
|
+
unitQualifier = unquoteSheetName(tableRef.slice(1, legacyQualifierEnd));
|
|
1931
|
+
tableRef = tableRef.slice(legacyQualifierEnd + 1);
|
|
1932
|
+
}
|
|
1933
|
+
}
|
|
1934
|
+
const idx = tableRef.indexOf("[");
|
|
1839
1935
|
if (idx === -1) return {
|
|
1840
|
-
|
|
1841
|
-
|
|
1936
|
+
unitQualifier,
|
|
1937
|
+
tableName: tableRef,
|
|
1938
|
+
columnStruct: ""
|
|
1842
1939
|
};
|
|
1843
1940
|
return {
|
|
1844
|
-
|
|
1845
|
-
|
|
1941
|
+
unitQualifier,
|
|
1942
|
+
tableName: tableRef.slice(0, idx),
|
|
1943
|
+
columnStruct: tableRef.slice(idx)
|
|
1846
1944
|
};
|
|
1847
1945
|
}
|
|
1848
1946
|
|
|
@@ -1970,16 +2068,38 @@ let DefinedNamesService = class DefinedNamesService extends Disposable {
|
|
|
1970
2068
|
getDefinedNameMap(unitId) {
|
|
1971
2069
|
return this._definedNameMap[unitId];
|
|
1972
2070
|
}
|
|
1973
|
-
getValueByName(unitId, name) {
|
|
1974
|
-
const cachedMap = this._nameCacheMap[unitId];
|
|
1975
|
-
if (cachedMap) return cachedMap[name.toLowerCase()] || null;
|
|
2071
|
+
getValueByName(unitId, name, sheetId) {
|
|
1976
2072
|
const nameMap = this._definedNameMap[unitId];
|
|
1977
2073
|
if (nameMap === void 0) return null;
|
|
2074
|
+
if (sheetId) {
|
|
2075
|
+
var _workbookScope;
|
|
2076
|
+
const normalizedName = name.toLowerCase();
|
|
2077
|
+
let workbookScope = null;
|
|
2078
|
+
let firstMatch = null;
|
|
2079
|
+
for (const item of Object.values(nameMap)) {
|
|
2080
|
+
if (item.name.toLowerCase() !== normalizedName) continue;
|
|
2081
|
+
if (firstMatch == null) firstMatch = item;
|
|
2082
|
+
if (item.localSheetId === sheetId) return item;
|
|
2083
|
+
if (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null) {
|
|
2084
|
+
if (workbookScope == null) workbookScope = item;
|
|
2085
|
+
}
|
|
2086
|
+
}
|
|
2087
|
+
return (_workbookScope = workbookScope) !== null && _workbookScope !== void 0 ? _workbookScope : firstMatch;
|
|
2088
|
+
}
|
|
2089
|
+
const cachedMap = this._nameCacheMap[unitId];
|
|
2090
|
+
if (cachedMap) return cachedMap[name.toLowerCase()] || null;
|
|
1978
2091
|
let result = null;
|
|
1979
|
-
|
|
2092
|
+
const normalizedName = name.toLowerCase();
|
|
2093
|
+
for (const item of Object.values(nameMap)) if (item.name.toLowerCase() === normalizedName && (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null)) {
|
|
1980
2094
|
result = item;
|
|
1981
2095
|
break;
|
|
1982
2096
|
}
|
|
2097
|
+
if (!result) {
|
|
2098
|
+
for (const item of Object.values(nameMap)) if (item.name.toLowerCase() === normalizedName) {
|
|
2099
|
+
result = item;
|
|
2100
|
+
break;
|
|
2101
|
+
}
|
|
2102
|
+
}
|
|
1983
2103
|
if (result) {
|
|
1984
2104
|
this._nameCacheMap[unitId] = this._nameCacheMap[unitId] || {};
|
|
1985
2105
|
this._nameCacheMap[unitId][name.toLowerCase()] = result;
|
|
@@ -2014,7 +2134,10 @@ let DefinedNamesService = class DefinedNamesService extends Disposable {
|
|
|
2014
2134
|
return;
|
|
2015
2135
|
}
|
|
2016
2136
|
this._nameCacheMap[unitId] = {};
|
|
2017
|
-
for (const item of Object.values(nameMap))
|
|
2137
|
+
for (const item of Object.values(nameMap)) {
|
|
2138
|
+
const normalizedName = item.name.toLowerCase();
|
|
2139
|
+
if (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null || this._nameCacheMap[unitId][normalizedName] == null) this._nameCacheMap[unitId][normalizedName] = item;
|
|
2140
|
+
}
|
|
2018
2141
|
}
|
|
2019
2142
|
_isDeepDefinedNameMapEmpty() {
|
|
2020
2143
|
for (const unitId in this._definedNameMap) if (this.hasDefinedName(unitId)) return false;
|
|
@@ -2587,6 +2710,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
|
|
|
2587
2710
|
FUNCTION_NAMES_LOGICAL["BYCOL"] = "BYCOL";
|
|
2588
2711
|
FUNCTION_NAMES_LOGICAL["BYROW"] = "BYROW";
|
|
2589
2712
|
FUNCTION_NAMES_LOGICAL["FALSE"] = "FALSE";
|
|
2713
|
+
FUNCTION_NAMES_LOGICAL["GROUPBY"] = "GROUPBY";
|
|
2590
2714
|
FUNCTION_NAMES_LOGICAL["IF"] = "IF";
|
|
2591
2715
|
FUNCTION_NAMES_LOGICAL["IFERROR"] = "IFERROR";
|
|
2592
2716
|
FUNCTION_NAMES_LOGICAL["IFNA"] = "IFNA";
|
|
@@ -2597,6 +2721,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
|
|
|
2597
2721
|
FUNCTION_NAMES_LOGICAL["MAP"] = "MAP";
|
|
2598
2722
|
FUNCTION_NAMES_LOGICAL["NOT"] = "NOT";
|
|
2599
2723
|
FUNCTION_NAMES_LOGICAL["OR"] = "OR";
|
|
2724
|
+
FUNCTION_NAMES_LOGICAL["PERCENTOF"] = "PERCENTOF";
|
|
2600
2725
|
FUNCTION_NAMES_LOGICAL["REDUCE"] = "REDUCE";
|
|
2601
2726
|
FUNCTION_NAMES_LOGICAL["SCAN"] = "SCAN";
|
|
2602
2727
|
FUNCTION_NAMES_LOGICAL["SWITCH"] = "SWITCH";
|
|
@@ -2624,6 +2749,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
|
|
|
2624
2749
|
*/
|
|
2625
2750
|
let FUNCTION_NAMES_LOOKUP = /* @__PURE__ */ function(FUNCTION_NAMES_LOOKUP) {
|
|
2626
2751
|
FUNCTION_NAMES_LOOKUP["ADDRESS"] = "ADDRESS";
|
|
2752
|
+
FUNCTION_NAMES_LOOKUP["ANCHORARRAY"] = "ANCHORARRAY";
|
|
2627
2753
|
FUNCTION_NAMES_LOOKUP["AREAS"] = "AREAS";
|
|
2628
2754
|
FUNCTION_NAMES_LOOKUP["CHOOSE"] = "CHOOSE";
|
|
2629
2755
|
FUNCTION_NAMES_LOOKUP["CHOOSECOLS"] = "CHOOSECOLS";
|
|
@@ -2946,6 +3072,7 @@ let FUNCTION_NAMES_TEXT = /* @__PURE__ */ function(FUNCTION_NAMES_TEXT) {
|
|
|
2946
3072
|
FUNCTION_NAMES_TEXT["PROPER"] = "PROPER";
|
|
2947
3073
|
FUNCTION_NAMES_TEXT["REGEXEXTRACT"] = "REGEXEXTRACT";
|
|
2948
3074
|
FUNCTION_NAMES_TEXT["REGEXMATCH"] = "REGEXMATCH";
|
|
3075
|
+
FUNCTION_NAMES_TEXT["REGEXTEST"] = "REGEXTEST";
|
|
2949
3076
|
FUNCTION_NAMES_TEXT["REGEXREPLACE"] = "REGEXREPLACE";
|
|
2950
3077
|
FUNCTION_NAMES_TEXT["REPLACE"] = "REPLACE";
|
|
2951
3078
|
FUNCTION_NAMES_TEXT["REPLACEB"] = "REPLACEB";
|
|
@@ -3057,6 +3184,7 @@ const NEW_EXCEL_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
|
3057
3184
|
"SHEETS",
|
|
3058
3185
|
"IFNA",
|
|
3059
3186
|
"IFS",
|
|
3187
|
+
"GROUPBY",
|
|
3060
3188
|
"SWITCH",
|
|
3061
3189
|
"XOR",
|
|
3062
3190
|
"BETA.DIST",
|
|
@@ -3151,7 +3279,7 @@ function deserializeRangeWithSheetWithCache(refString) {
|
|
|
3151
3279
|
if (refCache) return refCache;
|
|
3152
3280
|
const result = deserializeRangeWithSheet(refString);
|
|
3153
3281
|
referenceToRangeCache.set(refString, result);
|
|
3154
|
-
return
|
|
3282
|
+
return result;
|
|
3155
3283
|
}
|
|
3156
3284
|
function clearReferenceToRangeCache() {
|
|
3157
3285
|
referenceToRangeCache.clear();
|
|
@@ -3710,7 +3838,7 @@ var LexerTreeBuilder = class extends Disposable {
|
|
|
3710
3838
|
return this._currentLexerNode;
|
|
3711
3839
|
}
|
|
3712
3840
|
_handleDefinedName(sequenceArray, param) {
|
|
3713
|
-
const { unitId, getValueByName, getSheetName } = param;
|
|
3841
|
+
const { unitId, sheetId, getValueByName, getSheetName } = param;
|
|
3714
3842
|
if (unitId == null) return {
|
|
3715
3843
|
sequenceString: "",
|
|
3716
3844
|
hasDefinedName: false,
|
|
@@ -3730,14 +3858,15 @@ var LexerTreeBuilder = class extends Disposable {
|
|
|
3730
3858
|
let token = tokenRaw;
|
|
3731
3859
|
if (nodeType === 4 || nodeType === 3) {
|
|
3732
3860
|
if (nodeType === 3) token = this._getHasSheetNameDefinedName(tokenRaw, unitId, param);
|
|
3733
|
-
const
|
|
3861
|
+
const definedNameToken = token.trim();
|
|
3862
|
+
const definedContent = getValueByName(unitId, definedNameToken, sheetId);
|
|
3734
3863
|
if (definedContent) {
|
|
3735
3864
|
const refString = definedContent.formulaOrRefString;
|
|
3736
3865
|
const nestedDefinedNameParam = this._handleNestedDefinedName(refString, param);
|
|
3737
3866
|
if (nestedDefinedNameParam == null || typeof nestedDefinedNameParam !== "object") {
|
|
3738
3867
|
sequenceString += nestedDefinedNameParam || "#NAME?";
|
|
3739
3868
|
hasDefinedName = true;
|
|
3740
|
-
definedNames.push(
|
|
3869
|
+
definedNames.push(definedNameToken);
|
|
3741
3870
|
} else if (typeof nestedDefinedNameParam === "object") {
|
|
3742
3871
|
const { sequenceString: nestedSequenceString, definedNames: nestedDefinedNames } = nestedDefinedNameParam;
|
|
3743
3872
|
sequenceString += nestedSequenceString;
|
|
@@ -3746,10 +3875,10 @@ var LexerTreeBuilder = class extends Disposable {
|
|
|
3746
3875
|
});
|
|
3747
3876
|
hasDefinedName = true;
|
|
3748
3877
|
}
|
|
3749
|
-
} else if (this._checkDefinedNameDirty(
|
|
3878
|
+
} else if (this._checkDefinedNameDirty(definedNameToken, param)) {
|
|
3750
3879
|
sequenceString += "#NAME?";
|
|
3751
3880
|
hasDefinedName = true;
|
|
3752
|
-
definedNames.push(
|
|
3881
|
+
definedNames.push(definedNameToken);
|
|
3753
3882
|
} else sequenceString += token;
|
|
3754
3883
|
} else sequenceString += token;
|
|
3755
3884
|
}
|
|
@@ -4163,7 +4292,7 @@ var LexerTreeBuilder = class extends Disposable {
|
|
|
4163
4292
|
}
|
|
4164
4293
|
}
|
|
4165
4294
|
_nodeMaker(formulaStringRaw, sequenceArray, matchCurrentNodeIndex) {
|
|
4166
|
-
let formulaString = formulaStringRaw.replace(
|
|
4295
|
+
let formulaString = formulaStringRaw.replace(/(?:\r\n|\r|\n)$/g, " ");
|
|
4167
4296
|
if (formulaString.substring(0, 1) === "=") formulaString = formulaString.substring(1);
|
|
4168
4297
|
const formulaChars = formulaString.split("");
|
|
4169
4298
|
const charsCount = formulaChars.length;
|
|
@@ -4917,7 +5046,9 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
4917
5046
|
for (let j = 0; j < worksheets.length; j++) {
|
|
4918
5047
|
const worksheet = worksheets[j];
|
|
4919
5048
|
const cellMatrix = worksheet.getCellMatrix();
|
|
4920
|
-
|
|
5049
|
+
const sheetId = worksheet.getSheetId();
|
|
5050
|
+
this._initSheetArrayFormulaData(unitId, sheetId, cellMatrix);
|
|
5051
|
+
initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix);
|
|
4921
5052
|
}
|
|
4922
5053
|
}
|
|
4923
5054
|
const allBases = this._univerInstanceService.getAllUnitsForType(UniverInstanceType.UNIVER_BASE);
|
|
@@ -4929,7 +5060,6 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
4929
5060
|
const tables = Object.values(snapshot.tables);
|
|
4930
5061
|
for (let j = 0; j < tables.length; j++) {
|
|
4931
5062
|
const table = tables[j];
|
|
4932
|
-
if (table.deleted) continue;
|
|
4933
5063
|
const tableFormulaData = {};
|
|
4934
5064
|
const recordOrder = table.recordOrder;
|
|
4935
5065
|
if (!recordOrder) {
|
|
@@ -4938,13 +5068,12 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
4938
5068
|
}
|
|
4939
5069
|
for (let row = 0; row < recordOrder.length; row++) {
|
|
4940
5070
|
const recordId = recordOrder[row];
|
|
4941
|
-
|
|
4942
|
-
if (!record || record.deleted) continue;
|
|
5071
|
+
if (!table.records[recordId]) continue;
|
|
4943
5072
|
for (let col = 0; col < table.fieldOrder.length; col++) {
|
|
4944
5073
|
var _field$config$formula, _field$config, _row, _tableFormulaData$_ro;
|
|
4945
5074
|
const fieldId = table.fieldOrder[col];
|
|
4946
5075
|
const field = table.fields[fieldId];
|
|
4947
|
-
if (!field || field.
|
|
5076
|
+
if (!field || field.type !== "formula") continue;
|
|
4948
5077
|
const formula = String((_field$config$formula = (_field$config = field.config) === null || _field$config === void 0 ? void 0 : _field$config.formula) !== null && _field$config$formula !== void 0 ? _field$config$formula : "").trim();
|
|
4949
5078
|
if (!formula) continue;
|
|
4950
5079
|
(_tableFormulaData$_ro = tableFormulaData[_row = row]) !== null && _tableFormulaData$_ro !== void 0 || (tableFormulaData[_row] = {});
|
|
@@ -4966,7 +5095,9 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
4966
5095
|
formulaData[unitId] = {};
|
|
4967
5096
|
const worksheet = workbook.getSheetBySheetId(sheetId);
|
|
4968
5097
|
if (worksheet == null) return {};
|
|
4969
|
-
|
|
5098
|
+
const cellMatrix = worksheet.getCellMatrix();
|
|
5099
|
+
this._initSheetArrayFormulaData(unitId, sheetId, cellMatrix);
|
|
5100
|
+
initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix);
|
|
4970
5101
|
return formulaData[unitId][sheetId];
|
|
4971
5102
|
}
|
|
4972
5103
|
getArrayFormulaRange() {
|
|
@@ -5037,8 +5168,13 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
5037
5168
|
const allUnitData = {};
|
|
5038
5169
|
const unitStylesData = {};
|
|
5039
5170
|
const unitSheetNameMap = {};
|
|
5171
|
+
const unitNameMap = {};
|
|
5040
5172
|
for (const workbook of unitAllSheet) {
|
|
5041
5173
|
const unitId = workbook.getUnitId();
|
|
5174
|
+
unitNameMap[unitId] = {
|
|
5175
|
+
name: workbook.name,
|
|
5176
|
+
unitType: UniverInstanceType.UNIVER_SHEET
|
|
5177
|
+
};
|
|
5042
5178
|
const sheets = workbook.getSheets();
|
|
5043
5179
|
const sheetData = {};
|
|
5044
5180
|
const sheetNameMap = {};
|
|
@@ -5064,20 +5200,18 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
5064
5200
|
for (const base of unitAllBases) {
|
|
5065
5201
|
const snapshot = base.getSnapshot();
|
|
5066
5202
|
const unitId = base.getUnitId();
|
|
5203
|
+
unitNameMap[unitId] = {
|
|
5204
|
+
name: snapshot.name,
|
|
5205
|
+
unitType: UniverInstanceType.UNIVER_BASE
|
|
5206
|
+
};
|
|
5067
5207
|
const baseData = {};
|
|
5068
5208
|
const tableNameMap = {};
|
|
5069
|
-
for (const table of Object.values(snapshot.tables)
|
|
5070
|
-
var _table$recordOrder$
|
|
5209
|
+
for (const table of Object.values(snapshot.tables)) {
|
|
5210
|
+
var _table$recordOrder$le, _table$recordOrder;
|
|
5071
5211
|
baseData[table.id] = {
|
|
5072
5212
|
cellData: new ObjectMatrix(buildBaseRuntimeCellData(table)),
|
|
5073
|
-
rowCount: (_table$recordOrder$
|
|
5074
|
-
|
|
5075
|
-
return !((_table$records$record = table.records[recordId]) === null || _table$records$record === void 0 ? void 0 : _table$records$record.deleted);
|
|
5076
|
-
}).length) !== null && _table$recordOrder$fi !== void 0 ? _table$recordOrder$fi : 0,
|
|
5077
|
-
columnCount: table.fieldOrder.filter((fieldId) => {
|
|
5078
|
-
var _table$fields$fieldId;
|
|
5079
|
-
return !((_table$fields$fieldId = table.fields[fieldId]) === null || _table$fields$fieldId === void 0 ? void 0 : _table$fields$fieldId.deleted);
|
|
5080
|
-
}).length,
|
|
5213
|
+
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,
|
|
5214
|
+
columnCount: table.fieldOrder.length,
|
|
5081
5215
|
rowData: {},
|
|
5082
5216
|
columnData: {}
|
|
5083
5217
|
};
|
|
@@ -5090,7 +5224,8 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
5090
5224
|
return {
|
|
5091
5225
|
allUnitData,
|
|
5092
5226
|
unitStylesData,
|
|
5093
|
-
unitSheetNameMap
|
|
5227
|
+
unitSheetNameMap,
|
|
5228
|
+
unitNameMap
|
|
5094
5229
|
};
|
|
5095
5230
|
}
|
|
5096
5231
|
/**
|
|
@@ -5118,18 +5253,51 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
5118
5253
|
return rowData;
|
|
5119
5254
|
}
|
|
5120
5255
|
updateFormulaData(unitId, sheetId, cellValue) {
|
|
5256
|
+
var _this$_univerInstance, _formulaData$unitId$s, _formulaData$unitId;
|
|
5121
5257
|
const cellMatrix = new ObjectMatrix(cellValue);
|
|
5122
|
-
const formulaIdMap = this._getSheetFormulaIdMap(unitId, sheetId);
|
|
5123
|
-
const deleteFormulaIdMap = /* @__PURE__ */ new Map();
|
|
5124
|
-
const formulaData = this.getFormulaData();
|
|
5125
|
-
if (formulaData[unitId] == null) formulaData[unitId] = {};
|
|
5126
|
-
const workbookFormulaData = formulaData[unitId];
|
|
5127
|
-
if (workbookFormulaData[sheetId] == null) workbookFormulaData[sheetId] = {};
|
|
5128
|
-
const sheetFormulaDataMatrix = new ObjectMatrix(workbookFormulaData[sheetId] || {});
|
|
5129
5258
|
const newSheetFormulaDataMatrix = new ObjectMatrix();
|
|
5259
|
+
const worksheetCellMatrix = (_this$_univerInstance = this._univerInstanceService.getUnit(unitId)) === null || _this$_univerInstance === void 0 || (_this$_univerInstance = _this$_univerInstance.getSheetBySheetId(sheetId)) === null || _this$_univerInstance === void 0 ? void 0 : _this$_univerInstance.getCellMatrix();
|
|
5260
|
+
const affectedFormulaIds = /* @__PURE__ */ new Set();
|
|
5261
|
+
cellMatrix.forValue((r, c, cell) => {
|
|
5262
|
+
const currentCell = worksheetCellMatrix === null || worksheetCellMatrix === void 0 ? void 0 : worksheetCellMatrix.getValue(r, c);
|
|
5263
|
+
const currentFormulaId = currentCell === null || currentCell === void 0 ? void 0 : currentCell.si;
|
|
5264
|
+
const formulaId = cell === null || cell === void 0 ? void 0 : cell.si;
|
|
5265
|
+
const hasCurrentFormulaId = isFormulaId(currentFormulaId);
|
|
5266
|
+
const hasFormulaId = isFormulaId(formulaId);
|
|
5267
|
+
const formulaString = cell === null || cell === void 0 ? void 0 : cell.f;
|
|
5268
|
+
if (hasCurrentFormulaId) affectedFormulaIds.add(String(currentFormulaId));
|
|
5269
|
+
if (hasFormulaId) affectedFormulaIds.add(String(formulaId));
|
|
5270
|
+
if (!hasCurrentFormulaId && !hasFormulaId) {
|
|
5271
|
+
if (typeof formulaString === "string" && isFormulaString(formulaString)) newSheetFormulaDataMatrix.setValue(r, c, { f: formulaString });
|
|
5272
|
+
else if (isFormulaString(currentCell === null || currentCell === void 0 ? void 0 : currentCell.f)) newSheetFormulaDataMatrix.setValue(r, c, null);
|
|
5273
|
+
}
|
|
5274
|
+
});
|
|
5275
|
+
if (affectedFormulaIds.size === 0) return newSheetFormulaDataMatrix.getMatrix();
|
|
5276
|
+
const formulaIdMap = {};
|
|
5277
|
+
const sharedFormulaCellMatrix = new ObjectMatrix();
|
|
5278
|
+
worksheetCellMatrix === null || worksheetCellMatrix === void 0 || worksheetCellMatrix.forValue((r, c, cell) => {
|
|
5279
|
+
const formulaId = cell === null || cell === void 0 ? void 0 : cell.si;
|
|
5280
|
+
if (!isFormulaId(formulaId) || !affectedFormulaIds.has(String(formulaId))) return;
|
|
5281
|
+
sharedFormulaCellMatrix.setValue(r, c, cell);
|
|
5282
|
+
if (typeof (cell === null || cell === void 0 ? void 0 : cell.f) === "string" && isFormulaString(cell.f)) formulaIdMap[String(formulaId)] = {
|
|
5283
|
+
f: cell.f,
|
|
5284
|
+
r,
|
|
5285
|
+
c
|
|
5286
|
+
};
|
|
5287
|
+
});
|
|
5288
|
+
const formulaData = {};
|
|
5289
|
+
initSheetFormulaData(formulaData, unitId, sheetId, sharedFormulaCellMatrix);
|
|
5290
|
+
const deleteFormulaIdMap = /* @__PURE__ */ new Map();
|
|
5291
|
+
const sheetFormulaDataMatrix = new ObjectMatrix((_formulaData$unitId$s = (_formulaData$unitId = formulaData[unitId]) === null || _formulaData$unitId === void 0 ? void 0 : _formulaData$unitId[sheetId]) !== null && _formulaData$unitId$s !== void 0 ? _formulaData$unitId$s : {});
|
|
5130
5292
|
cellMatrix.forValue((r, c, cell) => {
|
|
5293
|
+
var _worksheetCellMatrix$;
|
|
5294
|
+
if (!isFormulaId(worksheetCellMatrix === null || worksheetCellMatrix === void 0 || (_worksheetCellMatrix$ = worksheetCellMatrix.getValue(r, c)) === null || _worksheetCellMatrix$ === void 0 ? void 0 : _worksheetCellMatrix$.si) && !isFormulaId(cell === null || cell === void 0 ? void 0 : cell.si)) return;
|
|
5131
5295
|
updateFormulaDataByCellValue(sheetFormulaDataMatrix, newSheetFormulaDataMatrix, formulaIdMap, deleteFormulaIdMap, r, c, cell);
|
|
5132
5296
|
});
|
|
5297
|
+
this._rebindSharedFormulaData(sheetFormulaDataMatrix, newSheetFormulaDataMatrix, formulaIdMap, deleteFormulaIdMap);
|
|
5298
|
+
return newSheetFormulaDataMatrix.getMatrix();
|
|
5299
|
+
}
|
|
5300
|
+
_rebindSharedFormulaData(sheetFormulaDataMatrix, newSheetFormulaDataMatrix, formulaIdMap, deleteFormulaIdMap) {
|
|
5133
5301
|
sheetFormulaDataMatrix.forValue((r, c, cell) => {
|
|
5134
5302
|
const formulaString = (cell === null || cell === void 0 ? void 0 : cell.f) || "";
|
|
5135
5303
|
const formulaId = (cell === null || cell === void 0 ? void 0 : cell.si) || "";
|
|
@@ -5187,7 +5355,6 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
5187
5355
|
}
|
|
5188
5356
|
}
|
|
5189
5357
|
});
|
|
5190
|
-
return newSheetFormulaDataMatrix.getMatrix();
|
|
5191
5358
|
}
|
|
5192
5359
|
updateArrayFormulaRange(unitId, sheetId, cellValue) {
|
|
5193
5360
|
var _this$_arrayFormulaRa5;
|
|
@@ -5263,7 +5430,7 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
5263
5430
|
for (const unitId in formulaData) {
|
|
5264
5431
|
const workbook = formulaData[unitId];
|
|
5265
5432
|
if (!workbook) continue;
|
|
5266
|
-
const workbookInstance = this._univerInstanceService.getUnit(unitId);
|
|
5433
|
+
const workbookInstance = this._univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_SHEET);
|
|
5267
5434
|
if (!workbookInstance) continue;
|
|
5268
5435
|
for (const sheetId in workbook) {
|
|
5269
5436
|
const sheet = workbook[sheetId];
|
|
@@ -5277,7 +5444,7 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
5277
5444
|
const column = Number(columnStr);
|
|
5278
5445
|
const currentCell = sheetInstance.getCellRaw(row, column);
|
|
5279
5446
|
const isFormula = isFormulaString(currentCell === null || currentCell === void 0 ? void 0 : currentCell.f) || isFormulaId(currentCell === null || currentCell === void 0 ? void 0 : currentCell.si);
|
|
5280
|
-
const noValue = (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === void 0 || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === null
|
|
5447
|
+
const noValue = (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === void 0 || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === null;
|
|
5281
5448
|
if (!(isFormula && noValue)) continue;
|
|
5282
5449
|
if (!columnRanges[column]) columnRanges[column] = [];
|
|
5283
5450
|
const lastRange = columnRanges[column].slice(-1)[0];
|
|
@@ -5309,22 +5476,38 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
|
|
|
5309
5476
|
}
|
|
5310
5477
|
return dirtyRanges;
|
|
5311
5478
|
}
|
|
5312
|
-
|
|
5313
|
-
|
|
5314
|
-
|
|
5315
|
-
|
|
5316
|
-
|
|
5317
|
-
|
|
5318
|
-
|
|
5319
|
-
|
|
5320
|
-
|
|
5321
|
-
|
|
5322
|
-
|
|
5323
|
-
|
|
5324
|
-
|
|
5325
|
-
|
|
5479
|
+
_initSheetArrayFormulaData(unitId, sheetId, cellMatrix) {
|
|
5480
|
+
let arrayFormulaRangeMatrix;
|
|
5481
|
+
let arrayFormulaCellDataMatrix;
|
|
5482
|
+
const formulaIds = /* @__PURE__ */ new Set();
|
|
5483
|
+
cellMatrix.forValue((_, __, cell) => {
|
|
5484
|
+
const formulaId = cell === null || cell === void 0 ? void 0 : cell.si;
|
|
5485
|
+
if (isFormulaString(cell === null || cell === void 0 ? void 0 : cell.f) && isFormulaId(formulaId)) formulaIds.add(String(formulaId));
|
|
5486
|
+
});
|
|
5487
|
+
cellMatrix.forValue((row, column, cell) => {
|
|
5488
|
+
var _arrayFormulaRangeMat, _this$_arrayFormulaRa7, _arrayFormulaCellData, _this$_arrayFormulaCe5;
|
|
5489
|
+
const ref = cell === null || cell === void 0 ? void 0 : cell.ref;
|
|
5490
|
+
const formula = cell === null || cell === void 0 ? void 0 : cell.f;
|
|
5491
|
+
const formulaId = cell === null || cell === void 0 ? void 0 : cell.si;
|
|
5492
|
+
const hasOwnFormula = isFormulaString(formula);
|
|
5493
|
+
const hasSharedFormula = isFormulaId(formulaId) && formulaIds.has(String(formulaId));
|
|
5494
|
+
if (!hasOwnFormula && !hasSharedFormula || typeof ref !== "string" || ref.length === 0) return true;
|
|
5495
|
+
const { range } = deserializeRangeWithSheet(ref);
|
|
5496
|
+
if (!Number.isFinite(range.startRow) || !Number.isFinite(range.startColumn) || !Number.isFinite(range.endRow) || !Number.isFinite(range.endColumn)) return true;
|
|
5497
|
+
if (range.startRow === row && range.endRow === row && range.startColumn === column && range.endColumn === column && !isArrayConstantFormula(formula)) return true;
|
|
5498
|
+
if (!this._arrayFormulaRange[unitId]) this._arrayFormulaRange[unitId] = {};
|
|
5499
|
+
if (!this._arrayFormulaCellData[unitId]) this._arrayFormulaCellData[unitId] = {};
|
|
5500
|
+
(_arrayFormulaRangeMat = arrayFormulaRangeMatrix) !== null && _arrayFormulaRangeMat !== void 0 || (arrayFormulaRangeMatrix = new ObjectMatrix((_this$_arrayFormulaRa7 = this._arrayFormulaRange[unitId]) === null || _this$_arrayFormulaRa7 === void 0 ? void 0 : _this$_arrayFormulaRa7[sheetId]));
|
|
5501
|
+
(_arrayFormulaCellData = arrayFormulaCellDataMatrix) !== null && _arrayFormulaCellData !== void 0 || (arrayFormulaCellDataMatrix = new ObjectMatrix((_this$_arrayFormulaCe5 = this._arrayFormulaCellData[unitId]) === null || _this$_arrayFormulaCe5 === void 0 ? void 0 : _this$_arrayFormulaCe5[sheetId]));
|
|
5502
|
+
if (arrayFormulaRangeMatrix.getValue(row, column) == null) arrayFormulaRangeMatrix.setValue(row, column, range);
|
|
5503
|
+
for (let r = range.startRow; r <= range.endRow; r++) for (let c = range.startColumn; c <= range.endColumn; c++) {
|
|
5504
|
+
if (arrayFormulaCellDataMatrix.getValue(r, c) != null) continue;
|
|
5505
|
+
const rangeCell = cellMatrix.getValue(r, c);
|
|
5506
|
+
if (rangeCell != null) arrayFormulaCellDataMatrix.setValue(r, c, { ...rangeCell });
|
|
5507
|
+
}
|
|
5326
5508
|
});
|
|
5327
|
-
|
|
5509
|
+
if (arrayFormulaRangeMatrix && this._arrayFormulaRange[unitId]) this._arrayFormulaRange[unitId][sheetId] = arrayFormulaRangeMatrix.getData();
|
|
5510
|
+
if (arrayFormulaCellDataMatrix && this._arrayFormulaCellData[unitId]) this._arrayFormulaCellData[unitId][sheetId] = arrayFormulaCellDataMatrix.getData();
|
|
5328
5511
|
}
|
|
5329
5512
|
};
|
|
5330
5513
|
FormulaDataModel = __decorate([__decorateParam(0, IUniverInstanceService), __decorateParam(1, Inject(LexerTreeBuilder))], FormulaDataModel);
|
|
@@ -5360,9 +5543,9 @@ function initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix) {
|
|
|
5360
5543
|
if (isFormulaId(formulaId) && !isFormulaString(formulaString)) {
|
|
5361
5544
|
const formulaInfo = formulaIdMap.get(formulaId);
|
|
5362
5545
|
if (formulaInfo) {
|
|
5363
|
-
const f = formulaInfo.f;
|
|
5364
5546
|
const x = c - formulaInfo.c;
|
|
5365
5547
|
const y = r - formulaInfo.r;
|
|
5548
|
+
const f = formulaInfo.f;
|
|
5366
5549
|
sheetFormulaDataMatrix.setValue(r, c, {
|
|
5367
5550
|
f,
|
|
5368
5551
|
si: formulaId,
|
|
@@ -5378,12 +5561,13 @@ function initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix) {
|
|
|
5378
5561
|
const BASE_LEGACY_FIELD_REF_PATTERN = /\{([^}]+)\}/g;
|
|
5379
5562
|
const BASE_TABLE_FIELD_REF_PATTERN = /\b([A-Z_]\w*)\[([^\]]+)\]/gi;
|
|
5380
5563
|
const BASE_BRACKET_FIELD_REF_PATTERN = /(^|[^A-Za-z0-9_\]\[])\[([^\]]+)\]/g;
|
|
5564
|
+
const BASE_EXTERNAL_A1_REF_PATTERN = /(?:'\[[^\]]+\](?:[^']|'')+'|\[[^\]]+\][^\s'!]+)!\$?[A-Z]{1,3}\$?\d+(?::\$?[A-Z]{1,3}\$?\d+)?/gi;
|
|
5381
5565
|
function normalizeBaseFormulaForEngine(formula, currentTable, snapshot) {
|
|
5382
5566
|
const refs = [];
|
|
5383
5567
|
const hold = (ref) => {
|
|
5384
5568
|
return `__BASE_FORMULA_REF_${refs.push(ref) - 1}__`;
|
|
5385
5569
|
};
|
|
5386
|
-
return formula.replace(BASE_LEGACY_FIELD_REF_PATTERN, (_match, fieldName) => hold(createEngineThisRowRef(currentTable, fieldName, snapshot))).replace(BASE_TABLE_FIELD_REF_PATTERN, (_match, sourceTableName, fieldName) => {
|
|
5570
|
+
return formula.replace(BASE_EXTERNAL_A1_REF_PATTERN, (reference) => hold(reference)).replace(BASE_LEGACY_FIELD_REF_PATTERN, (_match, fieldName) => hold(createEngineThisRowRef(currentTable, fieldName, snapshot))).replace(BASE_TABLE_FIELD_REF_PATTERN, (_match, sourceTableName, fieldName) => {
|
|
5387
5571
|
const targetTable = resolveBaseFormulaTable(sourceTableName, currentTable, snapshot);
|
|
5388
5572
|
return targetTable ? hold(createEngineThisRowRef(targetTable, fieldName, snapshot)) : `${sourceTableName}[${fieldName}]`;
|
|
5389
5573
|
}).replace(BASE_BRACKET_FIELD_REF_PATTERN, (_match, prefix, fieldName) => `${prefix}${hold(createEngineThisRowRef(currentTable, fieldName, snapshot))}`).replace(/__BASE_FORMULA_REF_(\d+)__/g, (_match, index) => {
|
|
@@ -5397,12 +5581,9 @@ function createEngineThisRowRef(table, fieldName, snapshot) {
|
|
|
5397
5581
|
function getEngineBaseTableName(table, snapshot) {
|
|
5398
5582
|
const tables = Object.values(snapshot.tables);
|
|
5399
5583
|
let sameNameCount = 0;
|
|
5400
|
-
for (let i = 0; i < tables.length; i++) {
|
|
5401
|
-
|
|
5402
|
-
if (
|
|
5403
|
-
sameNameCount++;
|
|
5404
|
-
if (sameNameCount > 1) break;
|
|
5405
|
-
}
|
|
5584
|
+
for (let i = 0; i < tables.length; i++) if (tables[i].name === table.name) {
|
|
5585
|
+
sameNameCount++;
|
|
5586
|
+
if (sameNameCount > 1) break;
|
|
5406
5587
|
}
|
|
5407
5588
|
return sameNameCount === 1 ? table.name : table.id;
|
|
5408
5589
|
}
|
|
@@ -5411,14 +5592,14 @@ function buildBaseRuntimeCellData(table) {
|
|
|
5411
5592
|
const fieldOrder = [];
|
|
5412
5593
|
for (let i = 0; i < table.fieldOrder.length; i++) {
|
|
5413
5594
|
const fieldId = table.fieldOrder[i];
|
|
5414
|
-
if (table.fields[fieldId]
|
|
5595
|
+
if (table.fields[fieldId]) fieldOrder.push(fieldId);
|
|
5415
5596
|
}
|
|
5416
5597
|
let recordOrder;
|
|
5417
5598
|
if (table.recordOrder) {
|
|
5418
5599
|
recordOrder = [];
|
|
5419
5600
|
for (let i = 0; i < table.recordOrder.length; i++) {
|
|
5420
5601
|
const recordId = table.recordOrder[i];
|
|
5421
|
-
if (table.records[recordId]
|
|
5602
|
+
if (table.records[recordId]) recordOrder.push(recordId);
|
|
5422
5603
|
}
|
|
5423
5604
|
} else {
|
|
5424
5605
|
var _table$records;
|
|
@@ -5426,7 +5607,7 @@ function buildBaseRuntimeCellData(table) {
|
|
|
5426
5607
|
const records = [];
|
|
5427
5608
|
for (let i = 0; i < allRecords.length; i++) {
|
|
5428
5609
|
const record = allRecords[i];
|
|
5429
|
-
|
|
5610
|
+
records.push(record);
|
|
5430
5611
|
}
|
|
5431
5612
|
records.sort((a, b) => a.orderKey.localeCompare(b.orderKey));
|
|
5432
5613
|
recordOrder = [];
|
|
@@ -5438,7 +5619,7 @@ function buildBaseRuntimeCellData(table) {
|
|
|
5438
5619
|
for (let row = 0; row < recordOrder.length; row++) {
|
|
5439
5620
|
const recordId = recordOrder[row];
|
|
5440
5621
|
const record = table.records[recordId];
|
|
5441
|
-
if (!record
|
|
5622
|
+
if (!record) continue;
|
|
5442
5623
|
cellData[row] = { ...cellData[row] };
|
|
5443
5624
|
for (let col = 0; col < fieldOrder.length; col++) {
|
|
5444
5625
|
var _record$values;
|
|
@@ -5490,14 +5671,17 @@ function inferBaseRuntimeCellType(value) {
|
|
|
5490
5671
|
if (typeof value === "string") return CellValueType.STRING;
|
|
5491
5672
|
return null;
|
|
5492
5673
|
}
|
|
5674
|
+
function isArrayConstantFormula(formula) {
|
|
5675
|
+
return typeof formula === "string" && /^=\s*\{/.test(formula);
|
|
5676
|
+
}
|
|
5493
5677
|
function isBaseCellData(value) {
|
|
5494
5678
|
return !!value && typeof value === "object" && (Object.prototype.hasOwnProperty.call(value, "v") || Object.prototype.hasOwnProperty.call(value, "t") || Object.prototype.hasOwnProperty.call(value, "p") || Object.prototype.hasOwnProperty.call(value, "f") || Object.prototype.hasOwnProperty.call(value, "si"));
|
|
5495
5679
|
}
|
|
5496
5680
|
function resolveBaseFormulaTable(tableName, currentTable, snapshot) {
|
|
5497
5681
|
if (!tableName || tableName === "table" || tableName === currentTable.id || tableName === currentTable.name) return currentTable;
|
|
5498
5682
|
const byId = snapshot.tables[tableName];
|
|
5499
|
-
if (byId
|
|
5500
|
-
const matches = Object.values(snapshot.tables).filter((table) =>
|
|
5683
|
+
if (byId) return byId;
|
|
5684
|
+
const matches = Object.values(snapshot.tables).filter((table) => table.name === tableName);
|
|
5501
5685
|
return matches.length === 1 ? matches[0] : void 0;
|
|
5502
5686
|
}
|
|
5503
5687
|
|
|
@@ -5549,6 +5733,7 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends Disp
|
|
|
5549
5733
|
_defineProperty(this, "_arrayFormulaRange", {});
|
|
5550
5734
|
_defineProperty(this, "_formulaData", {});
|
|
5551
5735
|
_defineProperty(this, "_sheetNameMap", {});
|
|
5736
|
+
_defineProperty(this, "_unitNameMap", {});
|
|
5552
5737
|
_defineProperty(this, "_forceCalculate", false);
|
|
5553
5738
|
_defineProperty(this, "_clearDependencyTreeCache", {});
|
|
5554
5739
|
_defineProperty(this, "_dirtyRanges", []);
|
|
@@ -5570,6 +5755,7 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends Disp
|
|
|
5570
5755
|
this._arrayFormulaRange = {};
|
|
5571
5756
|
this._formulaData = {};
|
|
5572
5757
|
this._sheetNameMap = {};
|
|
5758
|
+
this._unitNameMap = {};
|
|
5573
5759
|
this._clearDependencyTreeCache = {};
|
|
5574
5760
|
this._dirtyRanges = [];
|
|
5575
5761
|
this._dirtyNameMap = {};
|
|
@@ -5613,6 +5799,9 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends Disp
|
|
|
5613
5799
|
getSheetNameMap() {
|
|
5614
5800
|
return this._sheetNameMap;
|
|
5615
5801
|
}
|
|
5802
|
+
getUnitNameMap() {
|
|
5803
|
+
return this._unitNameMap;
|
|
5804
|
+
}
|
|
5616
5805
|
isForceCalculate() {
|
|
5617
5806
|
return this._forceCalculate;
|
|
5618
5807
|
}
|
|
@@ -5678,11 +5867,13 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends Disp
|
|
|
5678
5867
|
this._unitData = config.allUnitData;
|
|
5679
5868
|
this._unitStylesData = config.unitStylesData;
|
|
5680
5869
|
this._sheetNameMap = config.unitSheetNameMap;
|
|
5870
|
+
this._unitNameMap = config.unitNameMap || {};
|
|
5681
5871
|
} else {
|
|
5682
|
-
const { allUnitData, unitSheetNameMap, unitStylesData } = this._loadSheetData();
|
|
5872
|
+
const { allUnitData, unitNameMap, unitSheetNameMap, unitStylesData } = this._loadSheetData();
|
|
5683
5873
|
this._unitData = allUnitData;
|
|
5684
5874
|
this._unitStylesData = unitStylesData;
|
|
5685
5875
|
this._sheetNameMap = unitSheetNameMap;
|
|
5876
|
+
this._unitNameMap = unitNameMap;
|
|
5686
5877
|
}
|
|
5687
5878
|
if (config.rowData) this._applyUnitRowData(config.rowData);
|
|
5688
5879
|
this._formulaData = config.formulaData;
|
|
@@ -5700,10 +5891,11 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends Disp
|
|
|
5700
5891
|
this._mergeNameMap(this._sheetNameMap, this._dirtyNameMap);
|
|
5701
5892
|
}
|
|
5702
5893
|
loadDataLite(rowData) {
|
|
5703
|
-
const { allUnitData, unitSheetNameMap, unitStylesData } = this._loadSheetData();
|
|
5894
|
+
const { allUnitData, unitNameMap, unitSheetNameMap, unitStylesData } = this._loadSheetData();
|
|
5704
5895
|
this._unitData = allUnitData;
|
|
5705
5896
|
this._unitStylesData = unitStylesData;
|
|
5706
5897
|
this._sheetNameMap = unitSheetNameMap;
|
|
5898
|
+
this._unitNameMap = unitNameMap;
|
|
5707
5899
|
this._formulaData = this._formulaDataModel.getFormulaData();
|
|
5708
5900
|
this._arrayFormulaCellData = convertUnitDataToRuntime(this._formulaDataModel.getArrayFormulaCellData());
|
|
5709
5901
|
this._arrayFormulaRange = this._formulaDataModel.getArrayFormulaRange();
|
|
@@ -5738,6 +5930,9 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends Disp
|
|
|
5738
5930
|
registerSheetNameMap(sheetNameMap) {
|
|
5739
5931
|
this._sheetNameMap = sheetNameMap;
|
|
5740
5932
|
}
|
|
5933
|
+
registerUnitNameMap(unitNameMap) {
|
|
5934
|
+
this._unitNameMap = unitNameMap;
|
|
5935
|
+
}
|
|
5741
5936
|
_mergeNameMap(unitSheetNameMap, dirtyNameMap) {
|
|
5742
5937
|
Object.keys(dirtyNameMap).forEach((unitId) => {
|
|
5743
5938
|
if (dirtyNameMap[unitId]) Object.keys(dirtyNameMap[unitId]).forEach((sheetId) => {
|
|
@@ -5758,7 +5953,7 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends Disp
|
|
|
5758
5953
|
const workbook = this._univerInstanceService.getCurrentUnitOfType(UniverInstanceType.UNIVER_SHEET);
|
|
5759
5954
|
const worksheet = workbook === null || workbook === void 0 ? void 0 : workbook.getActiveSheet();
|
|
5760
5955
|
const base = workbook ? null : this._univerInstanceService.getCurrentUnitOfType(UniverInstanceType.UNIVER_BASE);
|
|
5761
|
-
const table = base ?
|
|
5956
|
+
const table = base ? getFirstBaseTable(base.getSnapshot().tables, base.getSnapshot().tableOrder) : null;
|
|
5762
5957
|
this._executeUnitId = (_workbook$getUnitId = workbook === null || workbook === void 0 ? void 0 : workbook.getUnitId()) !== null && _workbook$getUnitId !== void 0 ? _workbook$getUnitId : base === null || base === void 0 ? void 0 : base.getUnitId();
|
|
5763
5958
|
this._executeSubUnitId = (_worksheet$getSheetId = worksheet === null || worksheet === void 0 ? void 0 : worksheet.getSheetId()) !== null && _worksheet$getSheetId !== void 0 ? _worksheet$getSheetId : table === null || table === void 0 ? void 0 : table.id;
|
|
5764
5959
|
return this._formulaDataModel.getCalculateData();
|
|
@@ -5791,33 +5986,18 @@ FormulaCurrentConfigService = __decorate([
|
|
|
5791
5986
|
__decorateParam(2, Inject(FormulaDataModel)),
|
|
5792
5987
|
__decorateParam(3, Inject(ISheetRowFilteredService))
|
|
5793
5988
|
], FormulaCurrentConfigService);
|
|
5794
|
-
function
|
|
5795
|
-
var _Object$values
|
|
5989
|
+
function getFirstBaseTable(tables, tableOrder) {
|
|
5990
|
+
var _Object$values$;
|
|
5796
5991
|
for (const tableId of tableOrder) {
|
|
5797
5992
|
const table = tables[tableId];
|
|
5798
|
-
if (table
|
|
5993
|
+
if (table) return table;
|
|
5799
5994
|
}
|
|
5800
|
-
return (_Object$values$
|
|
5995
|
+
return (_Object$values$ = Object.values(tables)[0]) !== null && _Object$values$ !== void 0 ? _Object$values$ : null;
|
|
5801
5996
|
}
|
|
5802
5997
|
const IFormulaCurrentConfigService = createIdentifier("univer.formula.current-data.service");
|
|
5803
5998
|
|
|
5804
5999
|
//#endregion
|
|
5805
6000
|
//#region src/engine/analysis/lexer.ts
|
|
5806
|
-
/**
|
|
5807
|
-
* Copyright 2023-present DreamNum Co., Ltd.
|
|
5808
|
-
*
|
|
5809
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5810
|
-
* you may not use this file except in compliance with the License.
|
|
5811
|
-
* You may obtain a copy of the License at
|
|
5812
|
-
*
|
|
5813
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
5814
|
-
*
|
|
5815
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
5816
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
5817
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
5818
|
-
* See the License for the specific language governing permissions and
|
|
5819
|
-
* limitations under the License.
|
|
5820
|
-
*/
|
|
5821
6001
|
let Lexer = class Lexer extends Disposable {
|
|
5822
6002
|
constructor(_definedNamesService, _lexerTreeBuilder, _formulaCurrentConfigService) {
|
|
5823
6003
|
super();
|
|
@@ -5825,10 +6005,11 @@ let Lexer = class Lexer extends Disposable {
|
|
|
5825
6005
|
this._lexerTreeBuilder = _lexerTreeBuilder;
|
|
5826
6006
|
this._formulaCurrentConfigService = _formulaCurrentConfigService;
|
|
5827
6007
|
}
|
|
5828
|
-
treeBuilder(formulaString, transformSuffix = true) {
|
|
6008
|
+
treeBuilder(formulaString, transformSuffix = true, unitId) {
|
|
5829
6009
|
if (this._definedNamesService.getAllDefinedNamesIsEmpty()) return this._lexerTreeBuilder.treeBuilder(formulaString, transformSuffix);
|
|
5830
6010
|
return this._lexerTreeBuilder.treeBuilder(formulaString, transformSuffix, {
|
|
5831
|
-
unitId: this._formulaCurrentConfigService.getExecuteUnitId(),
|
|
6011
|
+
unitId: unitId !== null && unitId !== void 0 ? unitId : this._formulaCurrentConfigService.getExecuteUnitId(),
|
|
6012
|
+
sheetId: this._formulaCurrentConfigService.getExecuteSubUnitId(),
|
|
5832
6013
|
getValueByName: this._definedNamesService.getValueByName.bind(this._definedNamesService),
|
|
5833
6014
|
getDirtyDefinedNameMap: this._formulaCurrentConfigService.getDirtyDefinedNameMap.bind(this._formulaCurrentConfigService),
|
|
5834
6015
|
getSheetName: this._formulaCurrentConfigService.getSheetName.bind(this._formulaCurrentConfigService)
|
|
@@ -5850,10 +6031,13 @@ function getCellValue(cell) {
|
|
|
5850
6031
|
const body = cell === null || cell === void 0 ? void 0 : cell.p.body;
|
|
5851
6032
|
if (body == null) return 0;
|
|
5852
6033
|
const data = body.dataStream;
|
|
5853
|
-
return BuildTextUtils.transform.getPlainText(data);
|
|
6034
|
+
return normalizeRichTextFormulaValue(BuildTextUtils.transform.getPlainText(data));
|
|
5854
6035
|
}
|
|
5855
6036
|
return (_cell$v = cell === null || cell === void 0 ? void 0 : cell.v) !== null && _cell$v !== void 0 ? _cell$v : 0;
|
|
5856
6037
|
}
|
|
6038
|
+
function normalizeRichTextFormulaValue(value) {
|
|
6039
|
+
return value.replace(/\r\n|\r|\n/g, "\r\n");
|
|
6040
|
+
}
|
|
5857
6041
|
/**
|
|
5858
6042
|
* Extract the formula error from the cell
|
|
5859
6043
|
* @param cell
|
|
@@ -6092,24 +6276,16 @@ function reverseCompareOperator(operator) {
|
|
|
6092
6276
|
Reference https://en.wikipedia.org/wiki/Numeric_precision_in_Microsoft_Excel
|
|
6093
6277
|
*/
|
|
6094
6278
|
function plus(a, b) {
|
|
6095
|
-
|
|
6096
|
-
if (Number.isSafeInteger(result)) return result;
|
|
6097
|
-
return new Decimal(a).add(b).toNumber();
|
|
6279
|
+
return a + b;
|
|
6098
6280
|
}
|
|
6099
6281
|
function minus(a, b) {
|
|
6100
|
-
|
|
6101
|
-
if (Number.isSafeInteger(result)) return result;
|
|
6102
|
-
return new Decimal(a).sub(b).toNumber();
|
|
6282
|
+
return a - b;
|
|
6103
6283
|
}
|
|
6104
6284
|
function multiply(a, b) {
|
|
6105
|
-
|
|
6106
|
-
if (Number.isSafeInteger(result)) return result;
|
|
6107
|
-
return new Decimal(a).mul(b).toNumber();
|
|
6285
|
+
return a * b;
|
|
6108
6286
|
}
|
|
6109
6287
|
function divide(a, b) {
|
|
6110
|
-
|
|
6111
|
-
if (Number.isSafeInteger(result)) return result;
|
|
6112
|
-
return new Decimal(a).div(b).toNumber();
|
|
6288
|
+
return a / b;
|
|
6113
6289
|
}
|
|
6114
6290
|
/**
|
|
6115
6291
|
* Rounds a number to a specified number of decimal places.
|
|
@@ -6181,7 +6357,7 @@ function sqrt(base) {
|
|
|
6181
6357
|
* @returns True if numbers are equal, false otherwise.
|
|
6182
6358
|
*/
|
|
6183
6359
|
function equals(a, b) {
|
|
6184
|
-
return a === b;
|
|
6360
|
+
return a === b || stripErrorMargin(a) === stripErrorMargin(b);
|
|
6185
6361
|
}
|
|
6186
6362
|
/**
|
|
6187
6363
|
* Checks if the first number is greater than the second number.
|
|
@@ -6190,7 +6366,7 @@ function equals(a, b) {
|
|
|
6190
6366
|
* @returns True if a is greater than b, false otherwise.
|
|
6191
6367
|
*/
|
|
6192
6368
|
function greaterThan(a, b) {
|
|
6193
|
-
return a > b;
|
|
6369
|
+
return !equals(a, b) && stripErrorMargin(a) > stripErrorMargin(b);
|
|
6194
6370
|
}
|
|
6195
6371
|
/**
|
|
6196
6372
|
* Checks if the first number is greater than or equal to the second number.
|
|
@@ -6199,7 +6375,7 @@ function greaterThan(a, b) {
|
|
|
6199
6375
|
* @returns True if a is greater than or equal to b, false otherwise.
|
|
6200
6376
|
*/
|
|
6201
6377
|
function greaterThanOrEquals(a, b) {
|
|
6202
|
-
return a
|
|
6378
|
+
return equals(a, b) || stripErrorMargin(a) > stripErrorMargin(b);
|
|
6203
6379
|
}
|
|
6204
6380
|
/**
|
|
6205
6381
|
* Checks if the first number is less than the second number.
|
|
@@ -6208,7 +6384,7 @@ function greaterThanOrEquals(a, b) {
|
|
|
6208
6384
|
* @returns True if a is less than b, false otherwise.
|
|
6209
6385
|
*/
|
|
6210
6386
|
function lessThan(a, b) {
|
|
6211
|
-
return a < b;
|
|
6387
|
+
return !equals(a, b) && stripErrorMargin(a) < stripErrorMargin(b);
|
|
6212
6388
|
}
|
|
6213
6389
|
/**
|
|
6214
6390
|
* Checks if the first number is less than or equal to the second number.
|
|
@@ -6217,7 +6393,7 @@ function lessThan(a, b) {
|
|
|
6217
6393
|
* @returns True if a is less than or equal to b, false otherwise.
|
|
6218
6394
|
*/
|
|
6219
6395
|
function lessThanOrEquals(a, b) {
|
|
6220
|
-
return a
|
|
6396
|
+
return equals(a, b) || stripErrorMargin(a) < stripErrorMargin(b);
|
|
6221
6397
|
}
|
|
6222
6398
|
/**
|
|
6223
6399
|
* Complete the number to the specified accuracy and solve the accuracy error,
|
|
@@ -6485,8 +6661,8 @@ var BooleanValueObject = class BooleanValueObject extends BaseValueObject {
|
|
|
6485
6661
|
case ">=": return true;
|
|
6486
6662
|
case "=":
|
|
6487
6663
|
case "<":
|
|
6488
|
-
case "<=":
|
|
6489
|
-
case "<>": return
|
|
6664
|
+
case "<=": return false;
|
|
6665
|
+
case "<>": return true;
|
|
6490
6666
|
}
|
|
6491
6667
|
}
|
|
6492
6668
|
concatenateFront(valueObject) {
|
|
@@ -7108,12 +7284,13 @@ var StringValueObject = class StringValueObject extends BaseValueObject {
|
|
|
7108
7284
|
return BooleanValueObject.create(result);
|
|
7109
7285
|
}
|
|
7110
7286
|
_compareString(currentValue, value, operator) {
|
|
7287
|
+
const compareResult = currentValue.localeCompare(value);
|
|
7111
7288
|
switch (operator) {
|
|
7112
7289
|
case "=": return currentValue === value;
|
|
7113
|
-
case ">": return
|
|
7114
|
-
case ">=": return currentValue
|
|
7115
|
-
case "<": return
|
|
7116
|
-
case "<=": return currentValue
|
|
7290
|
+
case ">": return compareResult > 0;
|
|
7291
|
+
case ">=": return currentValue === value || compareResult > 0;
|
|
7292
|
+
case "<": return compareResult < 0;
|
|
7293
|
+
case "<=": return currentValue === value || compareResult < 0;
|
|
7117
7294
|
case "<>": return currentValue !== value;
|
|
7118
7295
|
}
|
|
7119
7296
|
}
|
|
@@ -7139,6 +7316,7 @@ var StringValueObject = class StringValueObject extends BaseValueObject {
|
|
|
7139
7316
|
}
|
|
7140
7317
|
convertToNumberObjectValue() {
|
|
7141
7318
|
const rawValue = this.getValue();
|
|
7319
|
+
if (rawValue.trim() === "") return ErrorValueObject.create("#VALUE!");
|
|
7142
7320
|
const parseData = getNumfmtParseValueFilter(rawValue);
|
|
7143
7321
|
if (parseData && parseData.z) return createNumberValueObjectByRawValue(parseData.v, parseData.z);
|
|
7144
7322
|
return createNumberValueObjectByRawValue(rawValue);
|
|
@@ -7247,6 +7425,8 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7247
7425
|
_defineProperty(this, "_sheetId", "");
|
|
7248
7426
|
_defineProperty(this, "_currentRow", -1);
|
|
7249
7427
|
_defineProperty(this, "_currentColumn", -1);
|
|
7428
|
+
_defineProperty(this, "_useInvertedIndexCache", false);
|
|
7429
|
+
_defineProperty(this, "_legacyImplicitForAggregate", false);
|
|
7250
7430
|
_defineProperty(this, "_sliceCache", /* @__PURE__ */ new Map());
|
|
7251
7431
|
_defineProperty(this, "_flattenCache", void 0);
|
|
7252
7432
|
_defineProperty(this, "_defaultValue", null);
|
|
@@ -7298,6 +7478,15 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7298
7478
|
getCurrentColumn() {
|
|
7299
7479
|
return this._currentColumn;
|
|
7300
7480
|
}
|
|
7481
|
+
usesInvertedIndexCache() {
|
|
7482
|
+
return this._useInvertedIndexCache;
|
|
7483
|
+
}
|
|
7484
|
+
usesLegacyImplicitForAggregate() {
|
|
7485
|
+
return this._legacyImplicitForAggregate;
|
|
7486
|
+
}
|
|
7487
|
+
setLegacyImplicitForAggregate(value) {
|
|
7488
|
+
this._legacyImplicitForAggregate = value;
|
|
7489
|
+
}
|
|
7301
7490
|
getArrayValue() {
|
|
7302
7491
|
return this._values;
|
|
7303
7492
|
}
|
|
@@ -7564,6 +7753,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7564
7753
|
if (itemValue == null || itemValue.isNull()) return true;
|
|
7565
7754
|
let matchObject;
|
|
7566
7755
|
if (isFuzzyMatching === true) matchObject = itemValue.compare(valueObject, "=");
|
|
7756
|
+
else if (searchType === 0 && itemValue.isNumber() && valueObject.isNumber()) matchObject = BooleanValueObject.create(Number(itemValue.getValue()) === Number(valueObject.getValue()));
|
|
7567
7757
|
else matchObject = itemValue.isEqual(valueObject);
|
|
7568
7758
|
if ((matchObject === null || matchObject === void 0 ? void 0 : matchObject.getValue()) === true) {
|
|
7569
7759
|
result = itemValue;
|
|
@@ -7686,7 +7876,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7686
7876
|
return false;
|
|
7687
7877
|
}
|
|
7688
7878
|
if (valueObject.isString() || valueObject.isNull() || valueObject.isBoolean()) return true;
|
|
7689
|
-
if (accumulatorAll.
|
|
7879
|
+
if (Number(accumulatorAll.getValue()) < Number(valueObject.getValue())) accumulatorAll = valueObject;
|
|
7690
7880
|
});
|
|
7691
7881
|
return accumulatorAll;
|
|
7692
7882
|
}
|
|
@@ -7727,7 +7917,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7727
7917
|
return accumulatorAll;
|
|
7728
7918
|
}
|
|
7729
7919
|
getNegative() {
|
|
7730
|
-
return
|
|
7920
|
+
return this.mapValue((valueObject) => NumberValueObject.create(0).minus(valueObject));
|
|
7731
7921
|
}
|
|
7732
7922
|
getReciprocal() {
|
|
7733
7923
|
return ArrayValueObject.create("{1}").divided(this);
|
|
@@ -7779,12 +7969,10 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
7779
7969
|
for (let c = 0; c < columnCount; c++) {
|
|
7780
7970
|
var _this$_values;
|
|
7781
7971
|
const row = (_this$_values = this._values) === null || _this$_values === void 0 ? void 0 : _this$_values[r];
|
|
7782
|
-
|
|
7783
|
-
|
|
7784
|
-
|
|
7785
|
-
|
|
7786
|
-
else rowList[c] = NullValueObject.create();
|
|
7787
|
-
}
|
|
7972
|
+
const currentValue = this.getValueOrDefault(r, c);
|
|
7973
|
+
if (row == null && currentValue == null) rowList[c] = ErrorValueObject.create("#VALUE!");
|
|
7974
|
+
else if (currentValue) rowList[c] = callbackFn(currentValue, r, c);
|
|
7975
|
+
else rowList[c] = NullValueObject.create();
|
|
7788
7976
|
}
|
|
7789
7977
|
result.push(rowList);
|
|
7790
7978
|
}
|
|
@@ -8094,7 +8282,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8094
8282
|
* If comparison operations are conducted for a single numerical value,
|
|
8095
8283
|
* then retrieve the judgment from the inverted index. This enhances performance.
|
|
8096
8284
|
*/
|
|
8097
|
-
if (batchOperatorType === 5) {
|
|
8285
|
+
if (batchOperatorType === 5 && this._useInvertedIndexCache) {
|
|
8098
8286
|
const { rowsInCache, rowsNotInCache } = CELL_INVERTED_INDEX_CACHE.canUseCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
|
|
8099
8287
|
if (rowsInCache.length > 0) {
|
|
8100
8288
|
if (operator === "=" && !(valueObject.isString() && isWildcard(valueObject.getValue()))) {
|
|
@@ -8128,13 +8316,13 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8128
8316
|
if (rowsNotInCache.length > 0) for (const interval of rowsNotInCache) {
|
|
8129
8317
|
const [start, end] = interval;
|
|
8130
8318
|
for (let r = start; r <= end; r++) this.__batchOperatorRowValue(valueObject, column, result, batchOperatorType, r - startRow, unitId, sheetId, startRow, startColumn, operator, isCaseSensitive);
|
|
8131
|
-
CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, start, end);
|
|
8319
|
+
if (this._useInvertedIndexCache) CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, start, end);
|
|
8132
8320
|
}
|
|
8133
8321
|
return;
|
|
8134
8322
|
}
|
|
8135
8323
|
}
|
|
8136
8324
|
for (let r = 0; r < rowCount; r++) this.__batchOperatorRowValue(valueObject, column, result, batchOperatorType, r, unitId, sheetId, startRow, startColumn, operator, isCaseSensitive);
|
|
8137
|
-
CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
|
|
8325
|
+
if (this._useInvertedIndexCache) CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
|
|
8138
8326
|
}
|
|
8139
8327
|
__batchOperatorRowValue(valueObject, column, result, batchOperatorType, r, unitId, sheetId, startRow, startColumn, operator, isCaseSensitive) {
|
|
8140
8328
|
const currentValue = this.getValueOrDefault(r, column);
|
|
@@ -8184,7 +8372,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8184
8372
|
break;
|
|
8185
8373
|
}
|
|
8186
8374
|
else result[r][column] = ErrorValueObject.create("#N/A");
|
|
8187
|
-
CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column + startColumn, (currentValue === null || currentValue === void 0 ? void 0 : currentValue.isNull()) ? null : currentValue === null || currentValue === void 0 ? void 0 : currentValue.getValue(), r + startRow);
|
|
8375
|
+
if (this._useInvertedIndexCache) CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column + startColumn, (currentValue === null || currentValue === void 0 ? void 0 : currentValue.isNull()) ? null : currentValue === null || currentValue === void 0 ? void 0 : currentValue.getValue(), r + startRow);
|
|
8188
8376
|
}
|
|
8189
8377
|
_batchOperatorArray(valueObject, batchOperatorType, operator, isCaseSensitive) {
|
|
8190
8378
|
let rowCount = valueObject.getRowCount();
|
|
@@ -8255,7 +8443,9 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8255
8443
|
}
|
|
8256
8444
|
result.push(rowList);
|
|
8257
8445
|
}
|
|
8258
|
-
|
|
8446
|
+
const newArray = this._createNewArray(result, rowCount, columnCount);
|
|
8447
|
+
if (batchOperatorType === 1) newArray.setLegacyImplicitForAggregate(true);
|
|
8448
|
+
return newArray;
|
|
8259
8449
|
}
|
|
8260
8450
|
_checkArrayCalculateType(valueObject) {
|
|
8261
8451
|
if (valueObject.getRowCount() === 1 && valueObject.getColumnCount() === 1) return 3;
|
|
@@ -8272,6 +8462,8 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8272
8462
|
this._sheetId = rawValue.sheetId;
|
|
8273
8463
|
this._currentRow = rawValue.row;
|
|
8274
8464
|
this._currentColumn = rawValue.column;
|
|
8465
|
+
this._useInvertedIndexCache = rawValue.useInvertedIndexCache === true;
|
|
8466
|
+
this._legacyImplicitForAggregate = rawValue.legacyImplicitForAggregate === true;
|
|
8275
8467
|
return rawValue.calculateValueList;
|
|
8276
8468
|
}
|
|
8277
8469
|
rawValue = rawValue.slice(1, -1);
|
|
@@ -8294,7 +8486,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
|
|
|
8294
8486
|
this._columnCount = maxColumnCount;
|
|
8295
8487
|
return result;
|
|
8296
8488
|
}
|
|
8297
|
-
_createNewArray(result, rowCount, columnCount, row =
|
|
8489
|
+
_createNewArray(result, rowCount, columnCount, row = this._currentRow, column = this._currentColumn) {
|
|
8298
8490
|
if (this._currentColumn === -1 || this._currentRow === -1) {
|
|
8299
8491
|
row = -1;
|
|
8300
8492
|
column = -1;
|
|
@@ -8359,6 +8551,7 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8359
8551
|
_defineProperty(this, "_filteredOutRows", []);
|
|
8360
8552
|
_defineProperty(this, "_defaultUnitId", "");
|
|
8361
8553
|
_defineProperty(this, "_forcedUnitId", "");
|
|
8554
|
+
_defineProperty(this, "_unitQualifier", "");
|
|
8362
8555
|
_defineProperty(this, "_runtimeData", {});
|
|
8363
8556
|
_defineProperty(this, "_arrayFormulaCellData", {});
|
|
8364
8557
|
_defineProperty(this, "_arrayFormulaRange", {});
|
|
@@ -8410,14 +8603,14 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8410
8603
|
}
|
|
8411
8604
|
iterator(callback) {
|
|
8412
8605
|
const { startRow, endRow, startColumn, endColumn } = this.getRangePosition();
|
|
8413
|
-
if (this._checkIfWorksheetMiss()) return callback(ErrorValueObject.create("#
|
|
8606
|
+
if (this._checkIfWorksheetMiss()) return callback(ErrorValueObject.create("#REF!"), startRow, startColumn);
|
|
8414
8607
|
const unitId = this._forcedUnitId || this._defaultUnitId;
|
|
8415
8608
|
const sheetId = this._forcedSheetId || this._defaultSheetId;
|
|
8416
8609
|
for (let r = startRow; r <= endRow; r++) for (let c = startColumn; c <= endColumn; c++) {
|
|
8417
8610
|
if (r < 0 || c < 0) return callback(ErrorValueObject.create("#REF!"), r, c);
|
|
8418
8611
|
const cell = this.getCellData(r, c);
|
|
8419
8612
|
let result = false;
|
|
8420
|
-
if (isNullCell(cell)) {
|
|
8613
|
+
if (isNullCell(cell) && !isTypedEmptyStringCell(cell)) {
|
|
8421
8614
|
result = callback(null, r, c);
|
|
8422
8615
|
continue;
|
|
8423
8616
|
}
|
|
@@ -8434,7 +8627,7 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8434
8627
|
}
|
|
8435
8628
|
}
|
|
8436
8629
|
getFirstCell() {
|
|
8437
|
-
if (this._checkIfWorksheetMiss()) return ErrorValueObject.create("#
|
|
8630
|
+
if (this._checkIfWorksheetMiss()) return ErrorValueObject.create("#REF!");
|
|
8438
8631
|
const { startRow, startColumn } = this.getRangePosition();
|
|
8439
8632
|
const cell = this.getCellData(startRow, startColumn);
|
|
8440
8633
|
if (!cell) return NumberValueObject.create(0);
|
|
@@ -8465,6 +8658,12 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8465
8658
|
setForcedUnitIdDirect(unitId) {
|
|
8466
8659
|
if (unitId.length > 0) this._forcedUnitId = unitId;
|
|
8467
8660
|
}
|
|
8661
|
+
setUnitQualifier(unitQualifier) {
|
|
8662
|
+
this._unitQualifier = unitQualifier;
|
|
8663
|
+
}
|
|
8664
|
+
getUnitQualifier() {
|
|
8665
|
+
return this._unitQualifier;
|
|
8666
|
+
}
|
|
8468
8667
|
getForcedUnitId() {
|
|
8469
8668
|
return this._forcedUnitId;
|
|
8470
8669
|
}
|
|
@@ -8613,14 +8812,15 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8613
8812
|
}
|
|
8614
8813
|
getCellValueObject(cell) {
|
|
8615
8814
|
const value = getCellValue(cell);
|
|
8815
|
+
const cellValueType = Number(cell.t);
|
|
8616
8816
|
if (ERROR_TYPE_SET.has(value)) return ErrorValueObject.create(value);
|
|
8617
|
-
if (
|
|
8817
|
+
if (cellValueType === CellValueType.NUMBER) {
|
|
8618
8818
|
const pattern = this._getPatternByCell(cell);
|
|
8619
8819
|
if (isTextFormat(pattern)) return StringValueObject.create(value.toString());
|
|
8620
8820
|
return createNumberValueObjectByRawValue(value, pattern);
|
|
8621
8821
|
}
|
|
8622
|
-
if (
|
|
8623
|
-
if (
|
|
8822
|
+
if (cellValueType === CellValueType.STRING || cellValueType === CellValueType.FORCE_STRING) return StringValueObject.create(value.toString());
|
|
8823
|
+
if (cellValueType === CellValueType.BOOLEAN) return createBooleanValueObjectByRawValue(value);
|
|
8624
8824
|
return ValueObjectFactory.create(value);
|
|
8625
8825
|
}
|
|
8626
8826
|
_getPatternByCell(cell) {
|
|
@@ -8696,7 +8896,7 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8696
8896
|
if (!row) row = rangeData.startRow;
|
|
8697
8897
|
if (!column) column = rangeData.startColumn;
|
|
8698
8898
|
const cell = this.getCellData(row, column);
|
|
8699
|
-
if (!cell) return
|
|
8899
|
+
if (!cell) return NullValueObject.create();
|
|
8700
8900
|
return this.getCellValueObject(cell);
|
|
8701
8901
|
}
|
|
8702
8902
|
setCurrentRowAndColumn(row, column) {
|
|
@@ -8750,7 +8950,8 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8750
8950
|
unitId: this.getUnitId(),
|
|
8751
8951
|
sheetId: this.getSheetId(),
|
|
8752
8952
|
row: startRow,
|
|
8753
|
-
column: startColumn
|
|
8953
|
+
column: startColumn,
|
|
8954
|
+
useInvertedIndexCache: true
|
|
8754
8955
|
};
|
|
8755
8956
|
const arrayValueObject = ArrayValueObject.create(arrayValueObjectData);
|
|
8756
8957
|
useCache && FORMULA_REF_TO_ARRAY_CACHE.set(key, arrayValueObject);
|
|
@@ -8780,6 +8981,9 @@ var BaseReferenceObject = class extends ObjectClassType {
|
|
|
8780
8981
|
return ArrayValueObject.create(arrayValueObjectData);
|
|
8781
8982
|
}
|
|
8782
8983
|
};
|
|
8984
|
+
function isTypedEmptyStringCell(cell) {
|
|
8985
|
+
return (cell === null || cell === void 0 ? void 0 : cell.v) === "" && (cell.t === CellValueType.STRING || cell.t === CellValueType.FORCE_STRING);
|
|
8986
|
+
}
|
|
8783
8987
|
var AsyncObject = class extends ObjectClassType {
|
|
8784
8988
|
constructor(_promise) {
|
|
8785
8989
|
super();
|
|
@@ -8841,10 +9045,13 @@ var RangeReferenceObject = class extends BaseReferenceObject {
|
|
|
8841
9045
|
|
|
8842
9046
|
//#endregion
|
|
8843
9047
|
//#region src/engine/reference-object/cell-reference-object.ts
|
|
9048
|
+
const EXCEL_MAX_ROWS = 1048576;
|
|
9049
|
+
const EXCEL_MAX_COLUMNS = 16384;
|
|
8844
9050
|
var CellReferenceObject = class extends BaseReferenceObject {
|
|
8845
9051
|
constructor(token) {
|
|
8846
9052
|
super(token);
|
|
8847
9053
|
const grid = deserializeRangeWithSheetWithCache(token);
|
|
9054
|
+
this.setUnitQualifier(grid.unitId);
|
|
8848
9055
|
this.setForcedUnitIdDirect(grid.unitId);
|
|
8849
9056
|
this.setForcedSheetName(grid.sheetName);
|
|
8850
9057
|
this.setRangeData(grid.range);
|
|
@@ -8852,6 +9059,12 @@ var CellReferenceObject = class extends BaseReferenceObject {
|
|
|
8852
9059
|
isCell() {
|
|
8853
9060
|
return true;
|
|
8854
9061
|
}
|
|
9062
|
+
isExceedRange() {
|
|
9063
|
+
var _this$getForcedSheetI;
|
|
9064
|
+
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;
|
|
9065
|
+
const { startRow, endRow, startColumn, endColumn } = this.getRangePosition();
|
|
9066
|
+
return startRow < 0 || startColumn < 0 || endRow >= EXCEL_MAX_ROWS || endColumn >= EXCEL_MAX_COLUMNS;
|
|
9067
|
+
}
|
|
8855
9068
|
unionBy(referenceObject) {
|
|
8856
9069
|
if (!referenceObject.isCell()) return ErrorValueObject.create("#REF!");
|
|
8857
9070
|
const cellReferenceObject = referenceObject;
|
|
@@ -8914,6 +9127,7 @@ var ColumnReferenceObject = class extends BaseReferenceObject {
|
|
|
8914
9127
|
constructor(token) {
|
|
8915
9128
|
super(token);
|
|
8916
9129
|
const grid = deserializeRangeWithSheetWithCache(token);
|
|
9130
|
+
this.setUnitQualifier(grid.unitId);
|
|
8917
9131
|
this.setForcedUnitIdDirect(grid.unitId);
|
|
8918
9132
|
this.setForcedSheetName(grid.sheetName);
|
|
8919
9133
|
const range = {
|
|
@@ -8956,6 +9170,7 @@ var RowReferenceObject = class extends BaseReferenceObject {
|
|
|
8956
9170
|
constructor(token) {
|
|
8957
9171
|
super(token);
|
|
8958
9172
|
const grid = deserializeRangeWithSheetWithCache(token);
|
|
9173
|
+
this.setUnitQualifier(grid.unitId);
|
|
8959
9174
|
this.setForcedUnitIdDirect(grid.unitId);
|
|
8960
9175
|
this.setForcedSheetName(grid.sheetName);
|
|
8961
9176
|
const range = {
|
|
@@ -9335,11 +9550,11 @@ function getPairedRangeAndCriteriaResult(variants, params) {
|
|
|
9335
9550
|
result = sum.divided(count);
|
|
9336
9551
|
} else if (formulaName === "MAXIFS") {
|
|
9337
9552
|
const picked = targetRange.pick(finalCompareResult);
|
|
9338
|
-
if (picked.getColumnCount() === 0) result =
|
|
9553
|
+
if (picked.getColumnCount() === 0) result = NumberValueObject.create(0);
|
|
9339
9554
|
else result = picked.max();
|
|
9340
9555
|
} else if (formulaName === "MINIFS") {
|
|
9341
9556
|
const picked = targetRange.pick(finalCompareResult);
|
|
9342
|
-
if (picked.getColumnCount() === 0) result =
|
|
9557
|
+
if (picked.getColumnCount() === 0) result = NumberValueObject.create(0);
|
|
9343
9558
|
else result = picked.min();
|
|
9344
9559
|
}
|
|
9345
9560
|
if (!results[rowIndex]) results[rowIndex] = [];
|
|
@@ -9351,13 +9566,25 @@ function getPairedRangeAndCriteriaResult(variants, params) {
|
|
|
9351
9566
|
* Two ArrayValueObject of the same type can be compared
|
|
9352
9567
|
*/
|
|
9353
9568
|
function filterSameValueObjectResult(array, range, criteria) {
|
|
9354
|
-
const [operator, criteriaObject] = findCompareToken(`${criteria.getValue()}`);
|
|
9569
|
+
const [operator, criteriaObject] = criteria.isString() ? findCompareToken(`${criteria.getValue()}`) : ["=", criteria];
|
|
9355
9570
|
return array.mapValue((valueObject, r, c) => {
|
|
9356
9571
|
const rangeValueObject = range.get(r, c);
|
|
9572
|
+
const isBlankStringCriteria = criteriaObject.isString() && criteriaObject.getValue() === "";
|
|
9573
|
+
if (operator === "<>" && isBlankStringCriteria && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString()) && rangeValueObject.getValue() === "") return BooleanValueObject.create(true);
|
|
9574
|
+
if (criteriaObject.isString() && criteriaObject.getValue() !== "" && (operator === "<" || operator === "<=") && (rangeValueObject == null || rangeValueObject.isNull() || rangeValueObject.isString() && rangeValueObject.getValue() === "")) return BooleanValueObject.create(false);
|
|
9575
|
+
if (criteriaObject.isString() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString()) && (operator === "<" || operator === "<=") && isSameLowerBoundBucket(rangeValueObject.getValue(), criteriaObject.getValue())) return BooleanValueObject.create(false);
|
|
9576
|
+
if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isNumber()) && criteriaObject.isString()) {
|
|
9577
|
+
const criteriaNumber = criteriaObject.convertToNumberObjectValue();
|
|
9578
|
+
if (criteriaNumber.isNumber()) return rangeValueObject.compare(criteriaNumber, operator);
|
|
9579
|
+
}
|
|
9580
|
+
if (criteriaObject.isNumber() && criteriaObject.isDateFormat() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString())) {
|
|
9581
|
+
const rangeNumber = rangeValueObject.convertToNumberObjectValue();
|
|
9582
|
+
if (rangeNumber.isNumber()) return rangeNumber.compare(criteriaObject, operator);
|
|
9583
|
+
}
|
|
9357
9584
|
if (rangeValueObject && isSameValueObjectType(rangeValueObject, criteriaObject)) return valueObject;
|
|
9358
9585
|
if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isError()) && criteriaObject.isError() && rangeValueObject.getValue() === criteriaObject.getValue()) return BooleanValueObject.create(true);
|
|
9359
9586
|
/**
|
|
9360
|
-
* If the operator is '=' or '<>', we can compare numbers
|
|
9587
|
+
* If the operator is '=' or '<>', we can compare string numbers against numeric criteria directly in COUNTIF, COUNTIFS, SUMIF, SUMIFS, etc.
|
|
9361
9588
|
* Other operators require both valueObjects to be of the same type.
|
|
9362
9589
|
* For example:
|
|
9363
9590
|
* | A1 | B1 |
|
|
@@ -9369,10 +9596,6 @@ function filterSameValueObjectResult(array, range, criteria) {
|
|
|
9369
9596
|
* =COUNTIF(A1:B1, '<=123') will return 1
|
|
9370
9597
|
*/
|
|
9371
9598
|
if (operator === "=" || operator === "<>") {
|
|
9372
|
-
if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isNumber()) && criteriaObject.isString()) {
|
|
9373
|
-
const criteriaNumber = criteriaObject.convertToNumberObjectValue();
|
|
9374
|
-
if (criteriaNumber.isNumber()) return rangeValueObject.compare(criteriaNumber, operator);
|
|
9375
|
-
}
|
|
9376
9599
|
if (criteriaObject.isNumber() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString())) {
|
|
9377
9600
|
const rangeNumber = rangeValueObject.convertToNumberObjectValue();
|
|
9378
9601
|
if (rangeNumber.isNumber()) return rangeNumber.compare(criteriaObject, operator);
|
|
@@ -9383,6 +9606,11 @@ function filterSameValueObjectResult(array, range, criteria) {
|
|
|
9383
9606
|
return BooleanValueObject.create(false);
|
|
9384
9607
|
});
|
|
9385
9608
|
}
|
|
9609
|
+
function isSameLowerBoundBucket(rangeValue, criteriaValue) {
|
|
9610
|
+
const criteriaMatch = criteriaValue.match(/^(\d+)\|/);
|
|
9611
|
+
const rangeMatch = rangeValue.match(/^(\d+)-/);
|
|
9612
|
+
return criteriaMatch != null && rangeMatch != null && criteriaMatch[1] === rangeMatch[1];
|
|
9613
|
+
}
|
|
9386
9614
|
/**
|
|
9387
9615
|
* Check if the two valueObjects are of the same type
|
|
9388
9616
|
* @param left
|
|
@@ -9483,6 +9711,7 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
|
|
|
9483
9711
|
_defineProperty(this, "_currentColumn", -1);
|
|
9484
9712
|
_defineProperty(this, "_currentRowCount", Number.NEGATIVE_INFINITY);
|
|
9485
9713
|
_defineProperty(this, "_currentColumnCount", Number.NEGATIVE_INFINITY);
|
|
9714
|
+
_defineProperty(this, "_functionRefInfoOverrideStack", []);
|
|
9486
9715
|
_defineProperty(this, "_currentSubUnitId", "");
|
|
9487
9716
|
_defineProperty(this, "_currentUnitId", "");
|
|
9488
9717
|
_defineProperty(this, "_runtimeData", {});
|
|
@@ -9511,10 +9740,12 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
|
|
|
9511
9740
|
return this._currentColumn;
|
|
9512
9741
|
}
|
|
9513
9742
|
get currentRowCount() {
|
|
9514
|
-
|
|
9743
|
+
var _this$_functionRefInf, _this$_functionRefInf2;
|
|
9744
|
+
return (_this$_functionRefInf = (_this$_functionRefInf2 = this._functionRefInfoOverrideStack[this._functionRefInfoOverrideStack.length - 1]) === null || _this$_functionRefInf2 === void 0 ? void 0 : _this$_functionRefInf2.rowCount) !== null && _this$_functionRefInf !== void 0 ? _this$_functionRefInf : this._currentRowCount;
|
|
9515
9745
|
}
|
|
9516
9746
|
get currentColumnCount() {
|
|
9517
|
-
|
|
9747
|
+
var _this$_functionRefInf3, _this$_functionRefInf4;
|
|
9748
|
+
return (_this$_functionRefInf3 = (_this$_functionRefInf4 = this._functionRefInfoOverrideStack[this._functionRefInfoOverrideStack.length - 1]) === null || _this$_functionRefInf4 === void 0 ? void 0 : _this$_functionRefInf4.columnCount) !== null && _this$_functionRefInf3 !== void 0 ? _this$_functionRefInf3 : this._currentColumnCount;
|
|
9518
9749
|
}
|
|
9519
9750
|
get currentSubUnitId() {
|
|
9520
9751
|
return this._currentSubUnitId;
|
|
@@ -9608,6 +9839,7 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
|
|
|
9608
9839
|
this._isCycleDependency = false;
|
|
9609
9840
|
this._totalFormulasToCalculate = 0;
|
|
9610
9841
|
this._completedFormulasCount = 0;
|
|
9842
|
+
this._functionRefInfoOverrideStack = [];
|
|
9611
9843
|
this.clearReferenceAndNumberformatCache();
|
|
9612
9844
|
}
|
|
9613
9845
|
clearReferenceAndNumberformatCache() {
|
|
@@ -9623,6 +9855,15 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
|
|
|
9623
9855
|
this._currentSubUnitId = sheetId;
|
|
9624
9856
|
this._currentUnitId = unitId;
|
|
9625
9857
|
}
|
|
9858
|
+
setFunctionRefInfoOverride(rowCount, columnCount) {
|
|
9859
|
+
this._functionRefInfoOverrideStack.push({
|
|
9860
|
+
rowCount,
|
|
9861
|
+
columnCount
|
|
9862
|
+
});
|
|
9863
|
+
return () => {
|
|
9864
|
+
this._functionRefInfoOverrideStack.pop();
|
|
9865
|
+
};
|
|
9866
|
+
}
|
|
9626
9867
|
clearFunctionDefinitionPrivacyVar() {
|
|
9627
9868
|
this._functionDefinitionPrivacyVar.clear();
|
|
9628
9869
|
}
|
|
@@ -9686,13 +9927,22 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
|
|
|
9686
9927
|
* then it is not treated as an array range and is directly assigned.
|
|
9687
9928
|
*/
|
|
9688
9929
|
if (startRow === endRow && startColumn === endColumn) {
|
|
9689
|
-
const
|
|
9930
|
+
const firstCellRaw = objectValueRefOrArray.getFirstCell();
|
|
9931
|
+
const firstCell = firstCellRaw.isNull() ? NumberValueObject.create(0) : firstCellRaw;
|
|
9690
9932
|
const valueObject = this._getValueObjectOfRuntimeData(firstCell);
|
|
9691
9933
|
sheetData.setValue(row, column, valueObject);
|
|
9692
9934
|
clearArrayUnitData.setValue(row, column, valueObject);
|
|
9693
9935
|
CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column, firstCell.getValue(), row, true);
|
|
9694
9936
|
return;
|
|
9695
9937
|
}
|
|
9938
|
+
if (this._isCurrentSingleCellArrayFormulaRange(unitId, sheetId, row, column)) {
|
|
9939
|
+
const errorObject = this._getValueObjectOfRuntimeData(ErrorValueObject.create("#VALUE!"));
|
|
9940
|
+
sheetData.setValue(row, column, errorObject);
|
|
9941
|
+
clearArrayUnitData.setValue(row, column, errorObject);
|
|
9942
|
+
runtimeArrayUnitData.setValue(row, column, errorObject);
|
|
9943
|
+
CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column, "#VALUE!", row, true);
|
|
9944
|
+
return;
|
|
9945
|
+
}
|
|
9696
9946
|
const arrayRange = {
|
|
9697
9947
|
startRow: row,
|
|
9698
9948
|
startColumn: column,
|
|
@@ -9904,6 +10154,11 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
|
|
|
9904
10154
|
});
|
|
9905
10155
|
return isCellOverlapping;
|
|
9906
10156
|
}
|
|
10157
|
+
_isCurrentSingleCellArrayFormulaRange(unitId, sheetId, row, column) {
|
|
10158
|
+
var _this$_currentConfigS4;
|
|
10159
|
+
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];
|
|
10160
|
+
return range != null && range.startRow === range.endRow && range.startColumn === range.endColumn;
|
|
10161
|
+
}
|
|
9907
10162
|
_isInArrayFormulaRange(range, r, c) {
|
|
9908
10163
|
if (range == null) return false;
|
|
9909
10164
|
const { startRow, startColumn, endRow, endColumn } = range;
|
|
@@ -10142,18 +10397,23 @@ const FORMULA_CACHE_LRU_COUNT = 5e3;
|
|
|
10142
10397
|
const FORMULA_AST_CACHE = new FormulaAstLRU(FORMULA_CACHE_LRU_COUNT);
|
|
10143
10398
|
const DIRTY_DEFINED_NAME_SET_CACHE = /* @__PURE__ */ new WeakMap();
|
|
10144
10399
|
const DIRTY_SUPER_TABLE_PATTERN_CACHE = /* @__PURE__ */ new WeakMap();
|
|
10145
|
-
function generateAstNode(unitId, formulaString, lexer, astTreeBuilder, currentConfigService) {
|
|
10146
|
-
|
|
10147
|
-
|
|
10148
|
-
|
|
10149
|
-
|
|
10400
|
+
function generateAstNode(unitId, formulaString, lexer, astTreeBuilder, currentConfigService, subUnitId) {
|
|
10401
|
+
var _ref;
|
|
10402
|
+
if (subUnitId) {
|
|
10403
|
+
currentConfigService.setExecuteUnitId(unitId);
|
|
10404
|
+
currentConfigService.setExecuteSubUnitId(subUnitId);
|
|
10405
|
+
}
|
|
10406
|
+
const cacheKey = `${unitId}:${(_ref = subUnitId !== null && subUnitId !== void 0 ? subUnitId : currentConfigService.getExecuteSubUnitId()) !== null && _ref !== void 0 ? _ref : ""}:${formulaString}`;
|
|
10407
|
+
let astNode = FORMULA_AST_CACHE.get(cacheKey);
|
|
10408
|
+
if (!(checkIsChangedByDefinedName(unitId, formulaString, currentConfigService) || checkIsChangedBySuperTable(unitId, formulaString, currentConfigService)) && astNode && !isDirtyDefinedForNode(astNode, currentConfigService, unitId)) return astNode;
|
|
10409
|
+
const lexerNode = lexer.treeBuilder(formulaString, true, unitId);
|
|
10150
10410
|
if (ERROR_TYPE_SET.has(lexerNode)) return ErrorNode.create(lexerNode);
|
|
10151
10411
|
astNode = astTreeBuilder.parse(lexerNode);
|
|
10152
10412
|
if (astNode == null) {
|
|
10153
10413
|
console.error("generateAstNode astNode is null");
|
|
10154
10414
|
return ErrorNode.create(lexerNode);
|
|
10155
10415
|
}
|
|
10156
|
-
|
|
10416
|
+
FORMULA_AST_CACHE.set(cacheKey, astNode);
|
|
10157
10417
|
return astNode;
|
|
10158
10418
|
}
|
|
10159
10419
|
function checkIsChangedByDefinedName(unitId, formula, currentConfigService) {
|
|
@@ -10184,15 +10444,15 @@ function getNormalizedDirtyDefinedNameSet(unitDefinedNameMap) {
|
|
|
10184
10444
|
function getDirtySuperTableReferencePattern(unitSuperTableMap) {
|
|
10185
10445
|
let tableReferencePattern = DIRTY_SUPER_TABLE_PATTERN_CACHE.get(unitSuperTableMap);
|
|
10186
10446
|
if (tableReferencePattern === void 0) {
|
|
10187
|
-
const
|
|
10188
|
-
tableReferencePattern =
|
|
10447
|
+
const tableNames = Object.keys(unitSuperTableMap).filter((tableName) => tableName.length > 0);
|
|
10448
|
+
tableReferencePattern = tableNames.length > 0 ? regexp.createRegExpFromSafeFragment(`(^|[^A-Za-z0-9_])${regexp.or(...tableNames)}(\\s*\\[|$|[^A-Za-z0-9_])`, "i") : null;
|
|
10189
10449
|
DIRTY_SUPER_TABLE_PATTERN_CACHE.set(unitSuperTableMap, tableReferencePattern);
|
|
10190
10450
|
}
|
|
10191
10451
|
return tableReferencePattern;
|
|
10192
10452
|
}
|
|
10193
|
-
function isDirtyDefinedForNode(node, currentConfigService) {
|
|
10453
|
+
function isDirtyDefinedForNode(node, currentConfigService, unitId) {
|
|
10194
10454
|
const definedNameMap = currentConfigService.getDirtyDefinedNameMap();
|
|
10195
|
-
const executeUnitId =
|
|
10455
|
+
const executeUnitId = unitId;
|
|
10196
10456
|
if (executeUnitId != null && definedNameMap[executeUnitId] != null) {
|
|
10197
10457
|
const names = Object.keys(definedNameMap[executeUnitId]);
|
|
10198
10458
|
for (let i = 0, len = names.length; i < len; i++) {
|
|
@@ -10207,7 +10467,7 @@ function includeDefinedName(tree, node, currentConfigService) {
|
|
|
10207
10467
|
* Detect whether the dirty map contains a defined name.
|
|
10208
10468
|
*/
|
|
10209
10469
|
if (node != null) {
|
|
10210
|
-
if (isDirtyDefinedForNode(node, currentConfigService)) return true;
|
|
10470
|
+
if (isDirtyDefinedForNode(node, currentConfigService, tree.unitId)) return true;
|
|
10211
10471
|
}
|
|
10212
10472
|
return false;
|
|
10213
10473
|
}
|
|
@@ -10286,6 +10546,49 @@ var FunctionService = class extends Disposable {
|
|
|
10286
10546
|
}
|
|
10287
10547
|
};
|
|
10288
10548
|
|
|
10549
|
+
//#endregion
|
|
10550
|
+
//#region src/services/unit-reference-resolver.service.ts
|
|
10551
|
+
const IFormulaUnitReferenceResolver = createIdentifier("univer.formula.unit-reference-resolver");
|
|
10552
|
+
const EXCEL_WORKBOOK_EXTENSION = /\.(?:xlsx|xlsm|xlsb|xltx|xltm|xls)$/i;
|
|
10553
|
+
function normalizeFormulaUnitName(name) {
|
|
10554
|
+
return name.replace(EXCEL_WORKBOOK_EXTENSION, "").toLowerCase();
|
|
10555
|
+
}
|
|
10556
|
+
let FormulaUnitReferenceResolver = class FormulaUnitReferenceResolver {
|
|
10557
|
+
constructor(_currentConfigService) {
|
|
10558
|
+
this._currentConfigService = _currentConfigService;
|
|
10559
|
+
}
|
|
10560
|
+
resolve({ hostUnitId, qualifier, referenceKind }) {
|
|
10561
|
+
const unitNameMap = this._currentConfigService.getUnitNameMap();
|
|
10562
|
+
const unitData = this._currentConfigService.getUnitData();
|
|
10563
|
+
const address = qualifier || hostUnitId;
|
|
10564
|
+
const direct = unitNameMap[address];
|
|
10565
|
+
if (direct || unitData[address]) return this._validateReferenceKind(hostUnitId, referenceKind, {
|
|
10566
|
+
unitId: address,
|
|
10567
|
+
unitType: direct === null || direct === void 0 ? void 0 : direct.unitType
|
|
10568
|
+
}, unitNameMap);
|
|
10569
|
+
if (!qualifier) return "#REF!";
|
|
10570
|
+
const namedUnits = Object.entries(unitNameMap).filter(([, item]) => item.name.length > 0);
|
|
10571
|
+
const normalizedQualifier = qualifier.toLowerCase();
|
|
10572
|
+
const exactMatches = namedUnits.filter(([, item]) => item.name.toLowerCase() === normalizedQualifier);
|
|
10573
|
+
const matches = exactMatches.length > 0 ? exactMatches : namedUnits.filter(([, item]) => normalizeFormulaUnitName(item.name) === normalizeFormulaUnitName(qualifier));
|
|
10574
|
+
if (matches.length !== 1) return "#REF!";
|
|
10575
|
+
const [unitId, item] = matches[0];
|
|
10576
|
+
return this._validateReferenceKind(hostUnitId, referenceKind, {
|
|
10577
|
+
unitId,
|
|
10578
|
+
unitType: item.unitType
|
|
10579
|
+
}, unitNameMap);
|
|
10580
|
+
}
|
|
10581
|
+
_validateReferenceKind(hostUnitId, referenceKind, resolution, unitNameMap) {
|
|
10582
|
+
var _unitNameMap$hostUnit;
|
|
10583
|
+
if (referenceKind !== "a1" || resolution.unitId === hostUnitId) return resolution;
|
|
10584
|
+
const hostType = (_unitNameMap$hostUnit = unitNameMap[hostUnitId]) === null || _unitNameMap$hostUnit === void 0 ? void 0 : _unitNameMap$hostUnit.unitType;
|
|
10585
|
+
if (resolution.unitType === UniverInstanceType.UNIVER_BASE) return "#REF!";
|
|
10586
|
+
if (hostType === UniverInstanceType.UNIVER_BASE && resolution.unitType !== UniverInstanceType.UNIVER_SHEET) return "#REF!";
|
|
10587
|
+
return resolution;
|
|
10588
|
+
}
|
|
10589
|
+
};
|
|
10590
|
+
FormulaUnitReferenceResolver = __decorate([__decorateParam(0, IFormulaCurrentConfigService)], FormulaUnitReferenceResolver);
|
|
10591
|
+
|
|
10289
10592
|
//#endregion
|
|
10290
10593
|
//#region src/engine/ast-node/prefix-node.ts
|
|
10291
10594
|
var PrefixNode = class extends BaseAstNode {
|
|
@@ -10317,6 +10620,7 @@ var PrefixNode = class extends BaseAstNode {
|
|
|
10317
10620
|
if (!value.isReferenceObject()) return ErrorValueObject.create("#VALUE!");
|
|
10318
10621
|
const currentValue = value;
|
|
10319
10622
|
if (currentValue.isCell()) return ErrorValueObject.create("#VALUE!");
|
|
10623
|
+
if (this._preserveAtRangeForFormula2LookupArray()) return currentValue;
|
|
10320
10624
|
const runtimeService = this._runtimeService;
|
|
10321
10625
|
const currentRow = runtimeService.currentRow || 0;
|
|
10322
10626
|
const currentColumn = runtimeService.currentColumn || 0;
|
|
@@ -10328,6 +10632,22 @@ var PrefixNode = class extends BaseAstNode {
|
|
|
10328
10632
|
if (currentValue.isTable()) return currentValue.getCellByPosition(currentRow);
|
|
10329
10633
|
return ErrorValueObject.create("#VALUE!");
|
|
10330
10634
|
}
|
|
10635
|
+
_preserveAtRangeForFormula2LookupArray() {
|
|
10636
|
+
let node = this;
|
|
10637
|
+
let parent = node.getParent();
|
|
10638
|
+
let sawCompareOperator = false;
|
|
10639
|
+
while (parent != null) {
|
|
10640
|
+
if (parent.nodeType === 3) sawCompareOperator || (sawCompareOperator = OPERATOR_TOKEN_COMPARE_SET.has(parent.getToken()));
|
|
10641
|
+
if (parent.nodeType === 4) {
|
|
10642
|
+
const functionName = parent.getToken().toUpperCase();
|
|
10643
|
+
if (sawCompareOperator && functionName === "XMATCH") return parent.getChildren().indexOf(node) === 1;
|
|
10644
|
+
return false;
|
|
10645
|
+
}
|
|
10646
|
+
node = parent;
|
|
10647
|
+
parent = parent.getParent();
|
|
10648
|
+
}
|
|
10649
|
+
return false;
|
|
10650
|
+
}
|
|
10331
10651
|
};
|
|
10332
10652
|
let PrefixNodeFactory = class PrefixNodeFactory extends BaseAstNodeFactory {
|
|
10333
10653
|
constructor(_functionService, _runtimeService) {
|
|
@@ -10385,58 +10705,62 @@ function prefixHandler(tokenTrimParam, functionService, runtimeService) {
|
|
|
10385
10705
|
//#endregion
|
|
10386
10706
|
//#region src/engine/ast-node/function-node.ts
|
|
10387
10707
|
var FunctionNode = class extends BaseAstNode {
|
|
10388
|
-
constructor(token, _functionExecutor, _currentConfigService, _runtimeService, _definedNamesService, _formulaDataModel) {
|
|
10708
|
+
constructor(token, _functionExecutor, _currentConfigService, _runtimeService, _definedNamesService, _formulaDataModel, _unitReferenceResolver) {
|
|
10389
10709
|
super(token);
|
|
10390
10710
|
this._functionExecutor = _functionExecutor;
|
|
10391
10711
|
this._currentConfigService = _currentConfigService;
|
|
10392
10712
|
this._runtimeService = _runtimeService;
|
|
10393
10713
|
this._definedNamesService = _definedNamesService;
|
|
10394
10714
|
this._formulaDataModel = _formulaDataModel;
|
|
10715
|
+
this._unitReferenceResolver = _unitReferenceResolver;
|
|
10395
10716
|
if (this._functionExecutor.isAsync()) this.setAsync();
|
|
10396
10717
|
if (this._functionExecutor.isAddress()) this.setAddress();
|
|
10397
10718
|
if (this._functionExecutor.needsLocale) this._setLocale();
|
|
10398
10719
|
if (this._functionExecutor.needsSheetsInfo) this._setSheetsInfo();
|
|
10399
10720
|
if (this._functionExecutor.needsFormulaDataModel) this._functionExecutor.setFormulaDataModel(this._formulaDataModel);
|
|
10721
|
+
if (this._functionExecutor.needsUnitReferenceResolver) this._functionExecutor.setUnitReferenceResolver(this._unitReferenceResolver);
|
|
10400
10722
|
}
|
|
10401
10723
|
get nodeType() {
|
|
10402
10724
|
return 4;
|
|
10403
10725
|
}
|
|
10404
10726
|
async executeAsync() {
|
|
10405
|
-
const variants = [];
|
|
10406
10727
|
const children = this.getChildren();
|
|
10407
|
-
const childrenCount = children.length;
|
|
10408
10728
|
this._compatibility();
|
|
10409
|
-
|
|
10410
|
-
const object = children[i].getValue();
|
|
10411
|
-
if (object == null) continue;
|
|
10412
|
-
if (object.isReferenceObject() && !this._functionExecutor.needsReferenceObject) variants.push(object.toArrayValueObject());
|
|
10413
|
-
else variants.push(object);
|
|
10414
|
-
}
|
|
10415
|
-
const resultVariant = await this._calculateAsync(variants);
|
|
10729
|
+
const resultVariant = this._functionExecutor.needsAstChildren ? this._calculateAst(children) : await this._calculateAsync(this._collectVariants(children));
|
|
10416
10730
|
let result;
|
|
10417
10731
|
if (resultVariant.isAsyncObject() || resultVariant.isAsyncArrayObject()) result = await resultVariant.getValue();
|
|
10418
10732
|
else result = resultVariant;
|
|
10733
|
+
result = this._normalizeTopLevelLegacyArrayResult(result);
|
|
10419
10734
|
this._setEmbeddedArrayFormulaToResult(result);
|
|
10420
10735
|
this._setRefData(result);
|
|
10421
10736
|
this.setValue(result);
|
|
10422
10737
|
return Promise.resolve(0);
|
|
10423
10738
|
}
|
|
10424
10739
|
execute() {
|
|
10425
|
-
const variants = [];
|
|
10426
10740
|
const children = this.getChildren();
|
|
10427
|
-
const childrenCount = children.length;
|
|
10428
10741
|
this._compatibility();
|
|
10742
|
+
const resultVariant = this._functionExecutor.needsAstChildren ? this._calculateAst(children) : this._calculate(this._collectVariants(children));
|
|
10743
|
+
const result = this._normalizeTopLevelLegacyArrayResult(resultVariant);
|
|
10744
|
+
this._setEmbeddedArrayFormulaToResult(result);
|
|
10745
|
+
this._setRefData(result);
|
|
10746
|
+
this.setValue(result);
|
|
10747
|
+
}
|
|
10748
|
+
_collectVariants(children) {
|
|
10749
|
+
const variants = [];
|
|
10750
|
+
const childrenCount = children.length;
|
|
10429
10751
|
for (let i = 0; i < childrenCount; i++) {
|
|
10430
|
-
const object = children[i]
|
|
10752
|
+
const object = this._getChildVariant(children[i]);
|
|
10431
10753
|
if (object == null) continue;
|
|
10432
|
-
|
|
10433
|
-
if (object.isReferenceObject() && !this._functionExecutor.needsReferenceObject) variants.push(object.toArrayValueObject());
|
|
10434
|
-
else variants.push(object);
|
|
10754
|
+
variants.push(object);
|
|
10435
10755
|
}
|
|
10436
|
-
|
|
10437
|
-
|
|
10438
|
-
|
|
10439
|
-
|
|
10756
|
+
return variants;
|
|
10757
|
+
}
|
|
10758
|
+
_getChildVariant(child) {
|
|
10759
|
+
const object = child.getValue();
|
|
10760
|
+
if (object == null) return;
|
|
10761
|
+
if (object.isReferenceObject() && this._functionExecutor.needsFilteredOutRows) this._setFilteredOutRows(object);
|
|
10762
|
+
if (object.isReferenceObject() && !this._functionExecutor.needsReferenceObject) return object.toArrayValueObject();
|
|
10763
|
+
return object;
|
|
10440
10764
|
}
|
|
10441
10765
|
isFunctionExecutorArgumentsIgnoreNumberPattern() {
|
|
10442
10766
|
return this._functionExecutor.isArgumentsIgnoreNumberPattern();
|
|
@@ -10451,6 +10775,14 @@ var FunctionNode = class extends BaseAstNode {
|
|
|
10451
10775
|
if (rowCount <= 1 && colCount <= 1) return;
|
|
10452
10776
|
this._runtimeService.setUnitArrayFormulaEmbeddedMap();
|
|
10453
10777
|
}
|
|
10778
|
+
_normalizeTopLevelLegacyArrayResult(result) {
|
|
10779
|
+
const parent = this.getParent();
|
|
10780
|
+
const isTopLevel = parent == null || parent.nodeType === 9;
|
|
10781
|
+
if (!this._functionExecutor.returnsLegacyArrayAsScalar || !isTopLevel || !result.isArray()) return result;
|
|
10782
|
+
const array = result;
|
|
10783
|
+
if (array.getRowCount() <= 1 && array.getColumnCount() <= 1) return result;
|
|
10784
|
+
return array.getFirstCell();
|
|
10785
|
+
}
|
|
10454
10786
|
/**
|
|
10455
10787
|
* Compatibility handling for special functions.
|
|
10456
10788
|
*/
|
|
@@ -10535,6 +10867,16 @@ var FunctionNode = class extends BaseAstNode {
|
|
|
10535
10867
|
}
|
|
10536
10868
|
return resultVariant;
|
|
10537
10869
|
}
|
|
10870
|
+
_calculateAst(children) {
|
|
10871
|
+
const { minParams, maxParams } = this._functionExecutor;
|
|
10872
|
+
if (minParams !== -1 && maxParams !== -1 && (children.length < minParams || children.length > maxParams)) return ErrorValueObject.create("#N/A");
|
|
10873
|
+
this._setRefInfo();
|
|
10874
|
+
this._handleAddressFunction();
|
|
10875
|
+
return this._functionExecutor.calculateAst(children, (node) => {
|
|
10876
|
+
var _this$_getChildVarian;
|
|
10877
|
+
return (_this$_getChildVarian = this._getChildVariant(node)) !== null && _this$_getChildVarian !== void 0 ? _this$_getChildVarian : null;
|
|
10878
|
+
});
|
|
10879
|
+
}
|
|
10538
10880
|
async _calculateAsync(variants) {
|
|
10539
10881
|
const { minParams, maxParams } = this._functionExecutor;
|
|
10540
10882
|
if (minParams !== -1 && maxParams !== -1 && (variants.length < minParams || variants.length > maxParams)) return ErrorValueObject.create("#N/A");
|
|
@@ -10550,15 +10892,15 @@ var FunctionNode = class extends BaseAstNode {
|
|
|
10550
10892
|
return resultVariant;
|
|
10551
10893
|
}
|
|
10552
10894
|
_setDefinedNamesForFunction() {
|
|
10553
|
-
const editorUnitId = this.
|
|
10895
|
+
const editorUnitId = this._runtimeService.currentUnitId;
|
|
10554
10896
|
if (editorUnitId == null) return;
|
|
10555
10897
|
const definedNames = this._definedNamesService.getDefinedNameMap(editorUnitId);
|
|
10556
10898
|
if (definedNames == null) return;
|
|
10557
10899
|
this._functionExecutor.setDefinedNames(definedNames);
|
|
10558
10900
|
}
|
|
10559
10901
|
_setRefInfo() {
|
|
10560
|
-
const { currentUnitId, currentSubUnitId, currentRow, currentColumn } = this._runtimeService;
|
|
10561
|
-
this._functionExecutor.setRefInfo(currentUnitId, currentSubUnitId, currentRow, currentColumn);
|
|
10902
|
+
const { currentUnitId, currentSubUnitId, currentRow, currentColumn, currentRowCount, currentColumnCount } = this._runtimeService;
|
|
10903
|
+
this._functionExecutor.setRefInfo(currentUnitId, currentSubUnitId, currentRow, currentColumn, currentRowCount, currentColumnCount);
|
|
10562
10904
|
if (this._functionExecutor.needsSheetRowColumnCount) {
|
|
10563
10905
|
const { rowCount, columnCount } = this._currentConfigService.getSheetRowColumnCount(currentUnitId, currentSubUnitId);
|
|
10564
10906
|
this._functionExecutor.setSheetRowColumnCount(rowCount, columnCount);
|
|
@@ -10604,7 +10946,7 @@ var ErrorFunctionNode = class extends BaseAstNode {
|
|
|
10604
10946
|
}
|
|
10605
10947
|
};
|
|
10606
10948
|
let FunctionNodeFactory = class FunctionNodeFactory extends BaseAstNodeFactory {
|
|
10607
|
-
constructor(_functionService, _currentConfigService, _runtimeService, _definedNamesService, _injector, _formulaDataModel) {
|
|
10949
|
+
constructor(_functionService, _currentConfigService, _runtimeService, _definedNamesService, _injector, _formulaDataModel, _unitReferenceResolver) {
|
|
10608
10950
|
super();
|
|
10609
10951
|
this._functionService = _functionService;
|
|
10610
10952
|
this._currentConfigService = _currentConfigService;
|
|
@@ -10612,6 +10954,7 @@ let FunctionNodeFactory = class FunctionNodeFactory extends BaseAstNodeFactory {
|
|
|
10612
10954
|
this._definedNamesService = _definedNamesService;
|
|
10613
10955
|
this._injector = _injector;
|
|
10614
10956
|
this._formulaDataModel = _formulaDataModel;
|
|
10957
|
+
this._unitReferenceResolver = _unitReferenceResolver;
|
|
10615
10958
|
}
|
|
10616
10959
|
get zIndex() {
|
|
10617
10960
|
return NODE_ORDER_MAP.get(4) || 100;
|
|
@@ -10622,14 +10965,14 @@ let FunctionNodeFactory = class FunctionNodeFactory extends BaseAstNodeFactory {
|
|
|
10622
10965
|
console.error(`No function ${token}`);
|
|
10623
10966
|
return ErrorNode.create("#NAME?");
|
|
10624
10967
|
}
|
|
10625
|
-
return new FunctionNode(token, functionExecutor, this._currentConfigService, this._runtimeService, this._definedNamesService, this._formulaDataModel);
|
|
10968
|
+
return new FunctionNode(token, functionExecutor, this._currentConfigService, this._runtimeService, this._definedNamesService, this._formulaDataModel, this._unitReferenceResolver);
|
|
10626
10969
|
}
|
|
10627
10970
|
checkAndCreateNodeType(param) {
|
|
10628
10971
|
if (typeof param === "string") return;
|
|
10629
10972
|
const { tokenTrim, minusPrefixNode, atPrefixNode } = prefixHandler(param.getToken().trim(), this._functionService, this._runtimeService);
|
|
10630
10973
|
const isColon = this._isParentUnionNode(param);
|
|
10631
10974
|
if (!Number.isNaN(Number(tokenTrim)) && !isColon) return ErrorNode.create("#VALUE!");
|
|
10632
|
-
const tokenTrimUpper = tokenTrim.toUpperCase();
|
|
10975
|
+
const tokenTrimUpper = normalizeFunctionToken(tokenTrim.toUpperCase());
|
|
10633
10976
|
if (isColon && COLUMN_LIKE_FUNCTION_NAMES.has(tokenTrimUpper)) return;
|
|
10634
10977
|
if (this._functionService.hasExecutor(tokenTrimUpper)) {
|
|
10635
10978
|
const functionNode = this.create(tokenTrimUpper);
|
|
@@ -10649,8 +10992,18 @@ FunctionNodeFactory = __decorate([
|
|
|
10649
10992
|
__decorateParam(2, IFormulaRuntimeService),
|
|
10650
10993
|
__decorateParam(3, IDefinedNamesService),
|
|
10651
10994
|
__decorateParam(4, Inject(Injector)),
|
|
10652
|
-
__decorateParam(5, Inject(FormulaDataModel))
|
|
10995
|
+
__decorateParam(5, Inject(FormulaDataModel)),
|
|
10996
|
+
__decorateParam(6, IFormulaUnitReferenceResolver)
|
|
10653
10997
|
], FunctionNodeFactory);
|
|
10998
|
+
function normalizeFunctionToken(token) {
|
|
10999
|
+
if (token === "REGEXTEST" || token === "_XLFN.REGEXTEST") return "REGEXMATCH";
|
|
11000
|
+
for (const prefix of [
|
|
11001
|
+
"_XLFN.",
|
|
11002
|
+
"_XLWS.",
|
|
11003
|
+
"_XLETA."
|
|
11004
|
+
]) if (token.startsWith(prefix)) return token.slice(prefix.length);
|
|
11005
|
+
return token;
|
|
11006
|
+
}
|
|
10654
11007
|
|
|
10655
11008
|
//#endregion
|
|
10656
11009
|
//#region src/engine/interpreter/interpreter.ts
|
|
@@ -10701,6 +11054,7 @@ let Interpreter = class Interpreter extends Disposable {
|
|
|
10701
11054
|
}
|
|
10702
11055
|
async _executeAsync(node, refOffsetX = 0, refOffsetY = 0) {
|
|
10703
11056
|
if (this._runtimeService.isStopExecution()) return Promise.resolve(1);
|
|
11057
|
+
if (await this._executeLazyFunctionAsync(node, refOffsetX, refOffsetY)) return Promise.resolve(0);
|
|
10704
11058
|
const children = node.getChildren();
|
|
10705
11059
|
const childrenCount = children.length;
|
|
10706
11060
|
for (let i = 0; i < childrenCount; i++) {
|
|
@@ -10721,6 +11075,7 @@ let Interpreter = class Interpreter extends Disposable {
|
|
|
10721
11075
|
}
|
|
10722
11076
|
_execute(node, refOffsetX = 0, refOffsetY = 0) {
|
|
10723
11077
|
if (this._runtimeService.isStopExecution()) return 1;
|
|
11078
|
+
if (this._executeLazyFunction(node, refOffsetX, refOffsetY)) return 0;
|
|
10724
11079
|
const children = node.getChildren();
|
|
10725
11080
|
const childrenCount = children.length;
|
|
10726
11081
|
for (let i = 0; i < childrenCount; i++) {
|
|
@@ -10738,6 +11093,161 @@ let Interpreter = class Interpreter extends Disposable {
|
|
|
10738
11093
|
node.execute();
|
|
10739
11094
|
return 0;
|
|
10740
11095
|
}
|
|
11096
|
+
async _executeLazyFunctionAsync(node, refOffsetX, refOffsetY) {
|
|
11097
|
+
if (node.nodeType !== 4) return false;
|
|
11098
|
+
const token = node.getToken().toUpperCase();
|
|
11099
|
+
if (token === "IF") return await this._executeLazyIfAsync(node, refOffsetX, refOffsetY);
|
|
11100
|
+
if (token === "IFERROR") return await this._executeLazyIfErrorAsync(node, refOffsetX, refOffsetY);
|
|
11101
|
+
return false;
|
|
11102
|
+
}
|
|
11103
|
+
_executeLazyFunction(node, refOffsetX, refOffsetY) {
|
|
11104
|
+
if (node.nodeType !== 4) return false;
|
|
11105
|
+
const token = node.getToken().toUpperCase();
|
|
11106
|
+
if (token === "IF") return this._executeLazyIf(node, refOffsetX, refOffsetY);
|
|
11107
|
+
if (token === "IFERROR") return this._executeLazyIfError(node, refOffsetX, refOffsetY);
|
|
11108
|
+
return false;
|
|
11109
|
+
}
|
|
11110
|
+
async _executeLazyIfAsync(node, refOffsetX, refOffsetY) {
|
|
11111
|
+
const children = node.getChildren();
|
|
11112
|
+
if (children.length < 2 || children.length > 3) return false;
|
|
11113
|
+
await this._executeAsync(children[0], refOffsetX, refOffsetY);
|
|
11114
|
+
const condition = children[0].getValue();
|
|
11115
|
+
if (condition == null || condition.isReferenceObject() || condition.isArray()) return false;
|
|
11116
|
+
if (condition.isError()) {
|
|
11117
|
+
node.setValue(condition);
|
|
11118
|
+
return true;
|
|
11119
|
+
}
|
|
11120
|
+
const selected = condition.getValue() ? children[1] : children[2];
|
|
11121
|
+
if (selected == null) {
|
|
11122
|
+
node.setValue(BooleanValueObject.create(false));
|
|
11123
|
+
return true;
|
|
11124
|
+
}
|
|
11125
|
+
await this._executeAsync(selected, refOffsetX, refOffsetY);
|
|
11126
|
+
node.setValue(this._toLazyIfSelectedValue(selected.getValue(), node));
|
|
11127
|
+
return true;
|
|
11128
|
+
}
|
|
11129
|
+
_executeLazyIf(node, refOffsetX, refOffsetY) {
|
|
11130
|
+
const children = node.getChildren();
|
|
11131
|
+
if (children.length < 2 || children.length > 3) return false;
|
|
11132
|
+
this._execute(children[0], refOffsetX, refOffsetY);
|
|
11133
|
+
const condition = children[0].getValue();
|
|
11134
|
+
if (condition == null || condition.isReferenceObject() || condition.isArray()) return false;
|
|
11135
|
+
if (condition.isError()) {
|
|
11136
|
+
node.setValue(condition);
|
|
11137
|
+
return true;
|
|
11138
|
+
}
|
|
11139
|
+
const selected = condition.getValue() ? children[1] : children[2];
|
|
11140
|
+
if (selected == null) {
|
|
11141
|
+
node.setValue(BooleanValueObject.create(false));
|
|
11142
|
+
return true;
|
|
11143
|
+
}
|
|
11144
|
+
this._execute(selected, refOffsetX, refOffsetY);
|
|
11145
|
+
node.setValue(this._toLazyIfSelectedValue(selected.getValue(), node));
|
|
11146
|
+
return true;
|
|
11147
|
+
}
|
|
11148
|
+
async _executeLazyIfErrorAsync(node, refOffsetX, refOffsetY) {
|
|
11149
|
+
var _children$1$getValue;
|
|
11150
|
+
const children = node.getChildren();
|
|
11151
|
+
if (children.length !== 2) return false;
|
|
11152
|
+
await this._executeAsync(children[0], refOffsetX, refOffsetY);
|
|
11153
|
+
const rawValue = children[0].getValue();
|
|
11154
|
+
const value = this._toLazyIfErrorValue(rawValue);
|
|
11155
|
+
if (value == null || value.isArray()) return false;
|
|
11156
|
+
if (!value.isError()) {
|
|
11157
|
+
node.setValue(value);
|
|
11158
|
+
return true;
|
|
11159
|
+
}
|
|
11160
|
+
await this._executeAsync(children[1], refOffsetX, refOffsetY);
|
|
11161
|
+
node.setValue((_children$1$getValue = children[1].getValue()) !== null && _children$1$getValue !== void 0 ? _children$1$getValue : ErrorValueObject.create("#VALUE!"));
|
|
11162
|
+
return true;
|
|
11163
|
+
}
|
|
11164
|
+
_executeLazyIfError(node, refOffsetX, refOffsetY) {
|
|
11165
|
+
var _children$1$getValue2;
|
|
11166
|
+
const children = node.getChildren();
|
|
11167
|
+
if (children.length !== 2) return false;
|
|
11168
|
+
this._execute(children[0], refOffsetX, refOffsetY);
|
|
11169
|
+
const rawValue = children[0].getValue();
|
|
11170
|
+
const value = this._toLazyIfErrorValue(rawValue);
|
|
11171
|
+
if (value == null || value.isArray()) return false;
|
|
11172
|
+
if (!value.isError()) {
|
|
11173
|
+
node.setValue(value);
|
|
11174
|
+
return true;
|
|
11175
|
+
}
|
|
11176
|
+
this._execute(children[1], refOffsetX, refOffsetY);
|
|
11177
|
+
node.setValue((_children$1$getValue2 = children[1].getValue()) !== null && _children$1$getValue2 !== void 0 ? _children$1$getValue2 : ErrorValueObject.create("#VALUE!"));
|
|
11178
|
+
return true;
|
|
11179
|
+
}
|
|
11180
|
+
_toLazyIfErrorValue(value) {
|
|
11181
|
+
if (value == null) return null;
|
|
11182
|
+
if (!value.isReferenceObject()) {
|
|
11183
|
+
const baseValue = value;
|
|
11184
|
+
return baseValue.isNull() ? NumberValueObject.create(0) : baseValue;
|
|
11185
|
+
}
|
|
11186
|
+
const reference = value;
|
|
11187
|
+
if (reference.getRowCount() !== 1 || reference.getColumnCount() !== 1) return reference.toArrayValueObject();
|
|
11188
|
+
const cellValue = reference.getCellByPosition();
|
|
11189
|
+
return cellValue.isNull() ? NumberValueObject.create(0) : cellValue;
|
|
11190
|
+
}
|
|
11191
|
+
_toLazyIfSelectedValue(value, node) {
|
|
11192
|
+
if (value == null) return ErrorValueObject.create("#VALUE!");
|
|
11193
|
+
if (value.isReferenceObject()) {
|
|
11194
|
+
const reference = value;
|
|
11195
|
+
if (this._preserveLazyIfSelectedReferenceArray(node)) return reference.toArrayValueObject();
|
|
11196
|
+
value = this._implicitLazyIfReferenceValue(reference);
|
|
11197
|
+
}
|
|
11198
|
+
if (value.isArray()) value = this._implicitLazyIfArrayValue(value);
|
|
11199
|
+
if (!value.isArray()) {
|
|
11200
|
+
const baseValue = value;
|
|
11201
|
+
return baseValue.isNull() ? NumberValueObject.create(0) : baseValue;
|
|
11202
|
+
}
|
|
11203
|
+
return value;
|
|
11204
|
+
}
|
|
11205
|
+
_implicitLazyIfReferenceValue(reference) {
|
|
11206
|
+
const range = reference.getRangePosition();
|
|
11207
|
+
const currentRow = this._runtimeService.currentRow || 0;
|
|
11208
|
+
const currentColumn = this._runtimeService.currentColumn || 0;
|
|
11209
|
+
const { startRow, startColumn, endRow, endColumn } = range;
|
|
11210
|
+
if (startRow === endRow && startColumn === endColumn) return reference.getCellByPosition();
|
|
11211
|
+
if (endRow === startRow && currentColumn >= startColumn && currentColumn <= endColumn) return reference.getCellByColumn(currentColumn);
|
|
11212
|
+
if (startColumn === endColumn && currentRow >= startRow && currentRow <= endRow) return reference.getCellByRow(currentRow);
|
|
11213
|
+
return ErrorValueObject.create("#VALUE!");
|
|
11214
|
+
}
|
|
11215
|
+
_preserveLazyIfSelectedReferenceArray(node) {
|
|
11216
|
+
let child = node;
|
|
11217
|
+
let parent = child.getParent();
|
|
11218
|
+
while (parent != null) {
|
|
11219
|
+
if (parent.nodeType === 4) return parent.getToken().toUpperCase() === "MATCH" && parent.getChildren().indexOf(child) === 1;
|
|
11220
|
+
child = parent;
|
|
11221
|
+
parent = parent.getParent();
|
|
11222
|
+
}
|
|
11223
|
+
return false;
|
|
11224
|
+
}
|
|
11225
|
+
_implicitLazyIfArrayValue(array) {
|
|
11226
|
+
if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return array;
|
|
11227
|
+
const startRow = array.getCurrentRow();
|
|
11228
|
+
const startColumn = array.getCurrentColumn();
|
|
11229
|
+
const rowCount = array.getRowCount();
|
|
11230
|
+
const columnCount = array.getColumnCount();
|
|
11231
|
+
const currentRow = this._runtimeService.currentRow || 0;
|
|
11232
|
+
const currentColumn = this._runtimeService.currentColumn || 0;
|
|
11233
|
+
let rowIndex = -1;
|
|
11234
|
+
let columnIndex = -1;
|
|
11235
|
+
if (rowCount === 1 && columnCount === 1) {
|
|
11236
|
+
rowIndex = 0;
|
|
11237
|
+
columnIndex = 0;
|
|
11238
|
+
} else if (rowCount === 1) {
|
|
11239
|
+
rowIndex = 0;
|
|
11240
|
+
columnIndex = currentColumn - startColumn;
|
|
11241
|
+
} else if (columnCount === 1) {
|
|
11242
|
+
rowIndex = currentRow - startRow;
|
|
11243
|
+
columnIndex = 0;
|
|
11244
|
+
} else {
|
|
11245
|
+
rowIndex = currentRow - startRow;
|
|
11246
|
+
columnIndex = currentColumn - startColumn;
|
|
11247
|
+
}
|
|
11248
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
|
|
11249
|
+
return array.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
|
|
11250
|
+
}
|
|
10741
11251
|
};
|
|
10742
11252
|
Interpreter = __decorate([__decorateParam(0, IFormulaRuntimeService)], Interpreter);
|
|
10743
11253
|
|
|
@@ -10956,9 +11466,10 @@ let LambdaNodeFactory = class LambdaNodeFactory extends BaseAstNodeFactory {
|
|
|
10956
11466
|
for (let i = 0; i < parameterArray.length; i++) {
|
|
10957
11467
|
const parameter = parameterArray[i];
|
|
10958
11468
|
if (parameter instanceof LexerNode) {
|
|
10959
|
-
const variant = parameter
|
|
11469
|
+
const variant = getLambdaParameterName(parameter);
|
|
11470
|
+
if (variant == null) return ErrorNode.create("#VALUE!");
|
|
10960
11471
|
parameter.setToken(DEFAULT_TOKEN_TYPE_LAMBDA_OMIT_PARAMETER);
|
|
10961
|
-
currentLambdaPrivacyVar.set(variant
|
|
11472
|
+
currentLambdaPrivacyVar.set(variant, void 0);
|
|
10962
11473
|
} else return ErrorNode.create("#VALUE!");
|
|
10963
11474
|
}
|
|
10964
11475
|
this._runtimeService.registerFunctionDefinitionPrivacyVar(lambdaId, currentLambdaPrivacyVar);
|
|
@@ -10975,6 +11486,20 @@ let LambdaNodeFactory = class LambdaNodeFactory extends BaseAstNodeFactory {
|
|
|
10975
11486
|
}
|
|
10976
11487
|
};
|
|
10977
11488
|
LambdaNodeFactory = __decorate([__decorateParam(0, IFormulaRuntimeService), __decorateParam(1, Inject(Interpreter))], LambdaNodeFactory);
|
|
11489
|
+
function getLambdaParameterName(parameter) {
|
|
11490
|
+
const children = parameter.getChildren();
|
|
11491
|
+
for (let i = 0; i < children.length; i++) {
|
|
11492
|
+
const child = children[i];
|
|
11493
|
+
if (typeof child === "string") {
|
|
11494
|
+
const token = child.trim();
|
|
11495
|
+
if (token.length > 0) return token;
|
|
11496
|
+
} else {
|
|
11497
|
+
const token = getLambdaParameterName(child);
|
|
11498
|
+
if (token != null) return token;
|
|
11499
|
+
}
|
|
11500
|
+
}
|
|
11501
|
+
return null;
|
|
11502
|
+
}
|
|
10978
11503
|
|
|
10979
11504
|
//#endregion
|
|
10980
11505
|
//#region src/engine/ast-node/lambda-parameter-node.ts
|
|
@@ -11085,12 +11610,17 @@ var OperatorNode = class extends BaseAstNode {
|
|
|
11085
11610
|
}
|
|
11086
11611
|
if (object1 == null) object1 = NullValueObject.create();
|
|
11087
11612
|
if (object2 == null) object2 = NullValueObject.create();
|
|
11088
|
-
if (object1.isReferenceObject()) object1 =
|
|
11089
|
-
if (object2.isReferenceObject()) object2 =
|
|
11613
|
+
if (object1.isReferenceObject()) object1 = this._referenceToOperatorValue(object1);
|
|
11614
|
+
if (object2.isReferenceObject()) object2 = this._referenceToOperatorValue(object2);
|
|
11090
11615
|
const result = this._functionExecutor.calculate(object1, object2);
|
|
11091
11616
|
this._setEmbeddedArrayFormulaToResult(result);
|
|
11092
11617
|
this.setValue(result);
|
|
11093
11618
|
}
|
|
11619
|
+
_referenceToOperatorValue(reference) {
|
|
11620
|
+
const array = reference.toArrayValueObject();
|
|
11621
|
+
if (array.getRowCount() === 1 && array.getColumnCount() === 1) return array.get(0, 0);
|
|
11622
|
+
return array;
|
|
11623
|
+
}
|
|
11094
11624
|
/**
|
|
11095
11625
|
* If it contains an array formula, set the current cell to the cache and send itself as a ref outward
|
|
11096
11626
|
*/
|
|
@@ -11167,6 +11697,7 @@ var TableReferenceObject = class extends BaseReferenceObject {
|
|
|
11167
11697
|
const { startColumn, endColumn, type } = this._parseStructuredRef(this._columnDataString, titleMap);
|
|
11168
11698
|
const tableStartRow = range.startRow;
|
|
11169
11699
|
const tableEndRow = range.endRow;
|
|
11700
|
+
const dataStartRow = tableStartRow + (this._tableData.showHeader === false ? 0 : 1);
|
|
11170
11701
|
let startRow = -1;
|
|
11171
11702
|
let endRow = -1;
|
|
11172
11703
|
switch (type) {
|
|
@@ -11175,10 +11706,15 @@ var TableReferenceObject = class extends BaseReferenceObject {
|
|
|
11175
11706
|
endRow = tableEndRow;
|
|
11176
11707
|
break;
|
|
11177
11708
|
case "#Data":
|
|
11178
|
-
startRow =
|
|
11709
|
+
startRow = dataStartRow;
|
|
11179
11710
|
endRow = tableEndRow;
|
|
11180
11711
|
break;
|
|
11181
11712
|
case "#Headers":
|
|
11713
|
+
if (this._tableData.showHeader === false) {
|
|
11714
|
+
startRow = -1;
|
|
11715
|
+
endRow = -1;
|
|
11716
|
+
break;
|
|
11717
|
+
}
|
|
11182
11718
|
startRow = tableStartRow;
|
|
11183
11719
|
endRow = tableStartRow;
|
|
11184
11720
|
break;
|
|
@@ -11193,7 +11729,7 @@ var TableReferenceObject = class extends BaseReferenceObject {
|
|
|
11193
11729
|
break;
|
|
11194
11730
|
}
|
|
11195
11731
|
default:
|
|
11196
|
-
startRow =
|
|
11732
|
+
startRow = dataStartRow;
|
|
11197
11733
|
endRow = tableEndRow;
|
|
11198
11734
|
break;
|
|
11199
11735
|
}
|
|
@@ -11218,6 +11754,13 @@ var TableReferenceObject = class extends BaseReferenceObject {
|
|
|
11218
11754
|
}
|
|
11219
11755
|
return rangeData;
|
|
11220
11756
|
}
|
|
11757
|
+
getCellData(row, column) {
|
|
11758
|
+
if (this._isCurrentRowForRange) {
|
|
11759
|
+
const { startRow, endRow } = this._tableData.range;
|
|
11760
|
+
if (row < startRow || row > endRow) return { v: "#N/A" };
|
|
11761
|
+
}
|
|
11762
|
+
return super.getCellData(row, column);
|
|
11763
|
+
}
|
|
11221
11764
|
getRefOffset() {
|
|
11222
11765
|
return {
|
|
11223
11766
|
x: 0,
|
|
@@ -11394,12 +11937,15 @@ var TableReferenceObject = class extends BaseReferenceObject {
|
|
|
11394
11937
|
}
|
|
11395
11938
|
/** Column title → column index; returns -1 if not found (caller should handle as parse error) */
|
|
11396
11939
|
_titleToIndex(name, titleMap) {
|
|
11397
|
-
var _titleMap$get;
|
|
11398
11940
|
const key = name.trim();
|
|
11399
11941
|
const hit = titleMap.get(key);
|
|
11400
11942
|
if (hit !== void 0) return hit;
|
|
11401
11943
|
const keyNorm = key.replace(/\u3000/g, " ").trim();
|
|
11402
|
-
|
|
11944
|
+
const normalizedHit = titleMap.get(keyNorm);
|
|
11945
|
+
if (normalizedHit !== void 0) return normalizedHit;
|
|
11946
|
+
const lineBreakNorm = keyNorm.replace(/\r\n?/g, "\n");
|
|
11947
|
+
for (const [title, index] of titleMap.entries()) if (title.replace(/\u3000/g, " ").trim().replace(/\r\n?/g, "\n") === lineBreakNorm) return index;
|
|
11948
|
+
return -1;
|
|
11403
11949
|
}
|
|
11404
11950
|
/** Resolve #This Row's row number; takes first data row (tableStartRow+1) when no context available */
|
|
11405
11951
|
_resolveThisRow(tableStartRow, tableEndRow) {
|
|
@@ -11411,13 +11957,15 @@ var TableReferenceObject = class extends BaseReferenceObject {
|
|
|
11411
11957
|
//#endregion
|
|
11412
11958
|
//#region src/engine/ast-node/reference-node.ts
|
|
11413
11959
|
var ReferenceNode = class extends BaseAstNode {
|
|
11414
|
-
constructor(_currentConfigService, _runtimeService, operatorString, _referenceObjectType, _isPrepareMerge = false,
|
|
11960
|
+
constructor(_currentConfigService, _runtimeService, operatorString, _referenceObjectType, _unitReferenceResolver, _superTableService, _isPrepareMerge = false, _tableReference) {
|
|
11415
11961
|
super(operatorString);
|
|
11416
11962
|
this._currentConfigService = _currentConfigService;
|
|
11417
11963
|
this._runtimeService = _runtimeService;
|
|
11418
11964
|
this._referenceObjectType = _referenceObjectType;
|
|
11965
|
+
this._unitReferenceResolver = _unitReferenceResolver;
|
|
11966
|
+
this._superTableService = _superTableService;
|
|
11419
11967
|
this._isPrepareMerge = _isPrepareMerge;
|
|
11420
|
-
this.
|
|
11968
|
+
this._tableReference = _tableReference;
|
|
11421
11969
|
_defineProperty(this, "_refOffsetX", 0);
|
|
11422
11970
|
_defineProperty(this, "_refOffsetY", 0);
|
|
11423
11971
|
}
|
|
@@ -11427,7 +11975,49 @@ var ReferenceNode = class extends BaseAstNode {
|
|
|
11427
11975
|
execute() {
|
|
11428
11976
|
const currentConfigService = this._currentConfigService;
|
|
11429
11977
|
const runtimeService = this._runtimeService;
|
|
11430
|
-
|
|
11978
|
+
let referenceObject;
|
|
11979
|
+
if (this._tableReference) {
|
|
11980
|
+
var _Array$from$find;
|
|
11981
|
+
const { unitQualifier, tableName, columnStruct } = this._tableReference;
|
|
11982
|
+
const resolution = this._unitReferenceResolver.resolve({
|
|
11983
|
+
hostUnitId: runtimeService.currentUnitId,
|
|
11984
|
+
qualifier: unitQualifier,
|
|
11985
|
+
referenceKind: "table"
|
|
11986
|
+
});
|
|
11987
|
+
if (typeof resolution === "string") {
|
|
11988
|
+
this.setValue(ErrorValueObject.create(resolution));
|
|
11989
|
+
return;
|
|
11990
|
+
}
|
|
11991
|
+
const tableMap = this._superTableService.getTableMap(resolution.unitId);
|
|
11992
|
+
const tableData = (_Array$from$find = Array.from((tableMap === null || tableMap === void 0 ? void 0 : tableMap.entries()) || []).find(([name]) => name.toLocaleLowerCase() === tableName.toLocaleLowerCase())) === null || _Array$from$find === void 0 ? void 0 : _Array$from$find[1];
|
|
11993
|
+
if (!tableData) {
|
|
11994
|
+
this.setValue(ErrorValueObject.create("#REF!"));
|
|
11995
|
+
return;
|
|
11996
|
+
}
|
|
11997
|
+
referenceObject = new TableReferenceObject(this.getToken(), tableData, columnStruct, this._superTableService.getTableOptionMap());
|
|
11998
|
+
referenceObject.setUnitQualifier(unitQualifier);
|
|
11999
|
+
referenceObject.setForcedUnitIdDirect(resolution.unitId);
|
|
12000
|
+
} else {
|
|
12001
|
+
referenceObject = getReferenceObjectFromCache(this.getToken(), this._referenceObjectType);
|
|
12002
|
+
const unitQualifier = referenceObject.getUnitQualifier();
|
|
12003
|
+
if (unitQualifier) {
|
|
12004
|
+
const resolution = this._unitReferenceResolver.resolve({
|
|
12005
|
+
hostUnitId: runtimeService.currentUnitId,
|
|
12006
|
+
qualifier: unitQualifier,
|
|
12007
|
+
referenceKind: "a1"
|
|
12008
|
+
});
|
|
12009
|
+
if (typeof resolution === "string") {
|
|
12010
|
+
this.setValue(ErrorValueObject.create(resolution));
|
|
12011
|
+
return;
|
|
12012
|
+
}
|
|
12013
|
+
referenceObject.setForcedUnitIdDirect(resolution.unitId);
|
|
12014
|
+
}
|
|
12015
|
+
}
|
|
12016
|
+
this._configureReferenceObject(referenceObject, currentConfigService, runtimeService);
|
|
12017
|
+
if (!this._isPrepareMerge && referenceObject.isExceedRange()) this.setValue(ErrorValueObject.create("#NAME?"));
|
|
12018
|
+
else this.setValue(referenceObject);
|
|
12019
|
+
}
|
|
12020
|
+
_configureReferenceObject(referenceObject, currentConfigService, runtimeService) {
|
|
11431
12021
|
referenceObject.setDefaultUnitId(runtimeService.currentUnitId);
|
|
11432
12022
|
referenceObject.setDefaultSheetId(runtimeService.currentSubUnitId);
|
|
11433
12023
|
referenceObject.setForcedSheetId(currentConfigService.getSheetNameMap());
|
|
@@ -11439,13 +12029,9 @@ var ReferenceNode = class extends BaseAstNode {
|
|
|
11439
12029
|
referenceObject.setRuntimeArrayFormulaCellData(runtimeService.getRuntimeArrayFormulaCellData());
|
|
11440
12030
|
referenceObject.setRuntimeArrayFormulaRange(runtimeService.getUnitArrayFormula());
|
|
11441
12031
|
referenceObject.setRuntimeFeatureCellData(runtimeService.getRuntimeFeatureCellData());
|
|
11442
|
-
|
|
11443
|
-
const currentCol = runtimeService.currentColumn;
|
|
11444
|
-
referenceObject.setCurrentRowAndColumn(currentRow, currentCol);
|
|
12032
|
+
referenceObject.setCurrentRowAndColumn(runtimeService.currentRow, runtimeService.currentColumn);
|
|
11445
12033
|
const { x, y } = this.getRefOffset();
|
|
11446
12034
|
referenceObject.setRefOffset(x, y);
|
|
11447
|
-
if (!this._isPrepareMerge && referenceObject.isExceedRange()) this.setValue(ErrorValueObject.create("#NAME?"));
|
|
11448
|
-
else this.setValue(referenceObject);
|
|
11449
12035
|
}
|
|
11450
12036
|
setRefOffset(x = 0, y = 0) {
|
|
11451
12037
|
this._refOffsetX = x;
|
|
@@ -11459,12 +12045,13 @@ var ReferenceNode = class extends BaseAstNode {
|
|
|
11459
12045
|
}
|
|
11460
12046
|
};
|
|
11461
12047
|
let ReferenceNodeFactory = class ReferenceNodeFactory extends BaseAstNodeFactory {
|
|
11462
|
-
constructor(_currentConfigService, _formulaRuntimeService, _functionService, _superTableService) {
|
|
12048
|
+
constructor(_currentConfigService, _formulaRuntimeService, _functionService, _superTableService, _unitReferenceResolver) {
|
|
11463
12049
|
super();
|
|
11464
12050
|
this._currentConfigService = _currentConfigService;
|
|
11465
12051
|
this._formulaRuntimeService = _formulaRuntimeService;
|
|
11466
12052
|
this._functionService = _functionService;
|
|
11467
12053
|
this._superTableService = _superTableService;
|
|
12054
|
+
this._unitReferenceResolver = _unitReferenceResolver;
|
|
11468
12055
|
}
|
|
11469
12056
|
get zIndex() {
|
|
11470
12057
|
return NODE_ORDER_MAP.get(1) || 100;
|
|
@@ -11493,7 +12080,7 @@ let ReferenceNodeFactory = class ReferenceNodeFactory extends BaseAstNodeFactory
|
|
|
11493
12080
|
}
|
|
11494
12081
|
}
|
|
11495
12082
|
_getTableMap() {
|
|
11496
|
-
const unitId = this.
|
|
12083
|
+
const unitId = this._formulaRuntimeService.currentUnitId;
|
|
11497
12084
|
if (!unitId) return;
|
|
11498
12085
|
return this._superTableService.getTableMap(unitId);
|
|
11499
12086
|
}
|
|
@@ -11501,25 +12088,25 @@ let ReferenceNodeFactory = class ReferenceNodeFactory extends BaseAstNodeFactory
|
|
|
11501
12088
|
var _tableMap$has;
|
|
11502
12089
|
const currentConfigService = this._currentConfigService;
|
|
11503
12090
|
const runtimeService = this._formulaRuntimeService;
|
|
11504
|
-
const makeRef = (type) => new ReferenceNode(currentConfigService, runtimeService, tokenTrim, type, isPrepareMerge);
|
|
12091
|
+
const makeRef = (type) => new ReferenceNode(currentConfigService, runtimeService, tokenTrim, type, this._unitReferenceResolver, this._superTableService, isPrepareMerge);
|
|
11505
12092
|
const tableMap = this._getTableMap();
|
|
11506
|
-
if ((_tableMap$has = tableMap === null || tableMap === void 0 ? void 0 : tableMap.has(tokenTrim)) !== null && _tableMap$has !== void 0 ? _tableMap$has : false) return this._getTableReferenceNode(tokenTrim,
|
|
12093
|
+
if ((_tableMap$has = tableMap === null || tableMap === void 0 ? void 0 : tableMap.has(tokenTrim)) !== null && _tableMap$has !== void 0 ? _tableMap$has : false) return this._getTableReferenceNode(tokenTrim, isPrepareMerge, true);
|
|
11507
12094
|
if (regexTestSingeRange(tokenTrim)) return makeRef(0);
|
|
11508
12095
|
const parentIsUnion = isLexerNode && this._checkParentIsUnionOperator(param);
|
|
11509
12096
|
if (parentIsUnion && regexTestSingleRow(tokenTrim)) return makeRef(2);
|
|
11510
12097
|
if (parentIsUnion && regexTestSingleColumn(tokenTrim)) return makeRef(1);
|
|
11511
|
-
return this._getTableReferenceNode(tokenTrim,
|
|
12098
|
+
return this._getTableReferenceNode(tokenTrim, isPrepareMerge, false);
|
|
11512
12099
|
}
|
|
11513
|
-
_getTableReferenceNode(tokenTrim,
|
|
12100
|
+
_getTableReferenceNode(tokenTrim, isPrepareMerge, isSuperTableDirectly = false) {
|
|
11514
12101
|
if (!this._checkTokenIsTableReference(tokenTrim) && !isSuperTableDirectly) return;
|
|
11515
|
-
const { tableName, columnStruct } = splitTableStructuredRef(tokenTrim);
|
|
12102
|
+
const { unitQualifier, tableName, columnStruct } = splitTableStructuredRef(tokenTrim);
|
|
11516
12103
|
const tableMap = this._getTableMap();
|
|
11517
|
-
|
|
11518
|
-
|
|
11519
|
-
|
|
11520
|
-
|
|
11521
|
-
|
|
11522
|
-
}
|
|
12104
|
+
const hasLocalTable = Array.from((tableMap === null || tableMap === void 0 ? void 0 : tableMap.keys()) || []).some((name) => name.toLocaleLowerCase() === tableName.toLocaleLowerCase());
|
|
12105
|
+
if (unitQualifier || hasLocalTable) return new ReferenceNode(this._currentConfigService, this._formulaRuntimeService, tokenTrim, 1, this._unitReferenceResolver, this._superTableService, isPrepareMerge, {
|
|
12106
|
+
unitQualifier,
|
|
12107
|
+
tableName,
|
|
12108
|
+
columnStruct
|
|
12109
|
+
});
|
|
11523
12110
|
}
|
|
11524
12111
|
_checkTokenIsTableReference(token) {
|
|
11525
12112
|
return regexTestReferenceTableAllColumn(token) || regexTestReferenceTableSingleColumn(token) || regexTestReferenceTableMultipleColumn(token) || regexTestReferenceTableTitleOnlyAnyHash(token);
|
|
@@ -11533,7 +12120,8 @@ ReferenceNodeFactory = __decorate([
|
|
|
11533
12120
|
__decorateParam(0, IFormulaCurrentConfigService),
|
|
11534
12121
|
__decorateParam(1, IFormulaRuntimeService),
|
|
11535
12122
|
__decorateParam(2, IFunctionService),
|
|
11536
|
-
__decorateParam(3, ISuperTableService)
|
|
12123
|
+
__decorateParam(3, ISuperTableService),
|
|
12124
|
+
__decorateParam(4, IFormulaUnitReferenceResolver)
|
|
11537
12125
|
], ReferenceNodeFactory);
|
|
11538
12126
|
|
|
11539
12127
|
//#endregion
|
|
@@ -11579,7 +12167,7 @@ var SuffixNode = class extends BaseAstNode {
|
|
|
11579
12167
|
const formulaData = this._currentConfigService.getFormulaData();
|
|
11580
12168
|
const formulaString = formulaData === null || formulaData === void 0 || (_formulaData$unitId = formulaData[unitId]) === null || _formulaData$unitId === void 0 || (_formulaData$unitId = _formulaData$unitId[sheetId]) === null || _formulaData$unitId === void 0 || (_formulaData$unitId = _formulaData$unitId[range.startRow]) === null || _formulaData$unitId === void 0 || (_formulaData$unitId = _formulaData$unitId[range.startColumn]) === null || _formulaData$unitId === void 0 ? void 0 : _formulaData$unitId.f;
|
|
11581
12169
|
if (!formulaString) return ErrorValueObject.create("#VALUE!");
|
|
11582
|
-
this._lexer.treeBuilder(formulaString);
|
|
12170
|
+
this._lexer.treeBuilder(formulaString, true, unitId);
|
|
11583
12171
|
return ErrorValueObject.create("#VALUE!");
|
|
11584
12172
|
/** todo */
|
|
11585
12173
|
}
|
|
@@ -11680,13 +12268,19 @@ var ValueNode = class extends BaseAstNode {
|
|
|
11680
12268
|
return 2;
|
|
11681
12269
|
}
|
|
11682
12270
|
execute() {
|
|
12271
|
+
const token = this.getToken();
|
|
12272
|
+
const tokenTrim = token.trim();
|
|
12273
|
+
if (tokenTrim.startsWith("\"") && tokenTrim.endsWith("\"")) {
|
|
12274
|
+
this.setValue(StringValueObject.create(tokenTrim.slice(1, -1).replace(/""/g, "\"")));
|
|
12275
|
+
return;
|
|
12276
|
+
}
|
|
11683
12277
|
const parent = this.getParent();
|
|
11684
12278
|
let isIgnoreNumberPattern = true;
|
|
11685
12279
|
if ((parent === null || parent === void 0 ? void 0 : parent.nodeType) === 4) {
|
|
11686
12280
|
var _isFunctionExecutorAr, _isFunctionExecutorAr2;
|
|
11687
12281
|
isIgnoreNumberPattern = (_isFunctionExecutorAr = (_isFunctionExecutorAr2 = parent.isFunctionExecutorArgumentsIgnoreNumberPattern) === null || _isFunctionExecutorAr2 === void 0 ? void 0 : _isFunctionExecutorAr2.call(parent)) !== null && _isFunctionExecutorAr !== void 0 ? _isFunctionExecutorAr : true;
|
|
11688
12282
|
}
|
|
11689
|
-
this.setValue(ValueObjectFactory.create(
|
|
12283
|
+
this.setValue(ValueObjectFactory.create(token, isIgnoreNumberPattern));
|
|
11690
12284
|
}
|
|
11691
12285
|
};
|
|
11692
12286
|
var ValueNodeFactory = class extends BaseAstNodeFactory {
|
|
@@ -11852,6 +12446,9 @@ let AstTreeBuilder = class AstTreeBuilder extends Disposable {
|
|
|
11852
12446
|
astNode = getAstNodeTopParent(astNode);
|
|
11853
12447
|
if (astNode == null || (astNode === null || astNode === void 0 ? void 0 : astNode.nodeType) === 7) return astNode;
|
|
11854
12448
|
switch (astNode.nodeType) {
|
|
12449
|
+
case 8:
|
|
12450
|
+
calculateStack.push(astNode);
|
|
12451
|
+
break;
|
|
11855
12452
|
case 4: {
|
|
11856
12453
|
const token = astNode.getToken().trim().toUpperCase();
|
|
11857
12454
|
if (FORCED_RECALCULATION_FUNCTION_NAME.has(token)) astNode.setForcedCalculateFunction();
|
|
@@ -11903,9 +12500,20 @@ let AstTreeBuilder = class AstTreeBuilder extends Disposable {
|
|
|
11903
12500
|
astNode = this._astNodeFactoryList[x].checkAndCreateNodeType(item);
|
|
11904
12501
|
if (astNode != null) break;
|
|
11905
12502
|
}
|
|
11906
|
-
if (astNode == null)
|
|
12503
|
+
if (astNode == null) {
|
|
12504
|
+
const aggregatorNode = this._createGroupByAggregatorTokenNode(item);
|
|
12505
|
+
if (aggregatorNode != null) return aggregatorNode;
|
|
12506
|
+
return new ErrorFunctionNode();
|
|
12507
|
+
}
|
|
11907
12508
|
return astNode;
|
|
11908
12509
|
}
|
|
12510
|
+
_createGroupByAggregatorTokenNode(param) {
|
|
12511
|
+
const token = (typeof param === "string" ? param : param.getToken()).trim().toUpperCase();
|
|
12512
|
+
if (!token.startsWith("_XLETA.")) return null;
|
|
12513
|
+
const name = token.slice(7);
|
|
12514
|
+
if (name !== "SUM" && name !== "COUNT" && name !== "COUNTA" && name !== "PERCENTOF" && name !== "MIN" && name !== "MAX" && name !== "ARRAYTOTEXT") return null;
|
|
12515
|
+
return new BaseAstNode(name);
|
|
12516
|
+
}
|
|
11909
12517
|
_initializeAstNode() {
|
|
11910
12518
|
this._astNodeFactoryList = [
|
|
11911
12519
|
this._astRootNodeFactory,
|
|
@@ -13122,7 +13730,7 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends Dispos
|
|
|
13122
13730
|
return this._dependencyTreeCache.get(treeId);
|
|
13123
13731
|
}
|
|
13124
13732
|
_getTreeNode(tree) {
|
|
13125
|
-
return generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService);
|
|
13733
|
+
return generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService, tree.subUnitId);
|
|
13126
13734
|
}
|
|
13127
13735
|
*_traverse(treeList, skippedTreeIds) {
|
|
13128
13736
|
const stack = treeList;
|
|
@@ -13248,12 +13856,12 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends Dispos
|
|
|
13248
13856
|
for (let i = 0, len = treeList.length; i < len; i++) {
|
|
13249
13857
|
const tree = treeList[i];
|
|
13250
13858
|
if (!tree.formula) continue;
|
|
13859
|
+
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
13251
13860
|
const node = this._getTreeNode(tree);
|
|
13252
13861
|
tree.isDirty = this._includeTree(tree, node);
|
|
13253
13862
|
const addressFunctionNodes = this._getAddressFunctionNodeList(node);
|
|
13254
13863
|
if (addressFunctionNodes.length > 0) tree.addressFunctionNodes = addressFunctionNodes;
|
|
13255
13864
|
if (tree.isVirtual) continue;
|
|
13256
|
-
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
13257
13865
|
const rangeList = await this._getRangeListByNode({
|
|
13258
13866
|
node,
|
|
13259
13867
|
refOffsetX: tree.refOffsetX,
|
|
@@ -13458,13 +14066,13 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends Dispos
|
|
|
13458
14066
|
async _calculateAddressFunctionRuntimeData(treeDependencyCache, preCalculateTreeList) {
|
|
13459
14067
|
while (preCalculateTreeList.length > 0) {
|
|
13460
14068
|
const tree = preCalculateTreeList.pop();
|
|
14069
|
+
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
13461
14070
|
const nodeData = {
|
|
13462
14071
|
node: this._getTreeNode(tree),
|
|
13463
14072
|
refOffsetX: tree.refOffsetX,
|
|
13464
14073
|
refOffsetY: tree.refOffsetY
|
|
13465
14074
|
};
|
|
13466
14075
|
await this._calculateAddressFunction(treeDependencyCache, tree);
|
|
13467
|
-
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
13468
14076
|
let value;
|
|
13469
14077
|
if (this._interpreter.checkAsyncNode(nodeData.node)) value = await this._interpreter.executeAsync(nodeData);
|
|
13470
14078
|
else value = this._interpreter.execute(nodeData);
|
|
@@ -13805,9 +14413,10 @@ let CalculateFormulaService = class CalculateFormulaService extends Disposable {
|
|
|
13805
14413
|
this._executeLock.acquire("FORMULA_EXECUTION_LOCK", async () => {
|
|
13806
14414
|
for (let i = 0; i < cycleReferenceCount; i++) {
|
|
13807
14415
|
this._runtimeService.setFormulaCycleIndex(i);
|
|
13808
|
-
await this._executeStep();
|
|
14416
|
+
const executed = await this._executeStep();
|
|
13809
14417
|
FORMULA_REF_TO_ARRAY_CACHE.clear();
|
|
13810
|
-
|
|
14418
|
+
const isCycleDependency = this._runtimeService.isCycleDependency();
|
|
14419
|
+
if (!executed || !isCycleDependency) break;
|
|
13811
14420
|
}
|
|
13812
14421
|
this._runtimeService.setFormulaExecuteStage(8);
|
|
13813
14422
|
this._executionInProgressListener$.next(this._runtimeService.getRuntimeState());
|
|
@@ -13891,7 +14500,8 @@ let CalculateFormulaService = class CalculateFormulaService extends Disposable {
|
|
|
13891
14500
|
const treeCount = treeList.length;
|
|
13892
14501
|
while (treeList.length > 0) {
|
|
13893
14502
|
const tree = treeList.pop();
|
|
13894
|
-
|
|
14503
|
+
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
14504
|
+
const node = generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService, tree.subUnitId);
|
|
13895
14505
|
const nodeData = {
|
|
13896
14506
|
node,
|
|
13897
14507
|
refOffsetX: tree.refOffsetX,
|
|
@@ -13917,11 +14527,9 @@ let CalculateFormulaService = class CalculateFormulaService extends Disposable {
|
|
|
13917
14527
|
if (this._runtimeService.isStopExecution() || nodeData == null && getDirtyData == null) {
|
|
13918
14528
|
this._runtimeService.setFormulaExecuteStage(0);
|
|
13919
14529
|
this._runtimeService.markedAsStopFunctionsExecuted();
|
|
13920
|
-
this._executionCompleteListener$.next(this._runtimeService.getAllRuntimeData());
|
|
13921
14530
|
return;
|
|
13922
14531
|
}
|
|
13923
14532
|
}
|
|
13924
|
-
this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
|
|
13925
14533
|
let value;
|
|
13926
14534
|
if (getDirtyData != null && tree.featureId != null) {
|
|
13927
14535
|
/**
|
|
@@ -14014,8 +14622,9 @@ let CalculateFormulaService = class CalculateFormulaService extends Disposable {
|
|
|
14014
14622
|
}
|
|
14015
14623
|
return result;
|
|
14016
14624
|
}
|
|
14017
|
-
async calculate(formulaString) {
|
|
14018
|
-
const
|
|
14625
|
+
async calculate(formulaString, transformSuffix = true, unitId) {
|
|
14626
|
+
const executeUnitId = unitId || this._runtimeService.currentUnitId || this._currentConfigService.getExecuteUnitId();
|
|
14627
|
+
const lexerNode = this._lexer.treeBuilder(formulaString, transformSuffix, executeUnitId);
|
|
14019
14628
|
if (Object.values(ErrorType).includes(lexerNode)) return;
|
|
14020
14629
|
const astNode = this._astTreeBuilder.parse(lexerNode);
|
|
14021
14630
|
const interpreter = this._interpreter;
|
|
@@ -14203,6 +14812,86 @@ CalculateController = __decorate([
|
|
|
14203
14812
|
__decorateParam(2, Inject(FormulaDataModel))
|
|
14204
14813
|
], CalculateController);
|
|
14205
14814
|
|
|
14815
|
+
//#endregion
|
|
14816
|
+
//#region src/services/active-dirty-manager.service.ts
|
|
14817
|
+
/**
|
|
14818
|
+
* Actively mark as dirty, calculate the dirty area based on the command,
|
|
14819
|
+
* and plugins can register the ref range they affect into the formula engine.
|
|
14820
|
+
*/
|
|
14821
|
+
var ActiveDirtyManagerService = class extends Disposable {
|
|
14822
|
+
constructor(..._args) {
|
|
14823
|
+
super(..._args);
|
|
14824
|
+
_defineProperty(this, "_dirtyConversionMap", /* @__PURE__ */ new Map());
|
|
14825
|
+
}
|
|
14826
|
+
dispose() {
|
|
14827
|
+
this._dirtyConversionMap.clear();
|
|
14828
|
+
}
|
|
14829
|
+
remove(commandId) {
|
|
14830
|
+
this._dirtyConversionMap.delete(commandId);
|
|
14831
|
+
}
|
|
14832
|
+
get(commandId) {
|
|
14833
|
+
return this._dirtyConversionMap.get(commandId);
|
|
14834
|
+
}
|
|
14835
|
+
has(commandId) {
|
|
14836
|
+
return this._dirtyConversionMap.has(commandId);
|
|
14837
|
+
}
|
|
14838
|
+
register(commandId, dirtyConversion) {
|
|
14839
|
+
this._dirtyConversionMap.set(commandId, dirtyConversion);
|
|
14840
|
+
}
|
|
14841
|
+
getDirtyConversionMap() {
|
|
14842
|
+
return this._dirtyConversionMap;
|
|
14843
|
+
}
|
|
14844
|
+
};
|
|
14845
|
+
const IActiveDirtyManagerService = createIdentifier("univer.formula.active-dirty-manager.service");
|
|
14846
|
+
|
|
14847
|
+
//#endregion
|
|
14848
|
+
//#region src/controllers/super-table-active-dirty.controller.ts
|
|
14849
|
+
let SuperTableActiveDirtyController = class SuperTableActiveDirtyController extends Disposable {
|
|
14850
|
+
constructor(_activeDirtyManagerService) {
|
|
14851
|
+
super();
|
|
14852
|
+
this._activeDirtyManagerService = _activeDirtyManagerService;
|
|
14853
|
+
this._initialize();
|
|
14854
|
+
}
|
|
14855
|
+
_initialize() {
|
|
14856
|
+
this._activeDirtyManagerService.register(SetSuperTableMutation.id, {
|
|
14857
|
+
commandId: SetSuperTableMutation.id,
|
|
14858
|
+
getDirtyData: (command) => {
|
|
14859
|
+
const params = command.params;
|
|
14860
|
+
const tableNames = [params.tableName, params.oldTableName].filter((name) => Boolean(name));
|
|
14861
|
+
return {
|
|
14862
|
+
dirtyRanges: [{
|
|
14863
|
+
unitId: params.unitId,
|
|
14864
|
+
sheetId: params.reference.sheetId,
|
|
14865
|
+
range: params.reference.range
|
|
14866
|
+
}],
|
|
14867
|
+
dirtySuperTableMap: { [params.unitId]: Object.fromEntries(tableNames.map((name) => [name, "1"])) },
|
|
14868
|
+
clearDependencyTreeCache: { [params.unitId]: { [params.reference.sheetId]: "1" } }
|
|
14869
|
+
};
|
|
14870
|
+
}
|
|
14871
|
+
});
|
|
14872
|
+
this._activeDirtyManagerService.register(RemoveSuperTableMutation.id, {
|
|
14873
|
+
commandId: RemoveSuperTableMutation.id,
|
|
14874
|
+
getDirtyData: (command) => {
|
|
14875
|
+
const params = command.params;
|
|
14876
|
+
return {
|
|
14877
|
+
dirtyRanges: params.reference ? [{
|
|
14878
|
+
unitId: params.unitId,
|
|
14879
|
+
sheetId: params.reference.sheetId,
|
|
14880
|
+
range: params.reference.range
|
|
14881
|
+
}] : void 0,
|
|
14882
|
+
dirtySuperTableMap: { [params.unitId]: { [params.tableName]: "1" } },
|
|
14883
|
+
clearDependencyTreeCache: params.reference ? { [params.unitId]: { [params.reference.sheetId]: "1" } } : void 0
|
|
14884
|
+
};
|
|
14885
|
+
}
|
|
14886
|
+
});
|
|
14887
|
+
this.disposeWithMe(toDisposable(() => {
|
|
14888
|
+
this._activeDirtyManagerService.remove(SetSuperTableMutation.id);
|
|
14889
|
+
this._activeDirtyManagerService.remove(RemoveSuperTableMutation.id);
|
|
14890
|
+
}));
|
|
14891
|
+
}
|
|
14892
|
+
};
|
|
14893
|
+
SuperTableActiveDirtyController = __decorate([__decorateParam(0, IActiveDirtyManagerService)], SuperTableActiveDirtyController);
|
|
14894
|
+
|
|
14206
14895
|
//#endregion
|
|
14207
14896
|
//#region src/engine/utils/r1c1-reference.ts
|
|
14208
14897
|
const $relativeRegex = /[\[\]]/g;
|
|
@@ -14222,7 +14911,7 @@ function singleReference(refBody, currentRow = 0, currentColumn = 0) {
|
|
|
14222
14911
|
};
|
|
14223
14912
|
}
|
|
14224
14913
|
function deserializeRangeForR1C1(refString, currentRow = 0, currentColumn = 0) {
|
|
14225
|
-
const { refBody, sheetName,
|
|
14914
|
+
const { refBody, sheetName, unitQualifier } = handleRefStringInfo(refString);
|
|
14226
14915
|
const colonIndex = refBody.indexOf(":");
|
|
14227
14916
|
if (colonIndex === -1) {
|
|
14228
14917
|
const grid = singleReference(refBody, currentRow, currentColumn);
|
|
@@ -14230,7 +14919,7 @@ function deserializeRangeForR1C1(refString, currentRow = 0, currentColumn = 0) {
|
|
|
14230
14919
|
const column = grid.column;
|
|
14231
14920
|
const absoluteRefType = grid.absoluteRefType;
|
|
14232
14921
|
return {
|
|
14233
|
-
unitId,
|
|
14922
|
+
unitId: unitQualifier,
|
|
14234
14923
|
sheetName,
|
|
14235
14924
|
range: {
|
|
14236
14925
|
startRow: row,
|
|
@@ -14247,7 +14936,7 @@ function deserializeRangeForR1C1(refString, currentRow = 0, currentColumn = 0) {
|
|
|
14247
14936
|
const startGrid = singleReference(refStartString, currentRow, currentColumn);
|
|
14248
14937
|
const endGrid = singleReference(refEndString, currentRow, currentColumn);
|
|
14249
14938
|
return {
|
|
14250
|
-
unitId,
|
|
14939
|
+
unitId: unitQualifier,
|
|
14251
14940
|
sheetName,
|
|
14252
14941
|
range: {
|
|
14253
14942
|
startRow: startGrid.row,
|
|
@@ -14277,6 +14966,91 @@ function getR1C1Ref(index, absoluteRefType = AbsoluteRefType.ALL, isRow) {
|
|
|
14277
14966
|
}
|
|
14278
14967
|
}
|
|
14279
14968
|
|
|
14969
|
+
//#endregion
|
|
14970
|
+
//#region src/engine/utils/unit-qualifier.ts
|
|
14971
|
+
/**
|
|
14972
|
+
* Copyright 2023-present DreamNum Co., Ltd.
|
|
14973
|
+
*
|
|
14974
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
14975
|
+
* you may not use this file except in compliance with the License.
|
|
14976
|
+
* You may obtain a copy of the License at
|
|
14977
|
+
*
|
|
14978
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
14979
|
+
*
|
|
14980
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14981
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14982
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14983
|
+
* See the License for the specific language governing permissions and
|
|
14984
|
+
* limitations under the License.
|
|
14985
|
+
*/
|
|
14986
|
+
const A1_UNIT_QUALIFIER = /('?)\[([^\]]+)\]((?:[^']|'')+)\1!(?=\$?[A-Z]{1,3}\$?\d+)/gi;
|
|
14987
|
+
const TABLE_UNIT_QUALIFIER = /(^|[^\w.])(?:'((?:[^']|'')+)'|\[([^\]]+)\]|([A-Za-z0-9_.-]+))!(?=[^\s!\[\]]+\[)/g;
|
|
14988
|
+
const INDIRECT_LITERAL = /\bINDIRECT\s*\(\s*"((?:[^"]|"")*)"/gi;
|
|
14989
|
+
function equalsQualifier(actual, expected) {
|
|
14990
|
+
return actual.replace(/''/g, "'").toLocaleLowerCase() === expected.toLocaleLowerCase();
|
|
14991
|
+
}
|
|
14992
|
+
function quoteQualifier(name) {
|
|
14993
|
+
return /^[A-Za-z0-9_.-]+$/.test(name) ? name : `'${name.replace(/'/g, "''")}'`;
|
|
14994
|
+
}
|
|
14995
|
+
function refactorReferenceSegment(segment, oldName, newName) {
|
|
14996
|
+
return segment.replace(A1_UNIT_QUALIFIER, (token, quote, qualifier, sheetName) => {
|
|
14997
|
+
if (!equalsQualifier(qualifier, oldName)) return token;
|
|
14998
|
+
const escapedName = newName.replace(/'/g, "''");
|
|
14999
|
+
return quote ? `'[${escapedName}]${sheetName}'!` : `[${newName}]${sheetName}!`;
|
|
15000
|
+
}).replace(TABLE_UNIT_QUALIFIER, (token, boundary, quoted, bracketed, plain) => {
|
|
15001
|
+
var _ref, _ref2;
|
|
15002
|
+
if (!equalsQualifier((_ref = (_ref2 = quoted !== null && quoted !== void 0 ? quoted : bracketed) !== null && _ref2 !== void 0 ? _ref2 : plain) !== null && _ref !== void 0 ? _ref : "", oldName)) return token;
|
|
15003
|
+
if (quoted != null) return `${boundary}'${newName.replace(/'/g, "''")}'!`;
|
|
15004
|
+
if (bracketed != null) return `${boundary}[${newName}]!`;
|
|
15005
|
+
return `${boundary}${quoteQualifier(newName)}!`;
|
|
15006
|
+
});
|
|
15007
|
+
}
|
|
15008
|
+
function refactorOutsideStrings(formula, oldName, newName) {
|
|
15009
|
+
let result = "";
|
|
15010
|
+
let chunk = "";
|
|
15011
|
+
let inString = false;
|
|
15012
|
+
for (let index = 0; index < formula.length; index++) {
|
|
15013
|
+
const character = formula[index];
|
|
15014
|
+
if (character !== "\"") {
|
|
15015
|
+
chunk += character;
|
|
15016
|
+
continue;
|
|
15017
|
+
}
|
|
15018
|
+
if (inString && formula[index + 1] === "\"") {
|
|
15019
|
+
chunk += "\"\"";
|
|
15020
|
+
index++;
|
|
15021
|
+
continue;
|
|
15022
|
+
}
|
|
15023
|
+
result += inString ? chunk : refactorReferenceSegment(chunk, oldName, newName);
|
|
15024
|
+
result += "\"";
|
|
15025
|
+
chunk = "";
|
|
15026
|
+
inString = !inString;
|
|
15027
|
+
}
|
|
15028
|
+
return result + (inString ? chunk : refactorReferenceSegment(chunk, oldName, newName));
|
|
15029
|
+
}
|
|
15030
|
+
/** Refactors only parsed reference qualifiers and INDIRECT literal references, never arbitrary text. */
|
|
15031
|
+
function refactorFormulaUnitQualifier(formula, oldName, newName) {
|
|
15032
|
+
if (!oldName || oldName === newName) return formula;
|
|
15033
|
+
return refactorOutsideStrings(formula.replace(INDIRECT_LITERAL, (token, literal) => {
|
|
15034
|
+
const next = refactorReferenceSegment(literal.replace(/""/g, "\""), oldName, newName).replace(/"/g, "\"\"");
|
|
15035
|
+
return token.replace(literal, next);
|
|
15036
|
+
}), oldName, newName);
|
|
15037
|
+
}
|
|
15038
|
+
/**
|
|
15039
|
+
* Copyright 2023-present DreamNum Co., Ltd.
|
|
15040
|
+
*
|
|
15041
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
15042
|
+
* you may not use this file except in compliance with the License.
|
|
15043
|
+
* You may obtain a copy of the License at
|
|
15044
|
+
*
|
|
15045
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
15046
|
+
*
|
|
15047
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
15048
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15049
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15050
|
+
* See the License for the specific language governing permissions and
|
|
15051
|
+
* limitations under the License.
|
|
15052
|
+
*/
|
|
15053
|
+
|
|
14280
15054
|
//#endregion
|
|
14281
15055
|
//#region src/engine/utils/check-variant-error.ts
|
|
14282
15056
|
function checkVariantErrorIsArray(variant) {
|
|
@@ -14374,11 +15148,14 @@ var BaseFunction = class {
|
|
|
14374
15148
|
_defineProperty(this, "_subUnitId", void 0);
|
|
14375
15149
|
_defineProperty(this, "_row", -1);
|
|
14376
15150
|
_defineProperty(this, "_column", -1);
|
|
15151
|
+
_defineProperty(this, "_currentFormulaRowCount", 1);
|
|
15152
|
+
_defineProperty(this, "_currentFormulaColumnCount", 1);
|
|
14377
15153
|
_defineProperty(this, "_definedNames", void 0);
|
|
14378
15154
|
_defineProperty(this, "_locale", void 0);
|
|
14379
15155
|
_defineProperty(this, "_sheetOrder", void 0);
|
|
14380
15156
|
_defineProperty(this, "_sheetNameMap", void 0);
|
|
14381
15157
|
_defineProperty(this, "_formulaDataModel", void 0);
|
|
15158
|
+
_defineProperty(this, "_unitReferenceResolver", void 0);
|
|
14382
15159
|
_defineProperty(this, "_rowCount", -1);
|
|
14383
15160
|
_defineProperty(this, "_columnCount", -1);
|
|
14384
15161
|
_defineProperty(
|
|
@@ -14421,6 +15198,12 @@ var BaseFunction = class {
|
|
|
14421
15198
|
"needsFormulaDataModel",
|
|
14422
15199
|
false
|
|
14423
15200
|
);
|
|
15201
|
+
_defineProperty(
|
|
15202
|
+
this,
|
|
15203
|
+
/** Whether the function resolves external Unit qualifiers. */
|
|
15204
|
+
"needsUnitReferenceResolver",
|
|
15205
|
+
false
|
|
15206
|
+
);
|
|
14424
15207
|
_defineProperty(
|
|
14425
15208
|
this,
|
|
14426
15209
|
/**
|
|
@@ -14437,6 +15220,23 @@ var BaseFunction = class {
|
|
|
14437
15220
|
"needsFilteredOutRows",
|
|
14438
15221
|
false
|
|
14439
15222
|
);
|
|
15223
|
+
_defineProperty(
|
|
15224
|
+
this,
|
|
15225
|
+
/**
|
|
15226
|
+
* Whether the function needs unevaluated AST children.
|
|
15227
|
+
*/
|
|
15228
|
+
"needsAstChildren",
|
|
15229
|
+
false
|
|
15230
|
+
);
|
|
15231
|
+
_defineProperty(
|
|
15232
|
+
this,
|
|
15233
|
+
/**
|
|
15234
|
+
* Legacy CSE-style array functions should write only the first result cell
|
|
15235
|
+
* when they are used as a top-level normal formula.
|
|
15236
|
+
*/
|
|
15237
|
+
"returnsLegacyArrayAsScalar",
|
|
15238
|
+
false
|
|
15239
|
+
);
|
|
14440
15240
|
_defineProperty(
|
|
14441
15241
|
this,
|
|
14442
15242
|
/**
|
|
@@ -14469,6 +15269,12 @@ var BaseFunction = class {
|
|
|
14469
15269
|
get column() {
|
|
14470
15270
|
return this._column;
|
|
14471
15271
|
}
|
|
15272
|
+
get currentFormulaRowCount() {
|
|
15273
|
+
return this._currentFormulaRowCount;
|
|
15274
|
+
}
|
|
15275
|
+
get currentFormulaColumnCount() {
|
|
15276
|
+
return this._currentFormulaColumnCount;
|
|
15277
|
+
}
|
|
14472
15278
|
dispose() {}
|
|
14473
15279
|
/**
|
|
14474
15280
|
* In Excel, to inject a defined name into a function that has positioning capabilities,
|
|
@@ -14479,8 +15285,9 @@ var BaseFunction = class {
|
|
|
14479
15285
|
getDefinedName(name) {
|
|
14480
15286
|
const nameMap = this._definedNames;
|
|
14481
15287
|
if (nameMap == null) return null;
|
|
15288
|
+
const normalizedName = name.toLowerCase();
|
|
14482
15289
|
return Object.values(nameMap).find((value) => {
|
|
14483
|
-
return value.name ===
|
|
15290
|
+
return value.name.toLowerCase() === normalizedName;
|
|
14484
15291
|
});
|
|
14485
15292
|
}
|
|
14486
15293
|
setDefinedNames(definedNames) {
|
|
@@ -14505,6 +15312,9 @@ var BaseFunction = class {
|
|
|
14505
15312
|
setFormulaDataModel(_formulaDataModel) {
|
|
14506
15313
|
this._formulaDataModel = _formulaDataModel;
|
|
14507
15314
|
}
|
|
15315
|
+
setUnitReferenceResolver(unitReferenceResolver) {
|
|
15316
|
+
this._unitReferenceResolver = unitReferenceResolver;
|
|
15317
|
+
}
|
|
14508
15318
|
setSheetRowColumnCount(rowCount, columnCount) {
|
|
14509
15319
|
this._rowCount = rowCount;
|
|
14510
15320
|
this._columnCount = columnCount;
|
|
@@ -14521,11 +15331,13 @@ var BaseFunction = class {
|
|
|
14521
15331
|
isArgumentsIgnoreNumberPattern() {
|
|
14522
15332
|
return false;
|
|
14523
15333
|
}
|
|
14524
|
-
setRefInfo(unitId, subUnitId, row, column) {
|
|
15334
|
+
setRefInfo(unitId, subUnitId, row, column, rowCount = 1, columnCount = 1) {
|
|
14525
15335
|
this._unitId = unitId;
|
|
14526
15336
|
this._subUnitId = subUnitId;
|
|
14527
15337
|
this._row = row;
|
|
14528
15338
|
this._column = column;
|
|
15339
|
+
this._currentFormulaRowCount = rowCount;
|
|
15340
|
+
this._currentFormulaColumnCount = columnCount;
|
|
14529
15341
|
}
|
|
14530
15342
|
calculateCustom(...arg) {
|
|
14531
15343
|
return null;
|
|
@@ -14533,6 +15345,9 @@ var BaseFunction = class {
|
|
|
14533
15345
|
calculate(...arg) {
|
|
14534
15346
|
return ErrorValueObject.create("#VALUE!");
|
|
14535
15347
|
}
|
|
15348
|
+
calculateAst(_children, _getVariant) {
|
|
15349
|
+
return ErrorValueObject.create("#VALUE!");
|
|
15350
|
+
}
|
|
14536
15351
|
checkArrayType(variant) {
|
|
14537
15352
|
return variant.isReferenceObject() || variant.isValueObject() && variant.isArray();
|
|
14538
15353
|
}
|
|
@@ -16630,7 +17445,12 @@ function getArrayValuesByAggregateIgnoreOptions(array, options, formulaDataModel
|
|
|
16630
17445
|
if (ignoreErrorValues) continue;
|
|
16631
17446
|
return valueObject;
|
|
16632
17447
|
}
|
|
16633
|
-
if (!valueObject || valueObject.isNull() || valueObject.
|
|
17448
|
+
if (!valueObject || valueObject.isNull() || valueObject.isString()) continue;
|
|
17449
|
+
if (!array.isArray() && valueObject.isBoolean()) {
|
|
17450
|
+
values.push(valueObject.getValue() ? 1 : 0);
|
|
17451
|
+
continue;
|
|
17452
|
+
}
|
|
17453
|
+
if (valueObject.isBoolean()) continue;
|
|
16634
17454
|
const value = valueObject.getValue();
|
|
16635
17455
|
if (!isRealNum(value)) continue;
|
|
16636
17456
|
values.push(+value);
|
|
@@ -18358,6 +19178,11 @@ var Normsdist = class extends BaseFunction {
|
|
|
18358
19178
|
|
|
18359
19179
|
//#endregion
|
|
18360
19180
|
//#region src/functions/compatibility/rank/index.ts
|
|
19181
|
+
function isSameRankNumber$2(left, right) {
|
|
19182
|
+
if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
|
|
19183
|
+
const scale = Math.max(1, Math.abs(left), Math.abs(right));
|
|
19184
|
+
return Math.abs(left - right) <= Number.EPSILON * scale * 2;
|
|
19185
|
+
}
|
|
18361
19186
|
var Rank = class extends BaseFunction {
|
|
18362
19187
|
constructor(..._args) {
|
|
18363
19188
|
super(..._args);
|
|
@@ -18383,7 +19208,7 @@ var Rank = class extends BaseFunction {
|
|
|
18383
19208
|
const numberValue = +numberObject.getValue();
|
|
18384
19209
|
const orderValue = +orderObject.getValue();
|
|
18385
19210
|
if (Number.isNaN(numberValue) || Number.isNaN(orderValue)) return ErrorValueObject.create("#VALUE!");
|
|
18386
|
-
const result = refNumbers.sort((a, b) => !orderValue ? b - a : a - b).
|
|
19211
|
+
const result = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b).findIndex((refNumber) => isSameRankNumber$2(refNumber, numberValue));
|
|
18387
19212
|
if (result === -1) return ErrorValueObject.create("#N/A");
|
|
18388
19213
|
return NumberValueObject.create(result + 1);
|
|
18389
19214
|
});
|
|
@@ -18394,12 +19219,12 @@ var Rank = class extends BaseFunction {
|
|
|
18394
19219
|
let refHasError = false;
|
|
18395
19220
|
let refErrorObject = ErrorValueObject.create("#N/A");
|
|
18396
19221
|
const refNumbers = [];
|
|
18397
|
-
if (!ref.isReferenceObject()) return {
|
|
19222
|
+
if (!ref.isReferenceObject() && !ref.isArray()) return {
|
|
18398
19223
|
refHasError: true,
|
|
18399
19224
|
refErrorObject,
|
|
18400
19225
|
refNumbers
|
|
18401
19226
|
};
|
|
18402
|
-
ref.toArrayValueObject().iterator((refObject) => {
|
|
19227
|
+
(ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
|
|
18403
19228
|
const _refObject = refObject;
|
|
18404
19229
|
if (_refObject.isError()) {
|
|
18405
19230
|
refHasError = true;
|
|
@@ -19465,7 +20290,8 @@ var Edate = class extends BaseFunction {
|
|
|
19465
20290
|
const year = _startDate.getUTCFullYear();
|
|
19466
20291
|
const month = _startDate.getUTCMonth() + monthsValue;
|
|
19467
20292
|
const day = _startDate.getUTCDate();
|
|
19468
|
-
const
|
|
20293
|
+
const lastDayOfTargetMonth = new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
|
|
20294
|
+
const currentSerial = excelDateSerial(new Date(Date.UTC(year, month, Math.min(day, lastDayOfTargetMonth))));
|
|
19469
20295
|
return NumberValueObject.create(currentSerial, DEFAULT_DATE_FORMAT);
|
|
19470
20296
|
});
|
|
19471
20297
|
}
|
|
@@ -19749,8 +20575,12 @@ var Networkdays = class extends BaseFunction {
|
|
|
19749
20575
|
for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
|
|
19750
20576
|
const cell = holidays.get(r, c);
|
|
19751
20577
|
if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
|
|
20578
|
+
if (cell.isNull()) continue;
|
|
19752
20579
|
const holidaySerialNumber = getDateSerialNumberByObject(cell);
|
|
19753
|
-
if (typeof holidaySerialNumber !== "number")
|
|
20580
|
+
if (typeof holidaySerialNumber !== "number") {
|
|
20581
|
+
if (cell.isString()) continue;
|
|
20582
|
+
return holidaySerialNumber;
|
|
20583
|
+
}
|
|
19754
20584
|
holidaysValueArray.push(holidaySerialNumber);
|
|
19755
20585
|
}
|
|
19756
20586
|
} else {
|
|
@@ -19821,8 +20651,12 @@ var NetworkdaysIntl = class extends BaseFunction {
|
|
|
19821
20651
|
for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
|
|
19822
20652
|
const cell = holidays.get(r, c);
|
|
19823
20653
|
if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
|
|
20654
|
+
if (cell.isNull()) continue;
|
|
19824
20655
|
const holidaySerialNumber = getDateSerialNumberByObject(cell);
|
|
19825
|
-
if (typeof holidaySerialNumber !== "number")
|
|
20656
|
+
if (typeof holidaySerialNumber !== "number") {
|
|
20657
|
+
if (cell.isString()) continue;
|
|
20658
|
+
return holidaySerialNumber;
|
|
20659
|
+
}
|
|
19826
20660
|
holidaysValueArray.push(holidaySerialNumber);
|
|
19827
20661
|
}
|
|
19828
20662
|
} else {
|
|
@@ -20275,8 +21109,12 @@ var Workday = class extends BaseFunction {
|
|
|
20275
21109
|
for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
|
|
20276
21110
|
const cell = holidays.get(r, c);
|
|
20277
21111
|
if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
|
|
21112
|
+
if (cell.isNull()) continue;
|
|
20278
21113
|
const holidaySerialNumber = getDateSerialNumberByObject(cell);
|
|
20279
|
-
if (typeof holidaySerialNumber !== "number")
|
|
21114
|
+
if (typeof holidaySerialNumber !== "number") {
|
|
21115
|
+
if (cell.isString()) continue;
|
|
21116
|
+
return holidaySerialNumber;
|
|
21117
|
+
}
|
|
20280
21118
|
holidaysValueArray.push(holidaySerialNumber);
|
|
20281
21119
|
}
|
|
20282
21120
|
} else {
|
|
@@ -20346,8 +21184,12 @@ var WorkdayIntl = class extends BaseFunction {
|
|
|
20346
21184
|
for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
|
|
20347
21185
|
const cell = holidays.get(r, c);
|
|
20348
21186
|
if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
|
|
21187
|
+
if (cell.isNull()) continue;
|
|
20349
21188
|
const holidaySerialNumber = getDateSerialNumberByObject(cell);
|
|
20350
|
-
if (typeof holidaySerialNumber !== "number")
|
|
21189
|
+
if (typeof holidaySerialNumber !== "number") {
|
|
21190
|
+
if (cell.isString()) continue;
|
|
21191
|
+
return holidaySerialNumber;
|
|
21192
|
+
}
|
|
20351
21193
|
holidaysValueArray.push(holidaySerialNumber);
|
|
20352
21194
|
}
|
|
20353
21195
|
} else {
|
|
@@ -27810,6 +28652,232 @@ var False = class extends BaseFunction {
|
|
|
27810
28652
|
}
|
|
27811
28653
|
};
|
|
27812
28654
|
|
|
28655
|
+
//#endregion
|
|
28656
|
+
//#region src/functions/logical/groupby/index.ts
|
|
28657
|
+
var Groupby = class extends BaseFunction {
|
|
28658
|
+
constructor(..._args) {
|
|
28659
|
+
super(..._args);
|
|
28660
|
+
_defineProperty(this, "minParams", 3);
|
|
28661
|
+
_defineProperty(this, "maxParams", 7);
|
|
28662
|
+
_defineProperty(this, "needsReferenceObject", true);
|
|
28663
|
+
_defineProperty(this, "needsAstChildren", true);
|
|
28664
|
+
}
|
|
28665
|
+
calculateAst(children, getVariant) {
|
|
28666
|
+
const rowFields = this._arrayInput(getVariant(children[0]));
|
|
28667
|
+
if (rowFields instanceof ErrorValueObject) return rowFields;
|
|
28668
|
+
const values = this._arrayInput(getVariant(children[1]));
|
|
28669
|
+
if (values instanceof ErrorValueObject) return values;
|
|
28670
|
+
const aggregators = this._aggregators(children[2]);
|
|
28671
|
+
if (aggregators.length === 0) return ErrorValueObject.create("#VALUE!");
|
|
28672
|
+
if (values.rowCount !== rowFields.rowCount) return ErrorValueObject.create("#VALUE!");
|
|
28673
|
+
const includeTotal = children[4] == null ? true : this._numberValue(getVariant(children[4])) !== 0;
|
|
28674
|
+
const sortColumnValue = children[5] == null ? 0 : this._numberValue(getVariant(children[5]));
|
|
28675
|
+
const sortColumn = sortColumnValue === 0 ? void 0 : Math.trunc(sortColumnValue);
|
|
28676
|
+
const filter = children[6] == null ? void 0 : this._arrayInput(getVariant(children[6]));
|
|
28677
|
+
if (filter instanceof ErrorValueObject) return filter;
|
|
28678
|
+
const groupColumnCount = rowFields.columnCount;
|
|
28679
|
+
const valueColumnCount = values.columnCount;
|
|
28680
|
+
const outputValueColumnCount = this._outputValueColumnCount(valueColumnCount, aggregators.length);
|
|
28681
|
+
const groups = [];
|
|
28682
|
+
const allValues = Array.from({ length: valueColumnCount }, () => []);
|
|
28683
|
+
for (let row = 0; row < rowFields.rowCount; row++) {
|
|
28684
|
+
if (filter != null && !this._truthy(filter.valueAt(row, 0))) continue;
|
|
28685
|
+
const key = [];
|
|
28686
|
+
for (let column = 0; column < groupColumnCount; column++) key.push(rowFields.valueAt(row, column));
|
|
28687
|
+
let group = groups.find((item) => this._keysEqual(item.key, key));
|
|
28688
|
+
if (group == null) {
|
|
28689
|
+
group = {
|
|
28690
|
+
key,
|
|
28691
|
+
values: Array.from({ length: valueColumnCount }, () => [])
|
|
28692
|
+
};
|
|
28693
|
+
groups.push(group);
|
|
28694
|
+
}
|
|
28695
|
+
for (let column = 0; column < valueColumnCount; column++) {
|
|
28696
|
+
const value = values.valueAt(row, column);
|
|
28697
|
+
group.values[column].push(value);
|
|
28698
|
+
allValues[column].push(value);
|
|
28699
|
+
}
|
|
28700
|
+
}
|
|
28701
|
+
this._sortGroups(groups, sortColumn);
|
|
28702
|
+
const includeHeader = aggregators.length > 1;
|
|
28703
|
+
const rowCount = groups.length + (includeHeader ? 1 : 0) + (includeTotal ? 1 : 0);
|
|
28704
|
+
const columnCount = groupColumnCount + outputValueColumnCount;
|
|
28705
|
+
const result = [];
|
|
28706
|
+
if (includeHeader) {
|
|
28707
|
+
const header = [];
|
|
28708
|
+
for (let column = 0; column < groupColumnCount; column++) header.push(StringValueObject.create(""));
|
|
28709
|
+
for (let column = 0; column < outputValueColumnCount; column++) header.push(StringValueObject.create(this._aggregatorHeader(this._aggregatorForOutput(aggregators, valueColumnCount, column))));
|
|
28710
|
+
result.push(header);
|
|
28711
|
+
}
|
|
28712
|
+
for (const group of groups) {
|
|
28713
|
+
const row = [...group.key];
|
|
28714
|
+
for (let column = 0; column < outputValueColumnCount; column++) {
|
|
28715
|
+
const valueColumn = this._valueColumnForOutput(valueColumnCount, aggregators.length, column);
|
|
28716
|
+
const aggregator = this._aggregatorForOutput(aggregators, valueColumnCount, column);
|
|
28717
|
+
row.push(this._applyAggregator(aggregator, group.values[valueColumn], allValues[valueColumn]));
|
|
28718
|
+
}
|
|
28719
|
+
result.push(row);
|
|
28720
|
+
}
|
|
28721
|
+
if (includeTotal) {
|
|
28722
|
+
const row = [];
|
|
28723
|
+
for (let column = 0; column < groupColumnCount; column++) row.push(StringValueObject.create(column === 0 ? "Total" : ""));
|
|
28724
|
+
for (let column = 0; column < outputValueColumnCount; column++) {
|
|
28725
|
+
const valueColumn = this._valueColumnForOutput(valueColumnCount, aggregators.length, column);
|
|
28726
|
+
const aggregator = this._aggregatorForOutput(aggregators, valueColumnCount, column);
|
|
28727
|
+
row.push(this._applyAggregator(aggregator, allValues[valueColumn], allValues[valueColumn]));
|
|
28728
|
+
}
|
|
28729
|
+
result.push(row);
|
|
28730
|
+
}
|
|
28731
|
+
return ArrayValueObject.create({
|
|
28732
|
+
calculateValueList: result,
|
|
28733
|
+
rowCount,
|
|
28734
|
+
columnCount,
|
|
28735
|
+
unitId: this.unitId,
|
|
28736
|
+
sheetId: this.subUnitId,
|
|
28737
|
+
row: this.row,
|
|
28738
|
+
column: this.column
|
|
28739
|
+
});
|
|
28740
|
+
}
|
|
28741
|
+
_arrayInput(variant) {
|
|
28742
|
+
if (variant == null) return ErrorValueObject.create("#VALUE!");
|
|
28743
|
+
let value = variant;
|
|
28744
|
+
if (value.isReferenceObject()) value = value.toArrayValueObject();
|
|
28745
|
+
if (value.isError()) return value;
|
|
28746
|
+
if (value.isArray()) {
|
|
28747
|
+
const array = value;
|
|
28748
|
+
return {
|
|
28749
|
+
rowCount: array.getRowCount(),
|
|
28750
|
+
columnCount: array.getColumnCount(),
|
|
28751
|
+
valueAt: (row, column) => {
|
|
28752
|
+
var _array$get;
|
|
28753
|
+
return (_array$get = array.get(row, column)) !== null && _array$get !== void 0 ? _array$get : NullValueObject.create();
|
|
28754
|
+
}
|
|
28755
|
+
};
|
|
28756
|
+
}
|
|
28757
|
+
return {
|
|
28758
|
+
rowCount: 1,
|
|
28759
|
+
columnCount: 1,
|
|
28760
|
+
valueAt: (row, column) => row === 0 && column === 0 ? value : NullValueObject.create()
|
|
28761
|
+
};
|
|
28762
|
+
}
|
|
28763
|
+
_aggregators(node) {
|
|
28764
|
+
const name = this._normalizedFunctionName(node.getToken());
|
|
28765
|
+
if (name === "GROUPBY") return [];
|
|
28766
|
+
if (name === "HSTACK") return node.getChildren().flatMap((child) => this._aggregators(child));
|
|
28767
|
+
if (this._isAggregatorName(name)) return [name];
|
|
28768
|
+
return [];
|
|
28769
|
+
}
|
|
28770
|
+
_normalizedFunctionName(token) {
|
|
28771
|
+
let normalized = token.toUpperCase();
|
|
28772
|
+
for (;;) {
|
|
28773
|
+
const prefix = [
|
|
28774
|
+
"_XLFN.",
|
|
28775
|
+
"_XLWS.",
|
|
28776
|
+
"_XLETA."
|
|
28777
|
+
].find((item) => normalized.startsWith(item));
|
|
28778
|
+
if (prefix == null) return normalized;
|
|
28779
|
+
normalized = normalized.slice(prefix.length);
|
|
28780
|
+
}
|
|
28781
|
+
}
|
|
28782
|
+
_isAggregatorName(name) {
|
|
28783
|
+
return name === "SUM" || name === "COUNT" || name === "COUNTA" || name === "PERCENTOF" || name === "MIN" || name === "MAX" || name === "ARRAYTOTEXT";
|
|
28784
|
+
}
|
|
28785
|
+
_outputValueColumnCount(valueColumnCount, aggregatorCount) {
|
|
28786
|
+
if (valueColumnCount === 1) return aggregatorCount;
|
|
28787
|
+
if (aggregatorCount === 1 || valueColumnCount === aggregatorCount) return valueColumnCount;
|
|
28788
|
+
return Math.min(valueColumnCount, aggregatorCount);
|
|
28789
|
+
}
|
|
28790
|
+
_valueColumnForOutput(valueColumnCount, aggregatorCount, outputColumn) {
|
|
28791
|
+
if (valueColumnCount === 1) return 0;
|
|
28792
|
+
if (aggregatorCount === 1 || valueColumnCount === aggregatorCount) return Math.min(outputColumn, valueColumnCount - 1);
|
|
28793
|
+
return Math.min(outputColumn, valueColumnCount - 1);
|
|
28794
|
+
}
|
|
28795
|
+
_aggregatorForOutput(aggregators, valueColumnCount, outputColumn) {
|
|
28796
|
+
if (aggregators.length === 1 || valueColumnCount === aggregators.length) return aggregators[Math.min(outputColumn, aggregators.length - 1)];
|
|
28797
|
+
return aggregators[Math.min(outputColumn, aggregators.length - 1)];
|
|
28798
|
+
}
|
|
28799
|
+
_aggregatorHeader(aggregator) {
|
|
28800
|
+
return aggregator === "PERCENTOF" ? "%" : aggregator;
|
|
28801
|
+
}
|
|
28802
|
+
_applyAggregator(aggregator, groupValues, allValues) {
|
|
28803
|
+
switch (aggregator) {
|
|
28804
|
+
case "SUM": return NumberValueObject.create(this._sum(groupValues));
|
|
28805
|
+
case "COUNT": return NumberValueObject.create(groupValues.filter((value) => value.isNumber()).length);
|
|
28806
|
+
case "COUNTA": return NumberValueObject.create(groupValues.filter((value) => !value.isNull() && !(value.isString() && value.getValue() === "")).length);
|
|
28807
|
+
case "PERCENTOF": {
|
|
28808
|
+
const allTotal = this._sum(allValues);
|
|
28809
|
+
if (allTotal === 0) return ErrorValueObject.create("#DIV/0!");
|
|
28810
|
+
return NumberValueObject.create(this._sum(groupValues) / allTotal);
|
|
28811
|
+
}
|
|
28812
|
+
case "MIN": {
|
|
28813
|
+
const values = groupValues.map((value) => this._numericValue(value)).filter((value) => value != null);
|
|
28814
|
+
return NumberValueObject.create(values.length === 0 ? 0 : Math.min(...values));
|
|
28815
|
+
}
|
|
28816
|
+
case "MAX": {
|
|
28817
|
+
const values = groupValues.map((value) => this._numericValue(value)).filter((value) => value != null);
|
|
28818
|
+
return NumberValueObject.create(values.length === 0 ? 0 : Math.max(...values));
|
|
28819
|
+
}
|
|
28820
|
+
case "ARRAYTOTEXT": return StringValueObject.create(groupValues.map((value) => this._textValue(value)).filter(Boolean).join(", "));
|
|
28821
|
+
}
|
|
28822
|
+
}
|
|
28823
|
+
_sum(values) {
|
|
28824
|
+
return values.reduce((sum, value) => {
|
|
28825
|
+
var _this$_numericValue;
|
|
28826
|
+
return sum + ((_this$_numericValue = this._numericValue(value)) !== null && _this$_numericValue !== void 0 ? _this$_numericValue : 0);
|
|
28827
|
+
}, 0);
|
|
28828
|
+
}
|
|
28829
|
+
_numericValue(value) {
|
|
28830
|
+
return value.isNumber() ? Number(value.getValue()) : void 0;
|
|
28831
|
+
}
|
|
28832
|
+
_numberValue(variant) {
|
|
28833
|
+
if (variant == null || variant.isError()) return 0;
|
|
28834
|
+
if (variant.isReferenceObject()) variant = variant.getFirstCell();
|
|
28835
|
+
if (variant.isArray()) {
|
|
28836
|
+
var _get;
|
|
28837
|
+
variant = (_get = variant.get(0, 0)) !== null && _get !== void 0 ? _get : NullValueObject.create();
|
|
28838
|
+
}
|
|
28839
|
+
const value = variant.getValue();
|
|
28840
|
+
return typeof value === "number" ? Math.trunc(value) : Math.trunc(Number(value) || 0);
|
|
28841
|
+
}
|
|
28842
|
+
_truthy(value) {
|
|
28843
|
+
if (value.isError() || value.isNull()) return false;
|
|
28844
|
+
return Boolean(value.getValue());
|
|
28845
|
+
}
|
|
28846
|
+
_keysEqual(left, right) {
|
|
28847
|
+
return left.length === right.length && left.every((value, index) => this._keyValue(value) === this._keyValue(right[index]));
|
|
28848
|
+
}
|
|
28849
|
+
_keyValue(value) {
|
|
28850
|
+
if (value.isError()) return `error:${value.getErrorType()}`;
|
|
28851
|
+
if (value.isNull()) return "null:";
|
|
28852
|
+
return `${typeof value.getValue()}:${String(value.getValue())}`;
|
|
28853
|
+
}
|
|
28854
|
+
_sortGroups(groups, sortColumn) {
|
|
28855
|
+
const descending = sortColumn != null && sortColumn < 0;
|
|
28856
|
+
const sortIndex = sortColumn == null ? void 0 : Math.abs(sortColumn) - 1;
|
|
28857
|
+
groups.sort((left, right) => {
|
|
28858
|
+
const compare = sortIndex != null && sortIndex < left.key.length ? this._compareValue(left.key[sortIndex], right.key[sortIndex]) : this._compareKey(left.key, right.key);
|
|
28859
|
+
return descending ? -compare : compare;
|
|
28860
|
+
});
|
|
28861
|
+
}
|
|
28862
|
+
_compareKey(left, right) {
|
|
28863
|
+
for (let index = 0; index < Math.min(left.length, right.length); index++) {
|
|
28864
|
+
const compare = this._compareValue(left[index], right[index]);
|
|
28865
|
+
if (compare !== 0) return compare;
|
|
28866
|
+
}
|
|
28867
|
+
return left.length - right.length;
|
|
28868
|
+
}
|
|
28869
|
+
_compareValue(left, right) {
|
|
28870
|
+
const leftNumber = this._numericValue(left);
|
|
28871
|
+
const rightNumber = this._numericValue(right);
|
|
28872
|
+
if (leftNumber != null && rightNumber != null) return leftNumber - rightNumber;
|
|
28873
|
+
return this._textValue(left).toUpperCase().localeCompare(this._textValue(right).toUpperCase());
|
|
28874
|
+
}
|
|
28875
|
+
_textValue(value) {
|
|
28876
|
+
if (value.isNull()) return "";
|
|
28877
|
+
return String(value.getValue());
|
|
28878
|
+
}
|
|
28879
|
+
};
|
|
28880
|
+
|
|
27813
28881
|
//#endregion
|
|
27814
28882
|
//#region src/functions/logical/if/index.ts
|
|
27815
28883
|
var If = class extends BaseFunction {
|
|
@@ -27820,12 +28888,18 @@ var If = class extends BaseFunction {
|
|
|
27820
28888
|
}
|
|
27821
28889
|
calculate(logicalTest, valueIfTrue, valueIfFalse = BooleanValueObject.create(false)) {
|
|
27822
28890
|
let _logicalTest = logicalTest;
|
|
28891
|
+
let useLegacyImplicitSelectedValue = false;
|
|
27823
28892
|
if (logicalTest.isArray()) {
|
|
27824
|
-
const
|
|
27825
|
-
const
|
|
27826
|
-
|
|
28893
|
+
const logicalTestArray = logicalTest;
|
|
28894
|
+
const rowCount = logicalTestArray.getRowCount();
|
|
28895
|
+
const columnCount = logicalTestArray.getColumnCount();
|
|
28896
|
+
if (rowCount === 1 && columnCount === 1) _logicalTest = logicalTestArray.get(0, 0);
|
|
28897
|
+
else if (!this._isCurrentArrayFormula() && logicalTestArray.getUnitId() !== "" && logicalTestArray.getSheetId() !== "" && logicalTestArray.getCurrentRow() >= 0 && logicalTestArray.getCurrentColumn() >= 0) {
|
|
28898
|
+
_logicalTest = this._legacyImplicitArrayValue(logicalTestArray);
|
|
28899
|
+
useLegacyImplicitSelectedValue = true;
|
|
28900
|
+
}
|
|
27827
28901
|
}
|
|
27828
|
-
if (!_logicalTest.isArray()) return this._handleSingleObject(_logicalTest, valueIfTrue, valueIfFalse);
|
|
28902
|
+
if (!_logicalTest.isArray()) return this._handleSingleObject(_logicalTest, valueIfTrue, valueIfFalse, useLegacyImplicitSelectedValue);
|
|
27829
28903
|
const maxRowLength = Math.max(_logicalTest.isArray() ? _logicalTest.getRowCount() : 1, valueIfTrue.isArray() ? valueIfTrue.getRowCount() : 1, valueIfFalse.isArray() ? valueIfFalse.getRowCount() : 1);
|
|
27830
28904
|
const maxColumnLength = Math.max(_logicalTest.isArray() ? _logicalTest.getColumnCount() : 1, valueIfTrue.isArray() ? valueIfTrue.getColumnCount() : 1, valueIfFalse.isArray() ? valueIfFalse.getColumnCount() : 1);
|
|
27831
28905
|
const logicalTestArray = expandArrayValueObject(maxRowLength, maxColumnLength, _logicalTest, ErrorValueObject.create("#N/A"));
|
|
@@ -27834,12 +28908,63 @@ var If = class extends BaseFunction {
|
|
|
27834
28908
|
return logicalTestArray.mapValue((logicalTestValue, rowIndex, columnIndex) => {
|
|
27835
28909
|
const valueIfTrueValue = valueIfTrueArray.get(rowIndex, columnIndex);
|
|
27836
28910
|
const valueIfFalseValue = valueIfFalseArray.get(rowIndex, columnIndex);
|
|
27837
|
-
return this._handleSingleObject(logicalTestValue, valueIfTrueValue, valueIfFalseValue);
|
|
28911
|
+
return this._handleSingleObject(logicalTestValue, valueIfTrueValue, valueIfFalseValue, false);
|
|
27838
28912
|
});
|
|
27839
28913
|
}
|
|
27840
|
-
_handleSingleObject(logicalTest, valueIfTrue, valueIfFalse) {
|
|
28914
|
+
_handleSingleObject(logicalTest, valueIfTrue, valueIfFalse, useLegacyImplicitSelectedValue) {
|
|
27841
28915
|
if (logicalTest.isError()) return logicalTest;
|
|
27842
|
-
|
|
28916
|
+
const logicalTestValue = this._coerceLogicalTest(logicalTest);
|
|
28917
|
+
if (logicalTestValue.isError()) return logicalTestValue;
|
|
28918
|
+
let selectedValue = logicalTestValue.getValue() ? valueIfTrue : valueIfFalse;
|
|
28919
|
+
if (useLegacyImplicitSelectedValue) selectedValue = this._legacyImplicitSelectedValue(selectedValue);
|
|
28920
|
+
return this._coerceSelectedValue(selectedValue);
|
|
28921
|
+
}
|
|
28922
|
+
_coerceSelectedValue(value) {
|
|
28923
|
+
return value.isNull() ? NumberValueObject.create(0) : value;
|
|
28924
|
+
}
|
|
28925
|
+
_coerceLogicalTest(logicalTest) {
|
|
28926
|
+
if (logicalTest.isNull()) return BooleanValueObject.create(false);
|
|
28927
|
+
if (logicalTest.isBoolean()) return logicalTest;
|
|
28928
|
+
if (logicalTest.isNumber()) return BooleanValueObject.create(Number(logicalTest.getValue()) !== 0);
|
|
28929
|
+
if (logicalTest.isString()) {
|
|
28930
|
+
const value = `${logicalTest.getValue()}`.trim().toUpperCase();
|
|
28931
|
+
if (value === "TRUE") return BooleanValueObject.create(true);
|
|
28932
|
+
if (value === "FALSE") return BooleanValueObject.create(false);
|
|
28933
|
+
}
|
|
28934
|
+
return ErrorValueObject.create("#VALUE!");
|
|
28935
|
+
}
|
|
28936
|
+
_legacyImplicitSelectedValue(value) {
|
|
28937
|
+
if (!value.isArray()) return value;
|
|
28938
|
+
const array = value;
|
|
28939
|
+
if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return value;
|
|
28940
|
+
return this._legacyImplicitArrayValue(array);
|
|
28941
|
+
}
|
|
28942
|
+
_legacyImplicitArrayValue(logicalTest) {
|
|
28943
|
+
const startRow = logicalTest.getCurrentRow();
|
|
28944
|
+
const startColumn = logicalTest.getCurrentColumn();
|
|
28945
|
+
const rowCount = logicalTest.getRowCount();
|
|
28946
|
+
const columnCount = logicalTest.getColumnCount();
|
|
28947
|
+
if (startRow < 0 || startColumn < 0) return ErrorValueObject.create("#VALUE!");
|
|
28948
|
+
let rowIndex = -1;
|
|
28949
|
+
let columnIndex = -1;
|
|
28950
|
+
if (rowCount === 1 && columnCount === 1) {
|
|
28951
|
+
rowIndex = 0;
|
|
28952
|
+
columnIndex = 0;
|
|
28953
|
+
} else if (rowCount === 1) {
|
|
28954
|
+
rowIndex = 0;
|
|
28955
|
+
columnIndex = this.column - startColumn;
|
|
28956
|
+
} else if (columnCount === 1) {
|
|
28957
|
+
rowIndex = this.row - startRow;
|
|
28958
|
+
columnIndex = 0;
|
|
28959
|
+
} else {
|
|
28960
|
+
rowIndex = this.row - startRow;
|
|
28961
|
+
columnIndex = this.column - startColumn;
|
|
28962
|
+
}
|
|
28963
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
|
|
28964
|
+
return logicalTest.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
|
|
28965
|
+
}
|
|
28966
|
+
_isCurrentArrayFormula() {
|
|
28967
|
+
return this.currentFormulaRowCount > 1 || this.currentFormulaColumnCount > 1;
|
|
27843
28968
|
}
|
|
27844
28969
|
};
|
|
27845
28970
|
|
|
@@ -27850,8 +28975,11 @@ var Iferror = class extends BaseFunction {
|
|
|
27850
28975
|
super(..._args);
|
|
27851
28976
|
_defineProperty(this, "minParams", 2);
|
|
27852
28977
|
_defineProperty(this, "maxParams", 2);
|
|
28978
|
+
_defineProperty(this, "needsReferenceObject", true);
|
|
27853
28979
|
}
|
|
27854
28980
|
calculate(value, valueIfError) {
|
|
28981
|
+
value = this._toValueObject(value);
|
|
28982
|
+
valueIfError = this._toValueObject(valueIfError);
|
|
27855
28983
|
if (!value.isArray()) return value.isError() ? valueIfError : value;
|
|
27856
28984
|
const maxRowLength = Math.max(value.isArray() ? value.getRowCount() : 1, valueIfError.isArray() ? valueIfError.getRowCount() : 1);
|
|
27857
28985
|
const maxColumnLength = Math.max(value.isArray() ? value.getColumnCount() : 1, valueIfError.isArray() ? valueIfError.getColumnCount() : 1);
|
|
@@ -27862,6 +28990,12 @@ var Iferror = class extends BaseFunction {
|
|
|
27862
28990
|
});
|
|
27863
28991
|
return valueArray;
|
|
27864
28992
|
}
|
|
28993
|
+
_toValueObject(value) {
|
|
28994
|
+
if (!value.isReferenceObject()) return value;
|
|
28995
|
+
const reference = value;
|
|
28996
|
+
if (reference.getRowCount() === 1 && reference.getColumnCount() === 1) return reference.getCellByPosition();
|
|
28997
|
+
return reference.toArrayValueObject();
|
|
28998
|
+
}
|
|
27865
28999
|
};
|
|
27866
29000
|
|
|
27867
29001
|
//#endregion
|
|
@@ -28138,6 +29272,23 @@ var Or = class extends BaseFunction {
|
|
|
28138
29272
|
}
|
|
28139
29273
|
};
|
|
28140
29274
|
|
|
29275
|
+
//#endregion
|
|
29276
|
+
//#region src/functions/logical/percentof/index.ts
|
|
29277
|
+
/**
|
|
29278
|
+
* PERCENTOF is an Excel GROUPBY aggregator token. It is evaluated by GROUPBY's
|
|
29279
|
+
* AST path, not as a standalone scalar function.
|
|
29280
|
+
*/
|
|
29281
|
+
var Percentof = class extends BaseFunction {
|
|
29282
|
+
constructor(..._args) {
|
|
29283
|
+
super(..._args);
|
|
29284
|
+
_defineProperty(this, "minParams", 0);
|
|
29285
|
+
_defineProperty(this, "maxParams", 0);
|
|
29286
|
+
}
|
|
29287
|
+
calculate(..._variants) {
|
|
29288
|
+
return ErrorValueObject.create("#VALUE!");
|
|
29289
|
+
}
|
|
29290
|
+
};
|
|
29291
|
+
|
|
28141
29292
|
//#endregion
|
|
28142
29293
|
//#region src/functions/logical/reduce/index.ts
|
|
28143
29294
|
var Reduce = class extends BaseFunction {
|
|
@@ -28421,6 +29572,7 @@ const functionLogical = [
|
|
|
28421
29572
|
[Bycol, "BYCOL"],
|
|
28422
29573
|
[Byrow, "BYROW"],
|
|
28423
29574
|
[False, "FALSE"],
|
|
29575
|
+
[Groupby, "GROUPBY"],
|
|
28424
29576
|
[If, "IF"],
|
|
28425
29577
|
[Iferror, "IFERROR"],
|
|
28426
29578
|
[Ifna, "IFNA"],
|
|
@@ -28431,6 +29583,7 @@ const functionLogical = [
|
|
|
28431
29583
|
[Map$1, "MAP"],
|
|
28432
29584
|
[Not, "NOT"],
|
|
28433
29585
|
[Or, "OR"],
|
|
29586
|
+
[Percentof, "PERCENTOF"],
|
|
28434
29587
|
[Reduce, "REDUCE"],
|
|
28435
29588
|
[Scan, "SCAN"],
|
|
28436
29589
|
[Switch, "SWITCH"],
|
|
@@ -28452,9 +29605,9 @@ var Address = class extends BaseFunction {
|
|
|
28452
29605
|
if (absNumber === null || absNumber === void 0 ? void 0 : absNumber.isError()) return absNumber;
|
|
28453
29606
|
if (a1 === null || a1 === void 0 ? void 0 : a1.isError()) return a1;
|
|
28454
29607
|
if (sheetText === null || sheetText === void 0 ? void 0 : sheetText.isError()) return sheetText;
|
|
28455
|
-
const _absNumber = absNumber
|
|
28456
|
-
const _a1 = a1
|
|
28457
|
-
const _sheetText = sheetText
|
|
29608
|
+
const _absNumber = absNumber == null || absNumber.isNull() ? NumberValueObject.create(1) : absNumber;
|
|
29609
|
+
const _a1 = a1 == null || a1.isNull() ? BooleanValueObject.create(true) : a1;
|
|
29610
|
+
const _sheetText = sheetText == null || sheetText.isNull() ? StringValueObject.create("") : sheetText;
|
|
28458
29611
|
const maxRowLength = Math.max(rowNumber.isArray() ? rowNumber.getRowCount() : 1, columnNumber.isArray() ? columnNumber.getRowCount() : 1, _absNumber.isArray() ? _absNumber.getRowCount() : 1, _a1.isArray() ? _a1.getRowCount() : 1, _sheetText.isArray() ? _sheetText.getRowCount() : 1);
|
|
28459
29612
|
const maxColumnLength = Math.max(rowNumber.isArray() ? rowNumber.getColumnCount() : 1, columnNumber.isArray() ? columnNumber.getColumnCount() : 1, _absNumber.isArray() ? _absNumber.getColumnCount() : 1, _a1.isArray() ? _a1.getColumnCount() : 1, _sheetText.isArray() ? _sheetText.getColumnCount() : 1);
|
|
28460
29613
|
const rowNumArray = expandArrayValueObject(maxRowLength, maxColumnLength, rowNumber, ErrorValueObject.create("#N/A"));
|
|
@@ -28505,6 +29658,20 @@ function transformAbsoluteRefType(number) {
|
|
|
28505
29658
|
}
|
|
28506
29659
|
}
|
|
28507
29660
|
|
|
29661
|
+
//#endregion
|
|
29662
|
+
//#region src/functions/lookup/anchorarray/index.ts
|
|
29663
|
+
var Anchorarray = class extends BaseFunction {
|
|
29664
|
+
constructor(..._args) {
|
|
29665
|
+
super(..._args);
|
|
29666
|
+
_defineProperty(this, "minParams", 1);
|
|
29667
|
+
_defineProperty(this, "maxParams", 1);
|
|
29668
|
+
_defineProperty(this, "needsReferenceObject", true);
|
|
29669
|
+
}
|
|
29670
|
+
calculate(reference) {
|
|
29671
|
+
return reference;
|
|
29672
|
+
}
|
|
29673
|
+
};
|
|
29674
|
+
|
|
28508
29675
|
//#endregion
|
|
28509
29676
|
//#region src/functions/lookup/areas/index.ts
|
|
28510
29677
|
var Areas = class extends BaseFunction {
|
|
@@ -29015,9 +30182,13 @@ var Hlookup = class extends BaseFunction {
|
|
|
29015
30182
|
return this._handleSingleObject(lookupValue, searchArray, resultArray, rangeLookupValue);
|
|
29016
30183
|
}
|
|
29017
30184
|
_handleSingleObject(value, searchArray, resultArray, rangeLookupValue) {
|
|
29018
|
-
if (rangeLookupValue === 0) return this.equalSearch(value, searchArray, resultArray);
|
|
30185
|
+
if (rangeLookupValue === 0) return this._blankResultAsZero(this.equalSearch(value, searchArray, resultArray));
|
|
29019
30186
|
return this.binarySearch(value, searchArray, resultArray);
|
|
29020
30187
|
}
|
|
30188
|
+
_blankResultAsZero(value) {
|
|
30189
|
+
if (value.isNull()) return NumberValueObject.create(0);
|
|
30190
|
+
return value;
|
|
30191
|
+
}
|
|
29021
30192
|
};
|
|
29022
30193
|
|
|
29023
30194
|
//#endregion
|
|
@@ -29289,11 +30460,23 @@ var Index = class extends BaseFunction {
|
|
|
29289
30460
|
|
|
29290
30461
|
//#endregion
|
|
29291
30462
|
//#region src/functions/lookup/indirect/index.ts
|
|
30463
|
+
const INDIRECT_ERROR_LITERALS = [
|
|
30464
|
+
"#NULL!",
|
|
30465
|
+
"#DIV/0!",
|
|
30466
|
+
"#VALUE!",
|
|
30467
|
+
"#REF!",
|
|
30468
|
+
"#NAME?",
|
|
30469
|
+
"#NUM!",
|
|
30470
|
+
"#N/A",
|
|
30471
|
+
"#CYCLE!",
|
|
30472
|
+
"#CALC!"
|
|
30473
|
+
];
|
|
29292
30474
|
var Indirect = class extends BaseFunction {
|
|
29293
30475
|
constructor(..._args) {
|
|
29294
30476
|
super(..._args);
|
|
29295
30477
|
_defineProperty(this, "minParams", 1);
|
|
29296
30478
|
_defineProperty(this, "maxParams", 2);
|
|
30479
|
+
_defineProperty(this, "needsUnitReferenceResolver", true);
|
|
29297
30480
|
}
|
|
29298
30481
|
isAddress() {
|
|
29299
30482
|
return true;
|
|
@@ -29317,10 +30500,13 @@ var Indirect = class extends BaseFunction {
|
|
|
29317
30500
|
_handleSingleObject(refTextObject, a1Value) {
|
|
29318
30501
|
const refTextValue = `${refTextObject.getValue()}`;
|
|
29319
30502
|
if (refTextValue.trim() === "") return ErrorValueObject.create("#REF!");
|
|
30503
|
+
const embeddedError = this._matchErrorLiteral(refTextValue);
|
|
30504
|
+
if (embeddedError != null) return ErrorValueObject.create(embeddedError);
|
|
29320
30505
|
const refTextV = this._convertToDefinedName(refTextValue);
|
|
29321
30506
|
if (a1Value === 0) {
|
|
29322
30507
|
const { range, sheetName, unitId } = deserializeRangeForR1C1(refTextV);
|
|
29323
30508
|
const rangeReferenceObject = new RangeReferenceObject(range);
|
|
30509
|
+
rangeReferenceObject.setUnitQualifier(unitId);
|
|
29324
30510
|
rangeReferenceObject.setForcedUnitIdDirect(unitId);
|
|
29325
30511
|
rangeReferenceObject.setForcedSheetName(sheetName);
|
|
29326
30512
|
return this._setDefault(rangeReferenceObject);
|
|
@@ -29331,12 +30517,23 @@ var Indirect = class extends BaseFunction {
|
|
|
29331
30517
|
const { range, sheetName, unitId } = deserializeRangeWithSheetWithCache(refTextV);
|
|
29332
30518
|
if (Number.isNaN(range.startRow) || range.endRow + 1 > MAX_ROW_COUNT || Number.isNaN(range.startColumn) || range.endColumn + 1 > MAX_COLUMN_COUNT) return ErrorValueObject.create("#REF!");
|
|
29333
30519
|
const rangeReferenceObject = new RangeReferenceObject(range);
|
|
30520
|
+
rangeReferenceObject.setUnitQualifier(unitId);
|
|
29334
30521
|
rangeReferenceObject.setForcedUnitIdDirect(unitId);
|
|
29335
30522
|
rangeReferenceObject.setForcedSheetName(sheetName);
|
|
29336
30523
|
return this._setDefault(rangeReferenceObject);
|
|
29337
30524
|
}
|
|
29338
30525
|
_setDefault(object) {
|
|
29339
30526
|
if (this.unitId == null || this.subUnitId == null) return ErrorValueObject.create("#REF!");
|
|
30527
|
+
const unitQualifier = object.getUnitQualifier();
|
|
30528
|
+
if (unitQualifier && this._unitReferenceResolver) {
|
|
30529
|
+
const resolution = this._unitReferenceResolver.resolve({
|
|
30530
|
+
hostUnitId: this.unitId,
|
|
30531
|
+
qualifier: unitQualifier,
|
|
30532
|
+
referenceKind: "a1"
|
|
30533
|
+
});
|
|
30534
|
+
if (typeof resolution === "string") return ErrorValueObject.create(resolution);
|
|
30535
|
+
object.setForcedUnitIdDirect(resolution.unitId);
|
|
30536
|
+
}
|
|
29340
30537
|
object.setDefaultUnitId(this.unitId);
|
|
29341
30538
|
object.setDefaultSheetId(this.subUnitId);
|
|
29342
30539
|
return object;
|
|
@@ -29355,6 +30552,10 @@ var Indirect = class extends BaseFunction {
|
|
|
29355
30552
|
if (formulaOrRefString.startsWith("=")) return formulaOrRefString.slice(1);
|
|
29356
30553
|
return formulaOrRefString;
|
|
29357
30554
|
}
|
|
30555
|
+
_matchErrorLiteral(refText) {
|
|
30556
|
+
const normalizedRefText = refText.toUpperCase();
|
|
30557
|
+
return INDIRECT_ERROR_LITERALS.find((errorType) => normalizedRefText.includes(errorType));
|
|
30558
|
+
}
|
|
29358
30559
|
};
|
|
29359
30560
|
|
|
29360
30561
|
//#endregion
|
|
@@ -29422,7 +30623,7 @@ var Match = class extends BaseFunction {
|
|
|
29422
30623
|
const columnCountLookup = lookupArray.getColumnCount();
|
|
29423
30624
|
if (rowCountLookup !== 1 && columnCountLookup !== 1) return ErrorValueObject.create("#N/A");
|
|
29424
30625
|
if (matchType === null || matchType === void 0 ? void 0 : matchType.isError()) return ErrorValueObject.create("#N/A");
|
|
29425
|
-
const matchTypeValue = this.getMatchTypeValue(matchType);
|
|
30626
|
+
const matchTypeValue = (matchType === null || matchType === void 0 ? void 0 : matchType.isNull()) ? 0 : this.getMatchTypeValue(matchType);
|
|
29426
30627
|
if (matchTypeValue == null) return ErrorValueObject.create("#VALUE!");
|
|
29427
30628
|
if (lookupValue.isArray()) return lookupValue.map((value) => this._handleSingleObject(value, lookupArray, matchTypeValue));
|
|
29428
30629
|
return this._handleSingleObject(lookupValue, lookupArray, matchTypeValue);
|
|
@@ -29841,9 +31042,10 @@ var Sort = class extends BaseFunction {
|
|
|
29841
31042
|
}
|
|
29842
31043
|
calculate(array, sortIndex, sortOrder, byCol) {
|
|
29843
31044
|
let _sortIndex = sortIndex !== null && sortIndex !== void 0 ? sortIndex : NumberValueObject.create(1);
|
|
29844
|
-
|
|
31045
|
+
let _sortOrder = sortOrder !== null && sortOrder !== void 0 ? sortOrder : NumberValueObject.create(1);
|
|
29845
31046
|
const _byCol = byCol !== null && byCol !== void 0 ? byCol : BooleanValueObject.create(false);
|
|
29846
31047
|
if (_sortIndex.isNull()) _sortIndex = NumberValueObject.create(1);
|
|
31048
|
+
if (_sortOrder.isNull()) _sortOrder = NumberValueObject.create(1);
|
|
29847
31049
|
if (_byCol.isArray()) {
|
|
29848
31050
|
const byColRowCount = _byCol.getRowCount();
|
|
29849
31051
|
const byColColumnCount = _byCol.getColumnCount();
|
|
@@ -30608,9 +31810,26 @@ var Vlookup = class extends BaseFunction {
|
|
|
30608
31810
|
return this._handleSingleObject(lookupValue, searchArray, resultArray, rangeLookupValue);
|
|
30609
31811
|
}
|
|
30610
31812
|
_handleSingleObject(value, searchArray, resultArray, rangeLookupValue) {
|
|
30611
|
-
if (rangeLookupValue === 0)
|
|
31813
|
+
if (rangeLookupValue === 0) {
|
|
31814
|
+
if (value.isNull()) return this._equalSearchBlankLookupValue(searchArray, resultArray);
|
|
31815
|
+
return this._blankResultAsZero(this.equalSearch(value, searchArray, resultArray));
|
|
31816
|
+
}
|
|
30612
31817
|
return this.binarySearch(value, searchArray, resultArray);
|
|
30613
31818
|
}
|
|
31819
|
+
_equalSearchBlankLookupValue(searchArray, resultArray) {
|
|
31820
|
+
var _resultArrayValue$;
|
|
31821
|
+
const zero = NumberValueObject.create(0);
|
|
31822
|
+
const matched = searchArray.mapValue((value) => {
|
|
31823
|
+
if (value.isNull()) return BooleanValueObject.create(false);
|
|
31824
|
+
return value.isEqual(zero);
|
|
31825
|
+
});
|
|
31826
|
+
const resultArrayValue = resultArray.pickRaw(matched);
|
|
31827
|
+
return this._blankResultAsZero(((_resultArrayValue$ = resultArrayValue[0]) === null || _resultArrayValue$ === void 0 ? void 0 : _resultArrayValue$[0]) || ErrorValueObject.create("#N/A"));
|
|
31828
|
+
}
|
|
31829
|
+
_blankResultAsZero(value) {
|
|
31830
|
+
if (value.isNull()) return NumberValueObject.create(0);
|
|
31831
|
+
return value;
|
|
31832
|
+
}
|
|
30614
31833
|
};
|
|
30615
31834
|
|
|
30616
31835
|
//#endregion
|
|
@@ -30780,7 +31999,8 @@ var Xlookup = class extends BaseFunction {
|
|
|
30780
31999
|
if (matchMode === null || matchMode === void 0 ? void 0 : matchMode.isNull()) _matchMode = NumberValueObject.create(0);
|
|
30781
32000
|
let _searchMode = searchMode !== null && searchMode !== void 0 ? searchMode : NumberValueObject.create(1);
|
|
30782
32001
|
if (searchMode === null || searchMode === void 0 ? void 0 : searchMode.isNull()) _searchMode = NumberValueObject.create(1);
|
|
30783
|
-
|
|
32002
|
+
const _lookupValue = this._legacyImplicitLookupValue(lookupValue);
|
|
32003
|
+
if (_lookupValue.isError()) return _lookupValue;
|
|
30784
32004
|
const rowCountLookup = lookupArray.isArray() ? lookupArray.getRowCount() : 1;
|
|
30785
32005
|
const columnCountLookup = lookupArray.isArray() ? lookupArray.getColumnCount() : 1;
|
|
30786
32006
|
const rowCountReturn = returnArray.isArray() ? returnArray.getRowCount() : 1;
|
|
@@ -30792,7 +32012,7 @@ var Xlookup = class extends BaseFunction {
|
|
|
30792
32012
|
if (matchModeValue instanceof ErrorValueObject) return matchModeValue;
|
|
30793
32013
|
const searchModeValue = this.getIndexNumValue(_searchMode);
|
|
30794
32014
|
if (searchModeValue instanceof ErrorValueObject) return searchModeValue;
|
|
30795
|
-
return this._getResult(
|
|
32015
|
+
return this._getResult(_lookupValue, baseValueObjectToArrayValueObject(lookupArray), baseValueObjectToArrayValueObject(returnArray), _ifNotFound, matchModeValue, searchModeValue, rowCountLookup, columnCountLookup, rowCountReturn, columnCountReturn);
|
|
30796
32016
|
}
|
|
30797
32017
|
_getResult(lookupValue, lookupArray, returnArray, ifNotFound, matchModeValue, searchModeValue, rowCountLookup, columnCountLookup, rowCountReturn, columnCountReturn) {
|
|
30798
32018
|
const lookupValueRowCount = lookupValue.isArray() ? lookupValue.getRowCount() : 1;
|
|
@@ -30807,7 +32027,7 @@ var Xlookup = class extends BaseFunction {
|
|
|
30807
32027
|
if (checkErrorCombination) return checkErrorCombination;
|
|
30808
32028
|
const result = this._handleSingleObject(value, lookupArray, resultArray, matchModeValue, searchModeValue);
|
|
30809
32029
|
if (result.isError()) return ifNotFound;
|
|
30810
|
-
return result;
|
|
32030
|
+
return this._blankResultAsZero(result);
|
|
30811
32031
|
});
|
|
30812
32032
|
}
|
|
30813
32033
|
const _lookupValue = lookupValue.isArray() ? lookupValue.get(0, 0) : lookupValue;
|
|
@@ -30816,7 +32036,7 @@ var Xlookup = class extends BaseFunction {
|
|
|
30816
32036
|
if (checkErrorCombination) return checkErrorCombination;
|
|
30817
32037
|
const result = this._handleSingleObject(_lookupValue, lookupArray, returnArray, matchModeValue, searchModeValue);
|
|
30818
32038
|
if (result.isError()) return ifNotFound;
|
|
30819
|
-
return result;
|
|
32039
|
+
return this._blankResultAsZero(result);
|
|
30820
32040
|
}
|
|
30821
32041
|
let axis = 0;
|
|
30822
32042
|
/**
|
|
@@ -30828,6 +32048,32 @@ var Xlookup = class extends BaseFunction {
|
|
|
30828
32048
|
if (resultArray == null) return ErrorValueObject.create("#N/A");
|
|
30829
32049
|
return resultArray;
|
|
30830
32050
|
}
|
|
32051
|
+
_legacyImplicitLookupValue(lookupValue) {
|
|
32052
|
+
if (!lookupValue.isArray()) return lookupValue;
|
|
32053
|
+
const array = lookupValue;
|
|
32054
|
+
if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return lookupValue;
|
|
32055
|
+
const startRow = array.getCurrentRow();
|
|
32056
|
+
const startColumn = array.getCurrentColumn();
|
|
32057
|
+
const rowCount = array.getRowCount();
|
|
32058
|
+
const columnCount = array.getColumnCount();
|
|
32059
|
+
let rowIndex = -1;
|
|
32060
|
+
let columnIndex = -1;
|
|
32061
|
+
if (rowCount === 1 && columnCount === 1) {
|
|
32062
|
+
rowIndex = 0;
|
|
32063
|
+
columnIndex = 0;
|
|
32064
|
+
} else if (rowCount === 1) {
|
|
32065
|
+
rowIndex = 0;
|
|
32066
|
+
columnIndex = this.column - startColumn;
|
|
32067
|
+
} else if (columnCount === 1) {
|
|
32068
|
+
rowIndex = this.row - startRow;
|
|
32069
|
+
columnIndex = 0;
|
|
32070
|
+
} else {
|
|
32071
|
+
rowIndex = this.row - startRow;
|
|
32072
|
+
columnIndex = this.column - startColumn;
|
|
32073
|
+
}
|
|
32074
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
|
|
32075
|
+
return array.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
|
|
32076
|
+
}
|
|
30831
32077
|
_handleExpandObject(value, searchArray, resultArray, matchModeValue, searchModeValue, axis = 0) {
|
|
30832
32078
|
if ((searchModeValue === 2 || searchModeValue === -2) && matchModeValue !== 2) {
|
|
30833
32079
|
const searchType = getSearchModeValue(searchModeValue);
|
|
@@ -30848,6 +32094,10 @@ var Xlookup = class extends BaseFunction {
|
|
|
30848
32094
|
if (matchModeValue === -1 || matchModeValue === 1) return this.orderSearch(value, searchArray, resultArray, matchModeValue === 1 ? 2 : 1, searchModeValue === -1);
|
|
30849
32095
|
return this.equalSearch(value, searchArray, resultArray, searchModeValue !== -1);
|
|
30850
32096
|
}
|
|
32097
|
+
_blankResultAsZero(value) {
|
|
32098
|
+
if (value.isNull()) return NumberValueObject.create(0);
|
|
32099
|
+
return value;
|
|
32100
|
+
}
|
|
30851
32101
|
/**
|
|
30852
32102
|
* Wildcard matching and binary search cannot appear at the same time
|
|
30853
32103
|
* @param matchModeValue
|
|
@@ -30964,6 +32214,7 @@ var Xmatch = class extends BaseFunction {
|
|
|
30964
32214
|
*/
|
|
30965
32215
|
const functionLookup = [
|
|
30966
32216
|
[Address, "ADDRESS"],
|
|
32217
|
+
[Anchorarray, "ANCHORARRAY"],
|
|
30967
32218
|
[Areas, "AREAS"],
|
|
30968
32219
|
[Choose, "CHOOSE"],
|
|
30969
32220
|
[Choosecols, "CHOOSECOLS"],
|
|
@@ -32069,7 +33320,7 @@ var Int = class extends BaseFunction {
|
|
|
32069
33320
|
let _number = number;
|
|
32070
33321
|
if (_number.isString()) _number = _number.convertToNumberObjectValue();
|
|
32071
33322
|
if (_number.isError()) return _number;
|
|
32072
|
-
const numberValue = Math.floor(+_number.getValue());
|
|
33323
|
+
const numberValue = Math.floor(stripErrorMargin(+_number.getValue()));
|
|
32073
33324
|
return NumberValueObject.create(numberValue);
|
|
32074
33325
|
}
|
|
32075
33326
|
};
|
|
@@ -33421,6 +34672,7 @@ var Sum = class extends BaseFunction {
|
|
|
33421
34672
|
let accumulatorAll = NumberValueObject.create(0);
|
|
33422
34673
|
for (let i = 0; i < variants.length; i++) {
|
|
33423
34674
|
let variant = variants[i];
|
|
34675
|
+
variant = this._legacyImplicitDerivedArray(variant);
|
|
33424
34676
|
if (variant.isString()) variant = variant.convertToNumberObjectValue();
|
|
33425
34677
|
if (variant.isError()) return variant;
|
|
33426
34678
|
if (variant.isArray()) variant = variant.sum();
|
|
@@ -33430,6 +34682,30 @@ var Sum = class extends BaseFunction {
|
|
|
33430
34682
|
}
|
|
33431
34683
|
return accumulatorAll;
|
|
33432
34684
|
}
|
|
34685
|
+
_legacyImplicitDerivedArray(variant) {
|
|
34686
|
+
if (!variant.isArray()) return variant;
|
|
34687
|
+
const array = variant;
|
|
34688
|
+
if (array.usesInvertedIndexCache() || !array.usesLegacyImplicitForAggregate()) return variant;
|
|
34689
|
+
const startRow = array.getCurrentRow();
|
|
34690
|
+
const startColumn = array.getCurrentColumn();
|
|
34691
|
+
if (startRow < 0 || startColumn < 0) return variant;
|
|
34692
|
+
const rowCount = array.getRowCount();
|
|
34693
|
+
const columnCount = array.getColumnCount();
|
|
34694
|
+
let rowIndex = -1;
|
|
34695
|
+
let columnIndex = -1;
|
|
34696
|
+
if (rowCount === 1) {
|
|
34697
|
+
rowIndex = 0;
|
|
34698
|
+
columnIndex = this.column - startColumn;
|
|
34699
|
+
} else if (columnCount === 1) {
|
|
34700
|
+
rowIndex = this.row - startRow;
|
|
34701
|
+
columnIndex = 0;
|
|
34702
|
+
} else {
|
|
34703
|
+
rowIndex = this.row - startRow;
|
|
34704
|
+
columnIndex = this.column - startColumn;
|
|
34705
|
+
}
|
|
34706
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
|
|
34707
|
+
return array.get(rowIndex, columnIndex) || variant;
|
|
34708
|
+
}
|
|
33433
34709
|
};
|
|
33434
34710
|
|
|
33435
34711
|
//#endregion
|
|
@@ -34003,8 +35279,17 @@ var Compare = class extends BaseFunction {
|
|
|
34003
35279
|
calculate(variant1, variant2) {
|
|
34004
35280
|
if (variant1.isError()) return variant1;
|
|
34005
35281
|
if (variant2.isError()) return variant2;
|
|
35282
|
+
const variant1Error = this._coerceErrorLiteral(variant1);
|
|
35283
|
+
if (variant1Error) return variant1Error;
|
|
35284
|
+
const variant2Error = this._coerceErrorLiteral(variant2);
|
|
35285
|
+
if (variant2Error) return variant2Error;
|
|
34006
35286
|
return variant1.compare(variant2, this._compareType);
|
|
34007
35287
|
}
|
|
35288
|
+
_coerceErrorLiteral(variant) {
|
|
35289
|
+
const value = variant.getValue();
|
|
35290
|
+
if (typeof value === "string" && ERROR_TYPE_SET.has(value)) return ErrorValueObject.create(value);
|
|
35291
|
+
return null;
|
|
35292
|
+
}
|
|
34008
35293
|
};
|
|
34009
35294
|
|
|
34010
35295
|
//#endregion
|
|
@@ -34262,6 +35547,7 @@ var Average = class extends BaseFunction {
|
|
|
34262
35547
|
let accumulatorCount = NumberValueObject.create(0);
|
|
34263
35548
|
for (let i = 0; i < variants.length; i++) {
|
|
34264
35549
|
let variant = variants[i];
|
|
35550
|
+
variant = this._legacyImplicitDerivedArray(variant);
|
|
34265
35551
|
if (variant.isString() || variant.isBoolean()) variant = variant.convertToNumberObjectValue();
|
|
34266
35552
|
if (variant.isError()) return variant;
|
|
34267
35553
|
if (variant.isArray()) {
|
|
@@ -34275,6 +35561,30 @@ var Average = class extends BaseFunction {
|
|
|
34275
35561
|
}
|
|
34276
35562
|
return accumulatorSum.divided(accumulatorCount);
|
|
34277
35563
|
}
|
|
35564
|
+
_legacyImplicitDerivedArray(variant) {
|
|
35565
|
+
if (!variant.isArray()) return variant;
|
|
35566
|
+
const array = variant;
|
|
35567
|
+
if (array.usesInvertedIndexCache()) return variant;
|
|
35568
|
+
const startRow = array.getCurrentRow();
|
|
35569
|
+
const startColumn = array.getCurrentColumn();
|
|
35570
|
+
if (startRow < 0 || startColumn < 0) return variant;
|
|
35571
|
+
const rowCount = array.getRowCount();
|
|
35572
|
+
const columnCount = array.getColumnCount();
|
|
35573
|
+
let rowIndex = -1;
|
|
35574
|
+
let columnIndex = -1;
|
|
35575
|
+
if (rowCount === 1) {
|
|
35576
|
+
rowIndex = 0;
|
|
35577
|
+
columnIndex = this.column - startColumn;
|
|
35578
|
+
} else if (columnCount === 1) {
|
|
35579
|
+
rowIndex = this.row - startRow;
|
|
35580
|
+
columnIndex = 0;
|
|
35581
|
+
} else {
|
|
35582
|
+
rowIndex = this.row - startRow;
|
|
35583
|
+
columnIndex = this.column - startColumn;
|
|
35584
|
+
}
|
|
35585
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
|
|
35586
|
+
return array.get(rowIndex, columnIndex) || variant;
|
|
35587
|
+
}
|
|
34278
35588
|
};
|
|
34279
35589
|
|
|
34280
35590
|
//#endregion
|
|
@@ -34807,7 +36117,13 @@ var Countif = class extends BaseFunction {
|
|
|
34807
36117
|
calculate(range, criteria) {
|
|
34808
36118
|
if (!range.isReferenceObject()) return ErrorValueObject.create("#VALUE!");
|
|
34809
36119
|
let _criteria = criteria;
|
|
34810
|
-
if (criteria.isReferenceObject())
|
|
36120
|
+
if (criteria.isReferenceObject()) {
|
|
36121
|
+
_criteria = criteria.toArrayValueObject();
|
|
36122
|
+
if (_criteria.getRowCount() === 1 && _criteria.getColumnCount() === 1) {
|
|
36123
|
+
const firstCriteria = _criteria.get(0, 0);
|
|
36124
|
+
_criteria = firstCriteria.isNull() ? NumberValueObject.create(0) : firstCriteria;
|
|
36125
|
+
}
|
|
36126
|
+
}
|
|
34811
36127
|
if (_criteria.isArray()) {
|
|
34812
36128
|
const resultArray = _criteria.mapValue((criteriaObject) => this._handleSingleObject(range, criteriaObject));
|
|
34813
36129
|
if (resultArray.getRowCount() === 1 && resultArray.getColumnCount() === 1) return resultArray.get(0, 0);
|
|
@@ -34842,7 +36158,7 @@ var Countifs = class extends BaseFunction {
|
|
|
34842
36158
|
_defineProperty(this, "needsReferenceObject", true);
|
|
34843
36159
|
}
|
|
34844
36160
|
calculate(...variants) {
|
|
34845
|
-
const { isError, errorObject, rangeIsDifferentSize, criteriaMaxRowLength, criteriaMaxColumnLength, variants: _variants } = parsePairedRangeAndCriteria(variants);
|
|
36161
|
+
const { isError, errorObject, rangeIsDifferentSize, criteriaMaxRowLength, criteriaMaxColumnLength, variants: _variants } = parsePairedRangeAndCriteria(this._legacyImplicitDerivedCriteria(variants));
|
|
34846
36162
|
if (isError) return errorObject;
|
|
34847
36163
|
if (rangeIsDifferentSize) {
|
|
34848
36164
|
if (criteriaMaxRowLength === 1 && criteriaMaxColumnLength === 1) return ErrorValueObject.create("#VALUE!");
|
|
@@ -34865,6 +36181,32 @@ var Countifs = class extends BaseFunction {
|
|
|
34865
36181
|
column: this.column
|
|
34866
36182
|
});
|
|
34867
36183
|
}
|
|
36184
|
+
_legacyImplicitDerivedCriteria(variants) {
|
|
36185
|
+
return variants.map((variant, index) => {
|
|
36186
|
+
if (index % 2 === 0 || !variant.isArray()) return variant;
|
|
36187
|
+
const array = variant;
|
|
36188
|
+
if (array.usesInvertedIndexCache()) return variant;
|
|
36189
|
+
const startRow = array.getCurrentRow();
|
|
36190
|
+
const startColumn = array.getCurrentColumn();
|
|
36191
|
+
if (startRow < 0 || startColumn < 0) return variant;
|
|
36192
|
+
const rowCount = array.getRowCount();
|
|
36193
|
+
const columnCount = array.getColumnCount();
|
|
36194
|
+
let rowIndex = -1;
|
|
36195
|
+
let columnIndex = -1;
|
|
36196
|
+
if (rowCount === 1) {
|
|
36197
|
+
rowIndex = 0;
|
|
36198
|
+
columnIndex = this.column - startColumn;
|
|
36199
|
+
} else if (columnCount === 1) {
|
|
36200
|
+
rowIndex = this.row - startRow;
|
|
36201
|
+
columnIndex = 0;
|
|
36202
|
+
} else {
|
|
36203
|
+
rowIndex = this.row - startRow;
|
|
36204
|
+
columnIndex = this.column - startColumn;
|
|
36205
|
+
}
|
|
36206
|
+
if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
|
|
36207
|
+
return array.get(rowIndex, columnIndex) || variant;
|
|
36208
|
+
});
|
|
36209
|
+
}
|
|
34868
36210
|
};
|
|
34869
36211
|
|
|
34870
36212
|
//#endregion
|
|
@@ -35642,6 +36984,7 @@ var Linest = class extends BaseFunction {
|
|
|
35642
36984
|
super(..._args);
|
|
35643
36985
|
_defineProperty(this, "minParams", 1);
|
|
35644
36986
|
_defineProperty(this, "maxParams", 4);
|
|
36987
|
+
_defineProperty(this, "returnsLegacyArrayAsScalar", true);
|
|
35645
36988
|
}
|
|
35646
36989
|
calculate(knownYs, knownXs, constb, stats) {
|
|
35647
36990
|
const { isError, errorObject } = checkKnownsArrayDimensions(knownYs, knownXs);
|
|
@@ -36171,7 +37514,11 @@ var Median = class extends BaseFunction {
|
|
|
36171
37514
|
if (isError) return errorObject;
|
|
36172
37515
|
} else {
|
|
36173
37516
|
if (variant.isError()) return variant;
|
|
36174
|
-
if (variant.isNull()
|
|
37517
|
+
if (variant.isNull()) continue;
|
|
37518
|
+
if (variant.isBoolean()) {
|
|
37519
|
+
values.push(variant.getValue() ? 1 : 0);
|
|
37520
|
+
continue;
|
|
37521
|
+
}
|
|
36175
37522
|
if (variant.isString()) {
|
|
36176
37523
|
const _variant = variant.convertToNumberObjectValue();
|
|
36177
37524
|
if (_variant.isError()) return _variant;
|
|
@@ -36781,6 +38128,11 @@ var QuartileExc = class extends BaseFunction {
|
|
|
36781
38128
|
|
|
36782
38129
|
//#endregion
|
|
36783
38130
|
//#region src/functions/statistical/rank-avg/index.ts
|
|
38131
|
+
function isSameRankNumber$1(left, right) {
|
|
38132
|
+
if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
|
|
38133
|
+
const scale = Math.max(1, Math.abs(left), Math.abs(right));
|
|
38134
|
+
return Math.abs(left - right) <= Number.EPSILON * scale * 2;
|
|
38135
|
+
}
|
|
36784
38136
|
var RankAvg = class extends BaseFunction {
|
|
36785
38137
|
constructor(..._args) {
|
|
36786
38138
|
super(..._args);
|
|
@@ -36812,14 +38164,9 @@ var RankAvg = class extends BaseFunction {
|
|
|
36812
38164
|
return resultArray;
|
|
36813
38165
|
}
|
|
36814
38166
|
_getResult(numberValue, orderValue, refNumbers) {
|
|
36815
|
-
const refOrderNumbers = refNumbers.sort((a, b) => !orderValue ? b - a : a - b);
|
|
36816
|
-
let index = refOrderNumbers.indexOf(numberValue);
|
|
38167
|
+
const refOrderNumbers = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b);
|
|
36817
38168
|
const results = [];
|
|
36818
|
-
|
|
36819
|
-
const start = index + 1;
|
|
36820
|
-
results.push(start);
|
|
36821
|
-
index = refOrderNumbers.indexOf(numberValue, start);
|
|
36822
|
-
}
|
|
38169
|
+
for (let index = 0; index < refOrderNumbers.length; index++) if (isSameRankNumber$1(refOrderNumbers[index], numberValue)) results.push(index + 1);
|
|
36823
38170
|
if (results.length === 0) return ErrorValueObject.create("#N/A");
|
|
36824
38171
|
const result = results.reduce((acc, cur) => acc + cur, 0) / results.length;
|
|
36825
38172
|
return NumberValueObject.create(result);
|
|
@@ -36828,12 +38175,12 @@ var RankAvg = class extends BaseFunction {
|
|
|
36828
38175
|
let refHasError = false;
|
|
36829
38176
|
let refErrorObject = ErrorValueObject.create("#N/A");
|
|
36830
38177
|
const refNumbers = [];
|
|
36831
|
-
if (!ref.isReferenceObject()) return {
|
|
38178
|
+
if (!ref.isReferenceObject() && !ref.isArray()) return {
|
|
36832
38179
|
refHasError: true,
|
|
36833
38180
|
refErrorObject,
|
|
36834
38181
|
refNumbers
|
|
36835
38182
|
};
|
|
36836
|
-
ref.toArrayValueObject().iterator((refObject) => {
|
|
38183
|
+
(ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
|
|
36837
38184
|
const _refObject = refObject;
|
|
36838
38185
|
if (_refObject.isError()) {
|
|
36839
38186
|
refHasError = true;
|
|
@@ -36855,6 +38202,11 @@ var RankAvg = class extends BaseFunction {
|
|
|
36855
38202
|
|
|
36856
38203
|
//#endregion
|
|
36857
38204
|
//#region src/functions/statistical/rank-eq/index.ts
|
|
38205
|
+
function isSameRankNumber(left, right) {
|
|
38206
|
+
if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
|
|
38207
|
+
const scale = Math.max(1, Math.abs(left), Math.abs(right));
|
|
38208
|
+
return Math.abs(left - right) <= Number.EPSILON * scale * 2;
|
|
38209
|
+
}
|
|
36858
38210
|
var RankEq = class extends BaseFunction {
|
|
36859
38211
|
constructor(..._args) {
|
|
36860
38212
|
super(..._args);
|
|
@@ -36880,7 +38232,7 @@ var RankEq = class extends BaseFunction {
|
|
|
36880
38232
|
const numberValue = +numberObject.getValue();
|
|
36881
38233
|
const orderValue = +orderObject.getValue();
|
|
36882
38234
|
if (Number.isNaN(numberValue) || Number.isNaN(orderValue)) return ErrorValueObject.create("#VALUE!");
|
|
36883
|
-
const result = refNumbers.sort((a, b) => !orderValue ? b - a : a - b).
|
|
38235
|
+
const result = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b).findIndex((refNumber) => isSameRankNumber(refNumber, numberValue));
|
|
36884
38236
|
if (result === -1) return ErrorValueObject.create("#N/A");
|
|
36885
38237
|
return NumberValueObject.create(result + 1);
|
|
36886
38238
|
});
|
|
@@ -36891,12 +38243,12 @@ var RankEq = class extends BaseFunction {
|
|
|
36891
38243
|
let refHasError = false;
|
|
36892
38244
|
let refErrorObject = ErrorValueObject.create("#N/A");
|
|
36893
38245
|
const refNumbers = [];
|
|
36894
|
-
if (!ref.isReferenceObject()) return {
|
|
38246
|
+
if (!ref.isReferenceObject() && !ref.isArray()) return {
|
|
36895
38247
|
refHasError: true,
|
|
36896
38248
|
refErrorObject,
|
|
36897
38249
|
refNumbers
|
|
36898
38250
|
};
|
|
36899
|
-
ref.toArrayValueObject().iterator((refObject) => {
|
|
38251
|
+
(ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
|
|
36900
38252
|
const _refObject = refObject;
|
|
36901
38253
|
if (_refObject.isError()) {
|
|
36902
38254
|
refHasError = true;
|
|
@@ -37968,11 +39320,10 @@ var Concat = class extends BaseFunction {
|
|
|
37968
39320
|
isError = valueObject;
|
|
37969
39321
|
return false;
|
|
37970
39322
|
}
|
|
37971
|
-
|
|
37972
|
-
else if (valueObject.isString() || valueObject.isNumber()) concatenatedString += valueObject.getValue();
|
|
39323
|
+
concatenatedString += formatValueForFormulaText(valueObject.getValue());
|
|
37973
39324
|
});
|
|
37974
39325
|
if (isError) return isError;
|
|
37975
|
-
} else if (!textValue.isError() && !textValue.isNull()) concatenatedString += textValue.getValue();
|
|
39326
|
+
} else if (!textValue.isError() && !textValue.isNull()) concatenatedString += formatValueForFormulaText(textValue.getValue());
|
|
37976
39327
|
return StringValueObject.create(concatenatedString);
|
|
37977
39328
|
}
|
|
37978
39329
|
};
|
|
@@ -37999,20 +39350,27 @@ var Concatenate = class extends BaseFunction {
|
|
|
37999
39350
|
}
|
|
38000
39351
|
});
|
|
38001
39352
|
let result = null;
|
|
39353
|
+
const referenceSource = textValues.find((textValue) => {
|
|
39354
|
+
if (!textValue.isArray()) return false;
|
|
39355
|
+
const arrayValue = textValue;
|
|
39356
|
+
return arrayValue.getUnitId() !== "" && arrayValue.getSheetId() !== "" && arrayValue.getCurrentRow() >= 0 && arrayValue.getCurrentColumn() >= 0;
|
|
39357
|
+
});
|
|
38002
39358
|
for (const textValue of textValues) result = expandArrayValueObject(maxRowLength, maxColumnLength, textValue, ErrorValueObject.create("#N/A")).mapValue((textValueObject, rowIndex, columnIndex) => {
|
|
38003
|
-
var
|
|
39359
|
+
var _resultValueObject$ge, _textValueObject$getV;
|
|
38004
39360
|
const resultValueObject = result && result.get(rowIndex, columnIndex);
|
|
38005
39361
|
if (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isError()) return resultValueObject;
|
|
38006
39362
|
if (textValueObject.isError()) return textValueObject;
|
|
38007
|
-
|
|
38008
|
-
|
|
38009
|
-
if (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isBoolean()) resultValue = `${resultValue}`.toLocaleUpperCase();
|
|
38010
|
-
if (textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.isBoolean()) textValue = `${textValue}`.toLocaleUpperCase();
|
|
38011
|
-
const resultValueObjectString = (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isNull()) ? "" : (_resultValue = resultValue) !== null && _resultValue !== void 0 ? _resultValue : "";
|
|
38012
|
-
const textValueObjectString = (textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.isNull()) ? "" : (_textValue = textValue) !== null && _textValue !== void 0 ? _textValue : "";
|
|
39363
|
+
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);
|
|
39364
|
+
const textValueObjectString = (textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.isNull()) ? "" : formatValueForFormulaText((_textValueObject$getV = textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.getValue()) !== null && _textValueObject$getV !== void 0 ? _textValueObject$getV : null);
|
|
38013
39365
|
return StringValueObject.create(`${resultValueObjectString}${textValueObjectString}`);
|
|
38014
39366
|
});
|
|
38015
39367
|
if (!result) return ErrorValueObject.create("#VALUE!");
|
|
39368
|
+
if (referenceSource && result.isArray()) {
|
|
39369
|
+
const resultArray = result;
|
|
39370
|
+
resultArray.setUnitId(referenceSource.getUnitId());
|
|
39371
|
+
resultArray.setSheetId(referenceSource.getSheetId());
|
|
39372
|
+
resultArray.setCurrent(referenceSource.getCurrentRow(), referenceSource.getCurrentColumn());
|
|
39373
|
+
}
|
|
38016
39374
|
return result;
|
|
38017
39375
|
}
|
|
38018
39376
|
};
|
|
@@ -39779,13 +41137,17 @@ var Text = class extends BaseFunction {
|
|
|
39779
41137
|
}
|
|
39780
41138
|
if (formatTextValue.isNull()) formatTextValue = StringValueObject.create(" ");
|
|
39781
41139
|
const formatTextValueString = `${formatTextValue.getValue()}`;
|
|
39782
|
-
const previewText = getFormatPreview(formatTextValueString, textValueNumber);
|
|
41140
|
+
const previewText = getFormatPreview(normalizeExcelWeekdayFormat(formatTextValueString), textValueNumber);
|
|
39783
41141
|
return StringValueObject.create(formatTextValueString === " " ? previewText.trimEnd() : previewText);
|
|
39784
41142
|
});
|
|
39785
41143
|
if (resultArray.getRowCount() === 1 && resultArray.getColumnCount() === 1) return resultArray.get(0, 0);
|
|
39786
41144
|
return resultArray;
|
|
39787
41145
|
}
|
|
39788
41146
|
};
|
|
41147
|
+
function normalizeExcelWeekdayFormat(formatText) {
|
|
41148
|
+
if (!formatText.includes("Å")) return formatText;
|
|
41149
|
+
return formatText.replace(/\u00C5{4,}/g, "dddd").replace(/\u00C5{1,3}/g, "ddd");
|
|
41150
|
+
}
|
|
39789
41151
|
|
|
39790
41152
|
//#endregion
|
|
39791
41153
|
//#region src/functions/text/textafter/index.ts
|
|
@@ -40160,9 +41522,19 @@ var Textsplit = class extends BaseFunction {
|
|
|
40160
41522
|
const _ignoreEmpty = ignoreEmpty !== null && ignoreEmpty !== void 0 ? ignoreEmpty : NumberValueObject.create(0);
|
|
40161
41523
|
const _matchMode = matchMode !== null && matchMode !== void 0 ? matchMode : NumberValueObject.create(0);
|
|
40162
41524
|
const _padWith = padWith !== null && padWith !== void 0 ? padWith : StringValueObject.create("#N/A");
|
|
40163
|
-
const { _variant: _colDelimiter, values: colDelimiterValue } = this._getStringValues(colDelimiter);
|
|
40164
41525
|
const { _variant, values: rowDelimiterValue } = this._getStringValues(_rowDelimiter, false);
|
|
40165
41526
|
_rowDelimiter = _variant;
|
|
41527
|
+
const allowBlankColDelimiter = rowDelimiter != null && !rowDelimiter.isNull() && !_rowDelimiter.isError() && rowDelimiterValue.length > 0;
|
|
41528
|
+
let _colDelimiter;
|
|
41529
|
+
let colDelimiterValue;
|
|
41530
|
+
if (allowBlankColDelimiter && this._isBlankScalarDelimiter(colDelimiter)) {
|
|
41531
|
+
_colDelimiter = colDelimiter;
|
|
41532
|
+
colDelimiterValue = [];
|
|
41533
|
+
} else {
|
|
41534
|
+
const { _variant: colDelimiterVariant, values } = this._getStringValues(colDelimiter);
|
|
41535
|
+
_colDelimiter = colDelimiterVariant;
|
|
41536
|
+
colDelimiterValue = values;
|
|
41537
|
+
}
|
|
40166
41538
|
const maxRowLength = Math.max(text.isArray() ? text.getRowCount() : 1, _ignoreEmpty.isArray() ? _ignoreEmpty.getRowCount() : 1, _matchMode.isArray() ? _matchMode.getRowCount() : 1);
|
|
40167
41539
|
const maxColumnLength = Math.max(text.isArray() ? text.getColumnCount() : 1, _ignoreEmpty.isArray() ? _ignoreEmpty.getColumnCount() : 1, _matchMode.isArray() ? _matchMode.getColumnCount() : 1);
|
|
40168
41540
|
const textArray = expandArrayValueObject(maxRowLength, maxColumnLength, text, ErrorValueObject.create("#N/A"));
|
|
@@ -40240,7 +41612,7 @@ var Textsplit = class extends BaseFunction {
|
|
|
40240
41612
|
const resultRows = textValue.split(rowDelimiterRegExp);
|
|
40241
41613
|
let resultColsMaxCount = 1;
|
|
40242
41614
|
let result = resultRows.map((row) => {
|
|
40243
|
-
let cols = row.split(colDelimiterRegExp);
|
|
41615
|
+
let cols = colDelimiterValue.length > 0 ? row.split(colDelimiterRegExp) : [row];
|
|
40244
41616
|
if (ignoreEmptyValue) cols = cols.filter((col) => col !== "");
|
|
40245
41617
|
resultColsMaxCount = Math.max(resultColsMaxCount, cols.length);
|
|
40246
41618
|
return cols;
|
|
@@ -40264,7 +41636,10 @@ var Textsplit = class extends BaseFunction {
|
|
|
40264
41636
|
if (valueObject.isNull()) value = "\\s";
|
|
40265
41637
|
if (valueObject.isBoolean()) value = value ? "TRUE" : "FALSE";
|
|
40266
41638
|
value += "";
|
|
40267
|
-
return escapeRegExp(value);
|
|
41639
|
+
return regexp.escapeRegExp(value);
|
|
41640
|
+
}
|
|
41641
|
+
_isBlankScalarDelimiter(valueObject) {
|
|
41642
|
+
return !valueObject.isArray() && (valueObject.isNull() || `${valueObject.getValue()}` === "");
|
|
40268
41643
|
}
|
|
40269
41644
|
};
|
|
40270
41645
|
|
|
@@ -40493,6 +41868,7 @@ const functionText = [
|
|
|
40493
41868
|
[Numbervalue, "NUMBERVALUE"],
|
|
40494
41869
|
[Regexextract, "REGEXEXTRACT"],
|
|
40495
41870
|
[Regexmatch, "REGEXMATCH"],
|
|
41871
|
+
[Regexmatch, "REGEXTEST"],
|
|
40496
41872
|
[Regexreplace, "REGEXREPLACE"],
|
|
40497
41873
|
[Proper, "PROPER"],
|
|
40498
41874
|
[Replace, "REPLACE"],
|
|
@@ -40560,6 +41936,58 @@ var Encodeurl = class extends BaseFunction {
|
|
|
40560
41936
|
}
|
|
40561
41937
|
};
|
|
40562
41938
|
|
|
41939
|
+
//#endregion
|
|
41940
|
+
//#region src/functions/web/filterxml/index.ts
|
|
41941
|
+
var Filterxml = class extends BaseFunction {
|
|
41942
|
+
constructor(..._args) {
|
|
41943
|
+
super(..._args);
|
|
41944
|
+
_defineProperty(this, "minParams", 2);
|
|
41945
|
+
_defineProperty(this, "maxParams", 2);
|
|
41946
|
+
}
|
|
41947
|
+
calculate(xml, xpath) {
|
|
41948
|
+
if (xml.isError()) return xml;
|
|
41949
|
+
if (xpath.isError()) return xpath;
|
|
41950
|
+
const tagName = getDescendantTagName(`${xpath.getValue()}`);
|
|
41951
|
+
if (tagName == null) return ErrorValueObject.create("#VALUE!");
|
|
41952
|
+
const values = extractTagTexts(`${xml.getValue()}`, tagName);
|
|
41953
|
+
if (values.length === 0) return ErrorValueObject.create("#VALUE!");
|
|
41954
|
+
return ArrayValueObject.create({
|
|
41955
|
+
calculateValueList: transformToValueObject(values.map((value) => [value])),
|
|
41956
|
+
rowCount: values.length,
|
|
41957
|
+
columnCount: 1,
|
|
41958
|
+
unitId: "",
|
|
41959
|
+
sheetId: "",
|
|
41960
|
+
row: 0,
|
|
41961
|
+
column: 0
|
|
41962
|
+
});
|
|
41963
|
+
}
|
|
41964
|
+
};
|
|
41965
|
+
function getDescendantTagName(xpath) {
|
|
41966
|
+
const text = xpath.trim();
|
|
41967
|
+
if (!text.startsWith("//")) return null;
|
|
41968
|
+
const tagName = text.slice(2).replace(/\/text\(\)$/, "").trim();
|
|
41969
|
+
return /^[A-Za-z0-9_.-]+$/.test(tagName) ? tagName : null;
|
|
41970
|
+
}
|
|
41971
|
+
function extractTagTexts(xml, tagName) {
|
|
41972
|
+
const open = `<${tagName}>`;
|
|
41973
|
+
const close = `</${tagName}>`;
|
|
41974
|
+
const values = [];
|
|
41975
|
+
let offset = 0;
|
|
41976
|
+
while (offset < xml.length) {
|
|
41977
|
+
const openIndex = xml.indexOf(open, offset);
|
|
41978
|
+
if (openIndex < 0) break;
|
|
41979
|
+
const valueStart = openIndex + open.length;
|
|
41980
|
+
const closeIndex = xml.indexOf(close, valueStart);
|
|
41981
|
+
if (closeIndex < 0) break;
|
|
41982
|
+
values.push(decodeXmlEntities(xml.slice(valueStart, closeIndex)));
|
|
41983
|
+
offset = closeIndex + close.length;
|
|
41984
|
+
}
|
|
41985
|
+
return values;
|
|
41986
|
+
}
|
|
41987
|
+
function decodeXmlEntities(value) {
|
|
41988
|
+
return value.replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&").replace(/"/g, "\"").replace(/'/g, "'");
|
|
41989
|
+
}
|
|
41990
|
+
|
|
40563
41991
|
//#endregion
|
|
40564
41992
|
//#region src/functions/web/function-map.ts
|
|
40565
41993
|
/**
|
|
@@ -40577,7 +42005,7 @@ var Encodeurl = class extends BaseFunction {
|
|
|
40577
42005
|
* See the License for the specific language governing permissions and
|
|
40578
42006
|
* limitations under the License.
|
|
40579
42007
|
*/
|
|
40580
|
-
const functionWeb = [[Encodeurl, "ENCODEURL"]];
|
|
42008
|
+
const functionWeb = [[Encodeurl, "ENCODEURL"], [Filterxml, "FILTERXML"]];
|
|
40581
42009
|
|
|
40582
42010
|
//#endregion
|
|
40583
42011
|
//#region src/functions/index.ts
|
|
@@ -40647,7 +42075,7 @@ function getObjectValue(result, isUseStrip = false) {
|
|
|
40647
42075
|
//#endregion
|
|
40648
42076
|
//#region package.json
|
|
40649
42077
|
var name = "@univerjs/engine-formula";
|
|
40650
|
-
var version = "1.0.0-alpha.
|
|
42078
|
+
var version = "1.0.0-alpha.4";
|
|
40651
42079
|
|
|
40652
42080
|
//#endregion
|
|
40653
42081
|
//#region src/services/global-computing-status.service.ts
|
|
@@ -40716,6 +42144,242 @@ let ComputingStatusReporterController = class ComputingStatusReporterController
|
|
|
40716
42144
|
};
|
|
40717
42145
|
ComputingStatusReporterController = __decorate([__decorateParam(0, ICommandService), __decorateParam(1, Inject(GlobalComputingStatusService))], ComputingStatusReporterController);
|
|
40718
42146
|
|
|
42147
|
+
//#endregion
|
|
42148
|
+
//#region src/services/formula-calculation-trigger.service.ts
|
|
42149
|
+
const LOCAL_ONLY = { onlyLocal: true };
|
|
42150
|
+
const CALCULATION_DEBOUNCE_TIME = 10;
|
|
42151
|
+
let FormulaCalculationTriggerService = class FormulaCalculationTriggerService extends Disposable {
|
|
42152
|
+
constructor(_commandService, _activeDirtyManagerService) {
|
|
42153
|
+
super();
|
|
42154
|
+
this._commandService = _commandService;
|
|
42155
|
+
this._activeDirtyManagerService = _activeDirtyManagerService;
|
|
42156
|
+
_defineProperty(this, "_waitingCommandQueue", []);
|
|
42157
|
+
_defineProperty(this, "_pendingDirtyData", createEmptyDirtyData());
|
|
42158
|
+
_defineProperty(this, "_runningDirtyData", createEmptyDirtyData());
|
|
42159
|
+
_defineProperty(this, "_timer", void 0);
|
|
42160
|
+
_defineProperty(this, "_started", false);
|
|
42161
|
+
_defineProperty(this, "_executionInProgress", false);
|
|
42162
|
+
_defineProperty(this, "_hasPendingCalculation", false);
|
|
42163
|
+
_defineProperty(this, "_stopRequested", false);
|
|
42164
|
+
this._initialize();
|
|
42165
|
+
}
|
|
42166
|
+
start() {
|
|
42167
|
+
if (this._started) return;
|
|
42168
|
+
this._started = true;
|
|
42169
|
+
this._scheduleFlush();
|
|
42170
|
+
}
|
|
42171
|
+
dispose() {
|
|
42172
|
+
clearTimeout(this._timer);
|
|
42173
|
+
this._waitingCommandQueue = [];
|
|
42174
|
+
this._pendingDirtyData = createEmptyDirtyData();
|
|
42175
|
+
this._runningDirtyData = createEmptyDirtyData();
|
|
42176
|
+
super.dispose();
|
|
42177
|
+
}
|
|
42178
|
+
_initialize() {
|
|
42179
|
+
this.disposeWithMe(this._commandService.onCommandExecuted((command, options) => {
|
|
42180
|
+
var _conversion$shouldTri;
|
|
42181
|
+
if (command.id === SetFormulaCalculationStartMutation.id) {
|
|
42182
|
+
this._executionInProgress = true;
|
|
42183
|
+
return;
|
|
42184
|
+
}
|
|
42185
|
+
if (command.id === SetFormulaCalculationNotificationMutation.id) {
|
|
42186
|
+
this._handleCalculationNotification(command.params);
|
|
42187
|
+
return;
|
|
42188
|
+
}
|
|
42189
|
+
const conversion = this._activeDirtyManagerService.get(command.id);
|
|
42190
|
+
if (!conversion) return;
|
|
42191
|
+
if (((_conversion$shouldTri = conversion.shouldTrigger) === null || _conversion$shouldTri === void 0 ? void 0 : _conversion$shouldTri.call(conversion, command, options)) === false) return;
|
|
42192
|
+
this._waitingCommandQueue.push(command);
|
|
42193
|
+
this._scheduleFlush();
|
|
42194
|
+
}));
|
|
42195
|
+
}
|
|
42196
|
+
_scheduleFlush() {
|
|
42197
|
+
if (!this._started || this._waitingCommandQueue.length === 0 && !this._hasPendingCalculation) return;
|
|
42198
|
+
clearTimeout(this._timer);
|
|
42199
|
+
this._timer = setTimeout(() => this._flush(), CALCULATION_DEBOUNCE_TIME);
|
|
42200
|
+
}
|
|
42201
|
+
_flush() {
|
|
42202
|
+
const commands = this._waitingCommandQueue;
|
|
42203
|
+
const dirtyData = this._generateDirty(commands);
|
|
42204
|
+
this._waitingCommandQueue = [];
|
|
42205
|
+
this._timer = void 0;
|
|
42206
|
+
if (hasDirtyData(dirtyData) || commands.some(({ id }) => id === SetTriggerFormulaCalculationStartMutation.id)) {
|
|
42207
|
+
this._pendingDirtyData = mergeDirtyData(this._pendingDirtyData, dirtyData);
|
|
42208
|
+
this._hasPendingCalculation = true;
|
|
42209
|
+
}
|
|
42210
|
+
if (!this._hasPendingCalculation) return;
|
|
42211
|
+
if (this._executionInProgress) {
|
|
42212
|
+
if (!this._stopRequested && dirtyDataIntersects(this._runningDirtyData, this._pendingDirtyData)) {
|
|
42213
|
+
this._stopRequested = true;
|
|
42214
|
+
this._commandService.executeCommand(SetFormulaCalculationStopMutation.id, {}, LOCAL_ONLY);
|
|
42215
|
+
}
|
|
42216
|
+
return;
|
|
42217
|
+
}
|
|
42218
|
+
this._startCalculation();
|
|
42219
|
+
}
|
|
42220
|
+
_startCalculation() {
|
|
42221
|
+
this._runningDirtyData = this._pendingDirtyData;
|
|
42222
|
+
this._pendingDirtyData = createEmptyDirtyData();
|
|
42223
|
+
this._hasPendingCalculation = false;
|
|
42224
|
+
this._executionInProgress = true;
|
|
42225
|
+
this._stopRequested = false;
|
|
42226
|
+
this._commandService.executeCommand(SetFormulaCalculationStartMutation.id, { ...this._runningDirtyData }, LOCAL_ONLY);
|
|
42227
|
+
}
|
|
42228
|
+
_handleCalculationNotification(params) {
|
|
42229
|
+
if (params.stageInfo != null) {
|
|
42230
|
+
this._executionInProgress = true;
|
|
42231
|
+
return;
|
|
42232
|
+
}
|
|
42233
|
+
const state = params.functionsExecutedState;
|
|
42234
|
+
if (state == null) return;
|
|
42235
|
+
if (!(state === 1 || state === 3 || state === 2) || !this._executionInProgress) return;
|
|
42236
|
+
this._executionInProgress = false;
|
|
42237
|
+
this._stopRequested = false;
|
|
42238
|
+
if (state === 1) this._pendingDirtyData = mergeDirtyData(this._runningDirtyData, this._pendingDirtyData);
|
|
42239
|
+
this._runningDirtyData = createEmptyDirtyData();
|
|
42240
|
+
if (this._hasPendingCalculation || this._waitingCommandQueue.length > 0) this._scheduleFlush();
|
|
42241
|
+
}
|
|
42242
|
+
_generateDirty(commands) {
|
|
42243
|
+
return commands.reduce((result, command) => {
|
|
42244
|
+
const conversion = this._activeDirtyManagerService.get(command.id);
|
|
42245
|
+
return conversion ? mergeDirtyData(result, conversion.getDirtyData(command)) : result;
|
|
42246
|
+
}, createEmptyDirtyData());
|
|
42247
|
+
}
|
|
42248
|
+
};
|
|
42249
|
+
FormulaCalculationTriggerService = __decorate([__decorateParam(0, ICommandService), __decorateParam(1, IActiveDirtyManagerService)], FormulaCalculationTriggerService);
|
|
42250
|
+
function createEmptyDirtyData() {
|
|
42251
|
+
return {
|
|
42252
|
+
forceCalculation: false,
|
|
42253
|
+
dirtyRanges: [],
|
|
42254
|
+
dirtyNameMap: {},
|
|
42255
|
+
dirtyDefinedNameMap: {},
|
|
42256
|
+
dirtySuperTableMap: {},
|
|
42257
|
+
dirtyUnitFeatureMap: {},
|
|
42258
|
+
dirtyUnitOtherFormulaMap: {},
|
|
42259
|
+
clearDependencyTreeCache: {}
|
|
42260
|
+
};
|
|
42261
|
+
}
|
|
42262
|
+
function mergeDirtyData(left, right) {
|
|
42263
|
+
var _right$dirtyRanges, _left$dirtySuperTable;
|
|
42264
|
+
const dirtyRanges = [...left.dirtyRanges];
|
|
42265
|
+
mergeDirtyRanges(dirtyRanges, (_right$dirtyRanges = right.dirtyRanges) !== null && _right$dirtyRanges !== void 0 ? _right$dirtyRanges : []);
|
|
42266
|
+
return {
|
|
42267
|
+
dirtyRanges,
|
|
42268
|
+
dirtyNameMap: mergeDirtyUnitStringMap(left.dirtyNameMap, right.dirtyNameMap),
|
|
42269
|
+
dirtyDefinedNameMap: mergeDirtyUnitStringMap(left.dirtyDefinedNameMap, right.dirtyDefinedNameMap),
|
|
42270
|
+
dirtySuperTableMap: mergeDirtyUnitStringMap((_left$dirtySuperTable = left.dirtySuperTableMap) !== null && _left$dirtySuperTable !== void 0 ? _left$dirtySuperTable : {}, right.dirtySuperTableMap),
|
|
42271
|
+
dirtyUnitFeatureMap: mergeDirtyUnitNestedMap(left.dirtyUnitFeatureMap, right.dirtyUnitFeatureMap),
|
|
42272
|
+
dirtyUnitOtherFormulaMap: mergeDirtyUnitNestedMap(left.dirtyUnitOtherFormulaMap, right.dirtyUnitOtherFormulaMap),
|
|
42273
|
+
clearDependencyTreeCache: mergeDirtyUnitStringMap(left.clearDependencyTreeCache, right.clearDependencyTreeCache),
|
|
42274
|
+
forceCalculation: left.forceCalculation || Boolean(right.forceCalculation)
|
|
42275
|
+
};
|
|
42276
|
+
}
|
|
42277
|
+
function mergeDirtyRanges(target, source) {
|
|
42278
|
+
const keys = new Set(target.map(getDirtyRangeKey));
|
|
42279
|
+
source.forEach((range) => {
|
|
42280
|
+
const key = getDirtyRangeKey(range);
|
|
42281
|
+
if (!keys.has(key)) {
|
|
42282
|
+
keys.add(key);
|
|
42283
|
+
target.push(range);
|
|
42284
|
+
}
|
|
42285
|
+
});
|
|
42286
|
+
}
|
|
42287
|
+
function getDirtyRangeKey({ unitId, sheetId, range }) {
|
|
42288
|
+
return JSON.stringify([
|
|
42289
|
+
unitId,
|
|
42290
|
+
sheetId,
|
|
42291
|
+
range.startRow,
|
|
42292
|
+
range.startColumn,
|
|
42293
|
+
range.endRow,
|
|
42294
|
+
range.endColumn,
|
|
42295
|
+
range.rangeType
|
|
42296
|
+
]);
|
|
42297
|
+
}
|
|
42298
|
+
function mergeDirtyUnitStringMap(left, right) {
|
|
42299
|
+
const result = { ...left };
|
|
42300
|
+
Object.entries(right !== null && right !== void 0 ? right : {}).forEach(([unitId, values]) => {
|
|
42301
|
+
result[unitId] = {
|
|
42302
|
+
...result[unitId],
|
|
42303
|
+
...values
|
|
42304
|
+
};
|
|
42305
|
+
});
|
|
42306
|
+
return result;
|
|
42307
|
+
}
|
|
42308
|
+
function mergeDirtyUnitNestedMap(left, right) {
|
|
42309
|
+
const result = { ...left };
|
|
42310
|
+
Object.entries(right !== null && right !== void 0 ? right : {}).forEach(([unitId, sheets]) => {
|
|
42311
|
+
const unitResult = { ...result[unitId] };
|
|
42312
|
+
Object.entries(sheets !== null && sheets !== void 0 ? sheets : {}).forEach(([sheetId, values]) => {
|
|
42313
|
+
unitResult[sheetId] = {
|
|
42314
|
+
...unitResult[sheetId],
|
|
42315
|
+
...values
|
|
42316
|
+
};
|
|
42317
|
+
});
|
|
42318
|
+
result[unitId] = unitResult;
|
|
42319
|
+
});
|
|
42320
|
+
return result;
|
|
42321
|
+
}
|
|
42322
|
+
function hasDirtyData(dirtyData) {
|
|
42323
|
+
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);
|
|
42324
|
+
}
|
|
42325
|
+
function hasNestedValue(value) {
|
|
42326
|
+
if (value == null) return false;
|
|
42327
|
+
if (typeof value !== "object") return true;
|
|
42328
|
+
return Object.values(value).some(hasNestedValue);
|
|
42329
|
+
}
|
|
42330
|
+
function dirtyDataIntersects(left, right) {
|
|
42331
|
+
if (left.forceCalculation || right.forceCalculation) return true;
|
|
42332
|
+
if (left.dirtyRanges.some((leftRange) => right.dirtyRanges.some((rightRange) => leftRange.unitId === rightRange.unitId && leftRange.sheetId === rightRange.sheetId && Rectangle.intersects(leftRange.range, rightRange.range))) || clearedSheetIntersects(left, right) || clearedSheetIntersects(right, left)) return true;
|
|
42333
|
+
return [
|
|
42334
|
+
[left.dirtyNameMap, right.dirtyNameMap],
|
|
42335
|
+
[left.dirtyDefinedNameMap, right.dirtyDefinedNameMap],
|
|
42336
|
+
[left.dirtySuperTableMap, right.dirtySuperTableMap],
|
|
42337
|
+
[left.dirtyUnitFeatureMap, right.dirtyUnitFeatureMap],
|
|
42338
|
+
[left.dirtyUnitOtherFormulaMap, right.dirtyUnitOtherFormulaMap],
|
|
42339
|
+
[left.clearDependencyTreeCache, right.clearDependencyTreeCache]
|
|
42340
|
+
].some(([leftMap, rightMap]) => hasSameNestedKey(leftMap, rightMap));
|
|
42341
|
+
}
|
|
42342
|
+
function clearedSheetIntersects(cleared, dirty) {
|
|
42343
|
+
return Object.entries(cleared.clearDependencyTreeCache).some(([unitId, sheets]) => Object.keys(sheets !== null && sheets !== void 0 ? sheets : {}).some((sheetId) => {
|
|
42344
|
+
var _dirty$dirtyNameMap$u, _dirty$dirtyUnitFeatu, _dirty$dirtyUnitOther;
|
|
42345
|
+
return dirty.dirtyRanges.some((range) => range.unitId === unitId && range.sheetId === sheetId) || ((_dirty$dirtyNameMap$u = dirty.dirtyNameMap[unitId]) === null || _dirty$dirtyNameMap$u === void 0 ? void 0 : _dirty$dirtyNameMap$u[sheetId]) != null || ((_dirty$dirtyUnitFeatu = dirty.dirtyUnitFeatureMap[unitId]) === null || _dirty$dirtyUnitFeatu === void 0 ? void 0 : _dirty$dirtyUnitFeatu[sheetId]) != null || ((_dirty$dirtyUnitOther = dirty.dirtyUnitOtherFormulaMap[unitId]) === null || _dirty$dirtyUnitOther === void 0 ? void 0 : _dirty$dirtyUnitOther[sheetId]) != null;
|
|
42346
|
+
}));
|
|
42347
|
+
}
|
|
42348
|
+
function hasSameNestedKey(left, right) {
|
|
42349
|
+
if (left == null || right == null || typeof left !== "object" || typeof right !== "object") return left != null && right != null;
|
|
42350
|
+
const rightRecord = right;
|
|
42351
|
+
return Object.entries(left).some(([key, value]) => Object.prototype.hasOwnProperty.call(rightRecord, key) && hasSameNestedKey(value, rightRecord[key]));
|
|
42352
|
+
}
|
|
42353
|
+
|
|
42354
|
+
//#endregion
|
|
42355
|
+
//#region src/controllers/formula-calculation-trigger.controller.ts
|
|
42356
|
+
/**
|
|
42357
|
+
* Copyright 2023-present DreamNum Co., Ltd.
|
|
42358
|
+
*
|
|
42359
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
42360
|
+
* you may not use this file except in compliance with the License.
|
|
42361
|
+
* You may obtain a copy of the License at
|
|
42362
|
+
*
|
|
42363
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
42364
|
+
*
|
|
42365
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
42366
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
42367
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
42368
|
+
* See the License for the specific language governing permissions and
|
|
42369
|
+
* limitations under the License.
|
|
42370
|
+
*/
|
|
42371
|
+
let FormulaCalculationTriggerController = class FormulaCalculationTriggerController extends Disposable {
|
|
42372
|
+
constructor(formulaCalculationTriggerService, lifecycleService) {
|
|
42373
|
+
super();
|
|
42374
|
+
if (isNodeEnv()) {
|
|
42375
|
+
formulaCalculationTriggerService.start();
|
|
42376
|
+
return;
|
|
42377
|
+
}
|
|
42378
|
+
this.disposeWithMe(lifecycleService.lifecycle$.pipe(filter((stage) => stage >= LifecycleStages.Rendered), take(1)).subscribe(() => formulaCalculationTriggerService.start()));
|
|
42379
|
+
}
|
|
42380
|
+
};
|
|
42381
|
+
FormulaCalculationTriggerController = __decorate([__decorateParam(0, Inject(FormulaCalculationTriggerService)), __decorateParam(1, Inject(LifecycleService))], FormulaCalculationTriggerController);
|
|
42382
|
+
|
|
40719
42383
|
//#endregion
|
|
40720
42384
|
//#region src/controllers/formula.controller.ts
|
|
40721
42385
|
let FormulaController = class FormulaController extends Disposable {
|
|
@@ -40937,38 +42601,6 @@ SetOtherFormulaController = __decorate([
|
|
|
40937
42601
|
__decorateParam(2, IDependencyManagerService)
|
|
40938
42602
|
], SetOtherFormulaController);
|
|
40939
42603
|
|
|
40940
|
-
//#endregion
|
|
40941
|
-
//#region src/services/active-dirty-manager.service.ts
|
|
40942
|
-
/**
|
|
40943
|
-
* Actively mark as dirty, calculate the dirty area based on the command,
|
|
40944
|
-
* and plugins can register the ref range they affect into the formula engine.
|
|
40945
|
-
*/
|
|
40946
|
-
var ActiveDirtyManagerService = class extends Disposable {
|
|
40947
|
-
constructor(..._args) {
|
|
40948
|
-
super(..._args);
|
|
40949
|
-
_defineProperty(this, "_dirtyConversionMap", /* @__PURE__ */ new Map());
|
|
40950
|
-
}
|
|
40951
|
-
dispose() {
|
|
40952
|
-
this._dirtyConversionMap.clear();
|
|
40953
|
-
}
|
|
40954
|
-
remove(commandId) {
|
|
40955
|
-
this._dirtyConversionMap.delete(commandId);
|
|
40956
|
-
}
|
|
40957
|
-
get(commandId) {
|
|
40958
|
-
return this._dirtyConversionMap.get(commandId);
|
|
40959
|
-
}
|
|
40960
|
-
has(commandId) {
|
|
40961
|
-
return this._dirtyConversionMap.has(commandId);
|
|
40962
|
-
}
|
|
40963
|
-
register(commandId, dirtyConversion) {
|
|
40964
|
-
this._dirtyConversionMap.set(commandId, dirtyConversion);
|
|
40965
|
-
}
|
|
40966
|
-
getDirtyConversionMap() {
|
|
40967
|
-
return this._dirtyConversionMap;
|
|
40968
|
-
}
|
|
40969
|
-
};
|
|
40970
|
-
const IActiveDirtyManagerService = createIdentifier("univer.formula.active-dirty-manager.service");
|
|
40971
|
-
|
|
40972
42604
|
//#endregion
|
|
40973
42605
|
//#region src/services/formula-common.ts
|
|
40974
42606
|
let FormulaResultStatus = /* @__PURE__ */ function(FormulaResultStatus) {
|
|
@@ -41169,7 +42801,11 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends Plugin {
|
|
|
41169
42801
|
}
|
|
41170
42802
|
onReady() {
|
|
41171
42803
|
var _this$_config;
|
|
41172
|
-
touchDependencies(this._injector, [
|
|
42804
|
+
touchDependencies(this._injector, [
|
|
42805
|
+
[FormulaController],
|
|
42806
|
+
[FormulaCalculationTriggerController],
|
|
42807
|
+
[SuperTableActiveDirtyController]
|
|
42808
|
+
]);
|
|
41173
42809
|
if (!((_this$_config = this._config) === null || _this$_config === void 0 ? void 0 : _this$_config.notExecuteFormula)) touchDependencies(this._injector, [
|
|
41174
42810
|
[SetOtherFormulaController],
|
|
41175
42811
|
[SetFeatureCalculationController],
|
|
@@ -41187,6 +42823,7 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends Plugin {
|
|
|
41187
42823
|
[IFunctionService, { useClass: FunctionService }],
|
|
41188
42824
|
[IDefinedNamesService, { useClass: DefinedNamesService }],
|
|
41189
42825
|
[IActiveDirtyManagerService, { useClass: ActiveDirtyManagerService }],
|
|
42826
|
+
[FormulaCalculationTriggerService],
|
|
41190
42827
|
[RegisterOtherFormulaService],
|
|
41191
42828
|
[IHyperlinkEngineFormulaService, { useClass: HyperlinkEngineFormulaService }],
|
|
41192
42829
|
[ISheetRowFilteredService, { useClass: SheetRowFilteredService }],
|
|
@@ -41194,6 +42831,8 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends Plugin {
|
|
|
41194
42831
|
[GlobalComputingStatusService],
|
|
41195
42832
|
[FormulaDataModel],
|
|
41196
42833
|
[FormulaController],
|
|
42834
|
+
[FormulaCalculationTriggerController],
|
|
42835
|
+
[SuperTableActiveDirtyController],
|
|
41197
42836
|
[ComputingStatusReporterController]
|
|
41198
42837
|
];
|
|
41199
42838
|
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]);
|
|
@@ -41205,7 +42844,8 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends Plugin {
|
|
|
41205
42844
|
if (!((_this$_config3 = this._config) === null || _this$_config3 === void 0 ? void 0 : _this$_config3.notExecuteFormula)) [
|
|
41206
42845
|
[ICalculateFormulaService, { useClass: CalculateFormulaService }],
|
|
41207
42846
|
[IDependencyManagerService, { useClass: DependencyManagerService }],
|
|
41208
|
-
[IFormulaDependencyGenerator, { useClass: FormulaDependencyGenerator }]
|
|
42847
|
+
[IFormulaDependencyGenerator, { useClass: FormulaDependencyGenerator }],
|
|
42848
|
+
[IFormulaUnitReferenceResolver, { useClass: FormulaUnitReferenceResolver }]
|
|
41209
42849
|
].forEach((dependency) => this._injector.add(dependency));
|
|
41210
42850
|
}
|
|
41211
42851
|
};
|
|
@@ -41215,4 +42855,4 @@ _defineProperty(UniverFormulaEnginePlugin, "version", version);
|
|
|
41215
42855
|
UniverFormulaEnginePlugin = __decorate([__decorateParam(1, Inject(Injector)), __decorateParam(2, IConfigService)], UniverFormulaEnginePlugin);
|
|
41216
42856
|
|
|
41217
42857
|
//#endregion
|
|
41218
|
-
export { ALL_IMPLEMENTED_FUNCTIONS, ALL_IMPLEMENTED_FUNCTIONS_SET, ActiveDirtyManagerService, ArrayValueObject, AstRootNodeFactory, AstTreeBuilder, AsyncArrayObject, AsyncCustomFunction, AsyncObject, BaseFunction, BaseReferenceObject, BaseValueObject, BooleanValue, BooleanValueObject, CELL_INVERTED_INDEX_CACHE, CalculateController, CalculateFormulaService, CustomFunction, DEFAULT_CYCLE_REFERENCE_COUNT, DEFAULT_INTERVAL_COUNT, DEFAULT_TOKEN_LAMBDA_FUNCTION_NAME, DEFAULT_TOKEN_LET_FUNCTION_NAME, DEFAULT_TOKEN_TYPE_LAMBDA_PARAMETER, DEFAULT_TOKEN_TYPE_PARAMETER, DEFAULT_TOKEN_TYPE_ROOT, DefinedNamesService, DependencyManagerBaseService, DependencyManagerService, ENGINE_FORMULA_CYCLE_REFERENCE_COUNT, ENGINE_FORMULA_PLUGIN_CONFIG_KEY, ENGINE_FORMULA_RETURN_DEPENDENCY_TREE, ERROR_TYPE_SET, ErrorType, ErrorValueObject, FORMULA_REF_TO_ARRAY_CACHE, FUNCTION_NAMES_ARRAY, FUNCTION_NAMES_COMPATIBILITY, FUNCTION_NAMES_CUBE, FUNCTION_NAMES_DATABASE, FUNCTION_NAMES_DATE, FUNCTION_NAMES_ENGINEERING, FUNCTION_NAMES_FINANCIAL, FUNCTION_NAMES_INFORMATION, FUNCTION_NAMES_LOGICAL, FUNCTION_NAMES_LOOKUP, FUNCTION_NAMES_MATH, FUNCTION_NAMES_STATISTICAL, FUNCTION_NAMES_TEXT, FUNCTION_NAMES_UNIVER, FUNCTION_NAMES_WEB, FeatureCalculationManagerService, FormulaCurrentConfigService, FormulaDataModel, FormulaDependencyGenerator, FormulaDependencyTree, FormulaDependencyTreeModel, FormulaDependencyTreeType, FormulaDependencyTreeVirtual, FormulaExecuteStageType, FormulaExecutedStateType, FormulaResultStatus, FormulaRuntimeService, FunctionNodeFactory, FunctionService, FunctionType, GlobalComputingStatusService, HyperlinkEngineFormulaService, IActiveDirtyManagerService, ICalculateFormulaService, IDefinedNamesService, IDependencyManagerService, IFeatureCalculationManagerService, IFormulaCurrentConfigService, IFormulaDependencyGenerator, IFormulaRuntimeService, IFunctionService, IHyperlinkEngineFormulaService, IOtherFormulaManagerService, ISheetRowFilteredService, ISuperTableService, Interpreter, LambdaNodeFactory, LambdaParameterNodeFactory, LambdaValueObjectObject, Lexer, LexerNode, LexerTreeBuilder, NEW_EXCEL_FUNCTIONS, NullValueObject, NumberValueObject, OPERATOR_TOKEN_SET, OperatorNodeFactory, OtherFormulaBizType, OtherFormulaManagerService, OtherFormulaMarkDirty, PrefixNodeFactory, RangeReferenceObject, ReferenceNodeFactory, RegisterFunctionMutation, RegisterOtherFormulaService, RemoveDefinedNameMutation, RemoveFeatureCalculationMutation, RemoveOtherFormulaMutation, RemoveSuperTableMutation, SUFFIX_TOKEN_SET, SetArrayFormulaDataMutation, SetCellFormulaDependencyCalculationMutation, SetCellFormulaDependencyCalculationResultMutation, SetDefinedNameMutation, SetDefinedNameMutationFactory, SetFeatureCalculationMutation, SetFormulaCalculationNotificationMutation, SetFormulaCalculationResultMutation, SetFormulaCalculationStartMutation, SetFormulaCalculationStopMutation, SetFormulaDataMutation, SetFormulaDependencyCalculationMutation, SetFormulaDependencyCalculationResultMutation, SetFormulaStringBatchCalculationMutation, SetFormulaStringBatchCalculationResultMutation, SetImageFormulaDataMutation, SetOtherFormulaMutation, SetQueryFormulaDependencyAllMutation, SetQueryFormulaDependencyAllResultMutation, SetQueryFormulaDependencyMutation, SetQueryFormulaDependencyResultMutation, SetSuperTableMutation, SetSuperTableOptionMutation, SetTriggerFormulaCalculationStartMutation, SheetRowFilteredService, StringValueObject, SuffixNodeFactory, SuperTableService, UnionNodeFactory, UniverFormulaEnginePlugin, ValueNodeFactory, ValueObjectFactory, compareToken, convertUnitDataToRuntime, deserializeRangeForR1C1, deserializeRangeWithSheet, deserializeRangeWithSheetWithCache, excelDateSerial, extractFormulaError, functionArray, functionCompatibility, functionCube, functionDatabase, functionDate, functionEngineering, functionFinancial, functionInformation, functionLogical, functionLookup, functionMath, functionMeta, functionStatistical, functionText, functionUniver, functionWeb, generateAstNode, generateExecuteAstNodeData, generateRandomDependencyTreeId, generateStringWithSequence, getAbsoluteRefTypeWitString, getAbsoluteRefTypeWithSingleString, getObjectValue, getRangeWithRefsString, handleNumfmtInCell, handleRefStringInfo, includeFormulaLexerToken, initSheetFormulaData, isFormulaLexerToken, isInDirtyRange, isReferenceString, isReferenceStringWithEffectiveColumn, isReferenceStrings, matchRefDrawToken, matchToken, needsQuoting, normalizeSheetName, operatorToken, prefixToken, quoteSheetName, sequenceNodeType, serializeRange, serializeRangeToRefString, serializeRangeWithSheet, serializeRangeWithSpreadsheet, singleReferenceToGrid, splitTableStructuredRef, strip, stripErrorMargin, unquoteSheetName };
|
|
42858
|
+
export { ALL_IMPLEMENTED_FUNCTIONS, ALL_IMPLEMENTED_FUNCTIONS_SET, ActiveDirtyManagerService, ArrayValueObject, AstRootNodeFactory, AstTreeBuilder, AsyncArrayObject, AsyncCustomFunction, AsyncObject, BaseFunction, BaseReferenceObject, BaseValueObject, BooleanValue, BooleanValueObject, CELL_INVERTED_INDEX_CACHE, CalculateController, CalculateFormulaService, CustomFunction, DEFAULT_CYCLE_REFERENCE_COUNT, DEFAULT_INTERVAL_COUNT, DEFAULT_TOKEN_LAMBDA_FUNCTION_NAME, DEFAULT_TOKEN_LET_FUNCTION_NAME, DEFAULT_TOKEN_TYPE_LAMBDA_PARAMETER, DEFAULT_TOKEN_TYPE_PARAMETER, DEFAULT_TOKEN_TYPE_ROOT, DefinedNamesService, DependencyManagerBaseService, DependencyManagerService, ENGINE_FORMULA_CYCLE_REFERENCE_COUNT, ENGINE_FORMULA_PLUGIN_CONFIG_KEY, ENGINE_FORMULA_RETURN_DEPENDENCY_TREE, ERROR_TYPE_SET, ErrorType, ErrorValueObject, FORMULA_REF_TO_ARRAY_CACHE, FUNCTION_NAMES_ARRAY, FUNCTION_NAMES_COMPATIBILITY, FUNCTION_NAMES_CUBE, FUNCTION_NAMES_DATABASE, FUNCTION_NAMES_DATE, FUNCTION_NAMES_ENGINEERING, FUNCTION_NAMES_FINANCIAL, FUNCTION_NAMES_INFORMATION, FUNCTION_NAMES_LOGICAL, FUNCTION_NAMES_LOOKUP, FUNCTION_NAMES_MATH, FUNCTION_NAMES_STATISTICAL, FUNCTION_NAMES_TEXT, FUNCTION_NAMES_UNIVER, FUNCTION_NAMES_WEB, FeatureCalculationManagerService, FormulaCalculationTriggerService, FormulaCurrentConfigService, FormulaDataModel, FormulaDependencyGenerator, FormulaDependencyTree, FormulaDependencyTreeModel, FormulaDependencyTreeType, FormulaDependencyTreeVirtual, FormulaExecuteStageType, FormulaExecutedStateType, FormulaResultStatus, FormulaRuntimeService, FormulaUnitReferenceResolver, FunctionNodeFactory, FunctionService, FunctionType, GlobalComputingStatusService, HyperlinkEngineFormulaService, IActiveDirtyManagerService, ICalculateFormulaService, IDefinedNamesService, IDependencyManagerService, IFeatureCalculationManagerService, IFormulaCurrentConfigService, IFormulaDependencyGenerator, IFormulaRuntimeService, IFormulaUnitReferenceResolver, IFunctionService, IHyperlinkEngineFormulaService, IOtherFormulaManagerService, ISheetRowFilteredService, ISuperTableService, Interpreter, LambdaNodeFactory, LambdaParameterNodeFactory, LambdaValueObjectObject, Lexer, LexerNode, LexerTreeBuilder, NEW_EXCEL_FUNCTIONS, NullValueObject, NumberValueObject, OPERATOR_TOKEN_SET, OperatorNodeFactory, OtherFormulaBizType, OtherFormulaManagerService, OtherFormulaMarkDirty, PrefixNodeFactory, RangeReferenceObject, ReferenceNodeFactory, RegisterFunctionMutation, RegisterOtherFormulaService, RemoveDefinedNameMutation, RemoveFeatureCalculationMutation, RemoveOtherFormulaMutation, RemoveSuperTableMutation, SUFFIX_TOKEN_SET, SetArrayFormulaDataMutation, SetCellFormulaDependencyCalculationMutation, SetCellFormulaDependencyCalculationResultMutation, SetDefinedNameMutation, SetDefinedNameMutationFactory, SetFeatureCalculationMutation, SetFormulaCalculationNotificationMutation, SetFormulaCalculationResultMutation, SetFormulaCalculationStartMutation, SetFormulaCalculationStopMutation, SetFormulaDataMutation, SetFormulaDependencyCalculationMutation, SetFormulaDependencyCalculationResultMutation, SetFormulaStringBatchCalculationMutation, SetFormulaStringBatchCalculationResultMutation, SetImageFormulaDataMutation, SetOtherFormulaMutation, SetQueryFormulaDependencyAllMutation, SetQueryFormulaDependencyAllResultMutation, SetQueryFormulaDependencyMutation, SetQueryFormulaDependencyResultMutation, SetSuperTableMutation, SetSuperTableOptionMutation, SetTriggerFormulaCalculationStartMutation, SheetRowFilteredService, StringValueObject, SuffixNodeFactory, SuperTableActiveDirtyController, SuperTableService, UnionNodeFactory, UniverFormulaEnginePlugin, ValueNodeFactory, ValueObjectFactory, compareToken, convertUnitDataToRuntime, deserializeRangeForR1C1, deserializeRangeWithSheet, deserializeRangeWithSheetWithCache, excelDateSerial, extractFormulaError, functionArray, functionCompatibility, functionCube, functionDatabase, functionDate, functionEngineering, functionFinancial, functionInformation, functionLogical, functionLookup, functionMath, functionMeta, functionStatistical, functionText, functionUniver, functionWeb, generateAstNode, generateExecuteAstNodeData, generateRandomDependencyTreeId, generateStringWithSequence, getAbsoluteRefTypeWitString, getAbsoluteRefTypeWithSingleString, getObjectValue, getRangeWithRefsString, handleNumfmtInCell, handleRefStringInfo, includeFormulaLexerToken, initSheetFormulaData, isFormulaLexerToken, isInDirtyRange, isReferenceString, isReferenceStringWithEffectiveColumn, isReferenceStrings, matchRefDrawToken, matchToken, needsQuoting, normalizeFormulaUnitName, normalizeSheetName, operatorToken, prefixToken, quoteSheetName, refactorFormulaUnitQualifier, sequenceNodeType, serializeRange, serializeRangeToRefString, serializeRangeWithSheet, serializeRangeWithSpreadsheet, singleReferenceToGrid, splitTableStructuredRef, strip, stripErrorMargin, unquoteSheetName };
|