in src/utils/filter-utils.js [462:513]
export function filterDataset(dataset, filters, layers, opt) {
const {allData, id: dataId, filterRecord: oldFilterRecord, fields} = dataset;
// if there is no filters
const filterRecord = getFilterRecord(dataId, filters, opt || {});
const newDataset = set(['filterRecord'], filterRecord, dataset);
if (!filters.length) {
return {
...newDataset,
gpuFilter: getGpuFilterProps(filters, dataId, fields),
filteredIndex: dataset.allIndexes,
filteredIndexForDomain: dataset.allIndexes
};
}
const changedFilters = diffFilters(filterRecord, oldFilterRecord);
// generate 2 sets of filter result
// filteredIndex used to calculate layer data
// filteredIndexForDomain used to calculate layer Domain
const shouldCalDomain = Boolean(changedFilters.dynamicDomain);
const shouldCalIndex = Boolean(changedFilters.cpu);
let filterResult = {};
if (shouldCalDomain || shouldCalIndex) {
const dynamicDomainFilters = shouldCalDomain ? filterRecord.dynamicDomain : null;
const cpuFilters = shouldCalIndex ? filterRecord.cpu : null;
const filterFuncs = filters.reduce((acc, filter) => {
const fieldIndex = getDatasetFieldIndexForFilter(dataset.id, filter);
const field = fieldIndex !== -1 ? fields[fieldIndex] : null;
return {
...acc,
[filter.id]: getFilterFunction(field, dataset.id, filter, layers)
};
}, {});
filterResult = filterDataByFilterTypes(
{dynamicDomainFilters, cpuFilters, filterFuncs},
allData
);
}
return {
...newDataset,
...filterResult,
gpuFilter: getGpuFilterProps(filters, dataId, fields)
};
}