Skip to content

Commit 85f3791

Browse files
committed
fix: generateDependencyTrees
1 parent f7423b7 commit 85f3791

File tree

4 files changed

+70
-39
lines changed

4 files changed

+70
-39
lines changed

packages/engine-formula/src/engine/dependency/formula-dependency.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ export interface IFormulaDependencyGenerator {
5858
generate(): Promise<IFormulaDependencyTree[]>;
5959
}
6060

61+
export type { IFormulaDependencyTree };
62+
6163
export const IFormulaDependencyGenerator = createIdentifier<IFormulaDependencyGenerator>('engine-formula.dependency-generator');
6264

6365
export class FormulaDependencyGenerator extends Disposable {

packages/engine-formula/src/services/calculate-formula.service.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ import type {
2323
IRuntimeUnitDataType,
2424
IUnitExcludedCell,
2525
} from '../basics/common';
26-
2726
import type { IUniverEngineFormulaConfig } from '../controller/config.schema';
27+
2828
import type { LexerNode } from '../engine/analysis/lexer-node';
29+
import type { IFormulaDependencyTree } from '../engine/dependency/formula-dependency';
2930
import type { FunctionVariantType } from '../engine/reference-object/base-reference-object';
3031
import type { IAllRuntimeData, IExecutionInProgressParams } from './runtime.service';
3132
import {
@@ -64,6 +65,7 @@ export interface ICalculateFormulaService {
6465
setRuntimeFeatureCellData(featureId: string, featureData: IRuntimeUnitDataType): void;
6566
setRuntimeFeatureRange(featureId: string, featureRange: IFeatureDirtyRangeType): void;
6667
execute(formulaDatasetConfig: IFormulaDatasetConfig): Promise<void>;
68+
generateDependencyTrees(formulaDatasetConfig: IFormulaDatasetConfig): Promise<IFormulaDependencyTree[]>;
6769
stopFormulaExecution(): void;
6870
calculate(formulaString: string, transformSuffix?: boolean): void;
6971
}
@@ -363,6 +365,37 @@ export class CalculateFormulaService extends Disposable implements ICalculateFor
363365
return this._runtimeService.getAllRuntimeData();
364366
}
365367

368+
async generateDependencyTrees(formulaDatasetConfig: IFormulaDatasetConfig): Promise<IFormulaDependencyTree[]> {
369+
this._currentConfigService.load(formulaDatasetConfig);
370+
371+
this._runtimeService.reset();
372+
373+
const normalTrees = await this._generateTrees(false);
374+
375+
const executeState = this._runtimeService.getAllRuntimeData();
376+
377+
const { dirtyRanges, excludedCell } = this._getArrayFormulaDirtyRangeAndExcludedRange(
378+
executeState.arrayFormulaRange,
379+
executeState.runtimeFeatureRange
380+
);
381+
382+
let arrayTrees: IFormulaDependencyTree[] = [];
383+
384+
if (dirtyRanges && dirtyRanges.length > 0) {
385+
this._currentConfigService.loadDirtyRangesAndExcludedCell(dirtyRanges, excludedCell);
386+
387+
arrayTrees = await this._generateTrees(true);
388+
}
389+
390+
return [...normalTrees, ...arrayTrees];
391+
}
392+
393+
private async _generateTrees(isArrayFormulaState: boolean): Promise<IFormulaDependencyTree[]> {
394+
const treeList = (await this._formulaDependencyGenerator.generate()).reverse();
395+
396+
return treeList;
397+
}
398+
366399
calculate(formulaString: string, transformSuffix: boolean = true) {
367400
// TODO how to observe @alex
368401
// this.getObserver('onBeforeFormulaCalculateObservable')?.notifyObservers(formulaString);

packages/engine-formula/src/services/current-data.service.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,6 @@ export interface IFormulaCurrentConfigService {
6565

6666
isForceCalculate(): boolean;
6767

68-
setForceCalculate(forceCalculate: boolean): void;
69-
7068
getDirtyRanges(): IUnitRange[];
7169

7270
getDirtyNameMap(): IDirtyUnitSheetNameMap;
@@ -224,10 +222,6 @@ export class FormulaCurrentConfigService extends Disposable implements IFormulaC
224222
return this._forceCalculate;
225223
}
226224

227-
setForceCalculate(forceCalculate: boolean) {
228-
this._forceCalculate = forceCalculate;
229-
}
230-
231225
getDirtyRanges() {
232226
return this._dirtyRanges;
233227
}

packages/sheets-formula/src/services/remote/remote-formula-dependency-generator.service.ts

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,8 @@
1515
*/
1616

1717
import type { IUnitRange } from '@univerjs/core';
18-
import type { FormulaCurrentConfigService } from '@univerjs/engine-formula';
19-
import { createIdentifier, isFormulaId, isFormulaString } from '@univerjs/core';
20-
import { IFormulaCurrentConfigService, IFormulaDependencyGenerator } from '@univerjs/engine-formula';
18+
import { createIdentifier, Inject, isFormulaId, isFormulaString } from '@univerjs/core';
19+
import { FormulaDataModel, ICalculateFormulaService, IFormulaCurrentConfigService } from '@univerjs/engine-formula';
2120

2221
export interface IFormulaCellAndFeatureItem {
2322
unitId: string;
@@ -41,43 +40,46 @@ export const IRemoteFormulaDependencyGenerator = createIdentifier<IRemoteFormula
4140
*/
4241
export class RemoteFormulaDependencyGeneratorService implements IRemoteFormulaDependencyGenerator {
4342
constructor(
44-
@IFormulaDependencyGenerator private readonly _dependencyGenerator: IFormulaDependencyGenerator,
43+
@ICalculateFormulaService private readonly _calculateFormulaService: ICalculateFormulaService,
44+
@Inject(FormulaDataModel) private readonly _formulaDataModel: FormulaDataModel,
4545
@IFormulaCurrentConfigService private readonly _currentConfigService: IFormulaCurrentConfigService
4646
) {}
4747

4848
async generate(range?: IUnitRange): Promise<Array<IFormulaCellAndFeatureItem>> {
49-
const configService = this._currentConfigService as FormulaCurrentConfigService;
50-
const originalForceCalculate = configService.isForceCalculate();
51-
configService.setForceCalculate(true);
52-
const trees = await this._dependencyGenerator.generate();
53-
configService.setForceCalculate(originalForceCalculate);
49+
const formulaData = this._formulaDataModel.getFormulaData();
50+
const arrayFormulaCellData = this._formulaDataModel.getArrayFormulaCellData();
51+
const arrayFormulaRange = this._formulaDataModel.getArrayFormulaRange();
52+
53+
const formulaDatasetConfig = {
54+
formulaData,
55+
arrayFormulaCellData,
56+
arrayFormulaRange,
57+
forceCalculate: false,
58+
dirtyRanges: range ? [range] : [],
59+
dirtyNameMap: {},
60+
dirtyDefinedNameMap: {},
61+
dirtyUnitFeatureMap: {},
62+
dirtyUnitOtherFormulaMap: {},
63+
clearDependencyTreeCache: {},
64+
maxIteration: 1,
65+
rowData: undefined,
66+
};
67+
68+
const trees = await this._calculateFormulaService.generateDependencyTrees(formulaDatasetConfig);
69+
5470
const result: Array<IFormulaCellAndFeatureItem> = [];
5571
for (let i = 0; i < trees.length; i++) {
5672
const tree = trees[i];
5773
if ((isFormulaString(tree.formula) || isFormulaId(tree.formulaId)) || tree.featureId != null) {
58-
let include = true;
59-
if (range) {
60-
if (tree.unitId !== range.unitId || tree.subUnitId !== range.sheetId) {
61-
include = false;
62-
} else if (tree.row != null && tree.column != null) {
63-
const r = range.range;
64-
if (tree.row < r.startRow || tree.row > r.endRow || tree.column < r.startColumn || tree.column > r.endColumn) {
65-
include = false;
66-
}
67-
}
68-
// For features without row/column, include if unitId and subUnitId match
69-
}
70-
if (include) {
71-
result.push({
72-
unitId: tree.unitId,
73-
subUnitId: tree.subUnitId,
74-
row: tree.row,
75-
column: tree.column,
76-
featureId: tree.featureId || undefined,
77-
formula: tree.formula || undefined,
78-
formulaId: tree.formulaId || undefined,
79-
});
80-
}
74+
result.push({
75+
unitId: tree.unitId,
76+
subUnitId: tree.subUnitId,
77+
row: tree.row,
78+
column: tree.column,
79+
featureId: tree.featureId || undefined,
80+
formula: tree.formula || undefined,
81+
formulaId: tree.formulaId || undefined,
82+
});
8183
}
8284
}
8385
return result;

0 commit comments

Comments
 (0)