globalstorage
Version:
Global Storage is a Global Distributed Data Warehouse
252 lines (210 loc) • 5.49 kB
JavaScript
'use strict'; // Get dataset row
// ds - <Object[]>
// Returns: <Array>
//
// Example: row([ { Id: 1, Name: 'Marcus' } ])
// Result: [1, 'Marcus']
var row = function row(ds) {
var result = [];
if (Array.isArray(ds) && ds.length > 0) {
var obj = ds[0];
for (var key in obj) {
result.push(obj[key]);
}
}
return result;
}; // Get dataset column
// ds - <Object[]>
// field - <string>, field name, optional
// Returns: <Array>
//
// Example: col([ { Id: 1 }, { Id: 2 }, { Id: 3 } ])
// Result: [1, 2, 3]
var col = function col(ds, field) {
var result = [];
if (Array.isArray(ds) && ds.length > 0) {
field = field || Object.keys(ds[0])[0];
result = ds.map(function (record) {
return record[field];
});
}
return result;
}; // Get dataset header
// ds - <Object[]>
// Returns: <string[]>
//
// Example: header([ { Id: 1, Name: 'Marcus' } ])
// Result: ['Id', 'Name']
var header = function header(ds) {
if (Array.isArray(ds) && ds.length > 0) {
var obj = ds[0];
return Object.keys(obj);
} else {
return [];
}
}; // Dataset projection
// meta - <string[]> | <Object>, projection metadata array of
// field names or object with structure:
// { toKey: [ fromKey, funcs ] }
// ds - <Object[]>
// Returns: <Object[]>
//
// Example: projection({ toKey: [ fromKey, funcs ] },
// [ { Id: 1, Name: 'Marcus' } ]);
//
// Example: projection(['Name'], [ { Id: 1, Name: 'Marcus' } ]);
//
// Result: [ { Name: 'Marcus' } ]
var projection = function projection(meta, ds) {
var complex = !Array.isArray(meta);
var fields = complex ? Object.keys(meta) : meta;
return ds.map(function (record) {
var row = {};
fields.forEach(function (key) {
if (complex) {
var data = meta[key];
var fromKey = data[0];
var value = record[fromKey];
if (value !== undefined) {
row[key] = data.slice(1).reduce(function (acc, fn) {
return fn(acc);
}, value);
}
} else {
var _value = record[key];
if (_value !== undefined) row[key] = record[key];
}
});
return row;
});
}; // Set union
// ds1 - <Object[]>
// ds2 - <Object[]>
// Returns: <Object[]>
//
// Example: union([ { Id: 1 }, { Id: 2 } ], [ { Id: 2 }, { Id: 3 } ]);
// Result: [ { Id: 1 }, { Id: 2 }, { Id: 3 } ]
var union = function union(ds1, ds2) {
var ds = [];
var ids = [];
var l1 = ds1.length;
var l2 = ds2.length;
for (var i = 0; i < l1; i++) {
var item = ds1[i];
ids.push(item.Id);
ds.push(item);
}
for (var _i = 0; _i < l2; _i++) {
var _item = ds2[_i];
if (!ids.includes(_item.Id)) {
ids.push(_item.Id);
ds.push(_item);
}
}
return ds;
}; // Set intersection
// ds1 - <Object[]>
// ds2 - <Object[]>
// Returns: <Object[]>
//
// Example: intersection([ { Id: 1 }, { Id: 2 } ], [ { Id: 2 }, { Id: 3 } ]);
// Result: [ { Id: 2 } ]
var intersection = function intersection(ds1, ds2) {
var ds = [];
var ids = [];
var l1 = ds1.length;
var l2 = ds2.length;
for (var i = 0; i < l1; i++) {
var item = ds1[i];
ids.push(item.Id);
}
for (var _i2 = 0; _i2 < l2; _i2++) {
var _item2 = ds2[_i2];
if (ids.includes(_item2.Id)) {
ds.push(_item2);
}
}
return ds;
}; // Set difference
// ds1 - <Object[]>
// ds2 - <Object[]>
// Returns: <Object[]>
//
// Example: difference([ { Id: 1 }, { Id: 2 } ], [ { Id: 2 }, { Id: 3 } ]);
// Result: [ { Id: 1 } ]
var difference = function difference(ds1, ds2) {
var ds = [];
var ids = [];
var l1 = ds1.length;
var l2 = ds2.length;
for (var i = 0; i < l2; i++) {
var item = ds2[i];
ids.push(item.Id);
}
for (var _i3 = 0; _i3 < l1; _i3++) {
var _item3 = ds1[_i3];
if (!ids.includes(_item3.Id)) {
ds.push(_item3);
}
}
return ds;
}; // Set complement
// ds1 - <Object[]>
// ds2 - <Object[]>
// Returns: <Object[]>
//
// Example: complement([ { Id: 1 }, { Id: 2 } ], [ { Id: 2 }, { Id: 3 } ]);
// Result: [ { Id: 3 } ]
var complement = function complement(ds1, ds2) {
return difference(ds2, ds1);
};
var compare = function compare(value, op, data) {
if (op === '=') return value === data;
if (op === '<') return value < data;
if (op === '>') return value > data;
if (op === '<=') return value <= data;
if (op === '>=') return value >= data;
return false;
};
var condition = function condition(def) {
if (typeof def !== 'string') {
return ['=', def];
}
var c0 = def[0];
var eq = c0 === '=';
var nt = c0 === '!';
if (eq || nt) return [c0, def.substr(1).trim()];
var c1 = def[1];
var et = c1 === '=';
var lt = c0 === '<';
var gt = c0 === '>';
if (lt || gt) {
if (et) return [c0 + c1, def.substr(2).trim()];else return [c0, def.substr(1).trim()];
}
return ['=', def];
};
var constraints = function constraints(defs) {
var prepare = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : condition;
var keys = Object.keys(defs);
var prepared = {};
var len = keys.length;
for (var i = 0; i < len; i++) {
var key = keys[i];
var def = defs[key];
prepared[key] = prepare(def);
}
return prepared;
};
module.exports = {
row: row,
col: col,
header: header,
projection: projection,
union: union,
intersection: intersection,
difference: difference,
complement: complement,
compare: compare,
condition: condition,
constraints: constraints
};