// utility for enc
'use strict';
var consts = require('./consts'),
c = consts.shorthand,
vlEncDef = require('./encdef'),
util = require('./util'),
schema = require('./schema/schema'),
encTypes = schema.encTypes;
var vlenc = module.exports = {};
vlenc.countRetinal = function(enc) {
var count = 0;
if (enc.color) count++;
if (enc.size) count++;
if (enc.shape) count++;
return count;
};
vlenc.has = function(enc, encType) {
var fieldDef = enc && enc[encType];
return fieldDef && fieldDef.name;
};
vlenc.isAggregate = function(enc) {
for (var k in enc) {
if (vlenc.has(enc, k) && enc[k].aggregate) {
return true;
}
}
return false;
};
vlenc.forEach = function(enc, f) {
var i = 0;
encTypes.forEach(function(k) {
if (vlenc.has(enc, k)) {
f(enc[k], k, i++);
}
});
};
vlenc.map = function(enc, f) {
var arr = [];
encTypes.forEach(function(k) {
if (vlenc.has(enc, k)) {
arr.push(f(enc[k], k, enc));
}
});
return arr;
};
vlenc.reduce = function(enc, f, init) {
var r = init;
encTypes.forEach(function(k) {
if (vlenc.has(enc, k)) {
r = f(r, enc[k], k, enc);
}
});
return r;
};
/*
* return key-value pairs of field name and list of fields of that field name
*/
vlenc.fields = function(enc) {
return vlenc.reduce(enc, function (m, field) {
var fieldList = m[field.name] = m[field.name] || [],
containsType = fieldList.containsType = fieldList.containsType || {};
Eif (fieldList.indexOf(field) === -1) {
fieldList.push(field);
// augment the array with containsType.Q / O / N / T
containsType[field.type] = true;
}
return m;
}, {});
};
vlenc.shorthand = function(enc) {
return vlenc.map(enc, function(field, et) {
return et + c.assign + vlEncDef.shorthand(field);
}).join(c.delim);
};
vlenc.fromShorthand = function(shorthand) {
var enc = util.isArray(shorthand) ? shorthand : shorthand.split(c.delim);
return enc.reduce(function(m, e) {
var split = e.split(c.assign),
enctype = split[0].trim(),
field = split[1];
m[enctype] = vlEncDef.fromShorthand(field);
return m;
}, {});
};
|