From 086eff01a907e7dc69039a47e51075914ee961f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Thu, 14 Sep 2017 15:57:18 +0200 Subject: [PATCH] Use ES6 class syntax --- lib/cartodb/models/dataview/aggregation.js | 285 ++++++++++----------- 1 file changed, 142 insertions(+), 143 deletions(-) diff --git a/lib/cartodb/models/dataview/aggregation.js b/lib/cartodb/models/dataview/aggregation.js index 575c7202..039cbea0 100644 --- a/lib/cartodb/models/dataview/aggregation.js +++ b/lib/cartodb/models/dataview/aggregation.js @@ -163,112 +163,158 @@ const TYPE = 'aggregation'; } } */ -function Aggregation(query, options = {}, queries = {}) { - if (typeof options.column !== 'string') { - throw new Error(`Aggregation expects 'column' in widget options`); +module.exports = class Aggregation extends BaseWidget { + constructor (query, options = {}, queries = {}) { + super(); + + if (typeof options.column !== 'string') { + throw new Error(`Aggregation expects 'column' in widget options`); + } + + if (typeof options.aggregation !== 'string') { + throw new Error(`Aggregation expects 'aggregation' operation in widget options`); + } + + if (!VALID_OPERATIONS[options.aggregation]) { + throw new Error(`Aggregation does not support '${options.aggregation}' operation`); + } + + var requiredOptions = VALID_OPERATIONS[options.aggregation]; + var missingOptions = requiredOptions.filter(requiredOption => !options.hasOwnProperty(requiredOption)); + + if (missingOptions.length > 0) { + throw new Error( + `Aggregation '${options.aggregation}' is missing some options: ${missingOptions.join(',')}` + ); + } + + this.query = query; + this.queries = queries; + this.column = options.column; + this.aggregation = options.aggregation; + this.aggregationColumn = options.aggregationColumn; + this._isFloatColumn = null; } - if (typeof options.aggregation !== 'string') { - throw new Error(`Aggregation expects 'aggregation' operation in widget options`); - } + sql (psql, override, callback) { + var self = this; - if (!VALID_OPERATIONS[options.aggregation]) { - throw new Error(`Aggregation does not support '${options.aggregation}' operation`); - } + if (!callback) { + callback = override; + override = {}; + } - var requiredOptions = VALID_OPERATIONS[options.aggregation]; - var missingOptions = requiredOptions.filter(requiredOption => !options.hasOwnProperty(requiredOption)); + if (this.aggregationColumn && this._isFloatColumn === null) { + this._isFloatColumn = false; + this.getColumnType(psql, this.aggregationColumn, this.queries.no_filters, function (err, type) { + if (!err && !!type) { + self._isFloatColumn = type.float; + } + self.sql(psql, override, callback); + }); + return null; + } - if (missingOptions.length > 0) { - throw new Error(`Aggregation '${options.aggregation}' is missing some options: ${missingOptions.join(',')}`); - } - - BaseWidget.apply(this); - - this.query = query; - this.queries = queries; - this.column = options.column; - this.aggregation = options.aggregation; - this.aggregationColumn = options.aggregationColumn; - this._isFloatColumn = null; -} - -Aggregation.prototype = new BaseWidget(); -Aggregation.prototype.constructor = Aggregation; - -module.exports = Aggregation; - -Aggregation.prototype.sql = function(psql, override, callback) { - var self = this; - - if (!callback) { - callback = override; - override = {}; - } - - if (this.aggregationColumn && this._isFloatColumn === null) { - this._isFloatColumn = false; - this.getColumnType(psql, this.aggregationColumn, this.queries.no_filters, function (err, type) { - if (!err && !!type) { - self._isFloatColumn = type.float; - } - self.sql(psql, override, callback); - }); - return null; - } - - var aggregationSql = aggregationDataviewQueryTpl({ - override: override, - query: this.query, - column: this.column, - aggregation: this.aggregation, - aggregationColumn: this.aggregation !== 'count' ? this.aggregationColumn : null, - aggregationFn: aggregationFnQueryTpl({ + var aggregationSql = aggregationDataviewQueryTpl({ + override: override, + query: this.query, + column: this.column, aggregation: this.aggregation, - aggregationColumn: this.aggregationColumn || 1 - }), - isFloatColumn: this._isFloatColumn, - limit: CATEGORIES_LIMIT - }); + aggregationColumn: this.aggregation !== 'count' ? this.aggregationColumn : null, + aggregationFn: aggregationFnQueryTpl({ + aggregation: this.aggregation, + aggregationColumn: this.aggregationColumn || 1 + }), + isFloatColumn: this._isFloatColumn, + limit: CATEGORIES_LIMIT + }); - debug(aggregationSql); + debug(aggregationSql); - return callback(null, aggregationSql); -}; - -Aggregation.prototype.format = function(result) { - var categories = []; - var count = 0; - var nulls = 0; - var nans = 0; - var infinities = 0; - var minValue = 0; - var maxValue = 0; - var categoriesCount = 0; - - if (result.rows.length) { - var firstRow = result.rows[0]; - count = firstRow.count; - nulls = firstRow.nulls_count; - nans = firstRow.nans_count; - infinities = firstRow.infinities_count; - minValue = firstRow.min_val; - maxValue = firstRow.max_val; - categoriesCount = firstRow.categories_count; - categories = result.rows.map(({ category, value, agg }) => ({ category, value, agg })); + return callback(null, aggregationSql); } - return { - aggregation: this.aggregation, - count: count, - nulls: nulls, - nans: nans, - infinities: infinities, - min: minValue, - max: maxValue, - categoriesCount: categoriesCount, - categories: categories - }; + format (result) { + var categories = []; + var count = 0; + var nulls = 0; + var nans = 0; + var infinities = 0; + var minValue = 0; + var maxValue = 0; + var categoriesCount = 0; + + if (result.rows.length) { + var firstRow = result.rows[0]; + count = firstRow.count; + nulls = firstRow.nulls_count; + nans = firstRow.nans_count; + infinities = firstRow.infinities_count; + minValue = firstRow.min_val; + maxValue = firstRow.max_val; + categoriesCount = firstRow.categories_count; + categories = result.rows.map(({ category, value, agg }) => ({ category, value, agg })); + } + + return { + aggregation: this.aggregation, + count: count, + nulls: nulls, + nans: nans, + infinities: infinities, + min: minValue, + max: maxValue, + categoriesCount: categoriesCount, + categories: categories + }; + } + + search (psql, userQuery, callback) { + var self = this; + + var escapedUserQuery = psql.escapeLiteral('%' + userQuery + '%'); + var value = this.aggregation !== 'count' && this.aggregationColumn ? + this.aggregation + '(' + this.aggregationColumn + ')' : 'count(1)'; + + // TODO unfiltered will be wrong as filters are already applied at this point + var query = searchQueryTpl({ + searchUnfiltered: filterCategoriesQueryTpl({ + query: this.query, + column: this.column, + value: '0', + userQuery: escapedUserQuery + }), + searchFiltered: filterCategoriesQueryTpl({ + query: this.query, + column: this.column, + value: value, + userQuery: escapedUserQuery + }) + }); + + debug(query); + + psql.query(query, function(err, result) { + if (err) { + return callback(err, result); + } + + return callback(null, {type: self.getType(), categories: result.rows }); + }, true); // use read-only transaction + } + + getType () { + return TYPE; + } + + toString () { + return JSON.stringify({ + _type: TYPE, + _query: this.query, + _column: this.column, + _aggregation: this.aggregation + }); + } }; const filterCategoriesQueryTpl = ctx => ` @@ -298,50 +344,3 @@ const searchQueryTpl = ctx => ` GROUP BY category ORDER BY value desc `; - -Aggregation.prototype.search = function(psql, userQuery, callback) { - var self = this; - - var escapedUserQuery = psql.escapeLiteral('%' + userQuery + '%'); - var value = this.aggregation !== 'count' && this.aggregationColumn ? - this.aggregation + '(' + this.aggregationColumn + ')' : 'count(1)'; - - // TODO unfiltered will be wrong as filters are already applied at this point - var query = searchQueryTpl({ - searchUnfiltered: filterCategoriesQueryTpl({ - query: this.query, - column: this.column, - value: '0', - userQuery: escapedUserQuery - }), - searchFiltered: filterCategoriesQueryTpl({ - query: this.query, - column: this.column, - value: value, - userQuery: escapedUserQuery - }) - }); - - debug(query); - - psql.query(query, function(err, result) { - if (err) { - return callback(err, result); - } - - return callback(null, {type: self.getType(), categories: result.rows }); - }, true); // use read-only transaction -}; - -Aggregation.prototype.getType = function() { - return TYPE; -}; - -Aggregation.prototype.toString = function() { - return JSON.stringify({ - _type: TYPE, - _query: this.query, - _column: this.column, - _aggregation: this.aggregation - }); -};