supergroup
Version:
Nested groups on arrays of objects where groups are Strings that know what you want them to know about themselves and their relatives.
411 lines (383 loc) • 22.9 kB
JavaScript
'use strict';
require('babel-polyfill');
var _assert = require('assert');
var _assert2 = _interopRequireDefault(_assert);
var _expect = require('expect.js');
var _expect2 = _interopRequireDefault(_expect);
var _supergroup = require('../supergroup');
var _supergroup2 = _interopRequireDefault(_supergroup);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var gradeBook = [{ lastName: "Gold", firstName: "Sigfried", class: "Remedial Programming", grade: "C", num: 2, empty: null }, { lastName: "Gold", firstName: "Sigfried", class: "Literary Posturing", grade: "B", num: 3, empty: '' }, { lastName: "Gold", firstName: "Sigfried", class: "Documenting with Pretty Colors", grade: "B", num: 3 }, { lastName: "Sassoon", firstName: "Sigfried", class: "Remedial Programming", grade: "A", num: 3, empty: NaN }, { lastName: "Androy", firstName: "Sigfried", class: "Remedial Programming", grade: "B", num: 3, empty: 0 }];
//var gradesByLastName = _.supergroup(gradeBook, 'lastName');
//import mocha from 'mocha';
//import vows from 'vows';
var gradesByLastName = _supergroup2.default.supergroup(gradeBook, 'lastName');
var gradesByName = _supergroup2.default.supergroup(gradeBook, function (d) {
return d.firstName + ' ' + d.lastName;
}, { dimName: 'fullName' });
var gradesByGradeLastName = _supergroup2.default.supergroup(gradeBook, ['grade', 'lastName']);
//console.log(gradesByLastName.rawValues());
var gradesByEmptyVals = _supergroup2.default.supergroup(gradeBook, 'empty');
describe('Supergroup', function () {
describe('#a Supergroup object', function () {
it("should be a Supergroup", function () {
_assert2.default.equal(gradesByGradeLastName instanceof _supergroup.Supergroup, true);
});
it("should still be a Supergroup after sorting", function () {
_assert2.default.equal(gradesByGradeLastName.sort() instanceof _supergroup.Supergroup, true);
});
it("should still be a Supergroup after mapping", function () {
_assert2.default.equal(gradesByGradeLastName.map(function (d) {
return d;
}) instanceof _supergroup.Supergroup, true);
});
it("should be a SGNodeList", function () {
_assert2.default.equal(gradesByGradeLastName instanceof _supergroup.SGNodeList, true);
});
it("should be an Array", function () {
_assert2.default.equal(gradesByGradeLastName instanceof Array, true);
});
it("should show as scalars with rawNodes call", function () {
_assert2.default.deepEqual(gradesByLastName.rawValues(), ["Gold", "Sassoon", "Androy"]);
//assert.deepEqual(gradesByLastName.rawNodes(), ["Gold","Sassoon","Androy"]);
});
it("should show as strings with toString call", function () {
_assert2.default.deepEqual(gradesByLastName.map(function (d) {
return d.toString();
}), ["Gold", "Sassoon", "Androy"]);
//assert.deepEqual(gradesByLastName.rawNodes(), ["Gold","Sassoon","Androy"]);
});
it("should show as strings with mapping to String", function () {
_assert2.default.deepEqual(gradesByLastName.map(String), ["Gold", "Sassoon", "Androy"]);
//assert.deepEqual(gradesByLastName.rawNodes(), ["Gold","Sassoon","Androy"]);
});
it("should show joined scalars in string context", function () {
_assert2.default.equal(gradesByLastName + '', "Gold,Sassoon,Androy");
});
it("should handle function dimensions", function () {
_assert2.default.deepEqual(gradesByName.rawValues(), ["Sigfried Gold", "Sigfried Sassoon", "Sigfried Androy"]);
//assert.deepEqual(gradesByName.rawNodes(), ["Sigfried Gold","Sigfried Sassoon","Sigfried Androy"]);
});
it("should should show top level of nested groups", function () {
//console.log('GRADE??', gradesByGradeLastName);
_assert2.default.deepEqual(gradesByGradeLastName.rawValues().sort(), ["A", "B", "C"]);
//assert.deepEqual(gradesByGradeLastName.rawNodes().sort(), ["A","B","C"]);
});
/*
describe('#a recsMap', function () {
/*
it("should be in a Node", function() {
assert.deepEqual(gradesByLastName.root.recsMap instanceof ArraySet, true);
});
* /
it("should hold all recs for a root Node", function() {
assert.deepEqual(gradesByLastName.root.records, gradeBook);
});
it("should hold correct records for a Node", function() {
assert.deepEqual(gradesByGradeLastName.lookup("A").records,
[gradeBook[3]]);
});
});
*/
it("should hold all recs for a root Node", function () {
_assert2.default.deepEqual(gradesByLastName.records, gradeBook);
//assert.deepEqual(gradesByLastName.root.records, gradeBook);
});
it('should have SGNodes for elements', function () {
//assert.equal(_.all(gradesByGradeLastName, d => d instanceof SGNode), true);
});
it('should have lookup', function () {
_assert2.default.equal(gradesByGradeLastName.lookup('B') instanceof _supergroup.SGNode, true);
});
it('should have children', function () {
_assert2.default.equal(gradesByGradeLastName.lookup('B').children.length, 2);
});
it("should have lookup paths", function () {
_assert2.default.equal(gradesByGradeLastName.lookup(['A', 'Sassoon']), gradesByGradeLastName.lookup('A').lookup('Sassoon'));
});
it('should lookup null', function () {
_assert2.default.equal(gradesByEmptyVals.lookup(null).records[0].grade, 'C');
});
it('should lookup empty string', function () {
_assert2.default.equal(gradesByEmptyVals.lookup('').records[0].grade, 'B');
});
it('should lookup undefined', function () {
_assert2.default.equal(gradesByEmptyVals.lookup(undefined).records[0].grade, 'B');
});
it('should lookup NaN', function () {
_assert2.default.equal(gradesByEmptyVals.lookup(NaN).records[0].grade, 'A');
});
it('should lookup 0', function () {
_assert2.default.equal(gradesByEmptyVals.lookup(0).records[0].grade, 'B');
});
it('should have leafNodes starting from level 1, testing one of them', function () {
_assert2.default.deepEqual(gradesByGradeLastName.leafNodes().sort()[0] + '', 'Androy');
});
it('should have leafNodes with namePaths()', function () {
_assert2.default.deepEqual(gradesByGradeLastName.leafNodes().namePaths().sort(), ['A/Sassoon', 'B/Androy', 'B/Gold', 'C/Gold']);
});
it('should sort to an SGNodeList', function () {
_assert2.default.equal(gradesByGradeLastName.leafNodes().sort() instanceof _supergroup.SGNodeList, true);
});
describe('#a Node object', function () {
it('should have lookup', function () {
_assert2.default.equal(gradesByGradeLastName[1].lookup('B').children + '', 'Gold,Androy');
});
it("should have a root with all recs", function () {
_assert2.default.deepEqual(gradesByLastName[0].root.records, gradeBook);
});
it('should have a referrence to all its records', function () {
_assert2.default.deepEqual(JSON.stringify(_supergroup2.default.sortBy(gradesByName.lookup('Sigfried Gold').records, function (d) {
return d.class;
})), JSON.stringify(_supergroup2.default.sortBy(gradeBook.slice(0, 3), function (d) {
return d.class;
}, function (d) {
return d.class;
})));
});
it('should assign records to the right groups', function () {
//console.log(gradesByLastName.lookup('Gold').records.plainArray());
_assert2.default.deepEqual(gradesByLastName.lookup('Gold').records, _supergroup2.default.where(gradeBook, { lastName: 'Gold' }));
});
it("should have a namePath", function () {
_assert2.default.equal('namePath' in gradesByGradeLastName[0].children[0], true);
});
it("should have a reasonable namePath", function () {
_assert2.default.equal(gradesByGradeLastName.sort()[0].children.sort()[0].namePath(), 'A/Sassoon');
});
it('should have leafNodes starting from level 1', function () {
_assert2.default.equal(gradesByGradeLastName.lookup('B').leafNodes() + '', 'Gold,Androy');
});
});
});
});
/*
describe('ArrayMap', function() {
let arrayMap = new ArrayMap([1,4,9,16,25,36,49,64,81], Math.sqrt);
describe('#an ArrayMap', function () {
it("should act like an array (sort of?)", function() {
assert.deepEqual(arrayMap.slice(0), [1,4,9,16,25,36,49,64,81]);
});
it("should have keys", function() {
assert.deepEqual(arrayMap.keys(), [1,2,3,4,5,6,7,8,9]);
});
});
});
describe('Supergroup FilterSet', function() {
let filts = gradesByGradeLastName.filterSet();
describe('#a Supergroup FilterSet object', function () {
it("should be a FilterSet", function() {
assert.equal(filts instanceof FilterSet, true);
});
it("should allow selection by value", function() {
filts.selectByNode(gradesByGradeLastName.lookup("A"));
assert.deepEqual(filts.selectedRecs(), [gradeBook[3]]);
});
});
});
*/
/*
*/
// really old stuff from https://github.com/Sigfried/supergroup/blob/f632d9623cb11ec7da090d5ab2b261bf934f65d4/supergroup_spec.js
/*
it('should sort to a List', function() {
expect(self.gradesByGradeLastName
.leafNodes()
.sort(function(a,b){
return a.namePath() < b.namePath() ? -1 :
b.namePath() < a.namePath() ? 1 : 0
})
.namePaths())
.toEqual( [ 'A/Sassoon', 'B/Androy', 'B/Gold', 'C/Gold' ]);
});
it('should sortBy to a List', function() {
expect(self.gradesByGradeLastName
.leafNodes()
.sortBy(function(d) { return d.namePath() })
.namePaths())
.toEqual([ 'A/Sassoon', 'B/Androy', 'B/Gold', 'C/Gold' ]);
});
it('should have previous', function() {
expect(self.gradesByGradeLastName
.sort()[2]
.previous()
.namePath())
.toEqual('B');
});
describe('asRootVal', function() {
// make new version of gradesByGradeLastName so asRootVal doesn't mess up other one
var gradesByGradeLastName = _.supergroup(gradeBook, ['grade','lastName']);
var root = gradesByGradeLastName.asRootVal();
it('should set its dimension as "root"', function() {
expect(root.dim).toBe('root');
});
it('should contain all the records', function() {
expect(root.aggregate(_.sum, 'num')).toBe(14);
});
it('should namePath to root', function() {
expect(gradesByGradeLastName.leafNodes().namePaths()).toEqual( [
'Root/C/Gold','Root/B/Gold','Root/B/Androy','Root/A/Sassoon'
]);
});
});
describe('hierarchicalTableToTree', function() {
var treePairs = [{"p":"animal","c":"mammal"},{"p":"animal","c":"reptile"},{"p":"animal","c":"fish"},{"p":"animal","c":"bird"},{"p":"bird","c":"kiwi"},{"p":"kiwi","c":"orange tailed kiwi"},{"p":"plant","c":"tree"},{"p":"plant","c":"bush"},{"p":"plant","c":"grass"},{"p":"plant","c":"fruit"},{"p":"fruit","c":"kiwi"},{"p":"kiwi","c":"purple kiwi"},{"p":"tree","c":"oak"},{"p":"tree","c":"maple"},{"p":"oak","c":"pin oak"},{"p":"mammal","c":"primate"},{"p":"mammal","c":"bovine"},{"p":"bovine","c":"cow"},{"p":"bovine","c":"ox"},{"p":"primate","c":"monkey"},{"p":"primate","c":"ape"},{"p":"ape","c":"chimpanzee"},{"p":"ape","c":"gorilla"},{"p":"ape","c":"me"}];
var tree;
it('should work with (data, parentProp, childProp) params', function() {
tree = _.hierarchicalTableToTree(treePairs, 'p', 'c');
expect(tree).toBeDefined();
});
it('should make this tree', function() {
var paths = _.invoke(tree.flattenTree(), 'namePath');
expect(paths).toEqual(["animal", "animal/mammal", "animal/mammal/primate", "animal/mammal/primate/monkey", "animal/mammal/primate/ape", "animal/mammal/primate/ape/chimpanzee", "animal/mammal/primate/ape/gorilla", "animal/mammal/primate/ape/me", "animal/mammal/bovine", "animal/mammal/bovine/cow", "animal/mammal/bovine/ox", "animal/reptile", "animal/fish", "animal/bird", "animal/bird/kiwi", "plant", "plant/tree", "plant/tree/oak", "plant/tree/oak/pin oak", "plant/tree/maple", "plant/bush", "plant/grass", "plant/fruit", "plant/fruit/kiwi", "plant/fruit/kiwi/orange tailed kiwi", "plant/fruit/kiwi/purple kiwi"]);
});
});
/*
suite.addBatch({
"supergroup general": {
topic: function(){ return null; },
"dimensions can be functions": function() {
assert.deepEqual(gradesByName.rawNodes(), ["Sigfried Gold","Sigfried Sassoon","Sigfried Androy"]);
},
"multi-level supergroups have top-level rawNodes": function() {
assert.deepEqual(gradesByGradeLastName.rawNodes().sort(), ["A","B","C"]);
},
"multi-level supergroups have children": function() {
assert.equal(gradesByGradeLastName[1]._hasChildren, true);
},
"multi-level supergroups have second-level rawNodes": function() {
assert.deepEqual(gradesByGradeLastName[1].children.rawNodes().sort(), ["Androy","Gold"]);
},
"multi-level supergroups have Node at second-level": function() {
assert.equal(gradesByGradeLastName[1].children[0] instanceof Node, true);
},
"first group contains three raw records": function() {
assert.deepEqual(gradesByLastName[0].records.slice(0), [
{"lastName":"Gold","firstName":"Sigfried","class":"Remedial Programming","grade":"C","num":2},
{"lastName":"Gold","firstName":"Sigfried","class":"Literary Posturing","grade":"B","num":3},
{"lastName":"Gold","firstName":"Sigfried","class":"Documenting with Pretty Colors","grade":"B","num":3}
]);
},
"lookup finds the right thing": function() {
assert.equal(gradesByLastName.lookup("Sassoon").records[0], gradeBook[3])
},
"two groups for 'B'": function() {
//console.log('lookup:', gradesByGradeLastName.lookup("B"));
assert.deepEqual(gradesByGradeLastName.lookup("B").children.rawNodes(), ["Gold","Androy"]);
},
"leafnodes on leaf returns NodeList": function() {
let leafNodes = gradesByGradeLastName[1].leafNodes();
assert.equal(leafNodes instanceof NodeList, true);
},
"leafnodes on leaf returns Node": function() {
let leafNodes = gradesByGradeLastName[1].children[0].leafNodes();
assert.equal(leafNodes.length , 1);
assert.equal(leafNodes[0] instanceof Node, true);
},
"leafnodes on Node returns Nodes": function() {
let leafNodes = gradesByGradeLastName[1].leafNodes();
assert.equal(leafNodes.length , 2);
assert.equal(leafNodes[0] instanceof Node, true);
},
"leafnodes on Supergroup returns NodeList": function() {
let leafNodes = gradesByGradeLastName.leafNodes();
assert.deepEqual(leafNodes.rawNodes(), ["Gold","Androy"]);
assert.equal(leafNodes.length, 4);
assert.equal(leafNodes instanceof NodeList, true);
},
"leafnodes on supergroup returns Nodes": function() {
let leafNode = gradesByGradeLastName.leafNodes()[0];
console.log(`leafNode is Node: ${leafNode instanceof Node}, its a ${leafNode.constructor}, leafNode: ${leafNode}`);
assert.equal(gradesByGradeLastName.leafNodes()[0] instanceof Node, true);
},
"leafnodes": function() {
assert.deepEqual(gradesByGradeLastName.leafNodes().namePaths(),
["C/Gold","B/Gold","B/Androy","A/Sassoon"]);
},
"sort": function() {
assert.deepEqual(gradesByGradeLastName.leafNodes().sort(function(a,b){
return a.namePath() < b.namePath() ? -1 :
b.namePath() < a.namePath() ? 1 : 0
}).namePaths(),
[ 'A/Sassoon', 'B/Androy', 'B/Gold', 'C/Gold' ]);
},
/*
"sortBy": function() {
assert.deepEqual(gradesByGradeLastName.leafNodes().sortBy(
function(d){ return d.namePath(); }).namePaths(),
[ 'A/Sassoon', 'B/Androy', 'B/Gold', 'C/Gold' ]);
},
"previous": function() {
assert.deepEqual(gradesByGradeLastName.sort()[2].previous().namePath(),
"B");
},
* /
},
*/
/*
"asRootVal": {
topic: function(){
// make new version of gradesByGradeLastName so asRootVal doesn't mess up other one
var gradesByGradeLastName = _.supergroup(gradeBook, ['grade','lastName']);
var root = gradesByGradeLastName.asRootVal();
return {gradesByGradeLastName:gradesByGradeLastName, root:root};
},
'should set its dimension as "root"': function(topic) {
assert.equal(topic.root.dim, 'root');
},
'should contain all the records': function(topic) {
assert.equal(topic.root.aggregate(_.sum, 'num'), 14);
},
'should namePath to root': function(topic) {
assert.deepEqual(topic.gradesByGradeLastName.leafNodes().namePaths(),
[ 'Root/C/Gold','Root/B/Gold','Root/B/Androy','Root/A/Sassoon' ]);
}
*/
/* haven't translated these yet
describe('hierarchicalTableToTree', function() {
var treePairs = [{"p":"animal","c":"mammal"},{"p":"animal","c":"reptile"},{"p":"animal","c":"fish"},{"p":"animal","c":"bird"},{"p":"bird","c":"kiwi"},{"p":"kiwi","c":"orange tailed kiwi"},{"p":"plant","c":"tree"},{"p":"plant","c":"bush"},{"p":"plant","c":"grass"},{"p":"plant","c":"fruit"},{"p":"fruit","c":"kiwi"},{"p":"kiwi","c":"purple kiwi"},{"p":"tree","c":"oak"},{"p":"tree","c":"maple"},{"p":"oak","c":"pin oak"},{"p":"mammal","c":"primate"},{"p":"mammal","c":"bovine"},{"p":"bovine","c":"cow"},{"p":"bovine","c":"ox"},{"p":"primate","c":"monkey"},{"p":"primate","c":"ape"},{"p":"ape","c":"chimpanzee"},{"p":"ape","c":"gorilla"},{"p":"ape","c":"me"}];
var tree;
it('should work with (data, parentProp, childProp) params', function() {
tree = _.hierarchicalTableToTree(treePairs, 'p', 'c');
expect(tree).toBeDefined();
});
it('should make this tree', function() {
var paths = _.invoke(tree.flattenTree(), 'namePath');
expect(paths).toEqual(["animal", "animal/mammal", "animal/mammal/primate", "animal/mammal/primate/monkey", "animal/mammal/primate/ape", "animal/mammal/primate/ape/chimpanzee", "animal/mammal/primate/ape/gorilla", "animal/mammal/primate/ape/me", "animal/mammal/bovine", "animal/mammal/bovine/cow", "animal/mammal/bovine/ox", "animal/reptile", "animal/fish", "animal/bird", "animal/bird/kiwi", "plant", "plant/tree", "plant/tree/oak", "plant/tree/oak/pin oak", "plant/tree/maple", "plant/bush", "plant/grass", "plant/fruit", "plant/fruit/kiwi", "plant/fruit/kiwi/orange tailed kiwi", "plant/fruit/kiwi/purple kiwi"]);
});
});
}
});
*/
//suite.run();
/*
var test_data = [
{"person_id": "0", "domain_id": "Condition", "concept_name": "Impacted cerumen", "drug_era_start_date": "2008-02-19", "drug_era_end_date": "2008-02-19"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Otogenic otalgia", "drug_era_start_date": "2008-02-19", "drug_era_end_date": "2008-02-19"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Acquired trigger finger", "drug_era_start_date": "2008-02-23", "drug_era_end_date": "2008-02-23"},
{"person_id": "0", "domain_id": "Drug", "concept_name": "Methylprednisolone", "drug_era_start_date": "2008-02-23", "drug_era_end_date": "2008-02-23"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Pes anserinus bursitis", "drug_era_start_date": "2008-02-23", "drug_era_end_date": "2008-02-23"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Benign essential hypertension", "drug_era_start_date": "2008-02-28", "drug_era_end_date": "2008-02-28"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Familial hyperchylomicronemia", "drug_era_start_date": "2008-02-28", "drug_era_end_date": "2008-02-28"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Hyperlipidemia", "drug_era_start_date": "2008-02-28", "drug_era_end_date": "2008-02-28"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Tachycardia", "drug_era_start_date": "2008-02-28", "drug_era_end_date": "2008-02-28"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Amblyopia", "drug_era_start_date": "2008-03-09", "drug_era_end_date": "2008-03-09"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Astigmatism", "drug_era_start_date": "2008-03-09", "drug_era_end_date": "2008-03-09"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Myopia", "drug_era_start_date": "2008-03-09", "drug_era_end_date": "2008-03-09"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Nonexudative age-related macular degeneration", "drug_era_start_date": "2008-03-09", "drug_era_end_date": "2008-03-09"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Malignant lymphoma of intra-abdominal lymph nodes", "drug_era_start_date": "2008-03-31", "drug_era_end_date": "2008-03-31"},
{"person_id": "0", "domain_id": "Drug", "concept_name": "pantoprazole", "drug_era_start_date": "2008-03-31", "drug_era_end_date": "2008-03-31"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Mobitz type II atrioventricular block", "drug_era_start_date": "2008-04-04", "drug_era_end_date": "2008-04-04"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Benign prostatic hypertrophy with outflow obstruction", "drug_era_start_date": "2008-04-24", "drug_era_end_date": "2008-04-24"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Chronic cystitis", "drug_era_start_date": "2008-04-24", "drug_era_end_date": "2008-04-24"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Chronic hepatitis C", "drug_era_start_date": "2008-04-24", "drug_era_end_date": "2008-04-24"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Acute pyelonephritis with medullary necrosis", "drug_era_start_date": "2008-05-08", "drug_era_end_date": "2008-05-08"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Urinary tract infectious disease", "drug_era_start_date": "2008-05-08", "drug_era_end_date": "2008-05-08"},
{"person_id": "0", "domain_id": "Condition", "concept_name": "Exudative age-related macular degeneration", "drug_era_start_date": "2008-05-20", "drug_era_end_date": "2008-05-20"},
{"person_id": "1494", "domain_id": "Condition", "concept_name": "Disorder of lipid metabolism", "drug_era_start_date": "2010-12-01", "drug_era_end_date": "2010-12-01"},
{"person_id": "1494", "domain_id": "Condition", "concept_name": "Open wound of foot except toes with complication", "drug_era_start_date": "2010-12-01", "drug_era_end_date": "2010-12-01"},
{"person_id": "1494", "domain_id": "Condition", "concept_name": "Peripheral vascular disease", "drug_era_start_date": "2010-12-01", "drug_era_end_date": "2010-12-01"}];
var domcon = _.supergroup(test_data, ['domain_id','concept_name']);
//var domcon = _.supergroup(person_eras, ['domain_id']);
console.log(domcon.rawNodes());
*/