From b7ecde5c9d183a11c70bf057f1e2fd5c362545ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Fri, 22 Dec 2017 13:43:30 +0100 Subject: [PATCH] Add function get columns for layer's query --- .../aggregation/aggregation-mapconfig.js | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/cartodb/models/aggregation/aggregation-mapconfig.js b/lib/cartodb/models/aggregation/aggregation-mapconfig.js index bf334338..7966693e 100644 --- a/lib/cartodb/models/aggregation/aggregation-mapconfig.js +++ b/lib/cartodb/models/aggregation/aggregation-mapconfig.js @@ -38,7 +38,7 @@ module.exports = class AggregationMapConfig extends MapConfig { return AggregationMapConfig.SUPPORTED_GEOMETRY_TYPES.includes(geometryType); } - constructor (config, datasource) { + constructor (config, connection, datasource) { super(config, datasource); const validate = aggregationValidator(this); @@ -50,6 +50,8 @@ module.exports = class AggregationMapConfig extends MapConfig { validate('placement', includesValidPlacementsValidator); validate('threshold', positiveNumberValidator); validate('columns', aggregationColumnsValidator); + + this.connection = connection; } getAggregatedQuery (index) { @@ -120,4 +122,26 @@ module.exports = class AggregationMapConfig extends MapConfig { return featureCount >= threshold; } + + getLayerColumns (index, skipGeoms, callback) { + const geomColumns = ['the_geom', 'the_geom_webmercator']; + const limitedQuery = ctx => `SELECT * FROM (${ctx.query}) __cdb_schema LIMIT 0`; + const layer = this.getLayer(index); + + this.connection.query(limitedQuery({ query: layer.options.sql }), (err, result) => { + if (err) { + return callback(err); + } + + let columns = result.fields || []; + + columns = columns.map(({ name, type }) => ({ name, type })); + + if (skipGeoms) { + columns = columns.filter((column) => !geomColumns.includes(column)); + } + + return callback(err, columns); + }); + } };