ProjectIterator.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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 = (ProjectIterator =
  17. (ProjectIterator = class ProjectIterator {
  18. constructor(packs, before, getPackByIdFn) {
  19. this.before = before;
  20. this.getPackByIdFn = getPackByIdFn;
  21. const byEndTs = (a,b) => (b.meta.end_ts - a.meta.end_ts) || (a.fromIndex - b.fromIndex);
  22. this.packs = packs.slice().sort(byEndTs);
  23. this.queue = new Heap(byEndTs);
  24. }
  25. next(callback) {
  26. // what's up next
  27. // console.log ">>> top item", iterator.packs[0]
  28. const iterator = this;
  29. const { before } = this;
  30. const { queue } = iterator;
  31. const opsToReturn = [];
  32. let nextPack = iterator.packs[0];
  33. let lowWaterMark = (nextPack != null ? nextPack.meta.end_ts : undefined) || 0;
  34. let nextItem = queue.peek();
  35. // console.log "queue empty?", queue.empty()
  36. // console.log "nextItem", nextItem
  37. // console.log "nextItem.meta.end_ts", nextItem?.meta.end_ts
  38. // console.log "lowWaterMark", lowWaterMark
  39. while ((before != null) && ((nextPack != null ? nextPack.meta.start_ts : undefined) > before)) {
  40. // discard pack that is outside range
  41. iterator.packs.shift();
  42. nextPack = iterator.packs[0];
  43. lowWaterMark = (nextPack != null ? nextPack.meta.end_ts : undefined) || 0;
  44. }
  45. if ((queue.empty() || ((nextItem != null ? nextItem.meta.end_ts : undefined) <= lowWaterMark)) && (nextPack != null)) {
  46. // retrieve the next pack and populate the queue
  47. return this.getPackByIdFn(nextPack.project_id, nextPack.doc_id, nextPack._id, function(err, pack) {
  48. if (err != null) { return callback(err); }
  49. iterator.packs.shift(); // have now retrieved this pack, remove it
  50. // console.log "got pack", pack
  51. for (const op of Array.from(pack.pack)) {
  52. // console.log "adding op", op
  53. if ((before == null) || (op.meta.end_ts < before)) {
  54. op.doc_id = nextPack.doc_id;
  55. op.project_id = nextPack.project_id;
  56. queue.push(op);
  57. }
  58. }
  59. // now try again
  60. return iterator.next(callback);
  61. });
  62. }
  63. // console.log "nextItem", nextItem, "lowWaterMark", lowWaterMark
  64. while ((nextItem != null) && ((nextItem != null ? nextItem.meta.end_ts : undefined) > lowWaterMark)) {
  65. opsToReturn.push(nextItem);
  66. queue.pop();
  67. nextItem = queue.peek();
  68. }
  69. // console.log "queue empty?", queue.empty()
  70. // console.log "nextPack", nextPack?
  71. if (queue.empty() && (nextPack == null)) { // got everything
  72. iterator._done = true;
  73. }
  74. return callback(null, opsToReturn);
  75. }
  76. done() {
  77. return this._done;
  78. }
  79. }));