Skip to content

Commit 76b995e

Browse files
committed
[params] Checking array equality
1 parent 8637c6c commit 76b995e

3 files changed

Lines changed: 89 additions & 2 deletions

File tree

src/common/array.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {size} from './other.ts';
1+
import {isArray, size} from './other.ts';
22
import {EMPTY_STRING} from './strings.ts';
33

44
export const arrayNew = <Value>(
@@ -18,6 +18,11 @@ export const arrayIsEqual = (array1: unknown[], array2: unknown[]): boolean =>
1818
size(array1) === size(array2) &&
1919
arrayEvery(array1, (value1, index) => array2[index] === value1);
2020

21+
export const arrayOrValueEqual = (value1: any, value2: any): boolean =>
22+
isArray(value1) && isArray(value2)
23+
? arrayIsEqual(value1, value2)
24+
: value1 === value2;
25+
2126
export const arrayIsSorted = <Value>(
2227
array: Value[],
2328
sorter: (value1: Value, value2: Value) => number,

src/queries/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import {
3434
arrayEvery,
3535
arrayForEach,
3636
arrayIsEmpty,
37+
arrayOrValueEqual,
3738
arrayPush,
3839
} from '../common/array.ts';
3940
import {getCellOrValueType, setOrDelCell} from '../common/cell.ts';
@@ -603,7 +604,7 @@ export const createQueries = getCreateFunction((store: Store): Queries => {
603604
oldParamValues,
604605
paramValues,
605606
(_, paramId, newValue) => {
606-
if (newValue !== mapGet(oldParamValues, paramId)) {
607+
if (!arrayOrValueEqual(newValue, mapGet(oldParamValues, paramId))) {
607608
mapSet(changedParamValues, paramId, newValue);
608609
}
609610
},

test/unit/core/other/queries.test.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5269,6 +5269,60 @@ describe('Parameterized', () => {
52695269
expect(listener).toHaveBeenCalledTimes(1);
52705270
});
52715271

5272+
test('addParamValuesListener ignores equal string[] params', () => {
5273+
store.setTable('t1', {r1: {c1: 'a'}, r2: {c1: 'b'}, r3: {c1: 'c'}});
5274+
queries.setQueryDefinition(
5275+
'q1',
5276+
't1',
5277+
({select, where, param}) => {
5278+
select('c1');
5279+
where((getTableCell) =>
5280+
(param('p1') as string[]).includes(getTableCell('c1') as string),
5281+
);
5282+
},
5283+
{p1: ['a', 'b']},
5284+
);
5285+
5286+
const listener = vi.fn();
5287+
queries.addParamValuesListener('q1', listener);
5288+
5289+
queries.setParamValues('q1', {p1: ['a', 'b']});
5290+
expect(listener).toHaveBeenCalledTimes(0);
5291+
5292+
queries.setParamValues('q1', {p1: ['a']});
5293+
expect(listener).toHaveBeenCalledTimes(1);
5294+
5295+
queries.setParamValues('q1', {p1: ['a']});
5296+
expect(listener).toHaveBeenCalledTimes(1);
5297+
});
5298+
5299+
test('addParamValuesListener ignores equal number[] params', () => {
5300+
store.setTable('t1', {r1: {c1: 1}, r2: {c1: 2}, r3: {c1: 3}});
5301+
queries.setQueryDefinition(
5302+
'q1',
5303+
't1',
5304+
({select, where, param}) => {
5305+
select('c1');
5306+
where((getTableCell) =>
5307+
(param('p1') as number[]).includes(getTableCell('c1') as number),
5308+
);
5309+
},
5310+
{p1: [1, 2]},
5311+
);
5312+
5313+
const listener = vi.fn();
5314+
queries.addParamValuesListener('q1', listener);
5315+
5316+
queries.setParamValues('q1', {p1: [1, 2]});
5317+
expect(listener).toHaveBeenCalledTimes(0);
5318+
5319+
queries.setParamValues('q1', {p1: [2, 3]});
5320+
expect(listener).toHaveBeenCalledTimes(1);
5321+
5322+
queries.setParamValues('q1', {p1: [2, 3]});
5323+
expect(listener).toHaveBeenCalledTimes(1);
5324+
});
5325+
52725326
test('addParamValueListener for specific query and param', () => {
52735327
store.setTable('t1', {
52745328
r1: {c1: 'a', c2: 'b', c3: 5},
@@ -5371,5 +5425,32 @@ describe('Parameterized', () => {
53715425
queries.setParamValue('q1', 'p1', 'd'); // Same value again
53725426
expect(listener).toHaveBeenCalledTimes(1);
53735427
});
5428+
5429+
test('addParamValueListener ignores equal boolean[] params', () => {
5430+
store.setTable('t1', {r1: {c1: true}, r2: {c1: false}});
5431+
queries.setQueryDefinition(
5432+
'q1',
5433+
't1',
5434+
({select, where, param}) => {
5435+
select('c1');
5436+
where((getTableCell) =>
5437+
(param('p1') as boolean[]).includes(getTableCell('c1') as boolean),
5438+
);
5439+
},
5440+
{p1: [true]},
5441+
);
5442+
5443+
const listener = vi.fn();
5444+
queries.addParamValueListener('q1', 'p1', listener);
5445+
5446+
queries.setParamValue('q1', 'p1', [true]);
5447+
expect(listener).toHaveBeenCalledTimes(0);
5448+
5449+
queries.setParamValue('q1', 'p1', [false]);
5450+
expect(listener).toHaveBeenCalledTimes(1);
5451+
5452+
queries.setParamValue('q1', 'p1', [false]);
5453+
expect(listener).toHaveBeenCalledTimes(1);
5454+
});
53745455
});
53755456
});

0 commit comments

Comments
 (0)