Implement aggregation columns

This commit is contained in:
Javier Goizueta 2017-12-12 11:18:18 +01:00
parent 5bf4eba215
commit b2fcbdd8a3

View File

@ -3,13 +3,33 @@
*/
module.exports = (options) => {
let templateFn = aggregationQueryTemplates[options.placement];
console.log(options);
if (!templateFn) {
throw new Error("Invalid Aggregation placement: '" + options.placement + "'");
}
return templateFn;
};
const aggregate_columns = ctx => {
let columns = ctx.columns || {};
if (Object.keys(columns).length == 0) {
// default aggregation
columns = {
_cdb_feature_count: {
aggregate_function: 'count'
}
}
}
return Object.keys(columns).map(column_name => {
let aggregate_expression = columns[column_name].aggregate_expression;
if (!aggregate_expression) {
const aggregate_function = columns[column_name].aggregate_function || 'count';
const aggregated_column = columns[column_name].aggregated_column || '*';
aggregate_expression = `${aggregate_function}(${aggregated_column})`;
}
return `${aggregate_expression} AS ${column_name}`;
}).join(', ');
};
// Notes:
// * ${ctx.res*0.00028/256}*!scale_denominator! is equivalent to ${ctx.res/256}*CDB_XYZ_Resolution(CDB_ZoomFromScale(!scale_denominator!))
// * We need to filter spatially using !bbox! to make the queries efficient because the filter added by Mapnik (wrapping the query)
@ -32,7 +52,7 @@ const aggregationQueryTemplates = {
AVG(ST_Y(_cdb_query.the_geom_webmercator))
), 3857
) AS the_geom_webmercator,
count(*) AS _cdb_feature_count
${aggregate_columns(ctx)}
FROM (${ctx.sourceQuery}) _cdb_query, _cdb_params
WHERE _cdb_query.the_geom_webmercator && _cdb_params.bbox
GROUP BY Floor(ST_X(_cdb_query.the_geom_webmercator)/_cdb_params.res), Floor(ST_Y(_cdb_query.the_geom_webmercator)/_cdb_params.res)
@ -49,7 +69,7 @@ const aggregationQueryTemplates = {
ST_SetSRID(ST_MakePoint(AVG(ST_X(_cdb_query.the_geom_webmercator)), AVG(ST_Y(_cdb_query.the_geom_webmercator))), 3857) AS the_geom_webmercator,
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,
count(*) AS _cdb_feature_count
${aggregate_columns(ctx)}
FROM (${ctx.sourceQuery}) _cdb_query, _cdb_params
WHERE the_geom_webmercator && _cdb_params.bbox
GROUP BY _cdb_gx, _cdb_gy
@ -68,7 +88,7 @@ const aggregationQueryTemplates = {
), _cdb_clusters AS (
SELECT
MIN(cartodb_id) AS cartodb_id,
count(*) AS _cdb_feature_count
${aggregate_columns(ctx)}
FROM (${ctx.sourceQuery}) _cdb_query, _cdb_params
WHERE _cdb_query.the_geom_webmercator && _cdb_params.bbox
GROUP BY Floor(ST_X(_cdb_query.the_geom_webmercator)/_cdb_params.res), Floor(ST_Y(_cdb_query.the_geom_webmercator)/_cdb_params.res)