ProjectIterator.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /* eslint-disable
  2. no-unmodified-loop-condition,
  3. no-unused-vars,
  4. */
  5. // TODO: This file was created by bulk-decaffeinate.
  6. // Fix any style issues and re-enable lint.
  7. /*
  8. * decaffeinate suggestions:
  9. * DS101: Remove unnecessary use of Array.from
  10. * DS102: Remove unnecessary code created because of implicit returns
  11. * DS207: Consider shorter variations of null checks
  12. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  13. */
  14. let ProjectIterator
  15. const Heap = require('heap')
  16. module.exports =
  17. ProjectIterator =
  18. ProjectIterator =
  19. class ProjectIterator {
  20. constructor(packs, before, getPackByIdFn) {
  21. this.before = before
  22. this.getPackByIdFn = getPackByIdFn
  23. const byEndTs = (a, b) =>
  24. b.meta.end_ts - a.meta.end_ts || a.fromIndex - b.fromIndex
  25. this.packs = packs.slice().sort(byEndTs)
  26. this.queue = new Heap(byEndTs)
  27. }
  28. next(callback) {
  29. // what's up next
  30. // console.log ">>> top item", iterator.packs[0]
  31. const iterator = this
  32. const { before } = this
  33. const { queue } = iterator
  34. const opsToReturn = []
  35. let nextPack = iterator.packs[0]
  36. let lowWaterMark =
  37. (nextPack != null ? nextPack.meta.end_ts : undefined) || 0
  38. let nextItem = queue.peek()
  39. // console.log "queue empty?", queue.empty()
  40. // console.log "nextItem", nextItem
  41. // console.log "nextItem.meta.end_ts", nextItem?.meta.end_ts
  42. // console.log "lowWaterMark", lowWaterMark
  43. while (
  44. before != null &&
  45. (nextPack != null ? nextPack.meta.start_ts : undefined) > before
  46. ) {
  47. // discard pack that is outside range
  48. iterator.packs.shift()
  49. nextPack = iterator.packs[0]
  50. lowWaterMark =
  51. (nextPack != null ? nextPack.meta.end_ts : undefined) || 0
  52. }
  53. if (
  54. (queue.empty() ||
  55. (nextItem != null ? nextItem.meta.end_ts : undefined) <=
  56. lowWaterMark) &&
  57. nextPack != null
  58. ) {
  59. // retrieve the next pack and populate the queue
  60. return this.getPackByIdFn(
  61. nextPack.project_id,
  62. nextPack.doc_id,
  63. nextPack._id,
  64. function (err, pack) {
  65. if (err != null) {
  66. return callback(err)
  67. }
  68. iterator.packs.shift() // have now retrieved this pack, remove it
  69. // console.log "got pack", pack
  70. for (const op of Array.from(pack.pack)) {
  71. // console.log "adding op", op
  72. if (before == null || op.meta.end_ts < before) {
  73. op.doc_id = nextPack.doc_id
  74. op.project_id = nextPack.project_id
  75. queue.push(op)
  76. }
  77. }
  78. // now try again
  79. return iterator.next(callback)
  80. }
  81. )
  82. }
  83. // console.log "nextItem", nextItem, "lowWaterMark", lowWaterMark
  84. while (
  85. nextItem != null &&
  86. (nextItem != null ? nextItem.meta.end_ts : undefined) > lowWaterMark
  87. ) {
  88. opsToReturn.push(nextItem)
  89. queue.pop()
  90. nextItem = queue.peek()
  91. }
  92. // console.log "queue empty?", queue.empty()
  93. // console.log "nextPack", nextPack?
  94. if (queue.empty() && nextPack == null) {
  95. // got everything
  96. iterator._done = true
  97. }
  98. return callback(null, opsToReturn)
  99. }
  100. done() {
  101. return this._done
  102. }
  103. }