diff --git a/lib/cartodb/backends/dataview.js b/lib/cartodb/backends/dataview.js index b6037ae6..9df22868 100644 --- a/lib/cartodb/backends/dataview.js +++ b/lib/cartodb/backends/dataview.js @@ -24,7 +24,7 @@ module.exports = DataviewBackend; DataviewBackend.prototype.getDataview = function (mapConfigProvider, user, params, callback) { - var dataviewName = params.dataviewName; + var dataviewName = params.dataviewName; step( function getMapConfig() { mapConfigProvider.getMapConfig(this); @@ -94,7 +94,7 @@ function getQueryRewriteData(mapConfig, dataviewDefinition, params) { } function getOverrideParams(params, ownFilter) { - var overrideParams = _.reduce(_.pick(params, 'start', 'end', 'bins', 'offset'), + var overrideParams = _.reduce(_.pick(params, 'start', 'end', 'bins', 'offset', 'categories'), function castNumbers(overrides, val, k) { if (!Number.isFinite(+val)) { throw new Error('Invalid number format for parameter \'' + k + '\''); diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index dc6f85ff..458951c2 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -109,7 +109,8 @@ LayergroupController.prototype.register = function(app) { 'bins', // number 'aggregation', //string 'offset', // number - 'q' // widgets search + 'q', // widgets search + 'categories', // number ]; app.get( diff --git a/lib/cartodb/models/dataview/aggregation.js b/lib/cartodb/models/dataview/aggregation.js index b4c59af2..40774353 100644 --- a/lib/cartodb/models/dataview/aggregation.js +++ b/lib/cartodb/models/dataview/aggregation.js @@ -245,6 +245,10 @@ module.exports = class Aggregation extends BaseDataview { return null; } + const limit = Number.isFinite(override.categories) && override.categories > 0 ? + override.categories : + CATEGORIES_LIMIT; + const aggregationSql = aggregationDataviewQueryTpl({ override: override, query: this.query, @@ -256,7 +260,7 @@ module.exports = class Aggregation extends BaseDataview { aggregationColumn: this.aggregationColumn || 1 }), isFloatColumn: this._isFloatColumn, - limit: CATEGORIES_LIMIT + limit }); debug(aggregationSql); diff --git a/test/acceptance/dataviews/aggregation.js b/test/acceptance/dataviews/aggregation.js index 4a274d80..45189213 100644 --- a/test/acceptance/dataviews/aggregation.js +++ b/test/acceptance/dataviews/aggregation.js @@ -325,7 +325,7 @@ describe('aggregation-dataview: special float values', function() { }); }); -describe('categories param', function () { +describe('aggregation dataview tuned by categories query param', function () { afterEach(function(done) { if (this.testClient) { this.testClient.drain(done); @@ -388,16 +388,41 @@ describe('categories param', function () { ] }; - it('should accept cartegories param to customize aggregation dataview', function (done) { - this.testClient = new TestClient(mapConfig, 1234); - const params = { - categories: 2 - }; + var scenarios = [ + { + params: { own_filter: 0, categories: -1 }, + categoriesExpected: 4 + }, + { + params: { own_filter: 0, categories: 0 }, + categoriesExpected: 4 + }, + { + params: { own_filter: 0, categories: 1 }, + categoriesExpected: 1 + }, + { + params: { own_filter: 0, categories: 2 }, + categoriesExpected: 2 + }, + { + params: { own_filter: 0, categories: 4 }, + categoriesExpected: 4 + }, + { + params: { own_filter: 0, categories: 5 }, + categoriesExpected: 4 + } + ]; - this.testClient.getDataview('categories', params, (err, dataview) => { - assert.ifError(err); - assert.equal(dataview.categoriesCount, 2); - done(); + scenarios.forEach(function (scenario) { + it(`should handle cartegories to customize aggregations: ${JSON.stringify(scenario.params)}`, function (done) { + this.testClient = new TestClient(mapConfig, 1234); + this.testClient.getDataview('categories', scenario.params, (err, dataview) => { + assert.ifError(err); + assert.equal(dataview.categories.length, scenario.categoriesExpected); + done(); + }); }); }); }); diff --git a/test/support/test-client.js b/test/support/test-client.js index cd7b4f60..f31f9db4 100644 --- a/test/support/test-client.js +++ b/test/support/test-client.js @@ -415,7 +415,7 @@ TestClient.prototype.getDataview = function(dataviewName, params, callback) { own_filter: params.hasOwnProperty('own_filter') ? params.own_filter : 1 }; - ['bbox', 'bins', 'start', 'end', 'aggregation', 'offset'].forEach(function(extraParam) { + ['bbox', 'bins', 'start', 'end', 'aggregation', 'offset', 'categories'].forEach(function(extraParam) { if (params.hasOwnProperty(extraParam)) { urlParams[extraParam] = params[extraParam]; }