in src/utils/filter-utils.js [417:452]
export function getFilterFunction(field, dataId, filter, layers) {
// field could be null in polygon filter
const valueAccessor = data => (field ? data[field.tableFieldIndex - 1] : null);
const defaultFunc = d => true;
switch (filter.type) {
case FILTER_TYPES.range:
return data => isInRange(valueAccessor(data), filter.value);
case FILTER_TYPES.multiSelect:
return data => filter.value.includes(valueAccessor(data));
case FILTER_TYPES.select:
return data => valueAccessor(data) === filter.value;
case FILTER_TYPES.timeRange:
if (!field) {
return defaultFunc;
}
const mappedValue = get(field, ['filterProps', 'mappedValue']);
const accessor = Array.isArray(mappedValue)
? (data, index) => mappedValue[index]
: data => timeToUnixMilli(valueAccessor(data), field.format);
return (data, index) => isInRange(accessor(data, index), filter.value);
case FILTER_TYPES.polygon:
if (!layers || !layers.length) {
return defaultFunc;
}
// @ts-ignore
const layerFilterFunctions = filter.layerId
.map(id => layers.find(l => l.id === id))
.filter(l => l && l.config.dataId === dataId)
.map(layer => getPolygonFilterFunctor(layer, filter));
return data => layerFilterFunctions.every(filterFunc => filterFunc(data));
default:
return defaultFunc;
}
}