/* eslint-disable no-unmodified-loop-condition, no-unused-vars, */ // TODO: This file was created by bulk-decaffeinate. // Fix any style issues and re-enable lint. /* * decaffeinate suggestions: * DS101: Remove unnecessary use of Array.from * DS102: Remove unnecessary code created because of implicit returns * DS207: Consider shorter variations of null checks * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md */ let ProjectIterator; const Heap = require("heap"); module.exports = (ProjectIterator = (ProjectIterator = class ProjectIterator { constructor(packs, before, getPackByIdFn) { this.before = before; this.getPackByIdFn = getPackByIdFn; const byEndTs = (a,b) => (b.meta.end_ts - a.meta.end_ts) || (a.fromIndex - b.fromIndex); this.packs = packs.slice().sort(byEndTs); this.queue = new Heap(byEndTs); } next(callback) { // what's up next // console.log ">>> top item", iterator.packs[0] const iterator = this; const { before } = this; const { queue } = iterator; const opsToReturn = []; let nextPack = iterator.packs[0]; let lowWaterMark = (nextPack != null ? nextPack.meta.end_ts : undefined) || 0; let nextItem = queue.peek(); // console.log "queue empty?", queue.empty() // console.log "nextItem", nextItem // console.log "nextItem.meta.end_ts", nextItem?.meta.end_ts // console.log "lowWaterMark", lowWaterMark while ((before != null) && ((nextPack != null ? nextPack.meta.start_ts : undefined) > before)) { // discard pack that is outside range iterator.packs.shift(); nextPack = iterator.packs[0]; lowWaterMark = (nextPack != null ? nextPack.meta.end_ts : undefined) || 0; } if ((queue.empty() || ((nextItem != null ? nextItem.meta.end_ts : undefined) <= lowWaterMark)) && (nextPack != null)) { // retrieve the next pack and populate the queue return this.getPackByIdFn(nextPack.project_id, nextPack.doc_id, nextPack._id, function(err, pack) { if (err != null) { return callback(err); } iterator.packs.shift(); // have now retrieved this pack, remove it // console.log "got pack", pack for (const op of Array.from(pack.pack)) { // console.log "adding op", op if ((before == null) || (op.meta.end_ts < before)) { op.doc_id = nextPack.doc_id; op.project_id = nextPack.project_id; queue.push(op); } } // now try again return iterator.next(callback); }); } // console.log "nextItem", nextItem, "lowWaterMark", lowWaterMark while ((nextItem != null) && ((nextItem != null ? nextItem.meta.end_ts : undefined) > lowWaterMark)) { opsToReturn.push(nextItem); queue.pop(); nextItem = queue.peek(); } // console.log "queue empty?", queue.empty() // console.log "nextPack", nextPack? if (queue.empty() && (nextPack == null)) { // got everything iterator._done = true; } return callback(null, opsToReturn); } done() { return this._done; } }));