Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(formula): subtotal count #2452

Open
wants to merge 9 commits into
base: dev
Choose a base branch
from
Next Next commit
fix(formula): subtotal count
  • Loading branch information
Dushusir committed Jun 17, 2024
commit 603643c894aaa0bb72a76654af1eb1e0a1f605ed
Original file line number Diff line number Diff line change
Expand Up @@ -275,12 +275,16 @@ describe('Test subtotal', () => {
expect(result).toBe(11.157);
});
it('Count, Var1 is array, var2 is array', async () => {
const result = await calculate('=SUBTOTAL(2,A1:B2,A3:F4)');
let result = await calculate('=SUBTOTAL(2,A1:B2,A3:F4)');
expect(result).toBe(10);
result = await calculate('=SUBTOTAL(2,B1:C1)');
expect(result).toBe(1);
});
it('Counta, Var1 is array, var2 is array', async () => {
const result = await calculate('=SUBTOTAL(3,A1:B2,A3:F4)');
let result = await calculate('=SUBTOTAL(3,A1:B2,A3:F4)');
expect(result).toBe(14);
result = await calculate('=SUBTOTAL(3,B1:C1)');
expect(result).toBe(2);
});
it('Max, Var1 is array, var2 is array', async () => {
const result = await calculate('=SUBTOTAL(4,A1:B2,A3:F4)');
Expand Down
24 changes: 20 additions & 4 deletions packages/engine-formula/src/functions/math/subtotal/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ export class Subtotal extends BaseFunction {
return this._handleSingleObject(functionNum as BaseValueObject, ...refs);
}

// eslint-disable-next-line max-lines-per-function, complexity
private _handleSingleObject(functionNum: Nullable<BaseValueObject>, ...refs: FunctionVariantType[]) {
const indexNum = this._getIndexNumValue(functionNum);
let result;
Expand Down Expand Up @@ -195,13 +196,28 @@ export class Subtotal extends BaseFunction {
}

private _count(ignoreHidden: boolean, ...refs: FunctionVariantType[]) {
const flattenArray = this._flattenRefArray(ignoreHidden, ...refs);
let accumulatorAll: BaseValueObject = NumberValueObject.create(0);
for (let i = 0; i < refs.length; i++) {
const variant = refs[i];

if (flattenArray.isError()) {
return flattenArray;
if (!variant.isReferenceObject()) {
return ErrorValueObject.create(ErrorType.VALUE);
}

const rowData = (variant as BaseReferenceObject).getRowData();

(variant as BaseReferenceObject).iterator((valueObject, rowIndex) => {
if (ignoreHidden && this._isRowHidden(rowData, rowIndex)) {
return true;
}

if (valueObject?.isNumber()) {
accumulatorAll = accumulatorAll.plusBy(1);
}
});
}

return flattenArray.count();
return accumulatorAll;
}

private _counta(ignoreHidden: boolean, ...refs: FunctionVariantType[]) {
Expand Down