Skip to content

Instantly share code, notes, and snippets.

@loopiezlol
Last active May 4, 2017 09:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save loopiezlol/7eaa21c52b3f987b7a8d50061597c15b to your computer and use it in GitHub Desktop.
Save loopiezlol/7eaa21c52b3f987b7a8d50061597c15b to your computer and use it in GitHub Desktop.
const co = require('co');
const fs = require('fs');
require('../../app/models/topic');
require('../../app/models/level');
const User = require('../../app/models/user');
function extractLevelMajority(topicsArray) {
let beginner = 0;
let basic = 0;
let medium = 0;
let expert = 0;
topicsArray.forEach(topic => {
if ((topic.levelId || {}).label === 'beginner') {
beginner += 1;
} else if ((topic.levelId || {}).label === 'basic') {
basic += 1;
} else if ((topic.levelId || {}).label === 'medium') {
medium += 1;
} else if ((topic.levelId || {}).label === 'expert') {
expert += 1;
}
})
if (beginner > basic && beginner > medium && beginner > expert) {
return 'beginner';
} else if (basic > beginner && basic > medium && basic > expert) {
return 'basic';
} else if (medium > beginner && medium > basic && medium > expert) {
return 'medium';
} else if (expert > beginner && expert > medium && expert > basic) {
return 'expert';
}
return 'no-majority';
}
module.exports = function() {
co(function*() {
yield new Promise((resolve, reject) => {
let counter = 0;
const majorityMap = {};
const query = {
topics: { $exists: true},
'onboardingSteps.0': 'revision',
}
const uCursor = User.find(query, 'topics.levelId')
.populate('topics.levelId', 'label')
// .populate('topics.topicId', 'name')
.limit(40000)
.lean()
.cursor();
uCursor.eachAsync(user => {
const majorLabel = extractLevelMajority(user.topics);
if(!majorityMap[majorLabel]) {
majorityMap[majorLabel] = {
count: 0,
ratio: 0,
}
}
majorityMap[majorLabel].count += 1;
// majorityMap[majorLabel].ratio = majorityMap[majorLabel].count / totalUsers * 100;
counter += 1;
console.log('at', counter, 'out of ~180k')
})
.then(() => {
// calculate ratio
Object.keys(majorityMap).forEach(m => {
majorityMap[m].ratio = majorityMap[m].count / counter * 100;
})
majorityMap.total = counter;
console.log('done');
fs.writeFile('level-majority.json', JSON.stringify(majorityMap, null, 2), err => {
if (err) console.log('something wrong happened', err);
console.log('done writing to file');
process.exit(0);
})
console.log(majorityMap)
resolve();
})
.catch(err => {
console.log(err);
reject();
process.exit(0);
});
})
})
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment