vega-lite
Version:
Vega-Lite is a concise high-level language for interactive visualization.
64 lines (57 loc) • 2.56 kB
text/typescript
import {MarkInvalidDataMode} from '../../invalid.js';
import {DataSourceType} from '../../data.js';
import {normalizeInvalidDataMode} from './normalizeInvalidDataMode.js';
type PreOrPostFilteringInvalidValues = 'include-invalid-values' | 'exclude-invalid-values';
export interface DataSourcesForHandlingInvalidValues {
marks: PreOrPostFilteringInvalidValues;
scales: PreOrPostFilteringInvalidValues;
}
interface GetDataSourcesForHandlingInvalidValuesProps {
invalid: MarkInvalidDataMode | null | undefined;
isPath: boolean;
}
export function getDataSourcesForHandlingInvalidValues({
invalid,
isPath,
}: GetDataSourcesForHandlingInvalidValuesProps): DataSourcesForHandlingInvalidValues {
const normalizedInvalid = normalizeInvalidDataMode(invalid, {isPath});
switch (normalizedInvalid) {
case 'filter':
// Both marks and scales use post-filter data
return {
marks: 'exclude-invalid-values',
scales: 'exclude-invalid-values',
};
case 'break-paths-show-domains':
return {
// Path-based marks use pre-filter data so we know to skip these invalid points in the path.
// For non-path based marks, we skip by not showing them at all.
marks: isPath ? 'include-invalid-values' : 'exclude-invalid-values',
scales: 'include-invalid-values',
};
case 'break-paths-filter-domains':
// For path marks, the marks will use unfiltered data (and skip points). But we need a separate data sources to feed the domain.
// For non-path marks, we can use the filtered data for both marks and scales.
return {
marks: isPath ? 'include-invalid-values' : 'exclude-invalid-values',
// Unlike 'break-paths-show-domains', 'break-paths-filter-domains' uses post-filter data to feed scale.
scales: 'exclude-invalid-values',
};
case 'show':
return {
marks: 'include-invalid-values',
scales: 'include-invalid-values',
};
}
}
export function getScaleDataSourceForHandlingInvalidValues(
props: GetDataSourcesForHandlingInvalidValuesProps,
): DataSourceType {
const {marks, scales} = getDataSourcesForHandlingInvalidValues(props);
if (marks === scales) {
// If both marks and scales use the same data, there is only the main data source.
return DataSourceType.Main;
}
// If marks and scales use differetnt data, return the pre/post-filter data source accordingly.
return scales === 'include-invalid-values' ? DataSourceType.PreFilterInvalid : DataSourceType.PostFilterInvalid;
}