diff --git a/src/compile/data/filterinvalid.ts b/src/compile/data/filterinvalid.ts index 5126ea8dd8..b94cc8e253 100644 --- a/src/compile/data/filterinvalid.ts +++ b/src/compile/data/filterinvalid.ts @@ -75,10 +75,9 @@ export class FilterInvalidNode extends DataFlowNode { if (fieldDef !== null) { if (fieldDef.type === 'temporal') { - vegaFilters.push(`(isDate(${ref}) || (isValid(${ref}) && isFinite(+${ref})))`); + vegaFilters.push(`(isDate(${ref}) || (${isValidFiniteNumberExpr(ref)})`); } else if (fieldDef.type === 'quantitative') { - vegaFilters.push(`isValid(${ref})`); - vegaFilters.push(`isFinite(+${ref})`); + vegaFilters.push(isValidFiniteNumberExpr(ref)); } else { // should never get here } @@ -94,3 +93,7 @@ export class FilterInvalidNode extends DataFlowNode { : null; } } + +export function isValidFiniteNumberExpr(ref: string) { + return `isValid(${ref}) && isFinite(+${ref})`; +} diff --git a/src/compile/data/stack.ts b/src/compile/data/stack.ts index 553bba2279..4bf33ba9c3 100644 --- a/src/compile/data/stack.ts +++ b/src/compile/data/stack.ts @@ -8,6 +8,7 @@ import {duplicate, getFirstDefined, hash} from '../../util'; import {sortParams} from '../common'; import {UnitModel} from '../unit'; import {DataFlowNode} from './dataflow'; +import {isValidFiniteNumberExpr} from './filterinvalid'; function getStackByFields(model: UnitModel): string[] { return model.stack.stackBy.reduce((fields, by) => { @@ -240,7 +241,7 @@ export class StackNode extends DataFlowNode { const binEnd = vgField(dimensionFieldDef, {expr: 'datum', binSuffix: 'end'}); transform.push({ type: 'formula', - expr: `${bandPosition}*${binStart}+${1 - bandPosition}*${binEnd}`, + expr: `${isValidFiniteNumberExpr(binStart)} ? ${bandPosition}*${binStart}+${1 - bandPosition}*${binEnd} : ${binStart}`, as: vgField(dimensionFieldDef, {binSuffix: 'mid', forAs: true}) }); } diff --git a/test/compile/data/stack.test.ts b/test/compile/data/stack.test.ts index 11d0d1f04e..e5f0a1f30d 100644 --- a/test/compile/data/stack.test.ts +++ b/test/compile/data/stack.test.ts @@ -202,7 +202,7 @@ describe('compile/data/stack', () => { expect(assemble(model)).toEqual([ { type: 'formula', - expr: '0.5*datum["bin_maxbins_10_b"]+0.5*datum["bin_maxbins_10_b_end"]', + expr: 'isValid(datum["bin_maxbins_10_b"]) && isFinite(+datum["bin_maxbins_10_b"]) ? 0.5*datum["bin_maxbins_10_b"]+0.5*datum["bin_maxbins_10_b_end"] : datum["bin_maxbins_10_b"]', as: 'bin_maxbins_10_b_mid' }, {