[6a3a178] | 1 | "use strict";
|
---|
| 2 | Object.defineProperty(exports, "__esModule", { value: true });
|
---|
| 3 | const HistogramIterationValue_1 = require("./HistogramIterationValue");
|
---|
| 4 | /**
|
---|
| 5 | * Used for iterating through histogram values.
|
---|
| 6 | */
|
---|
| 7 | class JsHistogramIterator /* implements Iterator<HistogramIterationValue> */ {
|
---|
| 8 | constructor() {
|
---|
| 9 | this.currentIterationValue = new HistogramIterationValue_1.default();
|
---|
| 10 | }
|
---|
| 11 | resetIterator(histogram) {
|
---|
| 12 | this.histogram = histogram;
|
---|
| 13 | this.savedHistogramTotalRawCount = histogram.totalCount;
|
---|
| 14 | this.arrayTotalCount = histogram.totalCount;
|
---|
| 15 | this.currentIndex = 0;
|
---|
| 16 | this.currentValueAtIndex = 0;
|
---|
| 17 | this.nextValueAtIndex = Math.pow(2, histogram.unitMagnitude);
|
---|
| 18 | this.prevValueIteratedTo = 0;
|
---|
| 19 | this.totalCountToPrevIndex = 0;
|
---|
| 20 | this.totalCountToCurrentIndex = 0;
|
---|
| 21 | this.totalValueToCurrentIndex = 0;
|
---|
| 22 | this.countAtThisValue = 0;
|
---|
| 23 | this.freshSubBucket = true;
|
---|
| 24 | this.currentIterationValue.reset();
|
---|
| 25 | }
|
---|
| 26 | /**
|
---|
| 27 | * Returns true if the iteration has more elements. (In other words, returns true if next would return an
|
---|
| 28 | * element rather than throwing an exception.)
|
---|
| 29 | *
|
---|
| 30 | * @return true if the iterator has more elements.
|
---|
| 31 | */
|
---|
| 32 | hasNext() {
|
---|
| 33 | if (this.histogram.totalCount !== this.savedHistogramTotalRawCount) {
|
---|
| 34 | throw "Concurrent Modification Exception";
|
---|
| 35 | }
|
---|
| 36 | return this.totalCountToCurrentIndex < this.arrayTotalCount;
|
---|
| 37 | }
|
---|
| 38 | /**
|
---|
| 39 | * Returns the next element in the iteration.
|
---|
| 40 | *
|
---|
| 41 | * @return the {@link HistogramIterationValue} associated with the next element in the iteration.
|
---|
| 42 | */
|
---|
| 43 | next() {
|
---|
| 44 | // Move through the sub buckets and buckets until we hit the next reporting level:
|
---|
| 45 | while (!this.exhaustedSubBuckets()) {
|
---|
| 46 | this.countAtThisValue = this.histogram.getCountAtIndex(this.currentIndex);
|
---|
| 47 | if (this.freshSubBucket) {
|
---|
| 48 | // Don't add unless we've incremented since last bucket...
|
---|
| 49 | this.totalCountToCurrentIndex += this.countAtThisValue;
|
---|
| 50 | this.totalValueToCurrentIndex +=
|
---|
| 51 | this.countAtThisValue *
|
---|
| 52 | this.histogram.highestEquivalentValue(this.currentValueAtIndex);
|
---|
| 53 | this.freshSubBucket = false;
|
---|
| 54 | }
|
---|
| 55 | if (this.reachedIterationLevel()) {
|
---|
| 56 | const valueIteratedTo = this.getValueIteratedTo();
|
---|
| 57 | Object.assign(this.currentIterationValue, {
|
---|
| 58 | valueIteratedTo,
|
---|
| 59 | valueIteratedFrom: this.prevValueIteratedTo,
|
---|
| 60 | countAtValueIteratedTo: this.countAtThisValue,
|
---|
| 61 | countAddedInThisIterationStep: this.totalCountToCurrentIndex - this.totalCountToPrevIndex,
|
---|
| 62 | totalCountToThisValue: this.totalCountToCurrentIndex,
|
---|
| 63 | totalValueToThisValue: this.totalValueToCurrentIndex,
|
---|
| 64 | percentile: (100 * this.totalCountToCurrentIndex) / this.arrayTotalCount,
|
---|
| 65 | percentileLevelIteratedTo: this.getPercentileIteratedTo(),
|
---|
| 66 | });
|
---|
| 67 | this.prevValueIteratedTo = valueIteratedTo;
|
---|
| 68 | this.totalCountToPrevIndex = this.totalCountToCurrentIndex;
|
---|
| 69 | this.incrementIterationLevel();
|
---|
| 70 | if (this.histogram.totalCount !== this.savedHistogramTotalRawCount) {
|
---|
| 71 | throw new Error("Concurrent Modification Exception");
|
---|
| 72 | }
|
---|
| 73 | return this.currentIterationValue;
|
---|
| 74 | }
|
---|
| 75 | this.incrementSubBucket();
|
---|
| 76 | }
|
---|
| 77 | throw new Error("Index Out Of Bounds Exception");
|
---|
| 78 | }
|
---|
| 79 | getPercentileIteratedTo() {
|
---|
| 80 | return (100 * this.totalCountToCurrentIndex) / this.arrayTotalCount;
|
---|
| 81 | }
|
---|
| 82 | getPercentileIteratedFrom() {
|
---|
| 83 | return (100 * this.totalCountToPrevIndex) / this.arrayTotalCount;
|
---|
| 84 | }
|
---|
| 85 | getValueIteratedTo() {
|
---|
| 86 | return this.histogram.highestEquivalentValue(this.currentValueAtIndex);
|
---|
| 87 | }
|
---|
| 88 | exhaustedSubBuckets() {
|
---|
| 89 | return this.currentIndex >= this.histogram.countsArrayLength;
|
---|
| 90 | }
|
---|
| 91 | incrementSubBucket() {
|
---|
| 92 | this.freshSubBucket = true;
|
---|
| 93 | this.currentIndex++;
|
---|
| 94 | this.currentValueAtIndex = this.histogram.valueFromIndex(this.currentIndex);
|
---|
| 95 | this.nextValueAtIndex = this.histogram.valueFromIndex(this.currentIndex + 1);
|
---|
| 96 | }
|
---|
| 97 | }
|
---|
| 98 | exports.default = JsHistogramIterator;
|
---|
| 99 | //# sourceMappingURL=JsHistogramIterator.js.map |
---|