From 30c4d0197efd0805ed636fa3cc995249fe7c2a8e Mon Sep 17 00:00:00 2001 From: wpxp123456 Date: Fri, 18 Oct 2024 20:52:50 +0800 Subject: [PATCH] fix(formula): fix bug --- .../engine-formula/src/basics/database.ts | 24 ++++++++++++++ .../logical/if/__tests__/index.spec.ts | 33 ++++++++++--------- .../src/functions/logical/if/index.ts | 6 +--- 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/packages/engine-formula/src/basics/database.ts b/packages/engine-formula/src/basics/database.ts index c0e3696df6e..aba63ed65b4 100644 --- a/packages/engine-formula/src/basics/database.ts +++ b/packages/engine-formula/src/basics/database.ts @@ -25,6 +25,14 @@ type DatabaseValueType = string | number | null; export function checkDatabase(database: BaseValueObject) { const databaseValues: DatabaseValueType[][] = []; + if (database.isError()) { + return { + isError: true, + errorObject: database as ErrorValueObject, + databaseValues, + }; + } + const rowCount = database.isArray() ? (database as ArrayValueObject).getRowCount() : 1; const columnCount = database.isArray() ? (database as ArrayValueObject).getColumnCount() : 1; @@ -74,6 +82,14 @@ export function checkDatabase(database: BaseValueObject) { export function checkField(field: BaseValueObject, database: DatabaseValueType[][]) { let fieldIndex: number = -1; + if (field.isError()) { + return { + isError: true, + errorObject: field as ErrorValueObject, + fieldIndex, + }; + } + const rowCount = field.isArray() ? (field as ArrayValueObject).getRowCount() : 1; const columnCount = field.isArray() ? (field as ArrayValueObject).getColumnCount() : 1; @@ -135,6 +151,14 @@ export function checkField(field: BaseValueObject, database: DatabaseValueType[] export function checkCriteria(criteria: BaseValueObject) { const criteriaValues: DatabaseValueType[][] = []; + if (criteria.isError()) { + return { + isError: true, + errorObject: criteria as ErrorValueObject, + criteriaValues, + }; + } + const rowCount = criteria.isArray() ? (criteria as ArrayValueObject).getRowCount() : 1; const columnCount = criteria.isArray() ? (criteria as ArrayValueObject).getColumnCount() : 1; diff --git a/packages/engine-formula/src/functions/logical/if/__tests__/index.spec.ts b/packages/engine-formula/src/functions/logical/if/__tests__/index.spec.ts index 57aeba6cefc..a16be0793b1 100644 --- a/packages/engine-formula/src/functions/logical/if/__tests__/index.spec.ts +++ b/packages/engine-formula/src/functions/logical/if/__tests__/index.spec.ts @@ -16,10 +16,11 @@ import { describe, expect, it } from 'vitest'; +import { ArrayValueObject, transformToValueObject } from '../../../../engine/value-object/array-value-object'; +import { BooleanValueObject, NumberValueObject, StringValueObject } from '../../../../engine/value-object/primitive-object'; +import { getObjectValue } from '../../../__tests__/create-function-test-bed'; import { FUNCTION_NAMES_LOGICAL } from '../../function-names'; import { If } from '../index'; -import { ArrayValueObject, transformToValue, transformToValueObject } from '../../../../engine/value-object/array-value-object'; -import { BooleanValueObject, NumberValueObject, StringValueObject } from '../../../../engine/value-object/primitive-object'; describe('Test if function', () => { const testFunction = new If(FUNCTION_NAMES_LOGICAL.IF); @@ -29,7 +30,7 @@ describe('Test if function', () => { const logicTest = BooleanValueObject.create(true); const valueIfTrue = NumberValueObject.create(1); const result = testFunction.calculate(logicTest, valueIfTrue); - expect(result.getValue()).toBe(1); + expect(getObjectValue(result)).toBe(1); }); it('LogicalTest and valueIfTrue and valueIfFalse', () => { @@ -37,7 +38,7 @@ describe('Test if function', () => { const valueIfTrue = NumberValueObject.create(1); const valueIfFalse = NumberValueObject.create(2); const result = testFunction.calculate(logicTest, valueIfTrue, valueIfFalse); - expect(result.getValue()).toBe(2); + expect(getObjectValue(result)).toBe(2); }); it('LogicalTest is array', () => { @@ -56,7 +57,7 @@ describe('Test if function', () => { }); const valueIfTrue = NumberValueObject.create(1); const result = testFunction.calculate(logicTest, valueIfTrue); - expect(transformToValue(result.getArrayValue())).toStrictEqual([ + expect(getObjectValue(result)).toStrictEqual([ [false], [1], [1], @@ -79,7 +80,7 @@ describe('Test if function', () => { column: 0, }); const result = testFunction.calculate(logicTest, valueIfTrue); - expect(transformToValue(result.getArrayValue())).toStrictEqual([ + expect(getObjectValue(result)).toStrictEqual([ [1], [2], [3], @@ -101,7 +102,7 @@ describe('Test if function', () => { column: 0, }); const result = testFunction.calculate(logicTest, valueIfTrue); - expect(result.getValue()).toBe(false); + expect(getObjectValue(result)).toBe(false); }); it('ValueIfFalse is array', () => { @@ -121,7 +122,7 @@ describe('Test if function', () => { column: 0, }); const result = testFunction.calculate(logicTest, valueIfTrue, valueIfFalse); - expect(transformToValue(result.getArrayValue())).toStrictEqual([ + expect(getObjectValue(result)).toStrictEqual([ [1], [2], [3], @@ -159,7 +160,7 @@ describe('Test if function', () => { column: 0, }); const result = testFunction.calculate(logicTest, valueIfTrue); - expect(transformToValue(result.getArrayValue())).toStrictEqual([ + expect(getObjectValue(result)).toStrictEqual([ [1], [false], [3], @@ -200,7 +201,7 @@ describe('Test if function', () => { column: 0, }); const result = testFunction.calculate(logicTest, valueIfTrue, valueIfFalse); - expect(transformToValue(result.getArrayValue())).toStrictEqual([ + expect(getObjectValue(result)).toStrictEqual([ ['yes'], [2], ['yes'], @@ -242,7 +243,7 @@ describe('Test if function', () => { column: 0, }); const result = testFunction.calculate(logicTest, valueIfTrue, valueIfFalse); - expect(transformToValue(result.getArrayValue())).toStrictEqual([ + expect(getObjectValue(result)).toStrictEqual([ [1], [2], [3], @@ -299,7 +300,7 @@ describe('Test if function', () => { column: 0, }); const result = testFunction.calculate(logicTest, valueIfTrue, valueIfFalse); - expect(transformToValue(result.getArrayValue())).toStrictEqual([ + expect(getObjectValue(result)).toStrictEqual([ [1], [7], [3], @@ -347,7 +348,7 @@ describe('Test if function', () => { column: 0, }); const result = testFunction.calculate(logicTest, valueIfTrue, valueIfFalse); - expect(transformToValue(result.getArrayValue())).toStrictEqual([ + expect(getObjectValue(result)).toStrictEqual([ ['no1', 'yes2', '#N/A', '#N/A'], ['yes1', 'yes2', '#N/A', '#N/A'], ['no1', 'yes2', '#N/A', '#N/A'], @@ -397,7 +398,7 @@ describe('Test if function', () => { column: 0, }); const result = testFunction.calculate(logicTest, valueIfTrue, valueIfFalse); - expect(transformToValue(result.getArrayValue())).toStrictEqual([ + expect(getObjectValue(result)).toStrictEqual([ ['no1', 'no2', 'no3', '#N/A'], ['yes2', 'yes3', 'yes4', 'yes5'], ['#N/A', '#N/A', '#N/A', '#N/A'], @@ -447,7 +448,7 @@ describe('Test if function', () => { column: 0, }); const result = testFunction.calculate(logicTest, valueIfTrue, valueIfFalse); - expect(transformToValue(result.getArrayValue())).toStrictEqual([ + expect(getObjectValue(result)).toStrictEqual([ ['no1', 'yes2', '#N/A', '#N/A'], ['no2', 'yes3', '#N/A', '#N/A'], ['no3', 'yes4', '#N/A', '#N/A'], @@ -494,7 +495,7 @@ describe('Test if function', () => { column: 0, }); const result = testFunction.calculate(logicTest, valueIfTrue, valueIfFalse); - expect(transformToValue(result.getArrayValue())).toStrictEqual([ + expect(getObjectValue(result)).toStrictEqual([ ['no1', 'no2', 'no3', '#N/A'], ['yes1', 'yes2', 'yes3', 'yes4'], ['no1', 'no2', 'no3', '#N/A'], diff --git a/packages/engine-formula/src/functions/logical/if/index.ts b/packages/engine-formula/src/functions/logical/if/index.ts index 4acf14ef169..cc0d921cd1b 100644 --- a/packages/engine-formula/src/functions/logical/if/index.ts +++ b/packages/engine-formula/src/functions/logical/if/index.ts @@ -14,9 +14,9 @@ * limitations under the License. */ +import type { ArrayValueObject } from '../../../engine/value-object/array-value-object'; import { ErrorType } from '../../../basics/error-type'; import { expandArrayValueObject } from '../../../engine/utils/array-object'; -import type { ArrayValueObject } from '../../../engine/value-object/array-value-object'; import { type BaseValueObject, ErrorValueObject } from '../../../engine/value-object/base-value-object'; import { BooleanValueObject, NullValueObject } from '../../../engine/value-object/primitive-object'; import { BaseFunction } from '../../base-function'; @@ -31,10 +31,6 @@ export class If extends BaseFunction { return logicalTest; } - if (valueIfTrue.isError()) { - return valueIfTrue; - } - // get single value object const _logicalTest = this._getSingleValueObject(logicalTest);