Skip to content

Commit 4d8cf8b

Browse files
committed
test: try strict comparison for field def comparisons
1 parent 3778e09 commit 4d8cf8b

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

src/channeldef.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,29 @@ export function vgField(
867867
}
868868
}
869869

870+
/**
871+
* Return true if fieldDefs are equal in field name and all "fn" opt.nofn related properties
872+
* Different from checking for full field def equivalence, since some (like axis) don't matter for positioning purposes.
873+
*/
874+
export function areFieldDefsWithInlineTransformsEquivalent(
875+
fieldDef1: FieldDef<string> | WindowFieldDef | AggregatedFieldDef,
876+
fieldDef2: FieldDef<string> | WindowFieldDef | AggregatedFieldDef
877+
) {
878+
if (isOpFieldDef(fieldDef1) || isOpFieldDef(fieldDef2)) {
879+
return isOpFieldDef(fieldDef1) && isOpFieldDef(fieldDef2) && fieldDef1.op === fieldDef2.op;
880+
}
881+
882+
const {field: field1, aggregate: aggregate1, bin: bin1, timeUnit: timeUnit1} = fieldDef1;
883+
const {field: field2, aggregate: aggregate2, bin: bin2, timeUnit: timeUnit2} = fieldDef2;
884+
885+
return (
886+
field1 === field2 &&
887+
JSON.stringify(aggregate1) === JSON.stringify(aggregate2) &&
888+
JSON.stringify(bin1) === JSON.stringify(bin2) &&
889+
timeUnit1 === timeUnit2
890+
);
891+
}
892+
870893
export function isDiscrete(def: TypedFieldDef<Field> | DatumDef<any, any>) {
871894
switch (def.type) {
872895
case 'nominal':

src/stack.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
PositionFieldDef,
1818
TypedFieldDef,
1919
vgField,
20+
areFieldDefsWithInlineTransformsEquivalent,
2021
} from './channeldef.js';
2122
import {CompositeAggregate} from './compositemark/index.js';
2223
import {channelHasField, Encoding, isAggregate} from './encoding.js';
@@ -181,13 +182,15 @@ export function stack(m: Mark | MarkDef, encoding: Encoding<string>): StackPrope
181182
if (encoding[dimensionChannel]) {
182183
const dimensionDef = encoding[dimensionChannel];
183184
const dimensionField = isFieldDef(dimensionDef) ? vgField(dimensionDef, {}) : undefined;
184-
const hasSameDimensionAndStackedField = dimensionField && dimensionField === stackedField;
185+
// const hasSameDimensionAndStackedField = dimensionField && dimensionField === stackedField;
186+
const areDefsEquivalent =
187+
isFieldDef(dimensionDef) && areFieldDefsWithInlineTransformsEquivalent(dimensionDef, stackedFieldDef);
185188

186189
// For polar coordinates, do not set a groupBy when working with quantitative fields.
187190
// const isPolar = isPolarPositionChannel(fieldChannel) || isPolarPositionChannel(dimensionChannel);
188191
// const shouldAddPolarGroupBy = !isUnbinnedQuantitative(dimensionDef);
189192

190-
if (!hasSameDimensionAndStackedField) {
193+
if (!areDefsEquivalent) {
191194
// if (isPolar ? shouldAddPolarGroupBy : !hasSameDimensionAndStackedField) {
192195
// avoid grouping by the stacked field
193196
groupbyChannels.push(dimensionChannel);

0 commit comments

Comments
 (0)