CrossFilter Transform

The crossfilter transform maintains a filter mask for multiple dimensional queries, using a set of sorted indices. This transform can be used in conjunction with the resolvefilter transform to enable fast interactive querying over large data sets. This transform is inspired by the Crossfilter library developed by Mike Bostock and collaborators.

Transform Parameters

Property Type Description
fields Field[ ] Required. An array of data fields to filter. The same field may be included more than once to specify multiple queries.
queries Array[ ] Required. An array of per-field range queries. Each entry must resolve to a two-element number array, indicating the minimum (inclusive) and maximum (exclusive) values that should pass through the filter.
signal String If defined, binds the computed filter mask to a signal with the given name.

This transform writes to the property _index on each input data object. If other transforms overwrite this property, the resulting behavior is undefined.

Usage

This example cross-filters the delay, time, and distance fields in a data set of flights. The crossfilter transform sets up the filters, using range queries defined by signal values. The three derived data sets use resolvefilter transforms to filter the data, in each case ignoring one of the fields. For example, the "filterTimeDistance" data set filters the data by the time and distance queries, ignoring the delay query.

{
  "signals": [
    { "name": "delayRange", "value": [-60, 180] },
    { "name": "timeRange", "value": [0, 24] },
    { "name": "distanceRange", "value": [0, 2400] },
  ],
  "data": [
    {
      "name": "flights",
      "url": "data/flights-200k.json",
      "transform": [
        {
          "type": "crossfilter",
          "signal": "xfilter",
          "fields": ["delay", "time", "distance"],
          "query": [
            {"signal": "delayRange"},
            {"signal": "timeRange"},
            {"signal": "distanceRange"}
          ]
        }
      ]
    },
    {
      "name": "filterTimeDistance",
      "source": "flights",
      "transform": [
        {
          "type": "resolvefilter",
          "filter": {"signal": "xfilter"},
          "ignore": 1
        },
        ...
      ]
    },
    {
      "name": "filterDelayDistance",
      "source": "flights",
      "transform": [
        {
          "type": "resolvefilter",
          "filter": {"signal": "xfilter"},
          "ignore": 2
        },
        ...
      ]
    },
    {
      "name": "filterDelayTime",
      "source": "flights",
      "transform": [
        {
          "type": "resolvefilter",
          "filter": {"signal": "xfilter"},
          "ignore": 4
        },
        ...
      ]
    }
  ]
}