-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathconstructRecommendations.js
112 lines (95 loc) · 3.17 KB
/
constructRecommendations.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
110
111
112
/**
* Constructs GitHub recommendation database. Based on followers of a project
* attemtps to find related proejcts. This program saves results into `out` folder
*
* Usage:
* node constructRecommendations.js ./db/followers ./db/stars
*
* Where:
* - followers: leveldb database name with indexed followers (produced by followersIndexer)
* - stars: leveldb database name with indexed stars (produced by starsIndexer)
*/
var fs = require('fs');
var saveRecommendation = require('./lib/saveRecommendation');
var findRelated = require('./lib/findRelated');
if (!checkInput()) {
printHelp();
return -1;
}
fs.mkdirSync('./out');
fs.mkdirSync('./projects');
// we will iterate over each project:
var projectsDB = openDB(process.argv[2]);
var starsDB = openDB(process.argv[3]);
processProjects();
function processProjects() {
var projects = [];
projectsDB.forEach(constructRecommendations)
.then(writeProjectsFile);
function constructRecommendations(projectName, followers) {
console.log('Processing', projectName);
starsDB.getAllKeyValues(followers)
.then(function (usersDB) {
console.log('Loaded projects starred by followers of ' + projectName);
var related = findRelated(followers, usersDB);
saveRecommendation(projectName, related);
projects.push(projectName);
});
}
function writeProjectsFile() {
var projectsFile ='./projects/projects.json';
console.log('Saving projects file to', projectsFile);
fs.writeFileSync(projectsFile, JSON.stringify(projects));
}
}
function openDB(name) {
console.log('Opening ' + name + '...');
return require('./lib/ldb')(name);
}
function loadFullDBInMemory(name) {
var db = openDB(name);
var records = Object.create(null);
var totalRead = 0;
return db.forEach(readRecord).then(returnRecords);
function readRecord(key, value) {
records[key] = value;
totalRead += 1;
}
function returnRecords() {
console.log('Loaded ' + totalRead + ' records');
return records;
}
}
function checkInput() {
console.log('Checking command arguments');
console.log('Followers database:', process.argv[2]);
if (!fs.existsSync(process.argv[2])) {
console.log('Followers database is missing' + name);
return;
}
console.log('Stars database:', process.argv[3]);
if (!fs.existsSync(process.argv[3])) {
console.log('Stars database is missing' + name);
return;
}
if (fs.existsSync('./out')) {
// just to make sure we do not overwrite old stuff.
console.log('Output folder `./out` is present. Please remove it to proceed.');
return;
}
return true; // all is good
}
function printHelp() {
[
'--------------------------------------------------------------------------',
'Constructs GitHub recommendation database. Based on followers of a project',
'attemtps to find related proejcts. This program saves results into `out` folder',
'',
'Usage:',
' node constructRecommendations.js ./db/followers ./db/stars',
'',
'Where:',
' - followers: leveldb database name with indexed followers (produced by followersIndexer)',
' - stars: leveldb database name with indexed stars (produced by starsIndexer)']
.forEach(function (line) { console.log(line); });
}