export function filterDataset()

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)
  };
}