Implement template method pattern to format histogram query output

This commit is contained in:
Daniel García Aubert
2017-09-11 17:19:02 +02:00
parent 271932a80d
commit 38e7e71328
3 changed files with 61 additions and 138 deletions
@@ -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')) {