Skip to content

Commit

Permalink
fix(formula): subtotal count
Browse files Browse the repository at this point in the history
  • Loading branch information
Dushusir committed Jun 7, 2024
1 parent 3337e79 commit aa2dc54
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 6 deletions.
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

0 comments on commit aa2dc54

Please sign in to comment.