Skip to content

Commit 57c277c

Browse files
author
Nicholas Thomson
committed
Merge pull request #55 from cloudspace/64907244_link_objects_to_categories
64907244 link objects to categories
2 parents cb76ac4 + 1c6876a commit 57c277c

File tree

4 files changed

+155
-36
lines changed

4 files changed

+155
-36
lines changed

app/scripts/controllers/crunchinator.js

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,23 @@ angular.module('crunchinatorApp.controllers')
4343

4444
//Fetch the data for each model, then set up its dimensions and run its filters.
4545
var modelCount = 0;
46-
_.each([Company, Category], function(Model){
46+
var models = [Company, Category, Investor];
47+
_.each(models, function(Model) {
4748
Model.fetch().then(function() {
4849
modelCount++;
49-
Model.setupDimensions();
50-
Model.runFilters(filterData);
51-
if(modelCount === 2) {
50+
if(modelCount === 3) {
5251
var companiesById = _.indexBy(Company.all, 'id');
5352
var categoriesById = _.indexBy(Category.all, 'id');
54-
Investor.fetch().then(function(){
55-
Investor.linkModels(companiesById, categoriesById);
56-
Investor.setupDimensions();
57-
Investor.runFilters(filterData);
58-
$scope.loading = false;
53+
var investorsById = _.indexBy(Investor.all, 'id');
54+
55+
Investor.linkModels(companiesById, categoriesById);
56+
Category.linkModels(companiesById, investorsById);
57+
58+
_.each(models, function(Model) {
59+
Model.setupDimensions();
60+
Model.runFilters(filterData);
5961
});
62+
$scope.loading = false;
6063
}
6164
});
6265
});

app/scripts/services/category.js

Lines changed: 108 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,31 @@ angular.module('crunchinatorApp.models').service('Category', function(Model, API
2525
return response.categories;
2626
};
2727

28+
/**
29+
* This links companies and investors to the category object so that when filtering
30+
* by categories we have access to the companies and investors it contains
31+
*
32+
* @param {object} companiesById An object/hash of all companies keyed by their IDs
33+
* @param {object} investorsById An object/hash of all categories keyed by their IDs
34+
*/
35+
Category.prototype.linkModels = function(companiesById, investorsById) {
36+
_.each(this.all, function(category){
37+
category.companies = [];
38+
category.investors = [];
39+
40+
_.each(category.company_ids, function(companyId){
41+
category.companies.push(companiesById[companyId]);
42+
});
43+
44+
_.each(category.investor_ids, function(investorId){
45+
category.investors.push(investorsById[investorId]);
46+
});
47+
48+
category.companies = _.compact(category.companies);
49+
category.investors = _.compact(category.investors);
50+
});
51+
};
52+
2853
/**
2954
* Sets up a crossfilter object on all of the model's data
3055
* Sets up a list of named dimensions used in the filter list to filter datasets
@@ -35,7 +60,32 @@ angular.module('crunchinatorApp.models').service('Category', function(Model, API
3560
this.dimensions = {
3661
byId: crossCategories.dimension(function(category) { return category.id; }),
3762
byCompanies: crossCategories.dimension(function(category) { return category.company_ids; }),
38-
byInvestors: crossCategories.dimension(function(category) { return category.investor_ids; })
63+
byInvestors: crossCategories.dimension(function(category) { return category.investor_ids; }),
64+
byTotalFunding: crossCategories.dimension(function(category) {
65+
return _.pluck(category.companies, 'total_funding');
66+
}),
67+
byFundingPerRound: crossCategories.dimension(function(category){
68+
return _.pluck(_.flatten(_.pluck(category.companies, 'funding_rounds')), 'raised_amount');
69+
}),
70+
byMostRecentFundingRound: crossCategories.dimension(function(category){
71+
return _.map(category.companies, function(company){
72+
return _.max(company.funding_rounds, function(round){
73+
return round.funded_on ? d3.time.format('%x').parse(round.funded_on) : 0;
74+
}).raised_amount;
75+
});
76+
}),
77+
byStatuses: crossCategories.dimension(function(category) {
78+
return _.pluck(category.companies, 'status');
79+
}),
80+
byAcquiredOn: crossCategories.dimension(function(category){
81+
return _.compact(_.pluck(category.companies, 'acquired_on'));
82+
}),
83+
byFundingRoundMonth: crossCategories.dimension(function(category){
84+
return _.compact(_.pluck(_.flatten(_.pluck(category.companies, 'funding_rounds')), 'funded_on'));
85+
}),
86+
byFoundedOn: crossCategories.dimension(function(category){
87+
return _.compact(_.pluck(category.companies, 'founded_on'));
88+
})
3989
};
4090

4191
this.byName = crossCategories.dimension(function(category) { return category.name; });
@@ -74,10 +124,63 @@ angular.module('crunchinatorApp.models').service('Category', function(Model, API
74124
});
75125
},
76126
byTotalFunding: function() {
77-
/*var ids = _.uniq(_.flatten(_.pluck(this.filterData.ranges, 'category_ids')));
78-
this.dimensions.byId.filter(function(id) {
79-
return (ids.length === 0 || ids.indexOf(id) > -1);
80-
});*/
127+
var self = this;
128+
var range = this.filterData.ranges;
129+
this.dimensions.byTotalFunding.filter(function(company_funding) {
130+
return self.fallsWithinRange(company_funding, range);
131+
});
132+
},
133+
byFundingPerRound: function() {
134+
var self = this;
135+
var range = this.filterData.ranges;
136+
this.dimensions.byFundingPerRound.filter(function(company_funding) {
137+
return self.fallsWithinRange(company_funding, range);
138+
});
139+
},
140+
byMostRecentFundingRound: function() {
141+
var self = this;
142+
var range = this.filterData.mostRecentRoundRanges;
143+
this.dimensions.byMostRecentFundingRound.filter(function(company_funding) {
144+
return self.fallsWithinRange(company_funding, range);
145+
});
146+
},
147+
byStatus: function() {
148+
var statuses = this.filterData.statuses;
149+
this.dimensions.byStatuses.filter(function(company_statuses) {
150+
if(statuses.length === 0) { return true; }
151+
152+
for(var i = 0; i < company_statuses.length; i++) {
153+
var company_status = company_statuses[i];
154+
if(_.contains(statuses, company_status)) {
155+
return true;
156+
}
157+
}
158+
return false;
159+
});
160+
},
161+
byAcquiredOn: function() {
162+
var self = this;
163+
var range = this.filterData.acquiredDate;
164+
var format = this.format;
165+
this.dimensions.byAcquiredOn.filter(function(company_acquired_on) {
166+
return self.fallsWithinRange(_.map(company_acquired_on, format.parse), range);
167+
});
168+
},
169+
byFoundedOn: function() {
170+
var self = this;
171+
var range = this.filterData.foundedDate;
172+
var format = this.format;
173+
this.dimensions.byFoundedOn.filter(function(company_founded_on) {
174+
return self.fallsWithinRange(_.map(company_founded_on, format.parse), range);
175+
});
176+
},
177+
byFundingRoundMonth: function() {
178+
var self = this;
179+
var range = this.filterData.fundingActivity;
180+
var format = this.format;
181+
this.dimensions.byFundingRoundMonth.filter(function(funding_round_dates) {
182+
return self.fallsWithinRange(_.map(funding_round_dates, format.parse), range);
183+
});
81184
}
82185
};
83186

app/scripts/services/investor.js

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -121,21 +121,24 @@ angular.module('crunchinatorApp.models').service('Investor', function(Model, API
121121
});
122122
},
123123
byTotalFunding: function() {
124+
var self = this;
124125
var range = this.filterData.ranges;
125126
this.dimensions.byTotalFunding.filter(function(company_funding) {
126-
return fallsWithinRange(company_funding, range);
127+
return self.fallsWithinRange(company_funding, range);
127128
});
128129
},
129130
byFundingPerRound: function() {
131+
var self = this;
130132
var range = this.filterData.ranges;
131133
this.dimensions.byFundingPerRound.filter(function(company_funding) {
132-
return fallsWithinRange(company_funding, range);
134+
return self.fallsWithinRange(company_funding, range);
133135
});
134136
},
135137
byMostRecentFundingRound: function() {
138+
var self = this;
136139
var range = this.filterData.mostRecentRoundRanges;
137140
this.dimensions.byMostRecentFundingRound.filter(function(company_funding) {
138-
return fallsWithinRange(company_funding, range);
141+
return self.fallsWithinRange(company_funding, range);
139142
});
140143
},
141144
byStatus: function() {
@@ -150,43 +153,30 @@ angular.module('crunchinatorApp.models').service('Investor', function(Model, API
150153
});
151154
},
152155
byAcquiredOn: function() {
156+
var self = this;
153157
var range = this.filterData.acquiredDate;
154158
var format = this.format;
155159
this.dimensions.byAcquiredOn.filter(function(company_acquired_on) {
156-
return fallsWithinRange(_.map(company_acquired_on, format.parse), range);
160+
return self.fallsWithinRange(_.map(company_acquired_on, format.parse), range);
157161
});
158162
},
159163
byFoundedOn: function() {
164+
var self = this;
160165
var range = this.filterData.foundedDate;
161166
var format = this.format;
162167
this.dimensions.byFoundedOn.filter(function(company_founded_on) {
163-
return fallsWithinRange(_.map(company_founded_on, format.parse), range);
168+
return self.fallsWithinRange(_.map(company_founded_on, format.parse), range);
164169
});
165170
},
166171
byFundingRoundMonth: function() {
172+
var self = this;
167173
var range = this.filterData.fundingActivity;
168174
var format = this.format;
169175
this.dimensions.byFundingRoundMonth.filter(function(funding_round_dates) {
170-
return fallsWithinRange(_.map(funding_round_dates, format.parse), range);
176+
return self.fallsWithinRange(_.map(funding_round_dates, format.parse), range);
171177
});
172178
}
173179
};
174180

175-
function fallsWithinRange(items, range) {
176-
if(range.length === 0) { return true; }
177-
if(items.length === 0) { return false; }
178-
179-
180-
181-
for(var i = 0; i < items.length; i++) {
182-
var item = items[i];
183-
184-
if(item >= range[0] && item <= range[1]) {
185-
return true;
186-
}
187-
}
188-
189-
return false;
190-
}
191181
return new Investor();
192182
});

app/scripts/services/model.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,5 +90,28 @@ angular.module('crunchinatorApp.models').service('Model', function($rootScope, $
9090
return this.all.length;
9191
};
9292

93+
/**
94+
* Returns whether any entry of an array of items falls within a number range.
95+
*
96+
* @param {array} list of numbers to check with
97+
* @param {array} a number range to check against
98+
* @return {boolean} whether the number list contains a value within the range
99+
*/
100+
Model.prototype.fallsWithinRange = function(items, range) {
101+
if(items.length === 0) { return false; }
102+
if(range.length === 0) { return true; }
103+
104+
105+
for(var i = 0; i < items.length; i++) {
106+
var item = items[i];
107+
108+
if(item >= range[0] && item <= range[1]) {
109+
return true;
110+
}
111+
}
112+
113+
return false;
114+
};
115+
93116
return new Model();
94117
});

0 commit comments

Comments
 (0)