UNPKG

1.44 kBJavaScriptView Raw
1import {Transform} from 'vega-dataflow';
2import {accessorName, inherits} from 'vega-util';
3
4/**
5 * Computes extents (min/max) for a data field.
6 * @constructor
7 * @param {object} params - The parameters for this operator.
8 * @param {function(object): *} params.field - The field over which to compute extends.
9 */
10export default function Extent(params) {
11 Transform.call(this, [undefined, undefined], params);
12}
13
14Extent.Definition = {
15 'type': 'Extent',
16 'metadata': {},
17 'params': [
18 { 'name': 'field', 'type': 'field', 'required': true }
19 ]
20};
21
22var prototype = inherits(Extent, Transform);
23
24prototype.transform = function(_, pulse) {
25 var extent = this.value,
26 field = _.field,
27 min = extent[0],
28 max = extent[1],
29 mod;
30
31 mod = pulse.changed()
32 || pulse.modified(field.fields)
33 || _.modified('field');
34
35 if (mod || min == null) {
36 min = +Infinity;
37 max = -Infinity;
38 }
39
40 pulse.visit(mod ? pulse.SOURCE : pulse.ADD, function(t) {
41 var v = field(t);
42 if (v != null) {
43 // coerce to number
44 v = +v;
45 // NaNs will fail all comparisons!
46 if (v < min) min = v;
47 if (v > max) max = v;
48 }
49 });
50
51 if (!Number.isFinite(min) || !Number.isFinite(max)) {
52 let name = accessorName(field);
53 if (name) name = ` for field "${name}"`;
54 pulse.dataflow.warn(`Infinite extent${name}: [${min}, ${max}]`);
55 min = max = undefined;
56 }
57 this.value = [min, max];
58};