'use strict';
require('../globals');
var marks = require('./marks');
module.exports = stacking;
function stacking(data, encoding, mdef, facets) {
Iif (!marks[encoding.marktype()].stack) return false;
// TODO: add || encoding.has(LOD) here once LOD is implemented
Iif (!encoding.has(COLOR)) return false;
var dim=null, val=null, idx =null,
isXMeasure = encoding.isMeasure(X),
isYMeasure = encoding.isMeasure(Y);
if (isXMeasure && !isYMeasure) {
dim = Y;
val = X;
idx = 0;
} else Eif (isYMeasure && !isXMeasure) {
dim = X;
val = Y;
idx = 1;
} else {
return null; // no stack encoding
}
// add transform to compute sums for scale
var stacked = {
name: STACKED,
source: TABLE,
transform: [{
type: 'aggregate',
groupby: [encoding.field(dim)].concat(facets), // dim and other facets
fields: [{op: 'sum', field: encoding.field(val)}] // TODO check if field with aggregate is correct?
}]
};
Iif (facets && facets.length > 0) {
stacked.transform.push({ //calculate max for each facet
type: 'aggregate',
groupby: facets,
fields: [{
op: 'max',
field: encoding.fieldName(val, {fn: 'sum'})
}]
});
}
data.push(stacked);
// add stack transform to mark
mdef.from.transform = [{
type: 'stack',
point: encoding.field(dim),
height: encoding.field(val),
output: {y1: val, y0: val + '2'}
}];
// TODO: This is super hack-ish -- consolidate into modular mark properties?
mdef.properties.update[val] = mdef.properties.enter[val] = {scale: val, field: val};
mdef.properties.update[val + '2'] = mdef.properties.enter[val + '2'] = {scale: val, field: val + '2'};
return val; //return stack encoding
}
|