Be able to accept timezone parameter

This commit is contained in:
Daniel García Aubert 2017-06-02 12:45:34 +02:00
parent 6374d2e4b6
commit c1fac13d6b
5 changed files with 24 additions and 12 deletions

View File

@ -80,7 +80,7 @@ DataviewBackend.prototype.getDataview = function (mapConfigProvider, user, param
overviewsQueryRewriter, queryRewriteData, { bbox: params.bbox } 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) { function castNumbers(overrides, val, k) {
if (!Number.isFinite(+val)) { if (!Number.isFinite(+val)) {
throw new Error('Invalid number format for parameter \'' + k + '\''); throw new Error('Invalid number format for parameter \'' + k + '\'');

View File

@ -26,6 +26,7 @@ var REQUEST_QUERY_PARAMS_WHITELIST = [
'end', // number 'end', // number
'column_type', // string 'column_type', // string
'aggregation', //string 'aggregation', //string
'timezone', // number
// widgets search // widgets search
'q' 'q'
]; ];

View File

@ -110,15 +110,6 @@ var dateBasicsQueryTpl = dot.template([
')' ')'
].join(' \n')); ].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([ var dateOverrideBasicsQueryTpl = dot.template([
'basics AS (', 'basics AS (',
' SELECT', ' SELECT',
@ -156,13 +147,14 @@ var dateHistogramQueryTpl = dot.template([
' THEN 0', ' THEN 0',
' ELSE GREATEST(1, LEAST(WIDTH_BUCKET({{=it._column}}, bins_array), bins_number)) - 1', ' ELSE GREATEST(1, LEAST(WIDTH_BUCKET({{=it._column}}, bins_array), bins_number)) - 1',
' END AS bin,', ' END AS bin,',
' date_part(\'epoch\', start_date)::numeric AS bin_start,',
' min(date_part(\'epoch\', {{=it._column}}))::numeric AS min,', ' min(date_part(\'epoch\', {{=it._column}}))::numeric AS min,',
' max(date_part(\'epoch\', {{=it._column}}))::numeric AS max,', ' max(date_part(\'epoch\', {{=it._column}}))::numeric AS max,',
' avg(date_part(\'epoch\', {{=it._column}}))::numeric AS avg,', ' avg(date_part(\'epoch\', {{=it._column}}))::numeric AS avg,',
' count(*) AS freq', ' count(*) AS freq',
'FROM ({{=it._query}}) _cdb_histogram, basics, bins, nulls', 'FROM ({{=it._query}}) _cdb_histogram, basics, bins, nulls',
'WHERE date_part(\'epoch\', {{=it._column}}) IS NOT NULL', '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' 'ORDER BY bin'
].join('\n')); ].join('\n'));
@ -187,6 +179,7 @@ function Histogram(query, options, queries) {
this.column = options.column; this.column = options.column;
this.bins = options.bins; this.bins = options.bins;
this.aggregation = options.aggregation; this.aggregation = options.aggregation;
this.timezone = options.timezone;
this._columnType = null; this._columnType = null;
} }

View File

@ -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();
});
});
}); });

View File

@ -369,7 +369,7 @@ TestClient.prototype.getDataview = function(dataviewName, params, callback) {
own_filter: params.hasOwnProperty('own_filter') ? params.own_filter : 1 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)) { if (params.hasOwnProperty(extraParam)) {
urlParams[extraParam] = params[extraParam]; urlParams[extraParam] = params[extraParam];
} }