Add query param to define the number of categories to be ranked

This commit is contained in:
Daniel García Aubert 2017-11-07 16:14:47 +01:00
parent 50ecdb5fee
commit 743bb0723b
5 changed files with 45 additions and 15 deletions

View File

@ -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 + '\'');

View File

@ -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(

View File

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

View File

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

View File

@ -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];
}