Skip to content
v3.3.0

LazilyTransformingAstService

Manages lazy application of formula AST transformations.

Structural operations (adding/removing rows/columns, moving cells, renaming sheets) require updating every formula that references the affected area. Applying these transformations eagerly to all formulas after every operation is expensive, especially for large spreadsheets with many formulas.

Instead of transforming all formulas immediately, this service stores transformations in a queue. Each formula vertex (FormulaVertex) and column index entry (ValueIndex) tracks its own version number. When a consumer needs up-to-date data, it calls applyTransformations() with its current version and receives all transformations accumulated since that version.

Over time, the transformations array grows unboundedly. To prevent this memory leak, the engine periodically triggers compaction when the number of accumulated transformations reaches the configurable maxPendingLazyTransformations:

  1. All FormulaVertex instances are forced to apply pending transformations (via DependencyGraph.forceApplyPostponedTransformations()).
  2. All ColumnIndex entries are forced to apply pending transformations (via ColumnSearchStrategy.forceApplyPostponedTransformations()).
  3. compact() is called, which advances versionOffset and clears the transformations array.
  4. UndoRedo.cleanupOrphanedOldData() removes any oldData entries that were written during forced application but belong to already-evicted undo entries.

The versionOffset ensures that version numbers remain globally consistent after compaction: version() = versionOffset + transformations.length.

+ new LazilyTransformingAstService(stats: Statistics, maxPendingLazyTransformations: number): LazilyTransformingAstService

Defined in src/LazilyTransformingAstService.ts:54

Parameters:

NameType
statsStatistics
maxPendingLazyTransformationsnumber

Returns: LazilyTransformingAstService

parser? : ParserWithCaching

Defined in src/LazilyTransformingAstService.ts:49


undoRedo? : UndoRedo

Defined in src/LazilyTransformingAstService.ts:50

addTransformation(transformation: FormulaTransformer): number

Defined in src/LazilyTransformingAstService.ts:66

Parameters:

NameType
transformationFormulaTransformer

Returns: number


applyTransformations(ast: Ast, address: SimpleCellAddress, version: number): [Ast, SimpleCellAddress, number]

Defined in src/LazilyTransformingAstService.ts:88

Parameters:

NameType
astAst
addressSimpleCellAddress
versionnumber

Returns: [Ast, SimpleCellAddress, number]


beginCombinedMode(sheet: number): void

Defined in src/LazilyTransformingAstService.ts:75

Parameters:

NameType
sheetnumber

Returns: void


commitCombinedMode(): number

Defined in src/LazilyTransformingAstService.ts:79

Returns: number


compact(): void

Defined in src/LazilyTransformingAstService.ts:135

Compacts the transformations array by discarding all entries that have already been applied by every consumer. Safe to call only after all FormulaVertex and ColumnIndex consumers have been brought up to the current version. After calling, UndoRedo.cleanupOrphanedOldData() must be invoked to remove oldData entries written during forceApplyPostponedTransformations for already-evicted undo entries.

Returns: void


getTransformationsFrom(version: number, filter?: undefined | function): IterableIterator‹FormulaTransformer›

Defined in src/LazilyTransformingAstService.ts:109

Parameters:

NameType
versionnumber
filter?undefined | function

Returns: IterableIterator‹FormulaTransformer›


needsCompaction(): boolean

Defined in src/LazilyTransformingAstService.ts:123

Returns true when enough transformations have accumulated to justify the cost of forcing all consumers (FormulaVertex, ColumnIndex) to apply pending changes.

Returns: boolean


version(): number

Defined in src/LazilyTransformingAstService.ts:62

Returns: number