creating HistogramBase with the common functions of NumericHistogram and DateHistogram

This commit is contained in:
Simon
2017-09-11 11:32:20 +02:00
parent e4a20fa954
commit 5e9b2e45c7
4 changed files with 86 additions and 148 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
const debug = require('debug')('windshaft:dataview:histogram');
const NumericHistogram = require('./numeric-histogram');
const DateHistogram = require('./date-histogram');
const NumericHistogram = require('./histograms/numeric-histogram');
const DateHistogram = require('./histograms/date-histogram');
const DATE_HISTOGRAM = 'DateHistogram';
const NUMERIC_HISTOGRAM = 'NumericHistogram';
@@ -1,4 +1,4 @@
const BaseDataview = require('./base');
const HistogramBase = require('./histogramBase');
const dateIntervalQueryTpl = ctx => `
WITH
@@ -144,8 +144,6 @@ const dateHistogramQueryTpl = ctx => `
const MAX_INTERVAL_VALUE = 366;
const TYPE = 'histogram';
const DATE_AGGREGATIONS = {
'auto': true,
'minute': true,
@@ -167,45 +165,12 @@ const DATE_AGGREGATIONS = {
}
}
*/
module.exports = class DateHistogram extends BaseDataview {
module.exports = class DateHistogram extends HistogramBase {
constructor (query, options, queries) {
super();
if (typeof options.column !== 'string') {
throw new Error('Histogram expects `column` in widget options');
}
this.query = query;
this.queries = queries;
this.column = options.column;
this.bins = options.bins;
super(query, options, queries);
this.aggregation = options.aggregation;
this.offset = options.offset;
this._columnType = null;
}
sql (psql, override, callback) {
if (!callback) {
callback = override;
override = {};
}
if (this._columnType === null) {
this.getColumnType(psql, this.column, this.queries.no_filters, (err, type) => {
// assume numeric, will fail later
this._columnType = 'numeric';
if (!err && !!type) {
this._columnType = Object.keys(type).find(function (key) {
return type[key];
});
}
this.sql(psql, override, callback);
}, true); // use read-only transaction
return null;
}
return this._buildQuery(psql, override, callback);
}
_buildQueryTpl (ctx) {
@@ -344,18 +309,6 @@ module.exports = class DateHistogram extends BaseDataview {
};
}
getType () {
return TYPE;
}
toString () {
return JSON.stringify({
_type: TYPE,
_column: this.column,
_query: this.query
});
}
_getAggregation (override) {
return override && override.aggregation ? override.aggregation : this.aggregation;
}
@@ -392,28 +345,6 @@ module.exports = class DateHistogram extends BaseDataview {
return binStart;
}
_getBinEnd (override) {
if (override.hasOwnProperty('start') && override.hasOwnProperty('end')) {
return Math.max(override.start, override.end);
}
return override.end || 0;
}
_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;
}
_parseOffset (offset, aggregation) {
if (!offset) {
return '0';
@@ -0,0 +1,77 @@
const BaseDataview = require('../base');
const TYPE = 'histogram';
module.exports = class HistogramBase extends BaseDataview {
constructor (query, options, queries) {
super();
if (typeof options.column !== 'string') {
throw new Error('Histogram expects `column` in widget options');
}
this.query = query;
this.queries = queries;
this.column = options.column;
this.bins = options.bins;
this._columnType = null;
}
sql (psql, override, callback) {
if (!callback) {
callback = override;
override = {};
}
if (this._columnType === null) {
this.getColumnType(psql, this.column, this.queries.no_filters, (err, type) => {
// assume numeric, will fail later
this._columnType = 'numeric';
if (!err && !!type) {
this._columnType = Object.keys(type).find(function (key) {
return type[key];
});
}
this.sql(psql, override, callback);
}, true); // use read-only transaction
return null;
}
return this._buildQuery(psql, override, callback);
}
getType () {
return TYPE;
}
toString () {
return JSON.stringify({
_type: TYPE,
_column: this.column,
_query: this.query
});
}
_getBinEnd (override) {
if (override.hasOwnProperty('start') && override.hasOwnProperty('end')) {
return Math.max(override.start, override.end);
}
return override.end || 0;
}
_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;
}
};
@@ -1,4 +1,4 @@
const BaseDataview = require('./base');
const HistogramBase = require('./histogramBase');
const columnCastTpl = ctx => `date_part('epoch', ${ctx.column})`;
@@ -149,8 +149,6 @@ const histogramQueryTpl = ctx => `
const BIN_MIN_NUMBER = 6;
const BIN_MAX_NUMBER = 48;
const TYPE = 'histogram';
/**
Numeric histogram:
{
@@ -161,46 +159,11 @@ Numeric histogram:
}
}
*/
module.exports = class NumericHistogram extends BaseDataview {
module.exports = class NumericHistogram extends HistogramBase {
constructor (query, options, queries) {
super();
if (typeof options.column !== 'string') {
throw new Error('Histogram expects `column` in widget options');
}
this.query = query;
this.queries = queries;
this.column = options.column;
this.bins = options.bins;
this._columnType = null;
super(query, options, queries);
}
sql (psql, override, callback) {
if (!callback) {
callback = override;
override = {};
}
if (this._columnType === null) {
this.getColumnType(psql, this.column, this.queries.no_filters, (err, type) => {
// assume numeric, will fail later
this._columnType = 'numeric';
if (!err && !!type) {
this._columnType = Object.keys(type).find(function (key) {
return type[key];
});
}
this.sql(psql, override, callback);
}, true); // use read-only transaction
return null;
}
return this._buildQuery(psql, override, callback);
}
_buildQuery (psql, override, callback) {
const histogramSql = this._buildQueryTpl({
_override: override,
@@ -283,18 +246,6 @@ module.exports = class NumericHistogram extends BaseDataview {
};
}
getType () {
return TYPE;
}
toString () {
return JSON.stringify({
_type: TYPE,
_column: this.column,
_query: this.query
});
}
_getBinStart (override) {
if (override.hasOwnProperty('start') && override.hasOwnProperty('end')) {
return Math.min(override.start, override.end);
@@ -314,25 +265,4 @@ module.exports = class NumericHistogram extends BaseDataview {
return binStart;
}
_getBinEnd (override) {
if (override.hasOwnProperty('start') && override.hasOwnProperty('end')) {
return Math.max(override.start, override.end);
}
return override.end || 0;
}
_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;
}
};