Merge branch 'mapconfig-aggregation' of github.com:CartoDB/Windshaft-cartodb into mapconfig-aggregation
This commit is contained in:
commit
acd0610517
@ -3,13 +3,33 @@
|
|||||||
*/
|
*/
|
||||||
module.exports = (options) => {
|
module.exports = (options) => {
|
||||||
let templateFn = aggregationQueryTemplates[options.placement];
|
let templateFn = aggregationQueryTemplates[options.placement];
|
||||||
console.log(options);
|
|
||||||
if (!templateFn) {
|
if (!templateFn) {
|
||||||
throw new Error("Invalid Aggregation placement: '" + options.placement + "'");
|
throw new Error("Invalid Aggregation placement: '" + options.placement + "'");
|
||||||
}
|
}
|
||||||
return templateFn;
|
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:
|
// Notes:
|
||||||
// * ${ctx.res*0.00028/256}*!scale_denominator! is equivalent to ${ctx.res/256}*CDB_XYZ_Resolution(CDB_ZoomFromScale(!scale_denominator!))
|
// * ${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)
|
// * 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))
|
AVG(ST_Y(_cdb_query.the_geom_webmercator))
|
||||||
), 3857
|
), 3857
|
||||||
) AS the_geom_webmercator,
|
) AS the_geom_webmercator,
|
||||||
count(*) AS _cdb_feature_count
|
${aggregate_columns(ctx)}
|
||||||
FROM (${ctx.sourceQuery}) _cdb_query, _cdb_params
|
FROM (${ctx.sourceQuery}) _cdb_query, _cdb_params
|
||||||
WHERE _cdb_query.the_geom_webmercator && _cdb_params.bbox
|
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)
|
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,
|
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_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,
|
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
|
FROM (${ctx.sourceQuery}) _cdb_query, _cdb_params
|
||||||
WHERE the_geom_webmercator && _cdb_params.bbox
|
WHERE the_geom_webmercator && _cdb_params.bbox
|
||||||
GROUP BY _cdb_gx, _cdb_gy
|
GROUP BY _cdb_gx, _cdb_gy
|
||||||
@ -68,7 +88,7 @@ const aggregationQueryTemplates = {
|
|||||||
), _cdb_clusters AS (
|
), _cdb_clusters AS (
|
||||||
SELECT
|
SELECT
|
||||||
MIN(cartodb_id) AS cartodb_id,
|
MIN(cartodb_id) AS cartodb_id,
|
||||||
count(*) AS _cdb_feature_count
|
${aggregate_columns(ctx)}
|
||||||
FROM (${ctx.sourceQuery}) _cdb_query, _cdb_params
|
FROM (${ctx.sourceQuery}) _cdb_query, _cdb_params
|
||||||
WHERE _cdb_query.the_geom_webmercator && _cdb_params.bbox
|
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)
|
GROUP BY Floor(ST_X(_cdb_query.the_geom_webmercator)/_cdb_params.res), Floor(ST_Y(_cdb_query.the_geom_webmercator)/_cdb_params.res)
|
||||||
|
@ -143,7 +143,7 @@ describe('aggregation', function () {
|
|||||||
},
|
},
|
||||||
threshold: 1
|
threshold: 1
|
||||||
},
|
},
|
||||||
cartocss: '#layer { marker-width: [value]; }',
|
cartocss: '#layer { marker-width: [total]; }',
|
||||||
cartocss_version: '2.3.0'
|
cartocss_version: '2.3.0'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user