@univerjs-pro/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.
Files changed (32) hide show
  1. package/README.md +7 -2
  2. package/lib/cjs/facade.js +1 -1
  3. package/lib/cjs/index.js +1 -1
  4. package/lib/es/facade.js +1 -1
  5. package/lib/es/index.js +1 -1
  6. package/lib/facade.js +1 -1
  7. package/lib/index.js +1 -1
  8. package/lib/types/controllers/external-reference-data-providers.controller.d.ts +6 -0
  9. package/lib/types/controllers/external-reference-rename.controller.d.ts +9 -0
  10. package/lib/types/controllers/external-reference-resource.controller.d.ts +6 -0
  11. package/lib/types/controllers/formula-reference-data-rpc.controller.d.ts +7 -0
  12. package/lib/types/engine/dependency-engine/dependency-engine.d.ts +11 -0
  13. package/lib/types/engine/dependency-engine/formula-cell-index.d.ts +1 -0
  14. package/lib/types/engine/dependency-engine/range-index.d.ts +1 -0
  15. package/lib/types/engine/dependency-engine/types.d.ts +1 -0
  16. package/lib/types/engine/formula-dependency.d.ts +31 -5
  17. package/lib/types/index.d.ts +22 -4
  18. package/lib/types/models/external-reference-overlay.model.d.ts +41 -0
  19. package/lib/types/models/external-reference.model.d.ts +91 -0
  20. package/lib/types/plugin.d.ts +8 -0
  21. package/lib/types/services/calculate-formula.service.d.ts +20 -3
  22. package/lib/types/services/dependency-manager.service.d.ts +7 -2
  23. package/lib/types/services/external-cache-reference-data.provider.d.ts +10 -0
  24. package/lib/types/services/external-reference-prefetch-planner.d.ts +18 -0
  25. package/lib/types/services/external-reference-prefetch.service.d.ts +38 -0
  26. package/lib/types/services/external-unit-reference-resolver.service.d.ts +8 -0
  27. package/lib/types/services/formula-reference-data.service.d.ts +71 -0
  28. package/lib/types/services/main-formula-reference-data.service.d.ts +12 -0
  29. package/lib/umd/facade.js +1 -1
  30. package/lib/umd/index.js +1 -1
  31. package/package.json +7 -6
  32. package/lib/types/engine/dependency-engine.d.ts +0 -8
@@ -0,0 +1,6 @@
1
+ import { Disposable, IResourceManagerService } from '@univerjs/core';
2
+ import { ExternalReferenceOverlayModel } from '../models/external-reference-overlay.model';
3
+ import { ExternalReferenceModel } from '../models/external-reference.model';
4
+ export declare class ExternalReferenceResourceController extends Disposable {
5
+ constructor(resourceManagerService: IResourceManagerService, externalReferenceModel: ExternalReferenceModel, externalReferenceOverlayModel: ExternalReferenceOverlayModel);
6
+ }
@@ -0,0 +1,7 @@
1
+ import { Disposable } from '@univerjs/core';
2
+ import { IRPCChannelService } from '@univerjs/rpc';
3
+ import { IFormulaReferenceDataService } from '../services/formula-reference-data.service';
4
+ export declare const FORMULA_REFERENCE_DATA_RPC_CHANNEL = "univer-pro.formula.reference-data";
5
+ export declare class FormulaReferenceDataRpcController extends Disposable {
6
+ constructor(rpcChannelService: IRPCChannelService, referenceDataService: IFormulaReferenceDataService);
7
+ }
@@ -85,6 +85,7 @@ export declare class DependencyEngine {
85
85
  */
86
86
  reset(): void;
87
87
  encodeCell(unitId: string, sheetId: string, row: number, col: number): CellId;
88
+ reserveDependencyCapacity(minNodeCapacity: number, minRangeCapacity?: number): void;
88
89
  decodeCell(cell: CellId): IDecodedCell;
89
90
  encodeFeatureCalculationId(unitId: string, sheetId: string, formulaId: string): string;
90
91
  decodeFeatureCalculationId(id: ExternalNodeId): IDecodedFeatureCalculationId;
@@ -95,6 +96,12 @@ export declare class DependencyEngine {
95
96
  markDirty?: boolean;
96
97
  mode?: 'replace' | 'merge';
97
98
  }): ISetNodeResult;
