Implement template method pattern to format histogram query output
This commit is contained in:
@@ -41,6 +41,12 @@ module.exports = class BaseHistogram extends BaseDataview {
|
||||
return this._buildQuery(psql, override, callback);
|
||||
}
|
||||
|
||||
format (result, override) {
|
||||
const histogram = this._getSummary(result, override);
|
||||
histogram.bins = this._getBuckets(result);
|
||||
return histogram;
|
||||
}
|
||||
|
||||
getType () {
|
||||
return TYPE;
|
||||
}
|
||||
@@ -53,25 +59,21 @@ module.exports = class BaseHistogram extends BaseDataview {
|
||||
});
|
||||
}
|
||||
|
||||
_getBinEnd (override) {
|
||||
_getBinStart (override) {
|
||||
if (override.hasOwnProperty('start') && override.hasOwnProperty('end')) {
|
||||
return Math.min(override.start, override.end);
|
||||
}
|
||||
return override.start || 0;
|
||||
}
|
||||
|
||||
_getBinEnd (override = {}) {
|
||||
if (override.hasOwnProperty('start') && override.hasOwnProperty('end')) {
|
||||
return Math.max(override.start, override.end);
|
||||
}
|
||||
return override.end || 0;
|
||||
}
|
||||
|
||||
_getBinsCount (override) {
|
||||
_getBinsCount (override = {}) {
|
||||
return override.bins || 0;
|
||||
}
|
||||
|
||||
_getWidth (override) {
|
||||
let width = 0;
|
||||
const binsCount = override.bins;
|
||||
|
||||
if (binsCount && Number.isFinite(override.start) && Number.isFinite(override.end)) {
|
||||
width = (override.end - override.start) / binsCount;
|
||||
}
|
||||
|
||||
return width;
|
||||
}
|
||||
};
|
||||
@@ -259,90 +259,37 @@ module.exports = class DateHistogram extends BaseHistogram {
|
||||
});
|
||||
}
|
||||
|
||||
format (result, override) {
|
||||
override = override || {};
|
||||
let buckets = [];
|
||||
|
||||
let binsCount = this._getBinsCount(override);
|
||||
let width = this._getWidth(override);
|
||||
let binsStart = this._getBinStart(override);
|
||||
let nulls = 0;
|
||||
let infinities = 0;
|
||||
let nans = 0;
|
||||
let avg;
|
||||
let timestampStart;
|
||||
let aggregation;
|
||||
let offset;
|
||||
|
||||
if (result.rows.length) {
|
||||
const firstRow = result.rows[0];
|
||||
binsCount = firstRow.bins_number;
|
||||
width = firstRow.bin_width || width;
|
||||
avg = firstRow.avg_val;
|
||||
nulls = firstRow.nulls_count;
|
||||
timestampStart = firstRow.timestamp_start;
|
||||
infinities = firstRow.infinities_count;
|
||||
nans = firstRow.nans_count;
|
||||
binsStart = this._populateBinStart(override, firstRow);
|
||||
|
||||
aggregation = this._getAggregation(override);
|
||||
offset = this._getOffset(override);
|
||||
|
||||
buckets = result.rows.map(row => {
|
||||
const { bin, min, max, avg, freq, timestamp } = row;
|
||||
return { bin, min, max, avg, freq, timestamp };
|
||||
});
|
||||
}
|
||||
_getSummary (result, override) {
|
||||
const firstRow = result.rows[0] || {};
|
||||
|
||||
return {
|
||||
aggregation: aggregation,
|
||||
offset: offset,
|
||||
timestamp_start: timestampStart,
|
||||
bin_width: width,
|
||||
bins_count: binsCount,
|
||||
bins_start: binsStart,
|
||||
nulls: nulls,
|
||||
infinities: infinities,
|
||||
nans: nans,
|
||||
avg: avg,
|
||||
bins: buckets
|
||||
aggregation: this._getAggregation(override),
|
||||
offset: this._getOffset(override),
|
||||
timestamp_start: firstRow.timestamp_start,
|
||||
|
||||
bin_width: firstRow.bin_width,
|
||||
bins_count: firstRow.bins_number,
|
||||
bins_start: firstRow.timestamp,
|
||||
nulls: firstRow.nulls_count,
|
||||
infinities: firstRow.infinities_count,
|
||||
nans: firstRow.nans_count,
|
||||
avg: firstRow.avg_val
|
||||
};
|
||||
}
|
||||
|
||||
_getAggregation (override) {
|
||||
_getBuckets (result) {
|
||||
return result.rows.map(row => {
|
||||
const { bin, min, max, avg, freq, timestamp } = row;
|
||||
return { bin, min, max, avg, freq, timestamp };
|
||||
});
|
||||
}
|
||||
|
||||
_getAggregation (override = {}) {
|
||||
return override && override.aggregation ? override.aggregation : this.aggregation;
|
||||
}
|
||||
|
||||
_getOffset (override) {
|
||||
if (override && override.offset) {
|
||||
return override.offset;
|
||||
}
|
||||
if (this.offset) {
|
||||
return this.offset;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
_getBinStart (override) {
|
||||
if (override.hasOwnProperty('start') && override.hasOwnProperty('end')) {
|
||||
return Math.min(override.start, override.end);
|
||||
}
|
||||
return override.start || 0;
|
||||
}
|
||||
|
||||
_populateBinStart (override, firstRow) {
|
||||
let binStart;
|
||||
|
||||
if (firstRow.hasOwnProperty('timestamp')) {
|
||||
binStart = firstRow.timestamp;
|
||||
} else if (override.hasOwnProperty('start')) {
|
||||
binStart = this._getBinStart(override);
|
||||
} else {
|
||||
binStart = firstRow.min;
|
||||
}
|
||||
|
||||
return binStart;
|
||||
_getOffset (override = {}) {
|
||||
return override.offset || this.offset || 0;
|
||||
}
|
||||
|
||||
_parseOffset (offset, aggregation) {
|
||||
|
||||
@@ -182,14 +182,14 @@ module.exports = class NumericHistogram extends BaseHistogram {
|
||||
_buildQueryTpl (ctx) {
|
||||
return `
|
||||
WITH
|
||||
${filteredQueryTpl(ctx)},
|
||||
${this._shouldOverride(ctx._override) ? overrideBasicsQueryTpl(ctx) : basicsQueryTpl(ctx)},
|
||||
${this._shouldOverrideRange(ctx._override) || this._shouldOverrideBins(ctx._override) ?
|
||||
overrideBinsQueryTpl(ctx) :
|
||||
`${iqrQueryTpl(ctx)}, ${binsQueryTpl(ctx)}`
|
||||
},
|
||||
${nullsQueryTpl(ctx)}
|
||||
${ctx._isFloatColumn ? `,${infinitiesQueryTpl(ctx)}, ${nansQueryTpl(ctx)}` : ''}
|
||||
${filteredQueryTpl(ctx)},
|
||||
${this._shouldOverride(ctx._override) ? overrideBasicsQueryTpl(ctx) : basicsQueryTpl(ctx)},
|
||||
${this._shouldOverrideRange(ctx._override) || this._shouldOverrideBins(ctx._override) ?
|
||||
overrideBinsQueryTpl(ctx) :
|
||||
`${iqrQueryTpl(ctx)}, ${binsQueryTpl(ctx)}`
|
||||
},
|
||||
${nullsQueryTpl(ctx)}
|
||||
${ctx._isFloatColumn ? `,${infinitiesQueryTpl(ctx)}, ${nansQueryTpl(ctx)}` : ''}
|
||||
${histogramQueryTpl(ctx)}
|
||||
`;
|
||||
}
|
||||
@@ -206,54 +206,28 @@ module.exports = class NumericHistogram extends BaseHistogram {
|
||||
return override && override.hasOwnProperty('bins');
|
||||
}
|
||||
|
||||
format (result, override) {
|
||||
override = override || {};
|
||||
let buckets = [];
|
||||
|
||||
let binsCount = this._getBinsCount(override);
|
||||
let width = this._getWidth(override);
|
||||
let binsStart = this._getBinStart(override);
|
||||
let nulls = 0;
|
||||
let infinities = 0;
|
||||
let nans = 0;
|
||||
let avg;
|
||||
|
||||
if (result.rows.length) {
|
||||
const firstRow = result.rows[0];
|
||||
binsCount = firstRow.bins_number;
|
||||
width = firstRow.bin_width || width;
|
||||
avg = firstRow.avg_val;
|
||||
nulls = firstRow.nulls_count;
|
||||
infinities = firstRow.infinities_count;
|
||||
nans = firstRow.nans_count;
|
||||
binsStart = this._populateBinStart(override, firstRow);
|
||||
|
||||
buckets = result.rows.map(row => {
|
||||
const { bin, min, max, avg, freq } = row;
|
||||
return { bin, min, max, avg, freq };
|
||||
});
|
||||
}
|
||||
_getSummary (result, override) {
|
||||
const firstRow = result.rows[0] || {};
|
||||
|
||||
return {
|
||||
bin_width: width,
|
||||
bins_count: binsCount,
|
||||
bins_start: binsStart,
|
||||
nulls: nulls,
|
||||
infinities: infinities,
|
||||
nans: nans,
|
||||
avg: avg,
|
||||
bins: buckets
|
||||
bin_width: firstRow.bin_width,
|
||||
bins_count: firstRow.bins_number,
|
||||
bins_start: this._populateBinStart(firstRow, override),
|
||||
nulls: firstRow.nulls_count,
|
||||
infinities: firstRow.infinities_count,
|
||||
nans: firstRow.nans_count,
|
||||
avg: firstRow.avg_val,
|
||||
};
|
||||
}
|
||||
|
||||
_getBinStart (override) {
|
||||
if (override.hasOwnProperty('start') && override.hasOwnProperty('end')) {
|
||||
return Math.min(override.start, override.end);
|
||||
}
|
||||
return override.start || 0;
|
||||
_getBuckets (result) {
|
||||
return result.rows.map(row => {
|
||||
const { bin, min, max, avg, freq } = row;
|
||||
return { bin, min, max, avg, freq };
|
||||
});
|
||||
}
|
||||
|
||||
_populateBinStart (override, firstRow) {
|
||||
_populateBinStart (firstRow, override = {}) {
|
||||
let binStart;
|
||||
|
||||
if (override.hasOwnProperty('start')) {
|
||||
|
||||
Reference in New Issue
Block a user