From 5e9b2e45c7a1698e0fa617f2c9d9fb6bf825dbe7 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 11 Sep 2017 11:30:09 +0200 Subject: [PATCH] creating HistogramBase with the common functions of NumericHistogram and DateHistogram --- lib/cartodb/models/dataview/histogram.js | 4 +- .../{ => histograms}/date-histogram.js | 77 +------------------ .../dataview/histograms/histogramBase.js | 77 +++++++++++++++++++ .../{ => histograms}/numeric-histogram.js | 76 +----------------- 4 files changed, 86 insertions(+), 148 deletions(-) rename lib/cartodb/models/dataview/{ => histograms}/date-histogram.js (85%) create mode 100644 lib/cartodb/models/dataview/histograms/histogramBase.js rename lib/cartodb/models/dataview/{ => histograms}/numeric-histogram.js (79%) diff --git a/lib/cartodb/models/dataview/histogram.js b/lib/cartodb/models/dataview/histogram.js index e4179df6..7e0f71bf 100644 --- a/lib/cartodb/models/dataview/histogram.js +++ b/lib/cartodb/models/dataview/histogram.js @@ -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'; diff --git a/lib/cartodb/models/dataview/date-histogram.js b/lib/cartodb/models/dataview/histograms/date-histogram.js similarity index 85% rename from lib/cartodb/models/dataview/date-histogram.js rename to lib/cartodb/models/dataview/histograms/date-histogram.js index a0ba927c..064de0ae 100644 --- a/lib/cartodb/models/dataview/date-histogram.js +++ b/lib/cartodb/models/dataview/histograms/date-histogram.js @@ -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'; diff --git a/lib/cartodb/models/dataview/histograms/histogramBase.js b/lib/cartodb/models/dataview/histograms/histogramBase.js new file mode 100644 index 00000000..dc6c40d6 --- /dev/null +++ b/lib/cartodb/models/dataview/histograms/histogramBase.js @@ -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; + } +}; \ No newline at end of file diff --git a/lib/cartodb/models/dataview/numeric-histogram.js b/lib/cartodb/models/dataview/histograms/numeric-histogram.js similarity index 79% rename from lib/cartodb/models/dataview/numeric-histogram.js rename to lib/cartodb/models/dataview/histograms/numeric-histogram.js index da6792dc..2c6ac8e6 100644 --- a/lib/cartodb/models/dataview/numeric-histogram.js +++ b/lib/cartodb/models/dataview/histograms/numeric-histogram.js @@ -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; - } };