99
+ setNewCellFormulaDeps(cell: CellId, deps: ICalcNodeDeps): ISetNodeResult;
100
+ setNewCellFormulaNodeOnly(cell: CellId): ISetNodeResult;
101
+ setNewCellFormulaNodeOnlyRange(unitId: string, sheetId: string, range: IRefRange['range'], skip?: {
102
+ row: number;
103
+ col: number;
104
+ }): CalcNodeIndex[];
98
105
  setOtherFormulaDeps(id: ExternalNodeId, deps: ICalcNodeDeps, options?: {
99
106
  checkCycle?: boolean;
100
107
  markDirty?: boolean;
@@ -279,7 +286,9 @@ export declare class DependencyEngine {
279
286
  private _isEmptyCalcNodeDeps;
280
287
  private _unregisterCompressedSharedFormulaGroupByNode;
281
288
  private _markCompressedSharedFormulaMembership;
289
+ private _markCompressedSharedFormulaMembershipByNodeIndices;
282
290
  private _clearCompressedSharedFormulaMembership;
291
+ private _clearCompressedSharedFormulaMembershipByNodeIndices;
283
292
  private _getCompressedSharedSourceCoverage;
284
293
  private _forEachCompressedSharedDependentByRange;
285
294
  private _forEachActiveCellFormulaInRange;
@@ -289,6 +298,7 @@ export declare class DependencyEngine {
289
298
  private _getCompressedSharedPrecedentCell;
290
299
  private _getCompressedSharedPrecedentRange;
291
300
  private _addNodeDepsOnly;
301
+ private _addNewNodeDepsOnly;
292
302
  private _removeNodeDepsOnly;
293
303
  private _collectDynamicResolveResult;
294
304
  private _addRuntimeDepsOnly;
@@ -297,6 +307,7 @@ export declare class DependencyEngine {
297
307
  private _detachPrecedentFromDependent;
298
308
  private _detachRuntimePrecedentFromDependent;
299
309
  private _addDirectEdge;
310
+ private _addDirectEdgeForNewNode;
300
311
  private _removeDirectEdge;
301
312
  private _addRuntimeDirectEdge;
302
313
  private _removeRuntimeDirectEdge;
@@ -14,6 +14,7 @@ export declare class FormulaCellIndex {
14
14
  private readonly _colBuckets;
15
15
  constructor(_codec: CellCodec, _indexToNodeId: ExternalNodeId[]);
16
16
  addFormulaCell(formulaCell: number, nodeIndex: CalcNodeIndex): void;
17
+ addFormulaCellByPosition(sheetKey: number, row: number, col: number, nodeIndex: CalcNodeIndex): void;
17
18
  removeFormulaCell(formulaCell: number, nodeIndex: CalcNodeIndex): void;
18
19
  forEachFormulaInRange(rangeInput: IRefRange, cb: (nodeIndex: CalcNodeIndex) => boolean | void): boolean;
19
20
  private _scanRows;
@@ -36,6 +36,7 @@ export declare class RangeIndex {
36
36
  private readonly _nodeToWholeColKeys;
37
37
  private readonly _nodeToWholeRowKeys;
38
38
  constructor(_codec: CellCodec, initialCapacity: number, _maxIndexedSpan: number);
39
+ reserveCapacity(minCapacity: number): void;
39
40
  addRange(nodeIndex: CalcNodeIndex, rangeInput: IRefRange): void;
40
41
  removeNode(nodeIndex: CalcNodeIndex): void;
41
42
  /**
@@ -109,6 +109,7 @@ export interface ICompressedSharedFormulaGroup {
109
109
  groupId: string;
110
110
  fillRange: IRefRange;
111
111
  patterns: ICompressedSharedFormulaPattern[];
112
+ memberNodeIndices?: CalcNodeIndex[];
112
113
  }
113
114
  export interface IDynamicDependency {
114
115
  id: DynamicDependencyId;
@@ -1,6 +1,6 @@
1
1
  import type { IUnitRange, Nullable } from '@univerjs/core';
2
2
  import type { BaseAstNode, IFormulaDataItem, IFormulaDependencyTree, IFormulaDependencyTreeJson, IUnitData } from '@univerjs/engine-formula';
3
- import type { DynamicResolver } from './dependency-engine';
3
+ import type { DynamicResolver } from './dependency-engine/types';
4
4
  import type { ISharedFormulaCompressionMetrics } from './shared-formula-group-analyzer';
5
5
  import { FormulaDependencyGenerator, FormulaDependencyTree, FormulaDependencyTreeType } from '@univerjs/engine-formula';
6
6
  export interface IFormulaCalculationTree {
@@ -37,14 +37,14 @@ export declare class FormulaDependencyProGenerator extends FormulaDependencyGene
37
37
  clearCachedCalculationNodeData(): void;
38
38
  clearCachedCalculationTree(): void;
39
39
  getCachedCalculationNodeData(nodeIndex: number): IFormulaCalculationNodeData | undefined;
40
- getCalculationOrder(): import("./dependency-engine").ICalculationOrderResult;
40
+ getCalculationOrder(): import("./dependency-engine/types").ICalculationOrderResult;
41
41
  getSharedFormulaCompressionMetrics(): ISharedFormulaCompressionMetrics;
42
42
  hasDynamicDepsByIndex(nodeIndex: number): boolean;
43
43
  refreshDynamicDepsByIndex(nodeIndex: number, resolver: DynamicResolver): boolean;
44
44
  hasUncalculatedDirtyPrecedentByIndex(nodeIndex: number, calculatedNodeIndices: ReadonlySet<number>): boolean;
45
45
  getAllDependencyJson(): Promise<IFormulaDependencyTreeJson[]>;
46
46
  generatePro(isCalculateTreeModel?: boolean): Promise<{
47
- calculationOrderResult: import("./dependency-engine").ICalculationOrderResult;
47
+ calculationOrderResult: import("./dependency-engine/types").ICalculationOrderResult;
48
48
  dependencyTree: Map<number, IFormulaCalculationTree>;
49
49
  }>;
50
50
  /**
@@ -66,9 +66,12 @@ export declare class FormulaDependencyProGenerator extends FormulaDependencyGene
66
66
  private _normalizeSharedFormulaRange;
67
67
  private _recordCompressedSharedFormulaGroupMetrics;
68
68
  private _recordExpandedSharedFormulaGroupMetrics;
69
+ private _shouldEagerCacheCalculationTrees;
70
+ private _hasAnyDirtyMapValue;
69
71
  private _markDirtyDependenciesPro;
70
72
  private _markForcedRecalculationNodesPro;
71
73
  private _markDirtyDefinedNameDependenciesPro;
74
+ private _markDirtySuperTableDependenciesPro;
72
75
  private _cacheCalculationTree;
73
76
  private _cacheCompressedVirtualCalculationTree;
74
77
  private _getOffsetRangeList;
@@ -78,13 +81,36 @@ export declare class FormulaDependencyProGenerator extends FormulaDependencyGene
78
81
  private _releaseDependencyTree;
79
82
  private _hasDirtyDefinedNames;
80
83
  private _syncForcedRecalculationNodeIndex;
81
- private _syncCompressedVirtualForcedRecalculationNodeIndex;
84
+ private _hasForcedRecalculationFunction;
82
85
  private _detectForcedRecalculationNodePro;
83
86
  private _includeDirtyDefinedNamePro;
87
+ private _includeDirtySuperTablePro;
84
88
  private _ensureTreeInitializedForDependencies;
85
- private _ensureTreeNodeForCalculation;
86
89
  private _getFeatureFormulaDependencyNodes;
87
90
  private _rangesIntersectAny;
88
91
  private _initialAstNodeAndRanges;
92
+ private _initialDependencyRanges;
93
+ private _tryInitialStaticReferenceRanges;
94
+ private _replaceDoubleQuotedStrings;
95
+ private _replaceQuotedSheetNames;
96
+ private _hasOnlyStaticReferenceSafeIdentifiers;
97
+ private _looksLikeA1ReferenceAt;
98
+ private _looksLikeColumnReferencePart;
99
+ private _isStaticReferenceTokenBoundarySafe;
100
+ private _tryCreateStaticReferenceRange;
101
+ private _tryCreateStaticColumnReferenceRange;
102
+ private _tryExtractStaticOffsetRanges;
103
+ private _tryCreateStaticOffsetRange;
104
+ private _tryInferOffsetRowSpan;
105
+ private _tryInferPositiveInteger;
106
+ private _tryParseInteger;
107
+ private _tryParseSingleStaticReference;
108
+ private _extractFunctionCalls;
109
+ private _findMatchingParen;
110
+ private _splitTopLevelArguments;
111
+ private _getStaticReferenceSheetSize;
112
+ private _dedupeStaticReferenceRanges;
113
+ private _columnNameToIndex;
114
+ private _nextNonSpaceChar;
89
115
  protected _createFDtree(unitId: string, sheetId: string, row: number, column: number, unitData: IUnitData, formulaDataItem: IFormulaDataItem): FormulaDependencyTree;
90
116
  }
@@ -1,5 +1,23 @@
1
- export { FormulaDependencyProGenerator } from './engine/formula-dependency';
1
+ export { ExternalReferenceDataProvidersController } from './controllers/external-reference-data-providers.controller';
2
+ export { ExternalReferenceRenameController } from './controllers/external-reference-rename.controller';
3
+ export { ExternalReferenceResourceController } from './controllers/external-reference-resource.controller';
4
+ export { FORMULA_REFERENCE_DATA_RPC_CHANNEL, FormulaReferenceDataRpcController } from './controllers/formula-reference-data-rpc.controller';
5
+ export { ExternalReferenceOverlayModel } from './models/external-reference-overlay.model';
6
+ export type { IExternalOverlayCellState } from './models/external-reference-overlay.model';
7
+ export { createEmptyExternalReferenceResource, createExternalSyntheticUnitId, EXTERNAL_REFERENCE_SCHEMA_VERSION, ExternalReferenceModel, SHEET_EXTERNAL_DATA_PLUGIN, } from './models/external-reference.model';
8
+ export type { ExternalReferenceBindingResult, IExternalReferenceCachedCell, IExternalReferenceCachedSheet, IExternalReferenceCoverage, IExternalReferenceLink, IExternalReferenceResource, IExternalReferenceTable, IExternalReferenceTableColumn, } from './models/external-reference.model';
2
9
  export { UniverProFormulaEnginePlugin } from './plugin';
3
- export { CalculateFormulaProService } from './services/calculate-formula.service';
4
- export { DependencyManagerProService } from './services/dependency-manager.service';
5
- export * from '@univerjs/engine-formula';
10
+ export { ExternalCacheReferenceDataProvider } from './services/external-cache-reference-data.provider';
11
+ export { ExternalReferencePrefetchPlanner } from './services/external-reference-prefetch-planner';
12
+ export { ExternalReferencePrefetchService } from './services/external-reference-prefetch.service';
13
+ export type { IExternalReferencePrefetchLimits, IExternalReferencePrefetchResult, } from './services/external-reference-prefetch.service';
14
+ export { ExternalFormulaUnitReferenceResolver } from './services/external-unit-reference-resolver.service';
15
+ export { createUnavailableReferenceDataResponse, FormulaReferenceDataProviderRegistry, IFormulaReferenceDataProviderRegistry, IFormulaReferenceDataService, } from './services/formula-reference-data.service';
16
+ export type { FormulaReferenceDataFreshness, FormulaReferenceDataSource, IFormulaReferenceDataCell, IFormulaReferenceDataProvider, IFormulaReferenceDataRangeRequest, IFormulaReferenceDataRequest, IFormulaReferenceDataResponse, IFormulaReferenceDataSheet, } from './services/formula-reference-data.service';
17
+ export { MainFormulaReferenceDataService } from './services/main-formula-reference-data.service';
18
+ export { RemoveSuperTableMutation, SetFormulaCalculationResultMutation, SetFormulaCalculationStartMutation, SetSuperTableMutation, SetTriggerFormulaCalculationStartMutation, } from '@univerjs/engine-formula';
19
+ export type { ISetFormulaCalculationResultMutation, ISetFormulaCalculationStartMutation, ISuperTable, } from '@univerjs/engine-formula';
20
+ export { SetFormulaDataMutation } from '@univerjs/engine-formula';
21
+ export { refactorFormulaUnitQualifier } from '@univerjs/engine-formula';
22
+ export type { IUniverEngineFormulaConfig } from '@univerjs/engine-formula';
23
+ export { FormulaCalculationTriggerService, FormulaDataModel, IActiveDirtyManagerService, ISuperTableService, } from '@univerjs/engine-formula';
@@ -0,0 +1,41 @@
1
+ import type { IRange, IUnitRange } from '@univerjs/core';
2
+ import type { IFormulaDatasetConfig } from '@univerjs/engine-formula';
3
+ import type { IFormulaReferenceDataRequest, IFormulaReferenceDataResponse } from '../services/formula-reference-data.service';
4
+ import { Disposable } from '@univerjs/core';
5
+ import { ISuperTableService } from '@univerjs/engine-formula';
6
+ import { ExternalReferenceModel } from './external-reference.model';
7
+ export interface IExternalOverlayCellState {
8
+ covered: boolean;
9
+ value: unknown;
10
+ }
11
+ export declare class ExternalReferenceOverlayModel extends Disposable {
12
+ private readonly _externalReferenceModel;
13
+ private readonly _superTableService;
14
+ private readonly _units;
15
+ private readonly _pendingDirtyRanges;
16
+ constructor(_externalReferenceModel: ExternalReferenceModel, _superTableService: ISuperTableService);
17
+ apply(request: IFormulaReferenceDataRequest, response: IFormulaReferenceDataResponse): Array<{
18
+ sheetId: string;
19
+ range: IRange;
20
+ }>;
21
+ materialize(config: IFormulaDatasetConfig): void;
22
+ getCellState(unitId: string, sheetId: string, row: number, column: number): IExternalOverlayCellState;
23
+ isRangeCovered(unitId: string, sheetNameOrId: string | undefined, range: IRange): boolean;
24
+ enforceLimits(maxCells: number, maxBytes: number): number;
25
+ invalidateHost(hostUnitId: string): IUnitRange[];
26
+ invalidateSyntheticUnit(unitId: string): IUnitRange[];
27
+ invalidateSourceRange(targetUnitIdOrName: string, sheetNameOrId: string, range: IRange): IUnitRange[];
28
+ invalidateSourceMetadata(targetUnitIdOrName: string): IUnitRange[];
29
+ drainDirtyRanges(): IUnitRange[];
30
+ getUnitCount(): number;
31
+ dispose(): void;
32
+ private _unitRanges;
33
+ private _queueDirty;
34
+ private _mergeSheet;
35
+ private _oldestCoverage;
36
+ private _coveredCellCount;
37
+ private _estimatedBytes;
38
+ private _writeCoverageMisses;
39
+ private _createUnavailableSheets;
40
+ private _registerTables;
41
+ }
@@ -0,0 +1,91 @@
1
+ import type { FormulaUnitType } from '@univerjs/engine-formula';
2
+ import { Disposable } from '@univerjs/core';
3
+ export declare const SHEET_EXTERNAL_DATA_PLUGIN = "SHEET_EXTERNAL_DATA_PLUGIN";
4
+ export declare const EXTERNAL_REFERENCE_SCHEMA_VERSION: 1;
5
+ export interface IExternalReferenceCoverage {
6
+ startRow: number;
7
+ endRow: number;
8
+ startColumn: number;
9
+ endColumn: number;
10
+ }
11
+ export interface IExternalReferenceCachedCell {
12
+ row: number;
13
+ column: number;
14
+ value: unknown;
15
+ valueType?: number;
16
+ }
17
+ export interface IExternalReferenceCachedSheet {
18
+ name: string;
19
+ sheetId?: string;
20
+ rowCount?: number;
21
+ columnCount?: number;
22
+ coverage: IExternalReferenceCoverage[];
23
+ cells: IExternalReferenceCachedCell[];
24
+ }
25
+ export interface IExternalReferenceTableColumn {
26
+ id?: string;
27
+ name: string;
28
+ }
29
+ export interface IExternalReferenceTable {
30
+ id?: string;
31
+ name: string;
32
+ sheetName?: string;
33
+ columns: IExternalReferenceTableColumn[];
34
+ range?: IExternalReferenceCoverage;
35
+ /** Base virtual tables start with records at row 0; Sheet tables default to a physical header. */
36
+ showHeader?: boolean;
37
+ }
38
+ export interface IExternalReferenceLink {
39
+ /** Host-local OOXML slot. Slots are one-based and order is preserved. */
40
+ slot: number;
41
+ name: string;
42
+ target: {
43
+ name: string;
44
+ unitType: FormulaUnitType;
45
+ uri?: string;
46
+ liveUnitId?: string;
47
+ };
48
+ sheetNames: Array<{
49
+ name: string;
50
+ sheetId?: string;
51
+ }>;
52
+ definedNames: Array<{
53
+ name: string;
54
+ formulaOrRefString: string;
55
+ }>;
56
+ tables: IExternalReferenceTable[];
57
+ cache?: {
58
+ revision?: string;
59
+ freshness: 'fresh' | 'stale';
60
+ complete: boolean;
61
+ sheets: IExternalReferenceCachedSheet[];
62
+ };
63
+ }
64
+ export interface IExternalReferenceResource {
65
+ schemaVersion: typeof EXTERNAL_REFERENCE_SCHEMA_VERSION;
66
+ links: IExternalReferenceLink[];
67
+ }
68
+ export type ExternalReferenceBindingResult = {
69
+ status: 'resolved';
70
+ link: IExternalReferenceLink;
71
+ } | {
72
+ status: 'missing' | 'ambiguous';
73
+ };
74
+ export declare function createEmptyExternalReferenceResource(): IExternalReferenceResource;
75
+ export declare function createExternalSyntheticUnitId(hostUnitId: string, slot: number): string;
76
+ export declare class ExternalReferenceModel extends Disposable {
77
+ private readonly _resources;
78
+ private readonly _loadErrors;
79
+ load(hostUnitId: string, value: unknown): boolean;
80
+ set(hostUnitId: string, resource: IExternalReferenceResource): boolean;
81
+ serialize(hostUnitId: string): IExternalReferenceResource;
82
+ get(hostUnitId: string): IExternalReferenceResource | undefined;
83
+ getLoadError(hostUnitId: string): 'invalid-resource' | 'unsupported-version' | undefined;
84
+ resolveBinding(hostUnitId: string, qualifier: string): ExternalReferenceBindingResult;
85
+ renameLiveTarget(unitId: string, oldName: string, newName: string): Array<{
86
+ hostUnitId: string;
87
+ slot: number;
88
+ }>;
89
+ remove(hostUnitId: string): void;
90
+ dispose(): void;
91
+ }
@@ -1,6 +1,14 @@
1
+ import type { Dependency } from '@univerjs/core';
1
2
  import { UniverFormulaEnginePlugin } from '@univerjs/engine-formula';
2
3
  export declare class UniverProFormulaEnginePlugin extends UniverFormulaEnginePlugin {
3
4
  static packageName: string;
4
5
  static version: string;
6
+ /**
7
+ * Allows execution backends to replace individual formula services before
8
+ * they are registered. Keeping one registration pass avoids duplicate DI
9
+ * bindings when a backend only swaps the calculator.
10
+ */
11
+ protected _extendFormulaExecutionDependencies(_dependencies: Dependency[]): void;
5
12
  protected _initializeWithOverride(): void;
13
+ onReady(): void;
6
14
  }
@@ -1,14 +1,25 @@
1
1
  import type { IFormulaDatasetConfig } from '@univerjs/engine-formula';
2
- import type { CalcNodeIndex, DynamicResolver, ICalculationOrderResult } from '../engine/dependency-engine';
2
+ import type { CalcNodeIndex, DynamicResolver, ICalculationOrderResult } from '../engine/dependency-engine/types';
3
3
  import type { IFormulaCalculationTree } from '../engine/formula-dependency';
4
- import { CalculateFormulaService } from '@univerjs/engine-formula';
4
+ import { IConfigService } from '@univerjs/core';
5
+ import { AstTreeBuilder, CalculateFormulaService, IFormulaCurrentConfigService, IFormulaDependencyGenerator, IFormulaRuntimeService, Interpreter, Lexer } from '@univerjs/engine-formula';
6
+ import { ExternalReferencePrefetchPlanner } from './external-reference-prefetch-planner';
7
+ import { ExternalReferencePrefetchService } from './external-reference-prefetch.service';
5
8
  export declare class CalculateFormulaProService extends CalculateFormulaService {
9
+ private readonly _externalPrefetchPlanner;
10
+ private readonly _externalPrefetchService;
6
11
  private _dynamicRuntimeRanges;
12
+ private _externalFormulaDatasetConfig;
13
+ private _externalPrefetchedNodes;
14
+ constructor(configService: IConfigService, lexer: Lexer, currentConfigService: IFormulaCurrentConfigService, runtimeService: IFormulaRuntimeService, formulaDependencyGenerator: IFormulaDependencyGenerator, interpreter: Interpreter, astTreeBuilder: AstTreeBuilder, _externalPrefetchPlanner: ExternalReferencePrefetchPlanner, _externalPrefetchService: ExternalReferencePrefetchService);
7
15
  execute(formulaDatasetConfig: IFormulaDatasetConfig): Promise<void>;
8
16
  protected _executeStep(cycleReferenceCount?: number): Promise<true | undefined>;
9
17
  protected _apply(isArrayFormulaState?: boolean, cycleReferenceCount?: number): Promise<import("@univerjs/engine-formula").IAllRuntimeData | undefined>;
18
+ private _setFormulaExecuteStage;
19
+ private _setTotalFormulasToCalculate;
10
20
  private _shouldRescheduleAfterDynamicChange;
11
- protected _forEachCalculationPlanTree(calculationOrderResult: Pick<ICalculationOrderResult, 'calculationForest'>, dependencyTree: Map<CalcNodeIndex, IFormulaCalculationTree>, cycleReferenceCount: number, visitor: (tree: IFormulaCalculationTree, nodeIndex: CalcNodeIndex, cycleIndex?: number) => Promise<boolean | void>): Promise<void>;
21
+ protected _forEachCalculationPlanTree(calculationOrderResult: Pick<ICalculationOrderResult, 'calculationForest'>, dependencyTree: Map<CalcNodeIndex, IFormulaCalculationTree>, cycleReferenceCount: number, visitor: (tree: IFormulaCalculationTree, nodeIndex: CalcNodeIndex, cycleIndex?: number, shouldPreserveCycleTree?: boolean) => Promise<boolean | void>): Promise<void>;
22
+ private _calculationPlanHasSelfReference;
12
23
  protected _getCalculationPlanTreeCount(calculationOrderResult: Pick<ICalculationOrderResult, 'calculationForest'>, dependencyTree: Map<CalcNodeIndex, IFormulaCalculationTree>, cycleReferenceCount: number): number;
13
24
  protected _getDynamicResolver(): DynamicResolver | undefined;
14
25
  private _refreshDynamicDepsAfterCalculate;
@@ -17,5 +28,11 @@ export declare class CalculateFormulaProService extends CalculateFormulaService
17
28
  private _getRangeSignature;
18
29
  private _waitForExecutionSlot;
19
30
  private _calculateDependencyTree;
31
+ private _prefetchDynamicExternalReferences;
32
+ private _collectAddressFunctionRuntimeReferences;
33
+ private _setFunctionRefInfoForTree;
34
+ private _formulaReferencesTreeCell;
35
+ private _isReferenceMetadataFunctionArgument;
36
+ private _parseA1Reference;
20
37
  private _getCalculationNodeData;
21
38
  }
@@ -1,6 +1,6 @@
1
1
  import type { IUnitRange } from '@univerjs/core';
2
2
  import type { FormulaDependencyTree, IDirtyUnitFeatureMap, IDirtyUnitOtherFormulaMap, IDirtyUnitSheetNameMap, IFormulaDependencyTree } from '@univerjs/engine-formula';
3
- import type { DynamicResolver, ICalcNodeRef, ICompressedSharedFormulaGroup } from '../engine/dependency-engine';
3
+ import type { DynamicResolver, ICalcNodeRef, ICompressedSharedFormulaGroup } from '../engine/dependency-engine/types';
4
4
  import { DependencyManagerBaseService } from '@univerjs/engine-formula';
5
5
  export declare class DependencyManagerProService extends DependencyManagerBaseService {
6
6
  private _dependencyEngineCache;
@@ -16,8 +16,13 @@ export declare class DependencyManagerProService extends DependencyManagerBaseSe
16
16
  clearFeatureFormulaDependency(unitId: string, sheetId?: string): void;
17
17
  getFeatureFormulaDependencyPro(unitId: string, sheetId: string, featureId: string): number | undefined;
18
18
  getFeatureFormulaDependencyNodePro(unitId: string, sheetId: string, featureId: string): ICalcNodeRef;
19
+ reserveFormulaDependencyCapacity(minNodeCapacity: number, minRangeCapacity?: number): void;
19
20
  addFormulaDependencyPro(unitId: string, sheetId: string, row: number, column: number, dependencyTree: IFormulaDependencyTree, featureNodes?: ICalcNodeRef[], mode?: 'replace' | 'merge'): number;
20
21
  addFormulaDependencyNodeOnlyPro(unitId: string, sheetId: string, row: number, column: number): number;
22
+ addFormulaDependencyNodeOnlyRangePro(unitId: string, sheetId: string, range: IUnitRange['range'], skip?: {
23
+ row: number;
24
+ col: number;
25
+ }): number[];
21
26
  registerCompressedSharedFormulaGroup(group: ICompressedSharedFormulaGroup): void;
22
27
  clearCompressedSharedFormulaGroups(unitId?: string, sheetId?: string): void;
23
28
  removeFormulaDependency(unitId: string, sheetId: string, row: number, column: number): void;
@@ -45,5 +50,5 @@ export declare class DependencyManagerProService extends DependencyManagerBaseSe
45
50
  prepareDynamicDependencies(resolver: DynamicResolver): boolean;
46
51
  getCalculationOrder(options?: {
47
52
  detectCycles?: boolean;
48
- }): import("../engine/dependency-engine").ICalculationOrderResult;
53
+ }): import("../engine/dependency-engine/types").ICalculationOrderResult;
49
54
  }
@@ -0,0 +1,10 @@
1
+ import type { IFormulaReferenceDataProvider, IFormulaReferenceDataRequest, IFormulaReferenceDataResponse } from './formula-reference-data.service';
2
+ import { ExternalReferenceModel } from '../models/external-reference.model';
3
+ export declare class ExternalCacheReferenceDataProvider implements IFormulaReferenceDataProvider {
4
+ private readonly _externalReferenceModel;
5
+ readonly id = "ooxml-external-cache";
6
+ readonly priority = -100;
7
+ constructor(_externalReferenceModel: ExternalReferenceModel);
8
+ canRead(request: IFormulaReferenceDataRequest): boolean;
9
+ readData(request: IFormulaReferenceDataRequest): Promise<IFormulaReferenceDataResponse | undefined>;
10
+ }
@@ -0,0 +1,18 @@
1
+ import type { IFormulaDatasetConfig } from '@univerjs/engine-formula';
2
+ import type { IFormulaReferenceDataRangeRequest, IFormulaReferenceDataRequest } from './formula-reference-data.service';
3
+ import { ExternalReferenceModel } from '../models/external-reference.model';
4
+ export declare class ExternalReferencePrefetchPlanner {
5
+ private readonly _externalReferenceModel;
6
+ private _calculationCounter;
7
+ private _requestCounter;
8
+ constructor(_externalReferenceModel: ExternalReferenceModel);
9
+ plan(config: IFormulaDatasetConfig): IFormulaReferenceDataRequest[];
10
+ planDynamic(hostUnitId: string, references: Array<{
11
+ unitId: string;
12
+ sheetName: string;
13
+ range: IFormulaReferenceDataRangeRequest['range'];
14
+ }>): IFormulaReferenceDataRequest[];
15
+ private _collectA1;
16
+ private _collectTables;
17
+ private _addRange;
18
+ }
@@ -0,0 +1,38 @@
1
+ import type { IUnitRange } from '@univerjs/core';
2
+ import type { IFormulaDatasetConfig } from '@univerjs/engine-formula';
3
+ import type { IFormulaReferenceDataRequest, IFormulaReferenceDataResponse } from './formula-reference-data.service';
4
+ import { Disposable } from '@univerjs/core';
5
+ import { FormulaDataModel } from '@univerjs/engine-formula';
6
+ import { ExternalReferenceOverlayModel } from '../models/external-reference-overlay.model';
7
+ import { IFormulaReferenceDataService } from './formula-reference-data.service';
8
+ export interface IExternalReferencePrefetchLimits {
9
+ maxCells: number;
10
+ maxBytes: number;
11
+ concurrency: number;
12
+ timeoutMs: number;
13
+ }
14
+ export interface IExternalReferencePrefetchResult {
15
+ responses: IFormulaReferenceDataResponse[];
16
+ dirtyRanges: Array<{
17
+ unitId: string;
18
+ sheetId: string;
19
+ range: NonNullable<IFormulaReferenceDataRequest['ranges'][number]['range']>;
20
+ }>;
21
+ discarded: number;
22
+ }
23
+ export declare class ExternalReferencePrefetchService extends Disposable {
24
+ private readonly _referenceDataService;
25
+ private readonly _overlayModel;
26
+ private readonly _formulaDataModel;
27
+ private readonly _inflight;
28
+ private readonly _latestCalculation;
29
+ constructor(_referenceDataService: IFormulaReferenceDataService, _overlayModel: ExternalReferenceOverlayModel, _formulaDataModel: FormulaDataModel);
30
+ prefetch(requests: IFormulaReferenceDataRequest[], config: IFormulaDatasetConfig, limits?: Partial<IExternalReferencePrefetchLimits>): Promise<IExternalReferencePrefetchResult>;
31
+ cancelHost(hostUnitId: string, nextCalculationId: string): void;
32
+ getInflightCount(): number;
33
+ drainDirtyRanges(): IUnitRange[];
34
+ dispose(): void;
35
+ private _hydrateLiveUnits;
36
+ private _hasWorkerLiveUnit;
37
+ private _readWithInflight;
38
+ }
@@ -0,0 +1,8 @@
1
+ import type { IFormulaUnitReferenceResolution, IFormulaUnitReferenceResolveInput } from '@univerjs/engine-formula';
2
+ import { ErrorType, FormulaUnitReferenceResolver, IFormulaCurrentConfigService } from '@univerjs/engine-formula';
3
+ import { ExternalReferenceModel } from '../models/external-reference.model';
4
+ export declare class ExternalFormulaUnitReferenceResolver extends FormulaUnitReferenceResolver {
5
+ private readonly _externalReferenceModel;
6
+ constructor(currentConfigService: IFormulaCurrentConfigService, _externalReferenceModel: ExternalReferenceModel);
7
+ resolve(input: IFormulaUnitReferenceResolveInput): IFormulaUnitReferenceResolution | ErrorType;
8
+ }
@@ -0,0 +1,71 @@
1
+ import type { ICellData, IDisposable, IRange } from '@univerjs/core';
2
+ import type { FormulaUnitType } from '@univerjs/engine-formula';
3
+ import { Disposable } from '@univerjs/core';
4
+ export type FormulaReferenceDataSource = 'worker-live' | 'main-live' | 'provider' | 'ooxml-cache' | 'unavailable';
5
+ export type FormulaReferenceDataFreshness = 'fresh' | 'stale' | 'unavailable';
6
+ export interface IFormulaReferenceDataRangeRequest {
7
+ sheetName?: string;
8
+ sheetId?: string;
9
+ tableName?: string;
10
+ range?: IRange;
11
+ }
12
+ export interface IFormulaReferenceDataRequest {
13
+ requestId: string;
14
+ calculationId: string;
15
+ hostUnitId: string;
16
+ bindingSlot: number;
17
+ syntheticUnitId: string;
18
+ target: {
19
+ name: string;
20
+ unitType: FormulaUnitType;
21
+ uri?: string;
22
+ liveUnitId?: string;
23
+ };
24
+ ranges: IFormulaReferenceDataRangeRequest[];
25
+ /** Defaults to true. Set false only when the caller explicitly accepts cached stale values. */
26
+ requireFresh?: boolean;
27
+ }
28
+ export interface IFormulaReferenceDataCell {
29
+ row: number;
30
+ column: number;
31
+ cell: ICellData;
32
+ }
33
+ export interface IFormulaReferenceDataSheet {
34
+ name: string;
35
+ sheetId: string;
36
+ rowCount: number;
37
+ columnCount: number;
38
+ coverage: IRange[];
39
+ cells: IFormulaReferenceDataCell[];
40
+ }
41
+ export interface IFormulaReferenceDataResponse {
42
+ requestId: string;
43
+ calculationId: string;
44
+ source: FormulaReferenceDataSource;
45
+ freshness: FormulaReferenceDataFreshness;
46
+ revision?: string;
47
+ sheets: IFormulaReferenceDataSheet[];
48
+ error?: '#N/A' | '#REF!' | '#CYCLE!';
49
+ }
50
+ export interface IFormulaReferenceDataService {
51
+ readData(request: IFormulaReferenceDataRequest): Promise<IFormulaReferenceDataResponse>;
52
+ }
53
+ export declare const IFormulaReferenceDataService: import("@wendellhu/redi").IdentifierDecorator<IFormulaReferenceDataService>;
54
+ export interface IFormulaReferenceDataProvider {
55
+ readonly id: string;
56
+ readonly priority?: number;
57
+ canRead(request: IFormulaReferenceDataRequest): boolean;
58
+ readData(request: IFormulaReferenceDataRequest): Promise<IFormulaReferenceDataResponse | undefined>;
59
+ }
60
+ export interface IFormulaReferenceDataProviderRegistry {
61
+ register(provider: IFormulaReferenceDataProvider): IDisposable;
62
+ getProviders(request: IFormulaReferenceDataRequest): IFormulaReferenceDataProvider[];
63
+ }
64
+ export declare const IFormulaReferenceDataProviderRegistry: import("@wendellhu/redi").IdentifierDecorator<IFormulaReferenceDataProviderRegistry>;
65
+ export declare class FormulaReferenceDataProviderRegistry extends Disposable implements IFormulaReferenceDataProviderRegistry {
66
+ private readonly _providers;
67
+ register(provider: IFormulaReferenceDataProvider): IDisposable;
68
+ getProviders(request: IFormulaReferenceDataRequest): IFormulaReferenceDataProvider[];
69
+ dispose(): void;
70
+ }
71
+ export declare function createUnavailableReferenceDataResponse(request: IFormulaReferenceDataRequest, error?: '#N/A' | '#REF!' | '#CYCLE!'): IFormulaReferenceDataResponse;
@@ -0,0 +1,12 @@
1
+ import type { IFormulaReferenceDataRequest, IFormulaReferenceDataResponse, IFormulaReferenceDataService } from './formula-reference-data.service';
2
+ import { FormulaDataModel, ISuperTableService } from '@univerjs/engine-formula';
3
+ import { IFormulaReferenceDataProviderRegistry } from './formula-reference-data.service';
4
+ export declare class MainFormulaReferenceDataService implements IFormulaReferenceDataService {
5
+ private readonly _formulaDataModel;
6
+ private readonly _superTableService;
7
+ private readonly _providerRegistry;
8
+ constructor(_formulaDataModel: FormulaDataModel, _superTableService: ISuperTableService, _providerRegistry: IFormulaReferenceDataProviderRegistry);
9
+ readData(request: IFormulaReferenceDataRequest): Promise<IFormulaReferenceDataResponse>;
10
+ private _readLiveSheets;
11
+ private _resolveLiveRange;
12
+ }
package/lib/umd/facade.js CHANGED
@@ -1 +1 @@
1
- function _0xae46(_0xc61b3b,_0x1ab20f){_0xc61b3b=_0xc61b3b-0x14b;var _0x6d171a=_0x6d17();var _0xae4607=_0x6d171a[_0xc61b3b];return _0xae4607;}(function(_0x5c68b1,_0x3aa87b){var _0x191e94=_0xae46,_0x201c42=_0x5c68b1();while(!![]){try{var _0x27ed55=-parseInt(_0x191e94(0x156))/0x1*(-parseInt(_0x191e94(0x14f))/0x2)+parseInt(_0x191e94(0x152))/0x3+parseInt(_0x191e94(0x15b))/0x4+-parseInt(_0x191e94(0x155))/0x5*(parseInt(_0x191e94(0x160))/0x6)+-parseInt(_0x191e94(0x15f))/0x7*(-parseInt(_0x191e94(0x14d))/0x8)+-parseInt(_0x191e94(0x153))/0x9*(-parseInt(_0x191e94(0x14b))/0xa)+-parseInt(_0x191e94(0x158))/0xb;if(_0x27ed55===_0x3aa87b)break;else _0x201c42['push'](_0x201c42['shift']());}catch(_0x278375){_0x201c42['push'](_0x201c42['shift']());}}}(_0x6d17,0x85e2f),function(_0x1b2c38,_0x3152c2){var _0x27aea4=_0xae46;typeof exports==_0x27aea4(0x154)&&typeof module<'u'?_0x3152c2(exports,require('@univerjs/engine-formula/facade')):typeof define==_0x27aea4(0x15a)&&define[_0x27aea4(0x14c)]?define([_0x27aea4(0x14e),_0x27aea4(0x157)],_0x3152c2):(_0x1b2c38=typeof globalThis<'u'?globalThis:_0x1b2c38||self,_0x3152c2(_0x1b2c38[_0x27aea4(0x159)]={},_0x1b2c38[_0x27aea4(0x151)]));}(this,function(_0x46a933,_0x1e51ca){var _0xd43bb1=_0xae46;Object[_0xd43bb1(0x15c)](_0x46a933,Symbol[_0xd43bb1(0x150)],{'value':_0xd43bb1(0x15d)}),Object[_0xd43bb1(0x15c)](_0x46a933,_0xd43bb1(0x15e),{'enumerable':!0x0,'get':function(){var _0x5662e6=_0xd43bb1;return _0x1e51ca[_0x5662e6(0x15e)];}});}));function _0x6d17(){var _0x22ea04=['561406zqfEYm','toStringTag','UniverEngineFormulaFacade','1173423eyILoy','16857qIpbGf','object','15scIOZG','2gNUvgy','@univerjs/engine-formula/facade','17198313BrgCsR','UniverProEngineFormulaFacade','function','3258360QDYMiE','defineProperty','Module','FFormula','4360748GqbHEx','1807602jcgDrf','3340yVmibu','amd','8DrQXMU','exports'];_0x6d17=function(){return _0x22ea04;};return _0x6d17();}
1
+ (function(_0x30d002,_0x1c7b8b){var _0x4a4ad8=_0x6e44,_0x296f80=_0x30d002();while(!![]){try{var _0xf5e00e=-parseInt(_0x4a4ad8(0x1e3))/0x1*(parseInt(_0x4a4ad8(0x1e5))/0x2)+-parseInt(_0x4a4ad8(0x1ea))/0x3+-parseInt(_0x4a4ad8(0x1e6))/0x4+-parseInt(_0x4a4ad8(0x1e7))/0x5+parseInt(_0x4a4ad8(0x1e1))/0x6+-parseInt(_0x4a4ad8(0x1e2))/0x7+parseInt(_0x4a4ad8(0x1ec))/0x8;if(_0xf5e00e===_0x1c7b8b)break;else _0x296f80['push'](_0x296f80['shift']());}catch(_0x10d9ff){_0x296f80['push'](_0x296f80['shift']());}}}(_0xd1dd,0xa8f2d),function(_0x27da3d,_0x5d4420){var _0x5f4928=_0x6e44;typeof exports=='object'&&typeof module<'u'?_0x5d4420(exports,require('@univerjs/engine-formula/facade')):typeof define=='function'&&define['amd']?define(['exports','@univerjs/engine-formula/facade'],_0x5d4420):(_0x27da3d=typeof globalThis<'u'?globalThis:_0x27da3d||self,_0x5d4420(_0x27da3d['UniverProEngineFormulaFacade']={},_0x27da3d[_0x5f4928(0x1e4)]));}(this,function(_0x1f2103,_0xebe3c1){var _0x8b67fa=_0x6e44;Object[_0x8b67fa(0x1e8)](_0x1f2103,Symbol[_0x8b67fa(0x1e0)],{'value':_0x8b67fa(0x1eb)}),Object[_0x8b67fa(0x1e8)](_0x1f2103,_0x8b67fa(0x1e9),{'enumerable':!0x0,'get':function(){var _0x3e5faa=_0x8b67fa;return _0xebe3c1[_0x3e5faa(0x1e9)];}});}));function _0x6e44(_0x55216e,_0x33ca1b){_0x55216e=_0x55216e-0x1e0;var _0xd1dd60=_0xd1dd();var _0x6e444a=_0xd1dd60[_0x55216e];return _0x6e444a;}function _0xd1dd(){var _0x540c1c=['8381198wJUsGM','69583ywNHdH','UniverEngineFormulaFacade','32iTFTTc','4135028dTVsVo','6286820LzVkIY','defineProperty','FFormula','2264994mAcQEQ','Module','37601096teeTQJ','toStringTag','8091822krKGqk'];_0xd1dd=function(){return _0x540c1c;};return _0xd1dd();}