sample.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. const MongoClient = require("mongodb").MongoClient;
  2. const ObjectID = require("mongodb").ObjectID;
  3. const mm = require('./mm.js')
  4. const delay = ms => new Promise(r => setTimeout(r.bind(ms), ms))
  5. ;(async () => {
  6. const mongoClient = new MongoClient("mongodb://localhost:27017/", { useNewUrlParser: true });
  7. const client = await mongoClient.connect()
  8. const db = client.db('mm')
  9. const Savable = mm(db).Savable
  10. const SlicedSavable = mm(db).sliceSavable([ObjectID("5c9571219be797377361c65a"), 'user', 'admin'])
  11. //const SlicedSavable = mm(db).sliceSavable([])
  12. //
  13. class Notebook extends SlicedSavable{
  14. static get relations(){
  15. return {
  16. owner: "notebook"
  17. }
  18. }
  19. }
  20. class User extends SlicedSavable{
  21. static get relations(){
  22. return {
  23. children: "parent",
  24. parent: "children",
  25. friends: "friends",
  26. notebook: "owner",
  27. }
  28. }
  29. }
  30. Savable.addClass(Notebook)
  31. Savable.addClass(User)
  32. let names = ['Ivan', 'Petro', 'Mykola', 'Sashko']
  33. let surnames = ['Ivanopulo', 'Petrov', 'Mykolyiv', 'Alexandrov']
  34. let rndItem = arr => arr[Math.floor(Math.random()*arr.length)]
  35. let person = new User({
  36. name: 'Mykola',
  37. surname: 'Silniy',
  38. phones: ['105', '1'],
  39. children: [
  40. new User({
  41. name: 'Marina',
  42. surname: 'Silnaya',
  43. phones: ['105', '1000503'],
  44. }),
  45. new User({
  46. name: 'Andrey',
  47. surname: 'Silniy',
  48. phones: ['103', '1000502'],
  49. }),
  50. new User({
  51. name: 'Fedor',
  52. surname: 'Ivanova',
  53. phones: ['102', '1000504'],
  54. notebook: new Notebook({
  55. brand: 'dubovo'
  56. })
  57. })
  58. ]
  59. })
  60. await person.save()
  61. let stamp = (new Date()).getTime()
  62. let prevI = 0;
  63. const persons = []
  64. //for (var i=0;i<1e10;i++){
  65. //let person = new User({
  66. //name: rndItem(names),
  67. //surname: rndItem(surnames),
  68. //phones: ['105', '1'],
  69. //friends: persons.slice(-(Math.random()*80))
  70. //})
  71. //await person.save(true)
  72. //persons.push(person)
  73. //if (persons.length > 200){
  74. //await (Math.random() > 0.5 ? persons.shift() : persons.pop()).save(true)
  75. //}
  76. //let now = (new Date()).getTime()
  77. //if (stamp < now - 1000){
  78. ////results:
  79. ////objects w/o relations: 2500 writes per second
  80. ////objects w relations: pessimistic backrelations sync, 0..80 friends of 200 latest created, ~25 per second due 0..80 saves of other friends with new one relation
  81. ////objects w relations: ~500 per second, save w/o backref save (but it updated in object), than, when object removed from random buffer, re-save it with updated relations
  82. //console.log(i, i - prevI)
  83. //prevI = i
  84. //stamp = now
  85. //}
  86. //}
  87. async function walker(limit=10) {
  88. let start = (new Date()).getTime()
  89. let stamp = start
  90. let now = start
  91. let prevI = 0
  92. let person
  93. for (let uP of Savable.m.User.find({},null,{sort:['_id', -1], limit: [1]})){
  94. person = await uP
  95. console.log(person)
  96. }
  97. //let person = [...Savable.m.User.find({},null,{sort:['_id', 1], limit: [1]})][0]
  98. //console.log('order-huyorder', person)
  99. let prevPerson;
  100. for (var i=0;i<limit;i++){
  101. prevPerson = person || prevPerson
  102. try {
  103. person = person.friends ? await rndItem(person.friends) : await Savable.m.User.findOne() //walking in graph: go to random friend
  104. }
  105. catch(e){
  106. person = await Savable.m.User.findOne()
  107. }
  108. //console.log(prevPerson && prevPerson._id)
  109. //await prevPerson.delete()
  110. //if (persons.includes(person)){
  111. //console.log('WAS HERE',person._id, person.name, person.surname, person.createdAt)
  112. //}
  113. //for (let friend of person.friends){
  114. //await friend
  115. //}
  116. //persons.push(person)
  117. now = (new Date()).getTime()
  118. if (stamp < now - 1000){
  119. //results:
  120. //walking: 100-200 per second, not so fun...
  121. //loops in graph: near 0-5 on 100 steps between nodes in graph
  122. console.log(i, i - prevI, person._id, person.name, person.surname, person.createdAt)
  123. prevI = i
  124. stamp = now
  125. }
  126. }
  127. return now - start
  128. }
  129. //await walker(8531)
  130. //console.log(await Promise.all([walker(), walker()]))
  131. //console.log(await Promise.all([walker(), walker()]))
  132. //for (let child of father.children){
  133. //console.log(await child)
  134. //console.log(child.name, child.dirty)
  135. //}
  136. //let father = await Savable.m.User.findOne(ObjectID("5c9571219be797377361c65a"))
  137. //console.log(father);
  138. //(await father.children[0]).parent = null;
  139. //await (await father.children[0]).save();
  140. //console.log(father);
  141. //let notik = await Savable.m.Notebook.findOne(ObjectID('5c7c064d2ed0f4c9ab4cba4e'))
  142. //let SilniyeMans = await Savable.m.Savable.find({ $or: [{surname: 'Silniy'}, {surname: 'Silnaya'}]})
  143. //for (let manPromise of SilniyeMans){
  144. //let man = await manPromise;
  145. //console.log('man', man.name, man.surname, man.createdAt)
  146. //notik.owner = man
  147. ////notik.owner = [man]
  148. ////notik.owner = new Set([man])
  149. //break;
  150. //}
  151. //await notik.save()
  152. //console.log(notik)
  153. //notik.ram = 4;
  154. //notik.resolution = {width: 1920, height: 1080}
  155. //await notik.save()
  156. //console.log(await Savable.m.Notebook.findOne(ObjectID('5c7c064d2ed0f4c9ab4cba4e')))
  157. //while(true){
  158. //await (new Savable({timestamp: (new Date).getTime(), r: Math.random()})).save()
  159. //console.log(person)
  160. //await delay(1000)
  161. ////}
  162. ////let person = new Savable()
  163. ////person._id = ObjectID('5c7bd603ce3cbc409978203e');
  164. ////console.log(person)
  165. //let child = new Savable({
  166. //name: 'New One Child',
  167. //surname: 'Silniy',
  168. //phones: ['105', '1000506']
  169. //});
  170. ////console.log(await person)
  171. ////console.log(await person.children[1])
  172. //person.children.push(child)
  173. //child.father = person
  174. ////console.log(person)
  175. ////console.log(child)
  176. //await person.save()
  177. ////console.log(await person.children[3])
  178. //let p2 =new Savable({_id: ObjectID('5c7bf8f04a3a3299f7deda0d' )}, true) //check for cache hit
  179. //;(await new Savable({_id: ObjectID('5c7bf8f04a3a3299f7deda0d' )}, true)) //check for cache hit
  180. //;(await p2)
  181. //console.log('parent 2', p2)
  182. //console.log(await p2.children[3]) //check for other hit
  183. //console.log(await person.children[3].father)
  184. //console.log(await person.children[3].father.children[1])
  185. ////let obj = {
  186. ////then(cb){
  187. ////process.nextTick(() => cb(obj))
  188. ////}
  189. ////}
  190. ////console.log(await obj)
  191. ////console.log('empty await', await person)//.then(p => console.log(p))
  192. ////console.log('sub await', (await person.children[0]))//.then(p => console.log(p))
  193. client.close();
  194. })()