-
Notifications
You must be signed in to change notification settings - Fork 1
/
team-stats.js
109 lines (95 loc) · 2.76 KB
/
team-stats.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// --------------------------------------------------------
// Initialize knex (the query builder)
// --------------------------------------------------------
var knex = require('knex')({
client: 'postgresql',
debug: true,
connection: {
host: 'localhost',
user: '',
password: '',
database: 'teams',
charset: 'utf8'
}
});
// --------------------------------------------------------
// Team
// --------------------------------------------------------
function Team() {
}
Team.prototype.calculateTotalPoints = function() {
var i;
var numPlayers = this.players.length;
var totalPoints = 0;
for (i = 0; i < numPlayers; i++) {
totalPoints = totalPoints + this.players[i].points;
}
return totalPoints;
};
// --------------------------------------------------------
// Get team stats
// --------------------------------------------------------
var joinjs = require('join-js').default;
var resultMaps = [
{
mapId: 'teamMap',
createNew: function() {
return new Team();
},
idProperty: 'id',
properties: ['name'],
associations: [
{name: 'coach', mapId: 'coachMap', columnPrefix: 'coach_'}
],
collections: [
{name: 'players', mapId: 'playerMap', columnPrefix: 'player_'}
]
},
{
mapId: 'coachMap',
idProperty: 'id',
properties: ['name']
},
{
mapId: 'playerMap',
idProperty: {name: 'id', column: 'id'},
properties: [
'name',
{name: 'gamesPlayed', column: 'games_played'},
'points'
]
}
];
function getTeamStats() {
return knex
.select(
't.id as team_id',
't.name as team_name',
'c.id as coach_id',
'c.name as coach_name',
'p.id as player_id',
'p.name as player_name',
'p.games_played as player_games_played',
'p.points as player_points')
.from('teams as t')
.leftOuterJoin('coaches as c', 'c.team_id', 't.id')
.leftOuterJoin('players as p', 'p.team_id', 't.id')
.then(function(resultSet) {
return joinjs.map(resultSet, resultMaps, 'teamMap', 'team_');
});
}
// --------------------------------------------------------
// Main
// --------------------------------------------------------
getTeamStats().then(function(teams) {
console.log(JSON.stringify(teams, null, 4));
console.log('');
var i = 0;
var numTeams = teams.length;
for (i = 0; i < numTeams; i++) {
console.log(teams[i].name);
console.log(' Total points: ' + teams[i].calculateTotalPoints());
}
// close the connection
return knex.destroy();
});