Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

index.js 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. const fs = require('fs')
  2. const config = require('./config')
  3. const random = require('./random')
  4. const classes = require('./classes')
  5. const score = require('./score')
  6. let batchCount = 1 // Counter to track how many things we've generated
  7. let extraProfilesToGenerate = 0
  8. let extraProfileCount = 0 // Counter to track how many EXTRA profiles we've generated
  9. let generatedResponseCount = 0 // Counter to track every response generated
  10. // Values for responsess as strings
  11. const possibleResponses = {
  12. not_important: null,
  13. some_what_important: null,
  14. important: null,
  15. very_important: null,
  16. extremely_important: null,
  17. mandatory: null,
  18. }
  19. for (let i = 0; i < Object.keys(possibleResponses).length; i++) {
  20. const key = Object.keys(possibleResponses)[i]
  21. possibleResponses[key] = config.scoreVals[i].toString()
  22. }
  23. /**
  24. * Our initial file setup
  25. */
  26. const write = async (batchNum, outputDataObject) => {
  27. await fs.writeFile(`${config.mockOutputPath}_${batchNum}.js`, '', () => {})
  28. fs.appendFile(
  29. `${config.mockOutputPath}_${batchNum}.js`,
  30. config.header + 'module.exports = ' + JSON.stringify(outputDataObject),
  31. err => {
  32. if (err) {
  33. console.error(err)
  34. return
  35. }
  36. },
  37. )
  38. }
  39. // Helper functions
  40. // const preComputedScores = score.precomputed
  41. const generate = (classObj, amount, meta) => {
  42. const instances = []
  43. for (let i = 0; i < amount; i++) {
  44. let startFrom = meta?.starting ? meta.starting - config.batchSize : 0
  45. instances.push(new classObj(i + startFrom + 1, meta))
  46. }
  47. return instances
  48. }
  49. console.log('\nStarting...\n---')
  50. /**
  51. * Generate Users
  52. */
  53. const generateUsers = () => {
  54. let users = generate(classes.User, config.batchSize, {
  55. starting: config.batchSize * batchCount,
  56. })
  57. users.forEach(user => {
  58. user.is_poster = random.number(100) > config.percentageOfSeekers ? 1 : 0
  59. if (user.is_poster) {
  60. extraProfilesToGenerate = extraProfilesToGenerate + random.number(2)
  61. }
  62. user.user_name = random.name() + ' ' + random.name()
  63. user.user_email = random.email()
  64. })
  65. console.log('COMPLETED: Generated Users...')
  66. return users
  67. }
  68. /**
  69. * Generate Profiles
  70. */
  71. const generateProfiles = jobPosterIds => {
  72. let profiles = generate(classes.Profile, config.batchSize, {
  73. starting: config.batchSize * batchCount,
  74. profile_id: extraProfileCount,
  75. })
  76. // Generate extra job posting profiles
  77. // attributed to random user.is_poster === true
  78. // TODO: Clean this up. Hard to read...
  79. if (extraProfilesToGenerate > 0) {
  80. let extras = []
  81. for (let l = 0; l < extraProfilesToGenerate; l++) {
  82. const generatedExtraProfiles = generate(classes.Profile, 1, {
  83. user_id:
  84. jobPosterIds.length > 1
  85. ? random.valFrom(jobPosterIds)
  86. : jobPosterIds[0],
  87. profile_id:
  88. config.batchSize * batchCount + extraProfileCount + l,
  89. })
  90. extras = [...extras, ...generatedExtraProfiles]
  91. }
  92. extras.forEach(profile => {
  93. profiles.push(profile)
  94. extraProfileCount++
  95. })
  96. }
  97. console.log('COMPLETED: Generated Profiles...')
  98. return profiles
  99. }
  100. /**
  101. * Generate Responses
  102. */
  103. const generateResponses = profiles => {
  104. // Generate responses first, before filling in details
  105. let responses = generate(
  106. classes.Response,
  107. (config.batchSize + extraProfilesToGenerate) * config.questions,
  108. { starting: generatedResponseCount + config.batchSize },
  109. )
  110. profiles.forEach((profile, i) => {
  111. const startingIndex = i * config.questions
  112. for (let k = 0; k < config.questions; k++) {
  113. const resToEdit = responses[startingIndex + k]
  114. resToEdit.response_key_id = k + 1
  115. resToEdit.profile_id = profile.profile_id
  116. resToEdit.val =
  117. k + 1 == config.questions
  118. ? random.valFrom(config.possibleZipcodes)
  119. : random.valFrom(Object.values(possibleResponses))
  120. }
  121. })
  122. generatedResponseCount = generatedResponseCount + responses.length
  123. console.log('COMPLETED: Generated Responses...')
  124. return responses
  125. }
  126. /**
  127. * Our main generator loop
  128. */
  129. for (
  130. let batch = config.batchSize;
  131. batch <= config.total;
  132. batch += config.batchSize
  133. ) {
  134. const users = generateUsers()
  135. let jobPosterIds = users
  136. .filter(user => user.is_poster > 0)
  137. .map(user => user.user_id)
  138. // Guarentee ONE job poster
  139. if (!jobPosterIds.length) {
  140. random.valFrom(users).is_poster = 1
  141. jobPosterIds = users
  142. .filter(user => user.is_poster > 0)
  143. .map(user => user.user_id)
  144. }
  145. const profiles = generateProfiles(jobPosterIds)
  146. const responses = generateResponses(profiles)
  147. write(config.batchSize * batchCount, { users, profiles, responses })
  148. batchCount++
  149. }
  150. /**
  151. * Score all the profiles!
  152. */
  153. // const compareProfileResponses = (seeker, potentialMatch) => {
  154. // const checkValCb = res => {
  155. // const val = parseInt(res.val)
  156. // return isNaN(val) ? 0 : val
  157. // }
  158. // const filterBy = idToCheckFor => {
  159. // return responses
  160. // .filter(
  161. // response =>
  162. // response.profile_id == idToCheckFor &&
  163. // response.val.length < 4,
  164. // )
  165. // .map(checkValCb)
  166. // }
  167. // const seekerResponses = filterBy(seeker.profile_id)
  168. // const potentialMatchResponses = filterBy(potentialMatch.profile_id)
  169. // const cachedScores = []
  170. // seekerResponses.forEach(seekerResponse => {
  171. // potentialMatchResponses.forEach(potentialResponse => {
  172. // cachedScores.push(
  173. // preComputedScores[seekerResponse][potentialResponse],
  174. // )
  175. // })
  176. // })
  177. // return Math.round(
  178. // cachedScores.reduce((a, b) => a + b) / cachedScores.length,
  179. // )
  180. // }
  181. // const scoreProfile = (profile, potentialMatchList) => {
  182. // return potentialMatchList
  183. // .map(profileToCompare => {
  184. // return {
  185. // match_queue_id: null,
  186. // profile_id: profile.profile_id,
  187. // target_id: profileToCompare.profile_id,
  188. // is_deleted: false,
  189. // score: compareProfileResponses(profile, profileToCompare),
  190. // }
  191. // })
  192. // .sort((a, b) => a.score - b.score)
  193. // }
  194. // const scoreAll = () => {
  195. // process.stdout.write('\nScoring Profiles')
  196. // let scores = []
  197. // const posterProfiles = profiles.filter(profile =>
  198. // jobPosterIds.includes(profile.user_id),
  199. // )
  200. // const seekerProfiles = profiles.filter(
  201. // profile => !jobPosterIds.includes(profile.user_id),
  202. // )
  203. // process.stdout.write('.')
  204. // for (let i = 0; i < seekerProfiles.length; i++) {
  205. // const scored = scoreProfile(seekerProfiles[i], posterProfiles)
  206. // scores.push(...scored)
  207. // }
  208. // process.stdout.write('.')
  209. // for (let j = 0; j < posterProfiles.length; j++) {
  210. // const scored = scoreProfile(posterProfiles[j], seekerProfiles)
  211. // scores.push(...scored)
  212. // }
  213. // process.stdout.write('.')
  214. // console.log('\n\nCOMPLETED: Scoring Profiles...')
  215. // return scores.reverse()
  216. // }
  217. // const match_queues = scoreAll().map((score, i) => {
  218. // score.match_queue_id = i + 1
  219. // // Comment out next line to see the scores
  220. // delete score.score
  221. // return score
  222. // })
  223. console.log('---\nFINISHED...\n===\n')