From c1fac13d6bedf8140a5b6ed0eb3451f1540c70c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Fri, 2 Jun 2017 12:45:34 +0200 Subject: [PATCH] Be able to accept timezone parameter --- lib/cartodb/backends/dataview.js | 2 +- lib/cartodb/controllers/base.js | 1 + lib/cartodb/models/dataview/histogram.js | 13 +++---------- test/acceptance/dataviews/histogram.js | 18 ++++++++++++++++++ test/support/test-client.js | 2 +- 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/lib/cartodb/backends/dataview.js b/lib/cartodb/backends/dataview.js index 84f0ccef..dc43f864 100644 --- a/lib/cartodb/backends/dataview.js +++ b/lib/cartodb/backends/dataview.js @@ -80,7 +80,7 @@ DataviewBackend.prototype.getDataview = function (mapConfigProvider, user, param overviewsQueryRewriter, queryRewriteData, { bbox: params.bbox } ); - var overrideParams = _.reduce(_.pick(params, 'start', 'end', 'bins'), + var overrideParams = _.reduce(_.pick(params, 'start', 'end', 'bins', 'timezone'), function castNumbers(overrides, val, k) { if (!Number.isFinite(+val)) { throw new Error('Invalid number format for parameter \'' + k + '\''); diff --git a/lib/cartodb/controllers/base.js b/lib/cartodb/controllers/base.js index 6ce49fa4..91fcaba7 100644 --- a/lib/cartodb/controllers/base.js +++ b/lib/cartodb/controllers/base.js @@ -26,6 +26,7 @@ var REQUEST_QUERY_PARAMS_WHITELIST = [ 'end', // number 'column_type', // string 'aggregation', //string + 'timezone', // number // widgets search 'q' ]; diff --git a/lib/cartodb/models/dataview/histogram.js b/lib/cartodb/models/dataview/histogram.js index dd3baf95..649bd0f2 100644 --- a/lib/cartodb/models/dataview/histogram.js +++ b/lib/cartodb/models/dataview/histogram.js @@ -110,15 +110,6 @@ var dateBasicsQueryTpl = dot.template([ ')' ].join(' \n')); -var overrideBasicsQueryTpl = dot.template([ - 'basics AS (', - ' SELECT', - ' max({{=it._end}}) AS max_val, min({{=it._start}}) AS min_val,', - ' avg({{=it._column}}) AS avg_val, count(1) AS total_rows', - ' FROM ({{=it._query}}) _cdb_basics', - ')' -].join('\n')); - var dateOverrideBasicsQueryTpl = dot.template([ 'basics AS (', ' SELECT', @@ -156,13 +147,14 @@ var dateHistogramQueryTpl = dot.template([ ' THEN 0', ' ELSE GREATEST(1, LEAST(WIDTH_BUCKET({{=it._column}}, bins_array), bins_number)) - 1', ' END AS bin,', + ' date_part(\'epoch\', start_date)::numeric AS bin_start,', ' min(date_part(\'epoch\', {{=it._column}}))::numeric AS min,', ' max(date_part(\'epoch\', {{=it._column}}))::numeric AS max,', ' avg(date_part(\'epoch\', {{=it._column}}))::numeric AS avg,', ' count(*) AS freq', 'FROM ({{=it._query}}) _cdb_histogram, basics, bins, nulls', 'WHERE date_part(\'epoch\', {{=it._column}}) IS NOT NULL', - 'GROUP BY bin, bins_number, bin_width, nulls_count, avg_val', + 'GROUP BY bin, bins_number, bin_width, nulls_count, avg_val, start_date', 'ORDER BY bin' ].join('\n')); @@ -187,6 +179,7 @@ function Histogram(query, options, queries) { this.column = options.column; this.bins = options.bins; this.aggregation = options.aggregation; + this.timezone = options.timezone; this._columnType = null; } diff --git a/test/acceptance/dataviews/histogram.js b/test/acceptance/dataviews/histogram.js index 294c9106..06fc6b80 100644 --- a/test/acceptance/dataviews/histogram.js +++ b/test/acceptance/dataviews/histogram.js @@ -204,4 +204,22 @@ describe('histogram-dataview for date column type', function() { }); }); + it.skip('should aggregate respecting timezone', function (done) { + var params = { + timezone: -7200 // GMT -2h + }; + + this.testClient = new TestClient(mapConfig, 1234); + this.testClient.getDataview('date_histogram', params, function(err, dataview) { + assert.ok(!err, err); + assert.equal(dataview.type, 'histogram'); + assert.ok(dataview.bin_width > 0, 'Unexpected bin width: ' + dataview.bin_width); + assert.equal(dataview.bins.length, 5); + dataview.bins.forEach(function(bin) { + assert.ok(bin.min <= bin.max, 'bin min < bin max: ' + JSON.stringify(bin)); + }); + + done(); + }); + }); }); diff --git a/test/support/test-client.js b/test/support/test-client.js index 1913d018..dc36929e 100644 --- a/test/support/test-client.js +++ b/test/support/test-client.js @@ -369,7 +369,7 @@ TestClient.prototype.getDataview = function(dataviewName, params, callback) { own_filter: params.hasOwnProperty('own_filter') ? params.own_filter : 1 }; - ['bbox', 'bins', 'start', 'end', 'aggregation'].forEach(function(extraParam) { + ['bbox', 'bins', 'start', 'end', 'aggregation', 'timezone'].forEach(function(extraParam) { if (params.hasOwnProperty(extraParam)) { urlParams[extraParam] = params[extraParam]; }