@univerjs/engine-formula 1.0.0-beta.0 → 1.0.0-beta.1

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.
@@ -220,6 +220,8 @@ export interface ISuperTable {
220
220
  * Sheet tables default to true; Base virtual tables store records from row 0.
221
221
  */
222
222
  showHeader?: boolean;
223
+ /** Whether the projected range contains a physical totals row. */
224
+ showFooter?: boolean;
223
225
  }
224
226
  export declare enum TableOptionType {
225
227
  ALL = "#All",
@@ -32,10 +32,10 @@ export declare const REFERENCE_REGEX_SINGLE_ROW = "^'?(\\[([^\\[\\]\\/?:\"<>|*\\
32
32
  export declare const REFERENCE_REGEX_SINGLE_ROW_PRECOMPILING: RegExp;
33
33
  export declare const REFERENCE_REGEX_SINGLE_COLUMN = "^'?(\\[([^\\[\\]\\/?:\"<>|*\\\\]+)\\])?(((?![\\[\\]\\/?*\\\\]).)*!)?'?\\s*?\\$?[A-Za-z]+$";
34
34
  export declare const REFERENCE_REGEX_SINGLE_COLUMN_PRECOMPILING: RegExp;
35
- export declare const REFERENCE_TABLE_ALL_COLUMN_REGEX = "^(?:(?:\\[([^\\[\\]\\/?:\"<>|*\\\\]+)\\]|'(?:[^']|'')+'|[^\\s!\\[\\]]+)!)?(?:\\[([^\\[\\]\\/?:\"<>|*\\\\]+)\\])?((?![~!@#$%^&*()+<>?:,./;\u2019\uFF0C\u3002\u3001\u2018\uFF1A\u201C\u300A\u300B\uFF1F~\uFF01@#\uFFE5%\u2026\u2026\uFF08\uFF09\u3010\u3011\\[\\]\\/\\\\]).)+$";
36
- export declare const REFERENCE_TABLE_SINGLE_COLUMN_REGEX = "^(?:(?:\\[([^\\[\\]\\/?:\"<>|*\\\\]+)\\]|'(?:[^']|'')+'|[^\\s!\\[\\]]+)!)?(?:\\[([^\\[\\]\\/?:\"<>|*\\\\]+)\\])?((?![~!@#$%^&*()+<>?:,./;\u2019\uFF0C\u3002\u3001\u2018\uFF1A\u201C\u300A\u300B\uFF1F~\uFF01@#\uFFE5%\u2026\u2026\uFF08\uFF09\u3010\u3011\\[\\]\\/\\\\]).)+(\\[[^#]*#?\\]|\\[\\[#.+\\]\\s*?,\\s*?\\[[^#]*#?\\]\\])+$";
37
- export declare const REFERENCE_TABLE_MULTIPLE_COLUMN_REGEX = "^(?:(?:\\[([^\\[\\]\\/?:\"<>|*\\\\]+)\\]|'(?:[^']|'')+'|[^\\s!\\[\\]]+)!)?(?:\\[([^\\[\\]\\/?:\"<>|*\\\\]+)\\])?((?![~!@#$%^&*()+<>?:,./;\u2019\uFF0C\u3002\u3001\u2018\uFF1A\u201C\u300A\u300B\uFF1F~\uFF01@#\uFFE5%\u2026\u2026\uFF08\uFF09\u3010\u3011\\[\\]\\/\\\\]).)+(\\[\\[[^#]*#?\\]\\s*?:\\s*?\\[[^#]*#?\\]\\])?$|^(?:(?:\\[([^\\[\\]\\/?:\"<>|*\\\\]+)\\]|'(?:[^']|'')+'|[^\\s!\\[\\]]+)!)?(?:\\[([^\\[\\]\\/?:\"<>|*\\\\]+)\\])?((?![~!@#$%^&*()+<>?:,./;\u2019\uFF0C\u3002\u3001\u2018\uFF1A\u201C\u300A\u300B\uFF1F~\uFF01@#\uFFE5%\u2026\u2026\uFF08\uFF09\u3010\u3011\\[\\]\\/\\\\]).)+(\\[\\[#.+\\]\\s*?,\\s*?\\[[^#]*#?\\]\\s*?:\\s*?\\[[^#]*#?\\]\\])?$";
38
- export declare const REFERENCE_TABLE_TITLE_ONLY_ANY_HASH_REGEX = "^(?:(?:\\[([^\\[\\]\\/?:\"<>|*\\\\]+)\\]|'(?:[^']|'')+'|[^\\s!\\[\\]]+)!)?(?:\\[([^\\[\\]\\/?:\"<>|*\\\\]+)\\])?((?![~!@#$%^&*()+<>?:,./;\u2019\uFF0C\u3002\u3001\u2018\uFF1A\u201C\u300A\u300B\uFF1F~\uFF01@#\uFFE5%\u2026\u2026\uFF08\uFF09\u3010\u3011\\[\\]\\/\\\\]).)+\\[\\s*#([^\\]]+)\\s*\\]$";
35
+ export declare const REFERENCE_TABLE_ALL_COLUMN_REGEX = "^(?:(?:\\[(?:[^\\]]|\\]\\])+\\]|'(?:[^']|'')+'|[^\\s!\\[\\]]+)!)?(?:\\[(?:[^\\]]|\\]\\])+\\])?((?![~!@#$%^&*()+<>?:,./;\u2019\uFF0C\u3002\u3001\u2018\uFF1A\u201C\u300A\u300B\uFF1F~\uFF01@#\uFFE5%\u2026\u2026\uFF08\uFF09\u3010\u3011\\[\\]\\/\\\\]).)+$";
36
+ export declare const REFERENCE_TABLE_SINGLE_COLUMN_REGEX = "^(?:(?:\\[(?:[^\\]]|\\]\\])+\\]|'(?:[^']|'')+'|[^\\s!\\[\\]]+)!)?(?:\\[(?:[^\\]]|\\]\\])+\\])?((?![~!@#$%^&*()+<>?:,./;\u2019\uFF0C\u3002\u3001\u2018\uFF1A\u201C\u300A\u300B\uFF1F~\uFF01@#\uFFE5%\u2026\u2026\uFF08\uFF09\u3010\u3011\\[\\]\\/\\\\]).)+(\\[[^#]*#?\\]|\\[\\[#.+\\]\\s*?,\\s*?\\[[^#]*#?\\]\\])+$";
37
+ export declare const REFERENCE_TABLE_MULTIPLE_COLUMN_REGEX = "^(?:(?:\\[(?:[^\\]]|\\]\\])+\\]|'(?:[^']|'')+'|[^\\s!\\[\\]]+)!)?(?:\\[(?:[^\\]]|\\]\\])+\\])?((?![~!@#$%^&*()+<>?:,./;\u2019\uFF0C\u3002\u3001\u2018\uFF1A\u201C\u300A\u300B\uFF1F~\uFF01@#\uFFE5%\u2026\u2026\uFF08\uFF09\u3010\u3011\\[\\]\\/\\\\]).)+(\\[\\[[^#]*#?\\]\\s*?:\\s*?\\[[^#]*#?\\]\\])?$|^(?:(?:\\[(?:[^\\]]|\\]\\])+\\]|'(?:[^']|'')+'|[^\\s!\\[\\]]+)!)?(?:\\[(?:[^\\]]|\\]\\])+\\])?((?![~!@#$%^&*()+<>?:,./;\u2019\uFF0C\u3002\u3001\u2018\uFF1A\u201C\u300A\u300B\uFF1F~\uFF01@#\uFFE5%\u2026\u2026\uFF08\uFF09\u3010\u3011\\[\\]\\/\\\\]).)+(\\[\\[#.+\\]\\s*?,\\s*?\\[[^#]*#?\\]\\s*?:\\s*?\\[[^#]*#?\\]\\])?$";
38
+ export declare const REFERENCE_TABLE_TITLE_ONLY_ANY_HASH_REGEX = "^(?:(?:\\[(?:[^\\]]|\\]\\])+\\]|'(?:[^']|'')+'|[^\\s!\\[\\]]+)!)?(?:\\[(?:[^\\]]|\\]\\])+\\])?((?![~!@#$%^&*()+<>?:,./;\u2019\uFF0C\u3002\u3001\u2018\uFF1A\u201C\u300A\u300B\uFF1F~\uFF01@#\uFFE5%\u2026\u2026\uFF08\uFF09\u3010\u3011\\[\\]\\/\\\\]).)+\\[\\s*#([^\\]]+)\\s*\\]$";
39
39
  export declare const REFERENCE_TABLE_ALL_COLUMN_REGEX_PRECOMPILING: RegExp;
40
40
  export declare const REFERENCE_TABLE_SINGLE_COLUMN_REGEX_PRECOMPILING: RegExp;
41
41
  export declare const REFERENCE_TABLE_MULTIPLE_COLUMN_REGEX_PRECOMPILING: RegExp;
@@ -15,7 +15,6 @@
15
15
  */
16
16
  import { Disposable, LifecycleService } from '@univerjs/core';
17
17
  import { FormulaCalculationTriggerService } from '../services/formula-calculation-trigger.service';
18
- import { RegisterOtherFormulaService } from '../services/register-other-formula.service';
19
18
  export declare class FormulaCalculationTriggerController extends Disposable {
20
- constructor(formulaCalculationTriggerService: FormulaCalculationTriggerService, registerOtherFormulaService: RegisterOtherFormulaService, lifecycleService: LifecycleService);
19
+ constructor(formulaCalculationTriggerService: FormulaCalculationTriggerService, lifecycleService: LifecycleService);
21
20
  }
@@ -17,7 +17,7 @@ import { Disposable, ICommandService, IConfigService } from '@univerjs/core';
17
17
  import { DataSyncPrimaryController } from '@univerjs/rpc';
18
18
  import { IFunctionService } from '../services/function.service';
19
19
  import { RegisterOtherFormulaService } from '../services/register-other-formula.service';
20
- type FormulaDataSyncController = Pick<DataSyncPrimaryController, 'registerSyncingMutations' | 'syncUnitMutations'>;
20
+ type FormulaDataSyncController = Pick<DataSyncPrimaryController, 'registerSyncingMutations' | 'syncUnitMutations' | 'waitForPendingMutations'>;
21
21
  export declare class FormulaController extends Disposable {
22
22
  private readonly _commandService;
23
23
  private readonly _functionService;
@@ -132,7 +132,7 @@ export declare class ArrayValueObject extends BaseValueObject {
132
132
  * the sequential matching approach is only used for special matches in XLOOKUP and XMATCH.
133
133
  * For example, when match_mode is set to 1 and -1 for an exact match. If not found, it returns the next smaller item.
134
134
  */
135
- orderSearch(valueObject: BaseValueObject, searchType?: ArrayOrderSearchType, isDesc?: boolean, isFuzzyMatching?: boolean): void | {
135
+ orderSearch(valueObject: BaseValueObject, searchType?: ArrayOrderSearchType, isDesc?: boolean, isFuzzyMatching?: boolean, keepFirstNearest?: boolean): void | {
136
136
  row: number;
137
137
  column: number;
138
138
  } | null;
@@ -167,11 +167,11 @@ export declare class BaseFunction {
167
167
  private _getOneLastByRaw;
168
168
  equalSearch(value: BaseValueObject, searchArray: ArrayValueObject, resultArray: ArrayValueObject, isFirst?: boolean): BaseValueObject;
169
169
  fuzzySearch(value: BaseValueObject, searchArray: ArrayValueObject, resultArray: ArrayValueObject, isFirst?: boolean): BaseValueObject;
170
- orderSearch(value: BaseValueObject, searchArray: ArrayValueObject, resultArray: ArrayValueObject, searchType?: ArrayOrderSearchType, isDesc?: boolean): BaseValueObject;
170
+ orderSearch(value: BaseValueObject, searchArray: ArrayValueObject, resultArray: ArrayValueObject, searchType?: ArrayOrderSearchType, isDesc?: boolean, keepFirstNearest?: boolean): BaseValueObject;
171
171
  binarySearchExpand(value: BaseValueObject, searchArray: ArrayValueObject, resultArray: ArrayValueObject, axis?: number, searchType?: ArrayBinarySearchType, matchType?: ArrayOrderSearchType): ErrorValueObject | ArrayValueObject | undefined;
172
172
  equalSearchExpand(value: BaseValueObject, searchArray: ArrayValueObject, resultArray: ArrayValueObject, isFirst?: boolean, axis?: number): ErrorValueObject | ArrayValueObject | undefined;
173
173
  fuzzySearchExpand(value: BaseValueObject, searchArray: ArrayValueObject, resultArray: ArrayValueObject, isFirst?: boolean, axis?: number): ErrorValueObject | ArrayValueObject | undefined;
174
- orderSearchExpand(value: BaseValueObject, searchArray: ArrayValueObject, resultArray: ArrayValueObject, searchType?: ArrayOrderSearchType, isDesc?: boolean, axis?: number): ErrorValueObject | ArrayValueObject | undefined;
174
+ orderSearchExpand(value: BaseValueObject, searchArray: ArrayValueObject, resultArray: ArrayValueObject, searchType?: ArrayOrderSearchType, isDesc?: boolean, axis?: number, keepFirstNearest?: boolean): ErrorValueObject | ArrayValueObject | undefined;
175
175
  flattenArray(variants: BaseValueObject[], ignoreLogicalValuesAndText?: boolean): ArrayValueObject | BaseValueObject;
176
176
  private _includingLogicalValuesAndText;
177
177
  createReferenceObject(reference: BaseReferenceObject, range: IRange): ErrorValueObject | BaseReferenceObject;
@@ -14,14 +14,13 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import type { BaseValueObject } from '../../../engine/value-object/base-value-object';
17
- import { ErrorValueObject } from '../../../engine/value-object/base-value-object';
18
- import { BaseFunction } from '../../base-function';
17
+ import { Sum } from '../../math/sum';
19
18
  /**
20
- * PERCENTOF is an Excel GROUPBY aggregator token. It is evaluated by GROUPBY's
21
- * AST path, not as a standalone scalar function.
19
+ * PERCENTOF is logically equivalent to SUM(dataSubset) / SUM(dataAll).
20
+ * GROUPBY also consumes the function name as an aggregator token through its AST path.
22
21
  */
23
- export declare class Percentof extends BaseFunction {
22
+ export declare class Percentof extends Sum {
24
23
  minParams: number;
25
24
  maxParams: number;
26
- calculate(..._variants: BaseValueObject[]): ErrorValueObject;
25
+ calculate(dataSubset: BaseValueObject, dataAll: BaseValueObject): BaseValueObject;
27
26
  }
@@ -23,6 +23,10 @@ export declare class Xlookup extends BaseFunction {
23
23
  private _legacyImplicitLookupValue;
24
24
  private _handleExpandObject;
25
25
  private _handleSingleObject;
26
+ private _exactSearch;
27
+ private _exactSearchExpand;
28
+ private _findExactPosition;
29
+ private _isExactMatch;
26
30
  private _blankResultAsZero;
27
31
  /**
28
32
  * Wildcard matching and binary search cannot appear at the same time
@@ -13,11 +13,10 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import type { IRange, Nullable } from '@univerjs/core';
16
+ import type { IDisposable, IRange, Nullable } from '@univerjs/core';
17
17
  import type { ISetFormulaCalculationResultMutation } from '../commands/mutations/set-formula-calculation.mutation';
18
18
  import type { IOtherFormulaResult } from './formula-common';
19
19
  import { Disposable, ICommandService, LifecycleService } from '@univerjs/core';
20
- import { BehaviorSubject } from 'rxjs';
21
20
  import { IActiveDirtyManagerService } from './active-dirty-manager.service';
22
21
  export declare enum OtherFormulaBizType {
23
22
  DEFAULT = "default",
@@ -33,6 +32,7 @@ export declare class RegisterOtherFormulaService extends Disposable {
33
32
  private _activeDirtyManagerService;
34
33
  private readonly _lifecycleService;
35
34
  private _formulaCacheMap;
35
+ private _mutationSyncHandler?;
36
36
  private _formulaChangeWithRange$;
37
37
  formulaChangeWithRange$: import("rxjs").Observable<{
38
38
  unitId: string;
@@ -45,12 +45,12 @@ export declare class RegisterOtherFormulaService extends Disposable {
45
45
  formulaResult$: import("rxjs").Observable<Record<string, Record<string, IOtherFormulaResult[]>>>;
46
46
  private _otherFormulaResultApplied$;
47
47
  otherFormulaResultApplied$: import("rxjs").Observable<ISetFormulaCalculationResultMutation>;
48
- calculateStarted$: BehaviorSubject<boolean>;
49
48
  constructor(_commandService: ICommandService, _activeDirtyManagerService: IActiveDirtyManagerService, _lifecycleService: LifecycleService);
50
49
  dispose(): void;
51
50
  private _ensureCacheMap;
52
51
  private _createFormulaId;
53
52
  private _initFormulaRegister;
53
+ setMutationSyncHandler(handler: (unitId: string) => () => Promise<void>): IDisposable;
54
54
  private _initFormulaCalculationResultChange;
55
55
  registerFormulaWithRange(unitId: string, subUnitId: string, formulaText: string, ranges?: IRange[], extra?: Record<string, any>, bizType?: OtherFormulaBizType, bizId?: string): string;
56
56
  getFormulaDirtyMap(unitId: string): Record<string, Record<string, boolean>>;
@@ -78,6 +78,7 @@ export interface IFormulaRuntimeService {
78
78
  reset(): void;
79
79
  setCurrent(row: number, column: number, rowCount: number, columnCount: number, sheetId: string, unitId: string): void;
80
80
  setFunctionRefInfoOverride(rowCount: number, columnCount: number): () => void;
81
+ hasFunctionRefInfoOverride(): boolean;
81
82
  registerFunctionDefinitionPrivacyVar(lambdaId: string, lambdaVar: Map<string, Nullable<BaseAstNode>>): void;
82
83
  getFunctionDefinitionPrivacyVar(lambdaId: string): Nullable<Map<string, Nullable<BaseAstNode>>>;
83
84
  setRuntimeData(functionVariant: FunctionVariantType): void;
@@ -187,6 +188,7 @@ export declare class FormulaRuntimeService extends Disposable implements IFormul
187
188
  clearReferenceAndNumberformatCache(): void;
188
189
  setCurrent(row: number, column: number, rowCount: number, columnCount: number, sheetId: string, unitId: string): void;
189
190
  setFunctionRefInfoOverride(rowCount: number, columnCount: number): () => void;
191
+ hasFunctionRefInfoOverride(): boolean;
190
192
  clearFunctionDefinitionPrivacyVar(): void;
191
193
  registerFunctionDefinitionPrivacyVar(lambdaId: string, lambdaVar: Map<string, Nullable<BaseAstNode>>): void;
192
194
  getFunctionDefinitionPrivacyVar(lambdaId: string): Nullable<Map<string, Nullable<BaseAstNode>>>;