-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.js
190 lines (144 loc) · 4.63 KB
/
main.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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/**
* A app designed to generate billions data
*/
const Mock = require('mockjs')
const {
initDatabase,
modelDefinitions,
} = require('../databases')
const {
concurrentJobs,
totalAccounts,
totalQuestions,
totalAnswers,
} = require('../config')
const utils = require('../utils')
const [
accountModel,
questionModel,
answerModel,
] = modelDefinitions
const { Random } = Mock
/**
* Get an account id from database
*/
const queryAccountId = async (mysqlClient) => {
const randomId = Random.natural(1, totalAccounts)
const queryAuthorIdSql = `
select account_id from ${accountModel.tableName} where id=${randomId}
`
const res = await mysqlClient.query(queryAuthorIdSql).catch(err => err)
if (!res || !res.length) {
console.log(`Failed to query account id for random Id: ${randomId} with error: ${res.sqlMessage}`)
return
}
return res[0].account_id
}
/**
* Get an question id from database
*/
const queryQuestionId = async (mysqlClient) => {
const randomId = Random.natural(1, totalQuestions)
const queryQuestionIdSql = `
select question_id from ${questionModel.tableName} where id=${randomId}
`
const res = await mysqlClient.query(queryQuestionIdSql).catch(err => err)
if (!res || !res.length) {
console.log(`Failed to query question id for random Id: ${randomId} with error: ${res.sqlMessage}`)
return
}
return res[0].question_id
}
/**
* Get an answer id from database
*/
const queryAnswerId = async (mysqlClient) => {
const randomId = Random.natural(1, totalAnswers)
const queryAnswerIdSql = `
select answer_id from ${answerModel.tableName} where id=${randomId}
`
const res = await mysqlClient.query(queryAnswerIdSql).catch(err => err)
if (!res || !res.length) {
console.log(`Failed to query answer id for random Id: ${randomId} with error: ${res.sqlMessage}`)
return
}
return res[0].answer_id
}
const generateAccounts = async (mysqlClient) => {
const start = Date.now()
const data = accountModel.generate_account()
const sql = utils.getInsertSql(accountModel.tableName, data)
console.log('Sending create new account sql string to Mysql')
const res = await mysqlClient.query(sql).catch(err => err)
const millSeconds = Date.now() - start
if (res && res.affectedRows > 0) {
console.log(`Successfully create an new account: ${data.account_id} in ${millSeconds} millseconds`)
} else {
console.log(`Failed to create an new account with Error: ${res.sqlMessage}`)
}
}
const generateQuestions = async (mysqlClient) => {
const start = Date.now()
const authorId = await queryAccountId(mysqlClient)
if (!authorId) {
return
}
const data = questionModel.generate_question(authorId)
const sql = utils.getInsertSql(questionModel.tableName, data)
console.log('Sending sql string to create new question')
const res = await mysqlClient.query(sql).catch(err => err)
const millSeconds = Date.now() - start
if (res && res.affectedRows > 0) {
console.log(`Successfully create an new question: ${data.question_id} in ${millSeconds} millseconds`)
} else {
console.log(`Failed to create an new account with Error: ${res.sqlMessage}`)
}
}
const generateAnswers = async (mysqlClient) => {
const start = Date.now()
const [authorId, questionId] = await Promise.all([
queryAccountId(mysqlClient),
queryQuestionId(mysqlClient),
])
if (!authorId || !questionId) {
return
}
console.log('Create new answer')
const newAnswer = answerModel.generate_answer(authorId, questionId)
const sql = utils.getInsertSql(answerModel.tableName, newAnswer)
const res = await mysqlClient.query(sql).catch(err => err)
const millSeconds = Date.now() - start
if (res && res.affectedRows > 0) {
console.log(`Successfully create an new answer: ${newAnswer.answer_id} in ${millSeconds} millseconds`)
} else {
console.log(`Failed to create an new answer with Error: ${res.sqlMessage}`)
}
}
const main = async (datasetGrossConfig) => {
const mysqlClient = await initDatabase()
const dataGeneratorRunner = utils.dataGeneratorRunner(mysqlClient)
const modelSettingsMapping = {
account: {
generator: generateAccounts,
tableName: accountModel.tableName,
},
question: {
generator: generateQuestions,
tableName: questionModel.tableName,
},
answer: {
generator: generateAnswers,
tableName: answerModel.tableName,
},
}
for (let { name, grossRowsCount } of datasetGrossConfig) {
const { generator, tableName } = modelSettingsMapping[name]
await dataGeneratorRunner({
concurrentJobs,
grossRowsCount,
generator,
tableName,
})
}
}
module.exports = main