From b81cfe418ad9bb8e505f0f8e80cb109648366230 Mon Sep 17 00:00:00 2001 From: Javier Goizueta Date: Thu, 14 Dec 2017 15:02:03 +0100 Subject: [PATCH 1/4] Always add a _cdb_feature_count to aggregated queries --- .../models/aggregation/aggregation-query.js | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/cartodb/models/aggregation/aggregation-query.js b/lib/cartodb/models/aggregation/aggregation-query.js index bf995c82..f088e6b3 100644 --- a/lib/cartodb/models/aggregation/aggregation-query.js +++ b/lib/cartodb/models/aggregation/aggregation-query.js @@ -50,16 +50,11 @@ const SUPPORTED_AGGREGATE_FUNCTIONS = { }; const aggregateColumns = ctx => { - // TODO: always add count - let columns = ctx.columns || {}; - if (Object.keys(columns).length === 0) { - // default aggregation - columns = { - _cdb_feature_count: { - aggregate_function: 'count' - } - }; - } + let columns = Object.assign({ + _cdb_feature_count: { + aggregate_function: 'count' + } + }, ctx.columns || {}); return Object.keys(columns).map(column_name => { const aggregate_function = columns[column_name].aggregate_function || 'count'; const aggregate_definition = SUPPORTED_AGGREGATE_FUNCTIONS[aggregate_function]; From 753ada0e76a1090f805790608e3f233ce6d7af57 Mon Sep 17 00:00:00 2001 From: Javier Goizueta Date: Thu, 14 Dec 2017 16:36:24 +0100 Subject: [PATCH 2/4] Add cartodb_id to test datasets --- test/acceptance/aggregation.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/acceptance/aggregation.js b/test/acceptance/aggregation.js index d08a0ea0..7bd1d328 100644 --- a/test/acceptance/aggregation.js +++ b/test/acceptance/aggregation.js @@ -20,6 +20,7 @@ describe('aggregation', function () { const POINTS_SQL_1 = ` select + x + 4 as cartodb_id, st_setsrid(st_makepoint(x*10, x*10), 4326) as the_geom, st_transform(st_setsrid(st_makepoint(x*10, x*10), 4326), 3857) as the_geom_webmercator, x as value @@ -28,6 +29,7 @@ describe('aggregation', function () { const POINTS_SQL_TIMESTAMP_1 = ` select + row_number() over() AS cartodb_id, st_setsrid(st_makepoint(x*10, x*10), 4326) as the_geom, st_transform(st_setsrid(st_makepoint(x*10, x*10), 4326), 3857) as the_geom_webmercator, x as value, @@ -41,6 +43,7 @@ describe('aggregation', function () { const POINTS_SQL_2 = ` select + x + 4 as cartodb_id, st_setsrid(st_makepoint(x*10, x*10*(-1)), 4326) as the_geom, st_transform(st_setsrid(st_makepoint(x*10, x*10*(-1)), 4326), 3857) as the_geom_webmercator, x as value, @@ -50,6 +53,7 @@ describe('aggregation', function () { const POLYGONS_SQL_1 = ` select + x + 4 as cartodb_id, st_buffer(st_setsrid(st_makepoint(x*10, x*10), 4326)::geography, 100000)::geometry as the_geom, st_transform( st_buffer(st_setsrid(st_makepoint(x*10, x*10), 4326)::geography, 100000)::geometry, From ba6cca46a171f3f5f24526748056381a573d64dc Mon Sep 17 00:00:00 2001 From: Javier Goizueta Date: Thu, 14 Dec 2017 16:37:15 +0100 Subject: [PATCH 3/4] Fix aggregation queries --- .../models/aggregation/aggregation-query.js | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/cartodb/models/aggregation/aggregation-query.js b/lib/cartodb/models/aggregation/aggregation-query.js index f088e6b3..b987e24d 100644 --- a/lib/cartodb/models/aggregation/aggregation-query.js +++ b/lib/cartodb/models/aggregation/aggregation-query.js @@ -50,11 +50,20 @@ const SUPPORTED_AGGREGATE_FUNCTIONS = { }; const aggregateColumns = ctx => { - let columns = Object.assign({ + return Object.assign({ _cdb_feature_count: { aggregate_function: 'count' } }, ctx.columns || {}); +}; + +const aggregateColumnNames = ctx => { + let columns = aggregateColumns(ctx); + return Object.keys(columns).join(', '); +}; + +const aggregateColumnDefs = ctx => { + let columns = aggregateColumns(ctx); return Object.keys(columns).map(column_name => { const aggregate_function = columns[column_name].aggregate_function || 'count'; const aggregate_definition = SUPPORTED_AGGREGATE_FUNCTIONS[aggregate_function]; @@ -89,7 +98,7 @@ const aggregationQueryTemplates = { AVG(ST_Y(_cdb_query.the_geom_webmercator)) ), 3857 ) AS the_geom_webmercator, - ${aggregateColumns(ctx)} + ${aggregateColumnDefs(ctx)} FROM (${ctx.sourceQuery}) _cdb_query, _cdb_params WHERE _cdb_query.the_geom_webmercator && _cdb_params.bbox GROUP BY @@ -107,14 +116,14 @@ const aggregationQueryTemplates = { SELECT Floor(ST_X(_cdb_query.the_geom_webmercator)/_cdb_params.res)::int AS _cdb_gx, Floor(ST_Y(_cdb_query.the_geom_webmercator)/_cdb_params.res)::int AS _cdb_gy, - ${aggregateColumns(ctx)} + ${aggregateColumnDefs(ctx)} FROM (${ctx.sourceQuery}) _cdb_query, _cdb_params WHERE the_geom_webmercator && _cdb_params.bbox GROUP BY _cdb_gx, _cdb_gy ) SELECT ST_SetSRID(ST_MakePoint(_cdb_gx*(res+0.5), _cdb_gy*(res+0.5)), 3857) AS the_geom_webmercator, - _cdb_feature_count + ${aggregateColumnNames(ctx)} FROM _cdb_clusters, _cdb_params `, @@ -127,7 +136,7 @@ const aggregationQueryTemplates = { ), _cdb_clusters AS ( SELECT MIN(cartodb_id) AS cartodb_id, - ${aggregateColumns(ctx)} + ${aggregateColumnDefs(ctx)} FROM (${ctx.sourceQuery}) _cdb_query, _cdb_params WHERE _cdb_query.the_geom_webmercator && _cdb_params.bbox GROUP BY @@ -136,7 +145,7 @@ const aggregationQueryTemplates = { ) SELECT _cdb_clusters.cartodb_id, the_geom, the_geom_webmercator, - _cdb_feature_count + ${aggregateColumnNames(ctx)} FROM _cdb_clusters INNER JOIN (${ctx.sourceQuery}) _cdb_query ON (_cdb_clusters.cartodb_id = _cdb_query.cartodb_id) From 507d105ab27a4debdc34a22860624a7fc4fe0068 Mon Sep 17 00:00:00 2001 From: Javier Goizueta Date: Thu, 14 Dec 2017 16:37:40 +0100 Subject: [PATCH 4/4] Add mode aggregation --- lib/cartodb/models/aggregation/aggregation-query.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/cartodb/models/aggregation/aggregation-query.js b/lib/cartodb/models/aggregation/aggregation-query.js index b987e24d..ca6d3431 100644 --- a/lib/cartodb/models/aggregation/aggregation-query.js +++ b/lib/cartodb/models/aggregation/aggregation-query.js @@ -46,6 +46,9 @@ const SUPPORTED_AGGREGATE_FUNCTIONS = { }, 'max': { sql: (column_name, params) => `max(${params.aggregated_column || column_name})` + }, + 'mode': { + sql: (column_name, params) => `cdb_mode(${params.aggregated_column || column_name})` } };