diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index 182fcff5..2d0bf710 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -59,7 +59,7 @@ LayergroupController.prototype.register = function(app) { getTile(this.tileBackend, 'map_tile'), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), incrementSuccessMetrics(global.statsClient), @@ -78,7 +78,7 @@ LayergroupController.prototype.register = function(app) { getTile(this.tileBackend, 'map_tile'), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), incrementSuccessMetrics(global.statsClient), @@ -98,7 +98,7 @@ LayergroupController.prototype.register = function(app) { getTile(this.tileBackend, 'maplayer_tile'), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), incrementSuccessMetrics(global.statsClient), @@ -117,7 +117,7 @@ LayergroupController.prototype.register = function(app) { getFeatureAttributes(this.attributesBackend), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), sendResponse() @@ -135,7 +135,7 @@ LayergroupController.prototype.register = function(app) { getPreviewImageByCenter(this.previewBackend), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), sendResponse() @@ -151,7 +151,7 @@ LayergroupController.prototype.register = function(app) { getPreviewImageByBoundingBox(this.previewBackend), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), sendResponse() @@ -185,7 +185,7 @@ LayergroupController.prototype.register = function(app) { getDataview(this.dataviewBackend), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), sendResponse() @@ -201,7 +201,7 @@ LayergroupController.prototype.register = function(app) { getDataview(this.dataviewBackend), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), sendResponse() @@ -217,7 +217,7 @@ LayergroupController.prototype.register = function(app) { dataviewSearch(this.dataviewBackend), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), sendResponse() @@ -233,7 +233,7 @@ LayergroupController.prototype.register = function(app) { dataviewSearch(this.dataviewBackend), setCacheControlHeader(), setLastModifiedHeader(), - getAffectedTables(this.layergroupAffectedTables, this.pgConnection), + getAffectedTables(this.layergroupAffectedTables, this.pgConnection, this.mapStore), setCacheChannelHeader(), setSurrogateKeyHeader(this.surrogateKeysCache), sendResponse() @@ -301,18 +301,9 @@ function createMapStoreMapConfigProvider (mapStore, userLimitsApi, forcedFormat params.layer = params.layer || 'all'; } - const mapConfigProvider = new MapStoreMapConfigProvider(mapStore, user, userLimitsApi, params); + res.locals.mapConfigProvider = new MapStoreMapConfigProvider(mapStore, user, userLimitsApi, params); - mapConfigProvider.getMapConfig((err, mapconfig) => { - if (err) { - return next(err); - } - - res.locals.mapConfigProvider = mapConfigProvider; - res.locals.mapconfig = mapconfig; - - next(); - }); + next(); }; } @@ -507,44 +498,59 @@ function setCacheControlHeader () { }; } -function getAffectedTables (layergroupAffectedTables, pgConnection) { +function getAffectedTables (layergroupAffectedTables, pgConnection, mapStore) { return function getAffectedTablesMiddleware (req, res, next) { - const { user, dbname, token, mapconfig } = res.locals; + const { user, dbname, token } = res.locals; if (layergroupAffectedTables.hasAffectedTables(dbname, token)) { res.locals.affectedTables = layergroupAffectedTables.get(dbname, token); return next(); } - pgConnection.getConnection(user, (err, connection) => { + mapStore.load(token, (err, mapconfig) => { if (err) { global.logger.warn('ERROR generating cache channel:', err); return next(); } - const sql = []; + const queries = []; mapconfig.getLayers().forEach(function(layer) { - sql.push(layer.options.sql); + queries.push(layer.options.sql); if (layer.options.affected_tables) { layer.options.affected_tables.map(function(table) { - sql.push(`SELECT * FROM ${table} LIMIT 0`); + queries.push(`SELECT * FROM ${table} LIMIT 0`); }); } }); - QueryTables.getAffectedTablesFromQuery(connection, sql.join(';'), (err, affectedTables) => { - req.profiler.done('getAffectedTablesFromQuery'); + const sql = queries.length ? queries.join(';') : null; + + if (!sql) { + global.logger.warn('ERROR generating cache channel:' + + ' this request doesn\'t need an X-Cache-Channel generated'); + return next(); + } + + pgConnection.getConnection(user, (err, connection) => { if (err) { - global.logger.warn('ERROR generating cache channel: ', err); + global.logger.warn('ERROR generating cache channel:', err); return next(); } - // feed affected tables cache so it can be reused from, for instance, map controller - layergroupAffectedTables.set(dbname, token, affectedTables); + QueryTables.getAffectedTablesFromQuery(connection, sql, (err, affectedTables) => { + req.profiler.done('getAffectedTablesFromQuery'); + if (err) { + global.logger.warn('ERROR generating cache channel: ', err); + return next(); + } - res.locals.affectedTables = affectedTables; + // feed affected tables cache so it can be reused from, for instance, map controller + layergroupAffectedTables.set(dbname, token, affectedTables); - next(); + res.locals.affectedTables = affectedTables; + + next(); + }); }); }); };