From c7f37047b053700823b43ba3abf2aa75c45758ec Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 19 May 2016 11:41:06 +0200 Subject: [PATCH 01/46] Save original query from analysis before wrapping it --- lib/cartodb/models/analysis-mapconfig-adapter.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/cartodb/models/analysis-mapconfig-adapter.js b/lib/cartodb/models/analysis-mapconfig-adapter.js index 6d54a3af..fa6aee47 100644 --- a/lib/cartodb/models/analysis-mapconfig-adapter.js +++ b/lib/cartodb/models/analysis-mapconfig-adapter.js @@ -145,6 +145,7 @@ AnalysisMapConfigAdapter.prototype.getMapConfig = function(analysisConfiguration var analysisSql = layerQuery(layerNode); var sqlQueryWrap = layer.options.sql_wrap; if (sqlQueryWrap) { + layer.options.sql_raw = analysisSql; analysisSql = sqlQueryWrap.replace(/<%=\s*sql\s*%>/g, analysisSql); } layer.options.sql = analysisSql; From 31344a1c75eb537c34d4dc4e303de1f8c78ffe19 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 19 May 2016 11:42:28 +0200 Subject: [PATCH 02/46] Adds test case with analysis --- test/acceptance/turbo-cartocss/regressions.js | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/test/acceptance/turbo-cartocss/regressions.js b/test/acceptance/turbo-cartocss/regressions.js index 4f152da3..a9d5de52 100644 --- a/test/acceptance/turbo-cartocss/regressions.js +++ b/test/acceptance/turbo-cartocss/regressions.js @@ -102,4 +102,71 @@ describe('turbo-carto regressions', function() { done(); }); }); + + it('should work with mapnik substitution tokens and analyses', function(done) { + var cartocss = [ + "#layer {", + " line-width: 2;", + " line-color: #3B3B58;", + " line-opacity: 1;", + " polygon-opacity: 0.7;", + " polygon-fill: ramp([points_count], (#E5F5F9,#99D8C9,#2CA25F))", + "}" + ].join('\n'); + + console.log(cartocss); + + var sqlWrap = [ + 'WITH hgrid AS (', + ' SELECT CDB_HexagonGrid(', + ' ST_Expand(!bbox!, greatest(!pixel_width!,!pixel_height!) * 100),', + ' greatest(!pixel_width!,!pixel_height!) * 100', + ' ) as cell', + ')', + 'SELECT', + ' hgrid.cell as the_geom_webmercator,', + ' count(1) as points_count,', + ' count(1)/power(100 * CDB_XYZ_Resolution(CDB_ZoomFromScale(!scale_denominator!)), 2) as points_density,', + ' 1 as cartodb_id', + 'FROM hgrid, (<%= sql %>) i', + 'where ST_Intersects(i.the_geom_webmercator, hgrid.cell)', + 'GROUP BY hgrid.cell' + ].join('\n'); + + var mapConfig = { + "version": "1.5.0", + "layers": [ + { + "type": 'mapnik', + "options": { + "cartocss_version": '2.3.0', + "source": { + "id": "head" + }, + sql_wrap: sqlWrap, + "cartocss": cartocss + } + } + ], + "analyses": [ + { + "id": "head", + "type": "source", + "params": { + "query": "SELECT * FROM car_log_nurburgring_2013_05_30" + } + } + ] + }; + + this.testClient = new TestClient(mapConfig, 1234); + this.testClient.getLayergroup(function(err, layergroup) { + assert.ok(!err, err); + + assert.ok(layergroup.hasOwnProperty('layergroupid')); + assert.ok(!layergroup.hasOwnProperty('errors')); + + done(); + }); + }); }); From 573932efba82b4e52d0df5eabee7254a41e5fcb1 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 19 May 2016 11:48:57 +0200 Subject: [PATCH 03/46] Simplify condition and use positive naming for parsing cartocss --- lib/cartodb/utils/style/turbo-carto-adapter.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/lib/cartodb/utils/style/turbo-carto-adapter.js b/lib/cartodb/utils/style/turbo-carto-adapter.js index d1c0c81f..fa754835 100644 --- a/lib/cartodb/utils/style/turbo-carto-adapter.js +++ b/lib/cartodb/utils/style/turbo-carto-adapter.js @@ -32,10 +32,8 @@ TurboCartoAdapter.prototype.getLayers = function (username, layers, callback) { }; TurboCartoAdapter.prototype._parseCartoCss = function (username, layer, callback) { - if (isNotLayerToParseCartocss(layer)) { - return process.nextTick(function () { - callback(null, layer); - }); + if (!shouldParseLayerCartocss(layer)) { + return callback(null, layer); } var sql = SubstitutionTokens.replace(layer.options.sql, { @@ -61,10 +59,6 @@ TurboCartoAdapter.prototype._parseCartoCss = function (username, layer, callback }); }; -function isNotLayerToParseCartocss(layer) { - if (!layer || !layer.options || !layer.options.cartocss || !layer.options.sql) { - return true; - } - - return false; +function shouldParseLayerCartocss(layer) { + return layer && layer.options && layer.options.cartocss && layer.options.sql; } From ba08745c2346d7eb9ba1b842e683c4f8a9d26009 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 19 May 2016 12:10:19 +0200 Subject: [PATCH 04/46] Adds hasTokens method to SubstitutionTokens --- lib/cartodb/utils/substitution-tokens.js | 10 +++++ test/unit/cartodb/substitution-tokens.test.js | 40 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 test/unit/cartodb/substitution-tokens.test.js diff --git a/lib/cartodb/utils/substitution-tokens.js b/lib/cartodb/utils/substitution-tokens.js index af09f838..5905fa4d 100644 --- a/lib/cartodb/utils/substitution-tokens.js +++ b/lib/cartodb/utils/substitution-tokens.js @@ -6,6 +6,16 @@ var SUBSTITUTION_TOKENS = { }; var SubstitutionTokens = { + tokens: function(sql) { + return Object.keys(SUBSTITUTION_TOKENS).filter(function(tokenName) { + return !!sql.match(SUBSTITUTION_TOKENS[tokenName]); + }); + }, + + hasTokens: function(sql) { + return this.tokens(sql).length > 0; + }, + replace: function(sql, replaceValues) { Object.keys(replaceValues).forEach(function(token) { if (SUBSTITUTION_TOKENS[token]) { diff --git a/test/unit/cartodb/substitution-tokens.test.js b/test/unit/cartodb/substitution-tokens.test.js new file mode 100644 index 00000000..70c3a0d0 --- /dev/null +++ b/test/unit/cartodb/substitution-tokens.test.js @@ -0,0 +1,40 @@ +var assert = require('assert'); +var SubstitutionTokens = require('../../../lib/cartodb/utils/substitution-tokens'); + +describe('SubstitutionTokens', function() { + + var sql = [ + 'WITH hgrid AS (', + ' SELECT CDB_HexagonGrid(', + ' ST_Expand(!bbox!, greatest(!pixel_width!,!pixel_height!) * 100),', + ' greatest(!pixel_width!,!pixel_height!) * 100', + ' ) as cell', + ')', + 'SELECT', + ' hgrid.cell as the_geom_webmercator,', + ' count(1) as points_count,', + ' count(1)/power(100 * CDB_XYZ_Resolution(CDB_ZoomFromScale(!scale_denominator!)), 2) as points_density,', + ' 1 as cartodb_id', + 'FROM hgrid, (select * from table) i', + 'where ST_Intersects(i.the_geom_webmercator, hgrid.cell)', + 'GROUP BY hgrid.cell' + ].join('\n'); + + it('should return tokens present in sql', function() { + assert.deepEqual(SubstitutionTokens.tokens(sql), ['bbox', 'scale_denominator', 'pixel_width', 'pixel_height']); + }); + + it('should return just one token', function() { + assert.deepEqual(SubstitutionTokens.tokens('select !bbox! from wadus'), ['bbox']); + }); + + it('should not return other tokens', function() { + assert.deepEqual(SubstitutionTokens.tokens('select !wadus! from wadus'), []); + }); + + it('should report sql has tokens', function() { + assert.equal(SubstitutionTokens.hasTokens(sql), true); + assert.equal(SubstitutionTokens.hasTokens('select !bbox! from wadus'), true); + assert.equal(SubstitutionTokens.hasTokens('select !wadus! from wadus'), false); + }); +}); From fd3f928d81e71f43479f1d7db39100ecc6e23148 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 19 May 2016 12:13:37 +0200 Subject: [PATCH 05/46] Fix test table --- test/acceptance/turbo-cartocss/regressions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/acceptance/turbo-cartocss/regressions.js b/test/acceptance/turbo-cartocss/regressions.js index a9d5de52..51df3847 100644 --- a/test/acceptance/turbo-cartocss/regressions.js +++ b/test/acceptance/turbo-cartocss/regressions.js @@ -153,7 +153,7 @@ describe('turbo-carto regressions', function() { "id": "head", "type": "source", "params": { - "query": "SELECT * FROM car_log_nurburgring_2013_05_30" + "query": "SELECT * FROM populated_places_simple_reduced" } } ] From ee94b8a587f2d60413a90073a836d80d9cb3a6a8 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 19 May 2016 12:13:49 +0200 Subject: [PATCH 06/46] Very raw implementation of SubstitutionTokens based on origin data --- .../utils/style/turbo-carto-adapter.js | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/lib/cartodb/utils/style/turbo-carto-adapter.js b/lib/cartodb/utils/style/turbo-carto-adapter.js index fa754835..0c86d0c8 100644 --- a/lib/cartodb/utils/style/turbo-carto-adapter.js +++ b/lib/cartodb/utils/style/turbo-carto-adapter.js @@ -1,5 +1,7 @@ 'use strict'; +var dot = require('dot'); +dot.templateSettings.strip = false; var queue = require('queue-async'); var SubstitutionTokens = require('../substitution-tokens'); @@ -31,17 +33,49 @@ TurboCartoAdapter.prototype.getLayers = function (username, layers, callback) { }); }; +var bboxTemplate = dot.template('(select ST_SetSRID(st_extent(the_geom_webmercator), 3857) from ({{=it._sql}}) __c)'); +var zoomTemplate = dot.template([ + 'GREATEST(', + 'ceil(log(40075017000 / 256 / GREATEST(', + ' st_xmax({{=it._bbox}}) - st_xmin({{=it._bbox}}),', + ' st_ymax({{=it._bbox}}) - st_ymin({{=it._bbox}})', + '))/log(2)),', + '0', + ')' +].join('\n')); +var pixelSizeTemplate = dot.template('40075017 * cos(ST_Y(ST_Centroid({{=it._bbox}}))) / 2 ^ (({{=it._zoom}}) + 8)'); +var scaleDenominatorTemplate = dot.template('({{=it._pixelSize}} / 0.00028)::numeric'); + + TurboCartoAdapter.prototype._parseCartoCss = function (username, layer, callback) { if (!shouldParseLayerCartocss(layer)) { return callback(null, layer); } - var sql = SubstitutionTokens.replace(layer.options.sql, { + var tokens = { bbox: 'ST_MakeEnvelope(-20037508.34,-20037508.34,20037508.34,20037508.34,3857)', scale_denominator: '500000001', pixel_width: '156412', pixel_height: '156412' - }); + }; + + var layerSql = layer.options.sql; + var layerRawSql = layer.options.sql_raw; + if (SubstitutionTokens.hasTokens(layerSql) && layerRawSql) { + var bbox = bboxTemplate({ _sql: layerRawSql }); + var zoom = zoomTemplate({ _bbox: bbox }); + var pixelSize = pixelSizeTemplate({ _bbox: bbox, _zoom: zoom }); + var scaleDenominator = scaleDenominatorTemplate({ _pixelSize: pixelSize }); + + tokens = { + bbox: bbox, + scale_denominator: scaleDenominator, + pixel_width: pixelSize, + pixel_height: pixelSize + }; + } + + var sql = SubstitutionTokens.replace(layerSql, tokens); this.turboCartoParser.process(username, layer.options.cartocss, sql, function (err, cartocss) { // Only return turbo-carto errors From f30be00eb9231503cb9b45e948eff2925f591311 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 19 May 2016 12:14:46 +0200 Subject: [PATCH 07/46] Remove console --- test/acceptance/turbo-cartocss/regressions.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/acceptance/turbo-cartocss/regressions.js b/test/acceptance/turbo-cartocss/regressions.js index 51df3847..e2dd38cc 100644 --- a/test/acceptance/turbo-cartocss/regressions.js +++ b/test/acceptance/turbo-cartocss/regressions.js @@ -114,8 +114,6 @@ describe('turbo-carto regressions', function() { "}" ].join('\n'); - console.log(cartocss); - var sqlWrap = [ 'WITH hgrid AS (', ' SELECT CDB_HexagonGrid(', From c372d69e9874f426222187c14cd3e7c3f568b4f6 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 13:01:23 +0200 Subject: [PATCH 08/46] LayergroupToken only makes sense at testing environment --- test/acceptance/analysis/named-maps.js | 2 +- test/acceptance/dynamic-styling-named-maps.js | 2 +- test/acceptance/limits.js | 2 +- test/acceptance/multilayer.js | 2 +- test/acceptance/multilayer_server.js | 2 +- test/acceptance/named_layers.js | 2 +- test/acceptance/overviews_metadata.js | 2 +- test/acceptance/overviews_metadata_named_maps.js | 2 +- test/acceptance/ported/attributes.js | 2 +- test/acceptance/ported/multilayer.js | 2 +- test/acceptance/ported/multilayer_interactivity.js | 2 +- test/acceptance/ported/raster.js | 2 +- test/acceptance/ported/retina.js | 2 +- test/acceptance/ported/server_png8_format.js | 2 +- test/acceptance/ported/support/ported_server_options.js | 2 +- test/acceptance/ported/support/test_client.js | 2 +- test/acceptance/ported/torque.js | 2 +- test/acceptance/ported/torque_boundaries.js | 2 +- test/acceptance/templates.js | 2 +- test/acceptance/turbo-cartocss/named-maps.js | 2 +- test/acceptance/widgets/named-maps.js | 2 +- test/acceptance/x_cache_channel.js | 2 +- .../layergroup_token.js => test/support/layergroup-token.js | 0 test/support/test-client.js | 2 +- 24 files changed, 23 insertions(+), 23 deletions(-) rename lib/cartodb/models/layergroup_token.js => test/support/layergroup-token.js (100%) diff --git a/test/acceptance/analysis/named-maps.js b/test/acceptance/analysis/named-maps.js index 26341a0a..bab87ee4 100644 --- a/test/acceptance/analysis/named-maps.js +++ b/test/acceptance/analysis/named-maps.js @@ -7,7 +7,7 @@ var serverOptions = require('../../../lib/cartodb/server_options'); var server = new CartodbWindshaft(serverOptions); var TestClient = require('../../support/test-client'); -var LayergroupToken = require('../../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../../support/layergroup-token'); describe('named-maps analysis', function() { diff --git a/test/acceptance/dynamic-styling-named-maps.js b/test/acceptance/dynamic-styling-named-maps.js index 934ddbcb..5fe2db3c 100644 --- a/test/acceptance/dynamic-styling-named-maps.js +++ b/test/acceptance/dynamic-styling-named-maps.js @@ -1,6 +1,6 @@ var assert = require('../support/assert'); var step = require('step'); -var LayergroupToken = require('../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../support/layergroup-token'); var testHelper = require(__dirname + '/../support/test_helper'); var CartodbWindshaft = require(__dirname + '/../../lib/cartodb/server'); var serverOptions = require(__dirname + '/../../lib/cartodb/server_options'); diff --git a/test/acceptance/limits.js b/test/acceptance/limits.js index ef91dac4..30a4e739 100644 --- a/test/acceptance/limits.js +++ b/test/acceptance/limits.js @@ -7,7 +7,7 @@ var redis = require('redis'); var CartodbWindshaft = require('../../lib/cartodb/server'); var serverOptions = require('../../lib/cartodb/server_options'); -var LayergroupToken = require('../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../support/layergroup-token'); describe('render limits', function() { diff --git a/test/acceptance/multilayer.js b/test/acceptance/multilayer.js index 2dbfbbbd..7095f4c5 100644 --- a/test/acceptance/multilayer.js +++ b/test/acceptance/multilayer.js @@ -6,7 +6,7 @@ var strftime = require('strftime'); var redis_stats_db = 5; var helper = require(__dirname + '/../support/test_helper'); -var LayergroupToken = require('../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../support/layergroup-token'); var windshaft_fixtures = __dirname + '/../../node_modules/windshaft/test/fixtures'; diff --git a/test/acceptance/multilayer_server.js b/test/acceptance/multilayer_server.js index e443f3aa..251ecc38 100644 --- a/test/acceptance/multilayer_server.js +++ b/test/acceptance/multilayer_server.js @@ -4,7 +4,7 @@ var assert = require('../support/assert'); var _ = require('underscore'); -var LayergroupToken = require('../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../support/layergroup-token'); var PgQueryRunner = require('../../lib/cartodb/backends/pg_query_runner'); var QueryTables = require('cartodb-query-tables'); diff --git a/test/acceptance/named_layers.js b/test/acceptance/named_layers.js index eeb74bc2..8788e5a6 100644 --- a/test/acceptance/named_layers.js +++ b/test/acceptance/named_layers.js @@ -5,7 +5,7 @@ var CartodbWindshaft = require(__dirname + '/../../lib/cartodb/server'); var serverOptions = require(__dirname + '/../../lib/cartodb/server_options'); var server = new CartodbWindshaft(serverOptions); -var LayergroupToken = require('../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../support/layergroup-token'); var RedisPool = require('redis-mpool'); var TemplateMaps = require('../../lib/cartodb/backends/template_maps.js'); diff --git a/test/acceptance/overviews_metadata.js b/test/acceptance/overviews_metadata.js index 0822cfe8..ad0f23e5 100644 --- a/test/acceptance/overviews_metadata.js +++ b/test/acceptance/overviews_metadata.js @@ -5,7 +5,7 @@ var CartodbWindshaft = require(__dirname + '/../../lib/cartodb/server'); var serverOptions = require(__dirname + '/../../lib/cartodb/server_options'); var server = new CartodbWindshaft(serverOptions); -var LayergroupToken = require('../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../support/layergroup-token'); var RedisPool = require('redis-mpool'); diff --git a/test/acceptance/overviews_metadata_named_maps.js b/test/acceptance/overviews_metadata_named_maps.js index 4f0ff6e7..8e9720ec 100644 --- a/test/acceptance/overviews_metadata_named_maps.js +++ b/test/acceptance/overviews_metadata_named_maps.js @@ -5,7 +5,7 @@ var CartodbWindshaft = require(__dirname + '/../../lib/cartodb/server'); var serverOptions = require(__dirname + '/../../lib/cartodb/server_options'); var server = new CartodbWindshaft(serverOptions); -var LayergroupToken = require('../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../support/layergroup-token'); var RedisPool = require('redis-mpool'); diff --git a/test/acceptance/ported/attributes.js b/test/acceptance/ported/attributes.js index 1c8f3983..5151cc09 100644 --- a/test/acceptance/ported/attributes.js +++ b/test/acceptance/ported/attributes.js @@ -6,7 +6,7 @@ var cartodbServer = require('../../../lib/cartodb/server'); var PortedServerOptions = require('./support/ported_server_options'); var BaseController = require('../../../lib/cartodb/controllers/base'); -var LayergroupToken = require('../../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../../support/layergroup-token'); describe('attributes', function() { diff --git a/test/acceptance/ported/multilayer.js b/test/acceptance/ported/multilayer.js index eb337070..fa6648f4 100644 --- a/test/acceptance/ported/multilayer.js +++ b/test/acceptance/ported/multilayer.js @@ -7,7 +7,7 @@ var step = require('step'); var mapnik = require('windshaft').mapnik; var cartodbServer = require('../../../lib/cartodb/server'); var ServerOptions = require('./support/ported_server_options'); -var LayergroupToken = require('../../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../../support/layergroup-token'); var BaseController = require('../../../lib/cartodb/controllers/base'); describe('multilayer', function() { diff --git a/test/acceptance/ported/multilayer_interactivity.js b/test/acceptance/ported/multilayer_interactivity.js index 44b54d4f..3f3f12b1 100644 --- a/test/acceptance/ported/multilayer_interactivity.js +++ b/test/acceptance/ported/multilayer_interactivity.js @@ -5,7 +5,7 @@ var _ = require('underscore'); var cartodbServer = require('../../../lib/cartodb/server'); var getLayerTypeFn = require('windshaft').model.MapConfig.prototype.getType; var PortedServerOptions = require('./support/ported_server_options'); -var LayergroupToken = require('../../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../../support/layergroup-token'); var BaseController = require('../../../lib/cartodb/controllers/base'); diff --git a/test/acceptance/ported/raster.js b/test/acceptance/ported/raster.js index cd3d43b9..2cea4bf4 100644 --- a/test/acceptance/ported/raster.js +++ b/test/acceptance/ported/raster.js @@ -6,7 +6,7 @@ var cartodbServer = require('../../../lib/cartodb/server'); var ServerOptions = require('./support/ported_server_options'); var BaseController = require('../../../lib/cartodb/controllers/base'); -var LayergroupToken = require('../../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../../support/layergroup-token'); describe('raster', function() { diff --git a/test/acceptance/ported/retina.js b/test/acceptance/ported/retina.js index b13d0fe4..1c4b16f1 100644 --- a/test/acceptance/ported/retina.js +++ b/test/acceptance/ported/retina.js @@ -6,7 +6,7 @@ var cartodbServer = require('../../../lib/cartodb/server'); var ServerOptions = require('./support/ported_server_options'); var BaseController = require('../../../lib/cartodb/controllers/base'); -var LayergroupToken = require('../../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../../support/layergroup-token'); describe('retina support', function() { diff --git a/test/acceptance/ported/server_png8_format.js b/test/acceptance/ported/server_png8_format.js index 39c89c66..30b5f2bc 100644 --- a/test/acceptance/ported/server_png8_format.js +++ b/test/acceptance/ported/server_png8_format.js @@ -7,7 +7,7 @@ var cartodbServer = require('../../../lib/cartodb/server'); var ServerOptions = require('./support/ported_server_options'); var BaseController = require('../../../lib/cartodb/controllers/base'); -var LayergroupToken = require('../../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../../support/layergroup-token'); var IMAGE_EQUALS_TOLERANCE_PER_MIL = 85; diff --git a/test/acceptance/ported/support/ported_server_options.js b/test/acceptance/ported/support/ported_server_options.js index 1cc5331f..875d42dc 100644 --- a/test/acceptance/ported/support/ported_server_options.js +++ b/test/acceptance/ported/support/ported_server_options.js @@ -1,6 +1,6 @@ var _ = require('underscore'); var serverOptions = require('../../../../lib/cartodb/server_options'); -var LayergroupToken = require('../../../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../../../support/layergroup-token'); var mapnik = require('windshaft').mapnik; var OverviewsQueryRewriter = require('../../../../lib/cartodb/utils/overviews_query_rewriter'); var overviewsQueryRewriter = new OverviewsQueryRewriter({ diff --git a/test/acceptance/ported/support/test_client.js b/test/acceptance/ported/support/test_client.js index 54893755..dad3ff3e 100644 --- a/test/acceptance/ported/support/test_client.js +++ b/test/acceptance/ported/support/test_client.js @@ -1,5 +1,5 @@ var testHelper = require('../../../support/test_helper'); -var LayergroupToken = require('../../../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../../../support/layergroup-token'); var step = require('step'); var assert = require('../../../support/assert'); diff --git a/test/acceptance/ported/torque.js b/test/acceptance/ported/torque.js index 84846ae1..b7a8c36f 100644 --- a/test/acceptance/ported/torque.js +++ b/test/acceptance/ported/torque.js @@ -7,7 +7,7 @@ var cartodbServer = require('../../../lib/cartodb/server'); var ServerOptions = require('./support/ported_server_options'); var BaseController = require('../../../lib/cartodb/controllers/base'); -var LayergroupToken = require('../../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../../support/layergroup-token'); describe('torque', function() { diff --git a/test/acceptance/ported/torque_boundaries.js b/test/acceptance/ported/torque_boundaries.js index f605570b..fb88be52 100644 --- a/test/acceptance/ported/torque_boundaries.js +++ b/test/acceptance/ported/torque_boundaries.js @@ -5,7 +5,7 @@ var cartodbServer = require('../../../lib/cartodb/server'); var ServerOptions = require('./support/ported_server_options'); var BaseController = require('../../../lib/cartodb/controllers/base'); -var LayergroupToken = require('../../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../../support/layergroup-token'); describe('torque boundary points', function() { diff --git a/test/acceptance/templates.js b/test/acceptance/templates.js index ae997ca8..e8e0a2ca 100644 --- a/test/acceptance/templates.js +++ b/test/acceptance/templates.js @@ -23,7 +23,7 @@ var serverOptions = require(__dirname + '/../../lib/cartodb/server_options'); var server = new CartodbWindshaft(serverOptions); server.setMaxListeners(0); -var LayergroupToken = require('../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../support/layergroup-token'); describe('template_api', function() { server.layergroupAffectedTablesCache.cache.reset(); diff --git a/test/acceptance/turbo-cartocss/named-maps.js b/test/acceptance/turbo-cartocss/named-maps.js index 9c88b6db..35dc8cd8 100644 --- a/test/acceptance/turbo-cartocss/named-maps.js +++ b/test/acceptance/turbo-cartocss/named-maps.js @@ -1,6 +1,6 @@ var assert = require('../../support/assert'); var step = require('step'); -var LayergroupToken = require('../../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../../support/layergroup-token'); var testHelper = require('../../support/test_helper'); var CartodbWindshaft = require('../../../lib/cartodb/server'); var serverOptions = require('../../../lib/cartodb/server_options'); diff --git a/test/acceptance/widgets/named-maps.js b/test/acceptance/widgets/named-maps.js index cc603d72..eb5a0d29 100644 --- a/test/acceptance/widgets/named-maps.js +++ b/test/acceptance/widgets/named-maps.js @@ -10,7 +10,7 @@ var CartodbWindshaft = require('../../../lib/cartodb/server'); var serverOptions = require('../../../lib/cartodb/server_options'); var server = new CartodbWindshaft(serverOptions); -var LayergroupToken = require('../../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../../support/layergroup-token'); describe('named-maps widgets', function() { diff --git a/test/acceptance/x_cache_channel.js b/test/acceptance/x_cache_channel.js index 8f536e1f..4ebb45e8 100644 --- a/test/acceptance/x_cache_channel.js +++ b/test/acceptance/x_cache_channel.js @@ -8,7 +8,7 @@ var serverOptions = require('../../lib/cartodb/server_options'); var server = new CartodbWindshaft(serverOptions); server.setMaxListeners(0); -var LayergroupToken = require('../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('../support/layergroup-token'); describe('get requests x-cache-channel', function() { diff --git a/lib/cartodb/models/layergroup_token.js b/test/support/layergroup-token.js similarity index 100% rename from lib/cartodb/models/layergroup_token.js rename to test/support/layergroup-token.js diff --git a/test/support/test-client.js b/test/support/test-client.js index a9ec5bee..e0fadeee 100644 --- a/test/support/test-client.js +++ b/test/support/test-client.js @@ -6,7 +6,7 @@ var urlParser = require('url'); var mapnik = require('windshaft').mapnik; -var LayergroupToken = require('../../lib/cartodb/models/layergroup_token'); +var LayergroupToken = require('./layergroup-token'); var assert = require('./assert'); var helper = require('./test_helper'); From 9f8551058d4920d522e4a49023f85969d5ab9956 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 13:10:52 +0200 Subject: [PATCH 09/46] Analysis adapter into adapter package --- lib/cartodb/cache/named_map_provider_cache.js | 2 +- lib/cartodb/controllers/map.js | 2 +- .../{ => mapconfig/adapter}/analysis-mapconfig-adapter.js | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename lib/cartodb/models/{ => mapconfig/adapter}/analysis-mapconfig-adapter.js (100%) diff --git a/lib/cartodb/cache/named_map_provider_cache.js b/lib/cartodb/cache/named_map_provider_cache.js index 9adb29b9..a98992db 100644 --- a/lib/cartodb/cache/named_map_provider_cache.js +++ b/lib/cartodb/cache/named_map_provider_cache.js @@ -2,7 +2,7 @@ var _ = require('underscore'); var dot = require('dot'); var NamedMapMapConfigProvider = require('../models/mapconfig/named_map_provider'); var MapConfigNamedLayersAdapter = require('../models/mapconfig_named_layers_adapter'); -var AnalysisMapConfigAdapter = require('../models/analysis-mapconfig-adapter'); +var AnalysisMapConfigAdapter = require('../models/mapconfig/adapter/analysis-mapconfig-adapter'); var templateName = require('../backends/template_maps').templateName; var queue = require('queue-async'); diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 1f8f25bb..4813e7ea 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -16,7 +16,7 @@ var Datasource = windshaft.model.Datasource; var NamedMapsCacheEntry = require('../cache/model/named_maps_entry'); var MapConfigNamedLayersAdapter = require('../models/mapconfig_named_layers_adapter'); -var AnalysisMapConfigAdapter = require('../models/analysis-mapconfig-adapter'); +var AnalysisMapConfigAdapter = require('../models/mapconfig/adapter/analysis-mapconfig-adapter'); var NamedMapMapConfigProvider = require('../models/mapconfig/named_map_provider'); var CreateLayergroupMapConfigProvider = require('../models/mapconfig/create_layergroup_provider'); var SqlWrapMapConfigAdapter = require('../models/mapconfig/adapter/sql-wrap-mapconfig-adapter'); diff --git a/lib/cartodb/models/analysis-mapconfig-adapter.js b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js similarity index 100% rename from lib/cartodb/models/analysis-mapconfig-adapter.js rename to lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js From ab984729f55abc73ce1e43c17b589f66c9799637 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 13:16:34 +0200 Subject: [PATCH 10/46] Named layers adapter into adapters package --- lib/cartodb/cache/named_map_provider_cache.js | 2 +- lib/cartodb/controllers/map.js | 2 +- .../adapter/mapconfig-named-layers-adapter.js} | 0 test/integration/mapconfig_named_layers_datasource.js | 2 +- test/integration/mapconfig_named_layers_expanded.js | 4 ++-- 5 files changed, 5 insertions(+), 5 deletions(-) rename lib/cartodb/models/{mapconfig_named_layers_adapter.js => mapconfig/adapter/mapconfig-named-layers-adapter.js} (100%) diff --git a/lib/cartodb/cache/named_map_provider_cache.js b/lib/cartodb/cache/named_map_provider_cache.js index a98992db..e5a3f932 100644 --- a/lib/cartodb/cache/named_map_provider_cache.js +++ b/lib/cartodb/cache/named_map_provider_cache.js @@ -1,7 +1,7 @@ var _ = require('underscore'); var dot = require('dot'); var NamedMapMapConfigProvider = require('../models/mapconfig/named_map_provider'); -var MapConfigNamedLayersAdapter = require('../models/mapconfig_named_layers_adapter'); +var MapConfigNamedLayersAdapter = require('../models/mapconfig/adapter/mapconfig-named-layers-adapter'); var AnalysisMapConfigAdapter = require('../models/mapconfig/adapter/analysis-mapconfig-adapter'); var templateName = require('../backends/template_maps').templateName; var queue = require('queue-async'); diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 4813e7ea..4d8cad9c 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -15,7 +15,7 @@ var Datasource = windshaft.model.Datasource; var NamedMapsCacheEntry = require('../cache/model/named_maps_entry'); -var MapConfigNamedLayersAdapter = require('../models/mapconfig_named_layers_adapter'); +var MapConfigNamedLayersAdapter = require('../models/mapconfig/adapter/mapconfig-named-layers-adapter'); var AnalysisMapConfigAdapter = require('../models/mapconfig/adapter/analysis-mapconfig-adapter'); var NamedMapMapConfigProvider = require('../models/mapconfig/named_map_provider'); var CreateLayergroupMapConfigProvider = require('../models/mapconfig/create_layergroup_provider'); diff --git a/lib/cartodb/models/mapconfig_named_layers_adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js similarity index 100% rename from lib/cartodb/models/mapconfig_named_layers_adapter.js rename to lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js diff --git a/test/integration/mapconfig_named_layers_datasource.js b/test/integration/mapconfig_named_layers_datasource.js index e312b7b3..39d19359 100644 --- a/test/integration/mapconfig_named_layers_datasource.js +++ b/test/integration/mapconfig_named_layers_datasource.js @@ -4,7 +4,7 @@ var assert = require('assert'); var RedisPool = require('redis-mpool'); var TemplateMaps = require('../../lib/cartodb/backends/template_maps.js'); var PgConnection = require(__dirname + '/../../lib/cartodb/backends/pg_connection'); -var MapConfigNamedLayersAdapter = require('../../lib/cartodb/models/mapconfig_named_layers_adapter'); +var MapConfigNamedLayersAdapter = require('../../lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter'); // configure redis pool instance to use in tests var redisPool = new RedisPool(global.environment.redis); diff --git a/test/integration/mapconfig_named_layers_expanded.js b/test/integration/mapconfig_named_layers_expanded.js index d78726c9..b7aae20e 100644 --- a/test/integration/mapconfig_named_layers_expanded.js +++ b/test/integration/mapconfig_named_layers_expanded.js @@ -4,9 +4,9 @@ var assert = require('assert'); var RedisPool = require('redis-mpool'); var TemplateMaps = require('../../lib/cartodb/backends/template_maps.js'); var PgConnection = require(__dirname + '/../../lib/cartodb/backends/pg_connection'); -var MapConfigNamedLayersAdapter = require('../../lib/cartodb/models/mapconfig_named_layers_adapter'); +var MapConfigNamedLayersAdapter = require('../../lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter'); -describe('mapconfig_named_layers_adapter', function() { +describe('mapconfig-named-layers-adapter', function() { // configure redis pool instance to use in tests var redisPool = new RedisPool(global.environment.redis); From 20725900b6e5d86ef900bc7a5bf996fed294f7a0 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 13:22:46 +0200 Subject: [PATCH 11/46] Overviews adapter into adapters package --- .../adapter/mapconfig-overviews-adapter.js} | 0 lib/cartodb/server.js | 2 +- test/integration/mapconfig_overviews_adapter.js | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename lib/cartodb/models/{mapconfig_overviews_adapter.js => mapconfig/adapter/mapconfig-overviews-adapter.js} (100%) diff --git a/lib/cartodb/models/mapconfig_overviews_adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js similarity index 100% rename from lib/cartodb/models/mapconfig_overviews_adapter.js rename to lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 8117d208..88cf61b6 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -34,7 +34,7 @@ var AnalysisBackend = require('./backends/analysis'); var timeoutErrorTilePath = __dirname + '/../../assets/render-timeout-fallback.png'; var timeoutErrorTile = require('fs').readFileSync(timeoutErrorTilePath, {encoding: null}); -var MapConfigOverviewsAdapter = require('./models/mapconfig_overviews_adapter'); +var MapConfigOverviewsAdapter = require('./models/mapconfig/adapter/mapconfig-overviews-adapter'); var TurboCartoParser = require('./utils/style/turbo-carto-parser'); var TurboCartoAdapter = require('./utils/style/turbo-carto-adapter'); diff --git a/test/integration/mapconfig_overviews_adapter.js b/test/integration/mapconfig_overviews_adapter.js index d168c02f..ea18c285 100644 --- a/test/integration/mapconfig_overviews_adapter.js +++ b/test/integration/mapconfig_overviews_adapter.js @@ -7,7 +7,7 @@ var PgConnection = require(__dirname + '/../../lib/cartodb/backends/pg_connectio var PgQueryRunner = require('../../lib/cartodb/backends/pg_query_runner'); var OverviewsMetadataApi = require('../../lib/cartodb/api/overviews_metadata_api'); var FilterStatsApi = require('../../lib/cartodb/api/filter_stats_api'); -var MapConfigOverviewsAdapter = require('../../lib/cartodb/models/mapconfig_overviews_adapter'); +var MapConfigOverviewsAdapter = require('../../lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter'); // configure redis pool instance to use in tests var redisPool = new RedisPool(global.environment.redis); From 69f40e6f6a1c2c1802a91255973d54ec4f6c139f Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 13:26:34 +0200 Subject: [PATCH 12/46] Removed duplicated declaration --- test/integration/mapconfig_overviews_adapter.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/integration/mapconfig_overviews_adapter.js b/test/integration/mapconfig_overviews_adapter.js index ea18c285..adb444f2 100644 --- a/test/integration/mapconfig_overviews_adapter.js +++ b/test/integration/mapconfig_overviews_adapter.js @@ -9,10 +9,6 @@ var OverviewsMetadataApi = require('../../lib/cartodb/api/overviews_metadata_api var FilterStatsApi = require('../../lib/cartodb/api/filter_stats_api'); var MapConfigOverviewsAdapter = require('../../lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter'); -// configure redis pool instance to use in tests -var redisPool = new RedisPool(global.environment.redis); -var pgConnection = new PgConnection(require('cartodb-redis')({ pool: redisPool })); - var redisPool = new RedisPool(global.environment.redis); var metadataBackend = cartodbRedis({pool: redisPool}); var pgConnection = new PgConnection(metadataBackend); From c4b6f65404de36dda9073a57cc0200084f3ec850 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 13:28:11 +0200 Subject: [PATCH 13/46] Create map provider into providers package --- lib/cartodb/controllers/map.js | 2 +- .../create-layergroup-provider.js} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename lib/cartodb/models/mapconfig/{create_layergroup_provider.js => provider/create-layergroup-provider.js} (95%) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 4d8cad9c..9f8b609f 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -18,7 +18,7 @@ var NamedMapsCacheEntry = require('../cache/model/named_maps_entry'); var MapConfigNamedLayersAdapter = require('../models/mapconfig/adapter/mapconfig-named-layers-adapter'); var AnalysisMapConfigAdapter = require('../models/mapconfig/adapter/analysis-mapconfig-adapter'); var NamedMapMapConfigProvider = require('../models/mapconfig/named_map_provider'); -var CreateLayergroupMapConfigProvider = require('../models/mapconfig/create_layergroup_provider'); +var CreateLayergroupMapConfigProvider = require('../models/mapconfig/provider/create-layergroup-provider'); var SqlWrapMapConfigAdapter = require('../models/mapconfig/adapter/sql-wrap-mapconfig-adapter'); /** diff --git a/lib/cartodb/models/mapconfig/create_layergroup_provider.js b/lib/cartodb/models/mapconfig/provider/create-layergroup-provider.js similarity index 95% rename from lib/cartodb/models/mapconfig/create_layergroup_provider.js rename to lib/cartodb/models/mapconfig/provider/create-layergroup-provider.js index 409d9bda..ef847af8 100644 --- a/lib/cartodb/models/mapconfig/create_layergroup_provider.js +++ b/lib/cartodb/models/mapconfig/provider/create-layergroup-provider.js @@ -1,7 +1,7 @@ var assert = require('assert'); var step = require('step'); -var MapStoreMapConfigProvider = require('./map_store_provider'); +var MapStoreMapConfigProvider = require('./../map_store_provider'); /** * @param {MapConfig} mapConfig From 215bbbd29c337aa111683efdbe9d22cda4696fe6 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 13:29:34 +0200 Subject: [PATCH 14/46] Store provider into providers package --- lib/cartodb/controllers/layergroup.js | 2 +- .../models/mapconfig/provider/create-layergroup-provider.js | 2 +- .../{map_store_provider.js => provider/map-store-provider.js} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename lib/cartodb/models/mapconfig/{map_store_provider.js => provider/map-store-provider.js} (100%) diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index 1c79e47a..8c426c7c 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -10,7 +10,7 @@ var userMiddleware = require('../middleware/user'); var DataviewBackend = require('../backends/dataview'); var AnalysisStatusBackend = require('../backends/analysis-status'); -var MapStoreMapConfigProvider = require('../models/mapconfig/map_store_provider'); +var MapStoreMapConfigProvider = require('../models/mapconfig/provider/map-store-provider'); var QueryTables = require('cartodb-query-tables'); diff --git a/lib/cartodb/models/mapconfig/provider/create-layergroup-provider.js b/lib/cartodb/models/mapconfig/provider/create-layergroup-provider.js index ef847af8..af5a775b 100644 --- a/lib/cartodb/models/mapconfig/provider/create-layergroup-provider.js +++ b/lib/cartodb/models/mapconfig/provider/create-layergroup-provider.js @@ -1,7 +1,7 @@ var assert = require('assert'); var step = require('step'); -var MapStoreMapConfigProvider = require('./../map_store_provider'); +var MapStoreMapConfigProvider = require('./map-store-provider'); /** * @param {MapConfig} mapConfig diff --git a/lib/cartodb/models/mapconfig/map_store_provider.js b/lib/cartodb/models/mapconfig/provider/map-store-provider.js similarity index 100% rename from lib/cartodb/models/mapconfig/map_store_provider.js rename to lib/cartodb/models/mapconfig/provider/map-store-provider.js From 8134aca14d181254ee1156ef7ca0b58574fa9636 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 13:32:28 +0200 Subject: [PATCH 15/46] Named map provider into providers package --- lib/cartodb/cache/named_map_provider_cache.js | 2 +- lib/cartodb/controllers/map.js | 2 +- .../{named_map_provider.js => provider/named-map-provider.js} | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename lib/cartodb/models/mapconfig/{named_map_provider.js => provider/named-map-provider.js} (98%) diff --git a/lib/cartodb/cache/named_map_provider_cache.js b/lib/cartodb/cache/named_map_provider_cache.js index e5a3f932..dac98b21 100644 --- a/lib/cartodb/cache/named_map_provider_cache.js +++ b/lib/cartodb/cache/named_map_provider_cache.js @@ -1,6 +1,6 @@ var _ = require('underscore'); var dot = require('dot'); -var NamedMapMapConfigProvider = require('../models/mapconfig/named_map_provider'); +var NamedMapMapConfigProvider = require('../models/mapconfig/provider/named-map-provider'); var MapConfigNamedLayersAdapter = require('../models/mapconfig/adapter/mapconfig-named-layers-adapter'); var AnalysisMapConfigAdapter = require('../models/mapconfig/adapter/analysis-mapconfig-adapter'); var templateName = require('../backends/template_maps').templateName; diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 9f8b609f..8e68e9fd 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -17,7 +17,7 @@ var NamedMapsCacheEntry = require('../cache/model/named_maps_entry'); var MapConfigNamedLayersAdapter = require('../models/mapconfig/adapter/mapconfig-named-layers-adapter'); var AnalysisMapConfigAdapter = require('../models/mapconfig/adapter/analysis-mapconfig-adapter'); -var NamedMapMapConfigProvider = require('../models/mapconfig/named_map_provider'); +var NamedMapMapConfigProvider = require('../models/mapconfig/provider/named-map-provider'); var CreateLayergroupMapConfigProvider = require('../models/mapconfig/provider/create-layergroup-provider'); var SqlWrapMapConfigAdapter = require('../models/mapconfig/adapter/sql-wrap-mapconfig-adapter'); diff --git a/lib/cartodb/models/mapconfig/named_map_provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js similarity index 98% rename from lib/cartodb/models/mapconfig/named_map_provider.js rename to lib/cartodb/models/mapconfig/provider/named-map-provider.js index e1ad6fea..e05998e1 100644 --- a/lib/cartodb/models/mapconfig/named_map_provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -4,9 +4,9 @@ var crypto = require('crypto'); var dot = require('dot'); var step = require('step'); var MapConfig = require('windshaft').model.MapConfig; -var templateName = require('../../backends/template_maps').templateName; +var templateName = require('../../../backends/template_maps').templateName; var QueryTables = require('cartodb-query-tables'); -var SqlWrapMapConfigAdapter = require('./adapter/sql-wrap-mapconfig-adapter'); +var SqlWrapMapConfigAdapter = require('./../adapter/sql-wrap-mapconfig-adapter'); /** * @constructor From ee49b8b2a2411c95f5537292c024fd07ab7b2a14 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 14:18:58 +0200 Subject: [PATCH 16/46] Turbo-carto adapter into adapters package --- .../style => models/mapconfig/adapter}/turbo-carto-adapter.js | 2 +- lib/cartodb/server.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename lib/cartodb/{utils/style => models/mapconfig/adapter}/turbo-carto-adapter.js (96%) diff --git a/lib/cartodb/utils/style/turbo-carto-adapter.js b/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js similarity index 96% rename from lib/cartodb/utils/style/turbo-carto-adapter.js rename to lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js index d1c0c81f..94ce3fc8 100644 --- a/lib/cartodb/utils/style/turbo-carto-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js @@ -1,7 +1,7 @@ 'use strict'; var queue = require('queue-async'); -var SubstitutionTokens = require('../substitution-tokens'); +var SubstitutionTokens = require('../../../utils/substitution-tokens'); function TurboCartoAdapter(turboCartoParser) { this.turboCartoParser = turboCartoParser; diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 88cf61b6..cb8cc452 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -37,7 +37,7 @@ var timeoutErrorTile = require('fs').readFileSync(timeoutErrorTilePath, {encodin var MapConfigOverviewsAdapter = require('./models/mapconfig/adapter/mapconfig-overviews-adapter'); var TurboCartoParser = require('./utils/style/turbo-carto-parser'); -var TurboCartoAdapter = require('./utils/style/turbo-carto-adapter'); +var TurboCartoAdapter = require('./models/mapconfig/adapter/turbo-carto-adapter'); module.exports = function(serverOptions) { // Make stats client globally accessible From 3e35604df0159525b977f48588aa16d26fdc5ac9 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 15:18:20 +0200 Subject: [PATCH 17/46] turbo-carto adapter with getMapConfig interface --- lib/cartodb/controllers/map.js | 6 +----- .../models/mapconfig/adapter/turbo-carto-adapter.js | 10 +++++++--- .../models/mapconfig/provider/named-map-provider.js | 6 +----- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 8e68e9fd..f97f4d3d 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -210,15 +210,11 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { assert.ifError(err); var next = this; - self.turboCartoAdapter.getLayers(req.context.user, requestMapConfig.layers, function (err, layers) { + self.turboCartoAdapter.getMapConfig(req.context.user, requestMapConfig, function (err, requestMapConfig) { if (err) { return next(err); } - if (layers) { - requestMapConfig.layers = layers; - } - return next(null, requestMapConfig, datasource); }); }, diff --git a/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js b/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js index f7a40a0c..fd2b0c20 100644 --- a/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js @@ -11,11 +11,13 @@ function TurboCartoAdapter(turboCartoParser) { module.exports = TurboCartoAdapter; -TurboCartoAdapter.prototype.getLayers = function (username, layers, callback) { +TurboCartoAdapter.prototype.getMapConfig = function (username, requestMapConfig, callback) { var self = this; + var layers = requestMapConfig.layers; + if (!layers || layers.length === 0) { - return callback(null, layers); + return callback(null, requestMapConfig); } var parseCartoQueue = queue(layers.length); @@ -29,7 +31,9 @@ TurboCartoAdapter.prototype.getLayers = function (username, layers, callback) { return callback(err); } - return callback(null, layers); + requestMapConfig.layers = layers; + + return callback(null, requestMapConfig); }); }; diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index e05998e1..aed00af7 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -164,15 +164,11 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { assert.ifError(err); var next = this; - self.turboCartoAdapter.getLayers(self.owner, _mapConfig.layers, function (err, layers) { + self.turboCartoAdapter.getMapConfig(self.owner, _mapConfig, function (err, _mapConfig) { if (err) { return next(err); } - if (layers) { - _mapConfig.layers = layers; - } - return next(null, _mapConfig, datasource); }); }, From 9f6ce64a3136ba6cafed705ceb6650d809a892d9 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 15:39:11 +0200 Subject: [PATCH 18/46] Named maps adapter with getMapConfig interface --- lib/cartodb/controllers/map.js | 7 +-- .../adapter/mapconfig-named-layers-adapter.js | 12 +++-- .../mapconfig/provider/named-map-provider.js | 7 +-- .../mapconfig_named_layers_datasource.js | 6 +-- .../mapconfig_named_layers_expanded.js | 44 ++++++++++--------- 5 files changed, 39 insertions(+), 37 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index f97f4d3d..650a754c 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -175,15 +175,12 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { assert.ifError(err); var next = this; analysesResults = _analysesResults; - self.namedLayersAdapter.getLayers(req.context.user, requestMapConfig.layers, self.pgConnection, - function(err, layers, datasource) { + self.namedLayersAdapter.getMapConfig(req.context.user, requestMapConfig, self.pgConnection, + function(err, requestMapConfig, datasource) { if (err) { return next(err); } - if (layers) { - requestMapConfig.layers = layers; - } return next(null, requestMapConfig, datasource); } ); diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js index 26b6c3a1..e8792def 100644 --- a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js @@ -8,11 +8,13 @@ function MapConfigNamedLayersAdapter(templateMaps) { module.exports = MapConfigNamedLayersAdapter; -MapConfigNamedLayersAdapter.prototype.getLayers = function(username, layers, dbMetadata, callback) { +MapConfigNamedLayersAdapter.prototype.getMapConfig = function(username, requestMapConfig, dbMetadata, callback) { var self = this; + var layers = requestMapConfig.layers; + if (!layers) { - return callback(null); + return callback(null, requestMapConfig); } var adaptLayersQueue = queue(layers.length); @@ -96,7 +98,9 @@ MapConfigNamedLayersAdapter.prototype.getLayers = function(username, layers, dbM }); - return callback(null, layers, datasourceBuilder.build()); + requestMapConfig.layers = layers; + + return callback(null, requestMapConfig, datasourceBuilder.build()); } @@ -114,7 +118,7 @@ MapConfigNamedLayersAdapter.prototype.getLayers = function(username, layers, dbM adaptLayersQueue.awaitAll(layersAdaptQueueFinish); }); } else { - return callback(null, layers, datasourceBuilder.build()); + return callback(null, requestMapConfig, datasourceBuilder.build()); } }; diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index aed00af7..fd661697 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -131,15 +131,12 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { assert.ifError(err); var next = this; self.analysesResults = analysesResults || []; - self.namedLayersAdapter.getLayers(self.owner, _mapConfig.layers, self.pgConnection, - function(err, layers, datasource) { + self.namedLayersAdapter.getMapConfig(self.owner, _mapConfig, self.pgConnection, + function(err, _mapConfig, datasource) { if (err) { return next(err); } - if (layers) { - _mapConfig.layers = layers; - } return next(null, _mapConfig, datasource); } ); diff --git a/test/integration/mapconfig_named_layers_datasource.js b/test/integration/mapconfig_named_layers_datasource.js index 39d19359..d372f138 100644 --- a/test/integration/mapconfig_named_layers_datasource.js +++ b/test/integration/mapconfig_named_layers_datasource.js @@ -294,9 +294,9 @@ describe('named_layers datasources', function() { testScenarios.forEach(function(testScenario) { it('should return a list of layers ' + testScenario.desc, function(done) { - mapConfigNamedLayersAdapter.getLayers(username, testScenario.config.layers, pgConnection, - function(err, layers, datasource) { - testScenario.test(err, layers, datasource, done); + mapConfigNamedLayersAdapter.getMapConfig(username, testScenario.config, pgConnection, + function(err, mapConfig, datasource) { + testScenario.test(err, mapConfig.layers, datasource, done); } ); }); diff --git a/test/integration/mapconfig_named_layers_expanded.js b/test/integration/mapconfig_named_layers_expanded.js index b7aae20e..90c384f4 100644 --- a/test/integration/mapconfig_named_layers_expanded.js +++ b/test/integration/mapconfig_named_layers_expanded.js @@ -147,10 +147,10 @@ describe('mapconfig-named-layers-adapter', function() { var missingNamedMapLayerConfig = makeNamedMapLayerConfig({ config: {} }); - mapConfigNamedLayersAdapter.getLayers(username, missingNamedMapLayerConfig.layers, pgConnection, - function(err, layers, datasource) { + mapConfigNamedLayersAdapter.getMapConfig(username, missingNamedMapLayerConfig, pgConnection, + function(err, mapConfig, datasource) { assert.ok(err); - assert.ok(!layers); + assert.ok(!mapConfig); assert.ok(!datasource); assert.equal(err.message, 'Missing Named Map `name` in layer options'); @@ -164,10 +164,10 @@ describe('mapconfig-named-layers-adapter', function() { var nonExistentNamedMapLayerConfig = makeNamedMapLayerConfig({ name: missingTemplateName }); - mapConfigNamedLayersAdapter.getLayers(username, nonExistentNamedMapLayerConfig.layers, pgConnection, - function(err, layers, datasource) { + mapConfigNamedLayersAdapter.getMapConfig(username, nonExistentNamedMapLayerConfig, pgConnection, + function(err, mapConfig, datasource) { assert.ok(err); - assert.ok(!layers); + assert.ok(!mapConfig); assert.ok(!datasource); assert.equal( err.message, "Template '" + missingTemplateName + "' of user '" + username + "' not found" @@ -187,10 +187,10 @@ describe('mapconfig-named-layers-adapter', function() { var nonAuthTokensNamedMapLayerConfig = makeNamedMapLayerConfig({ name: tokenAuthTemplateName }); - mapConfigNamedLayersAdapter.getLayers(username, nonAuthTokensNamedMapLayerConfig.layers, pgConnection, - function(err, layers, datasource) { + mapConfigNamedLayersAdapter.getMapConfig(username, nonAuthTokensNamedMapLayerConfig, pgConnection, + function(err, mapConfig, datasource) { assert.ok(err); - assert.ok(!layers); + assert.ok(!mapConfig); assert.ok(!datasource); assert.equal(err.message, "Unauthorized '" + tokenAuthTemplateName + "' template instantiation"); @@ -209,10 +209,10 @@ describe('mapconfig-named-layers-adapter', function() { var nestedNamedMapLayerConfig = makeNamedMapLayerConfig({ name: nestedNamedMapTemplateName }); - mapConfigNamedLayersAdapter.getLayers(username, nestedNamedMapLayerConfig.layers, pgConnection, - function(err, layers, datasource) { + mapConfigNamedLayersAdapter.getMapConfig(username, nestedNamedMapLayerConfig, pgConnection, + function(err, mapConfig, datasource) { assert.ok(err); - assert.ok(!layers); + assert.ok(!mapConfig); assert.ok(!datasource); assert.equal(err.message, 'Nested named layers are not allowed'); @@ -226,9 +226,10 @@ describe('mapconfig-named-layers-adapter', function() { var validNamedMapMapLayerConfig = makeNamedMapLayerConfig({ name: templateName }); - mapConfigNamedLayersAdapter.getLayers(username, validNamedMapMapLayerConfig.layers, pgConnection, - function(err, layers, datasource) { + mapConfigNamedLayersAdapter.getMapConfig(username, validNamedMapMapLayerConfig, pgConnection, + function(err, mapConfig, datasource) { assert.ok(!err); + var layers = mapConfig.layers; assert.ok(layers.length, 1); assert.ok(layers[0].type, 'cartodb'); assert.notEqual(datasource.getLayerDatasource(0), undefined); @@ -248,9 +249,10 @@ describe('mapconfig-named-layers-adapter', function() { name: tokenAuthTemplateName, auth_tokens: ['valid1'] }); - mapConfigNamedLayersAdapter.getLayers(username, validAuthTokensNamedMapLayerConfig.layers, pgConnection, - function(err, layers, datasource) { + mapConfigNamedLayersAdapter.getMapConfig(username, validAuthTokensNamedMapLayerConfig, pgConnection, + function(err, mapConfig, datasource) { assert.ok(!err); + var layers = mapConfig.layers; assert.equal(layers.length, 1); assert.notEqual(datasource.getLayerDatasource(0), undefined); @@ -270,9 +272,10 @@ describe('mapconfig-named-layers-adapter', function() { name: multipleLayersTemplateName, auth_tokens: ['valid2'] }); - mapConfigNamedLayersAdapter.getLayers(username, multipleLayersNamedMapLayerConfig.layers, pgConnection, - function(err, layers, datasource) { + mapConfigNamedLayersAdapter.getMapConfig(username, multipleLayersNamedMapLayerConfig, pgConnection, + function(err, mapConfig, datasource) { assert.ok(!err); + var layers = mapConfig.layers; assert.equal(layers.length, 2); assert.equal(layers[0].type, 'mapnik'); @@ -306,9 +309,10 @@ describe('mapconfig-named-layers-adapter', function() { }, auth_tokens: ['valid2'] }); - mapConfigNamedLayersAdapter.getLayers(username, multipleLayersNamedMapLayerConfig.layers, pgConnection, - function(err, layers, datasource) { + mapConfigNamedLayersAdapter.getMapConfig(username, multipleLayersNamedMapLayerConfig, pgConnection, + function(err, mapConfig, datasource) { assert.ok(!err); + var layers = mapConfig.layers; assert.equal(layers.length, 2); assert.equal(layers[0].type, 'mapnik'); From 6ccdb6cefd993bb37e1e6e8ee24e0a1bde404f28 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 15:52:31 +0200 Subject: [PATCH 19/46] Overviews adapter with getMapConfig interface --- lib/cartodb/controllers/map.js | 9 ++------- .../adapter/mapconfig-overviews-adapter.js | 10 +++++++--- .../mapconfig/provider/named-map-provider.js | 6 +----- test/integration/mapconfig_overviews_adapter.js | 16 +++++++++++++--- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 650a754c..50cc21bd 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -188,17 +188,12 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { function addOverviewsInformation(err, requestMapConfig, datasource) { assert.ifError(err); var next = this; - self.overviewsAdapter.getLayers( - req.context.user, requestMapConfig.layers, analysesResults, - function(err, layers) { + self.overviewsAdapter.getMapConfig(req.context.user, requestMapConfig, analysesResults, + function(err, requestMapConfig) { if (err) { return next(err); } - if (layers) { - requestMapConfig.layers = layers; - } - return next(null, requestMapConfig, datasource); } ); diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js index 3b8d54a2..a438d0ca 100644 --- a/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js @@ -9,11 +9,13 @@ function MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsApi) { module.exports = MapConfigOverviewsAdapter; -MapConfigOverviewsAdapter.prototype.getLayers = function(username, layers, analysesResults, callback) { +MapConfigOverviewsAdapter.prototype.getMapConfig = function(username, requestMapConfig, analysesResults, callback) { var self = this; + var layers = requestMapConfig.layers; + if (!layers || layers.length === 0) { - return callback(null, layers); + return callback(null, requestMapConfig); } var augmentLayersQueue = queue(layers.length); @@ -85,7 +87,9 @@ MapConfigOverviewsAdapter.prototype.getLayers = function(username, layers, analy return callback(new Error('Missing layers array from layergroup config')); } - return callback(null, layers); + requestMapConfig.layers = layers; + + return callback(null, requestMapConfig); } layers.forEach(function(layer) { diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index fd661697..25d9b50d 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -145,15 +145,11 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { assert.ifError(err); var next = this; - self.overviewsAdapter.getLayers(self.owner, _mapConfig.layers, self.analysesResults, function(err, layers) { + self.overviewsAdapter.getMapConfig(self.owner, _mapConfig, self.analysesResults, function(err, _mapConfig) { if (err) { return next(err); } - if (layers) { - _mapConfig.layers = layers; - } - return next(null, _mapConfig, datasource); }); }, diff --git a/test/integration/mapconfig_overviews_adapter.js b/test/integration/mapconfig_overviews_adapter.js index adb444f2..6444f18f 100644 --- a/test/integration/mapconfig_overviews_adapter.js +++ b/test/integration/mapconfig_overviews_adapter.js @@ -33,8 +33,13 @@ describe('MapConfigOverviewsAdapter', function() { } }; - mapConfigOverviewsAdapter.getLayers('localhost', [layer_without_overviews], [], function(err, layers) { + var _mapConfig = { + layers: [layer_without_overviews] + }; + + mapConfigOverviewsAdapter.getMapConfig('localhost', _mapConfig, [], function(err, mapConfig) { assert.ok(!err); + var layers = mapConfig.layers; assert.equal(layers.length, 1); assert.equal(layers[0].type, 'cartodb'); assert.equal(layers[0].options.sql, sql); @@ -52,7 +57,7 @@ describe('MapConfigOverviewsAdapter', function() { var sql = 'SELECT * FROM test_table_overviews'; var cartocss = '#layer { marker-fill: black; }'; var cartocss_version = '2.3.0'; - var layer_without_overviews = { + var layer_with_overviews = { type: 'cartodb', options: { sql: sql, @@ -61,8 +66,13 @@ describe('MapConfigOverviewsAdapter', function() { } }; - mapConfigOverviewsAdapter.getLayers('localhost', [layer_without_overviews], [], function(err, layers) { + var _mapConfig = { + layers: [layer_with_overviews] + }; + + mapConfigOverviewsAdapter.getMapConfig('localhost', _mapConfig, [], function(err, mapConfig) { assert.ok(!err); + var layers = mapConfig.layers; assert.equal(layers.length, 1); assert.equal(layers[0].type, 'cartodb'); assert.equal(layers[0].options.sql, sql); From 12c44fda6fefeb519a3e6b2c3e1d4da5d6798a0e Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 16:20:42 +0200 Subject: [PATCH 20/46] Unify getMapConfig interface --- lib/cartodb/controllers/map.js | 6 +++++- .../models/mapconfig/adapter/sql-wrap-mapconfig-adapter.js | 2 +- lib/cartodb/models/mapconfig/provider/named-map-provider.js | 6 +++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 50cc21bd..82081544 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -136,6 +136,10 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { var mapConfig; var analysesResults = []; + var user = req.context.user; + var params = req.params; + var context = {}; + step( function setupParams(){ self.req2params(req, this); @@ -143,7 +147,7 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { prepareConfigFn, function prepareSqlWrap(err, requestMapConfig) { assert.ifError(err); - self.sqlWrapMapConfigAdapter.getMapConfig(requestMapConfig, this); + self.sqlWrapMapConfigAdapter.getMapConfig(user, requestMapConfig, params, context, this); }, function prepareAnalysisLayers(err, requestMapConfig) { assert.ifError(err); diff --git a/lib/cartodb/models/mapconfig/adapter/sql-wrap-mapconfig-adapter.js b/lib/cartodb/models/mapconfig/adapter/sql-wrap-mapconfig-adapter.js index 6b9a5130..8bb3d201 100644 --- a/lib/cartodb/models/mapconfig/adapter/sql-wrap-mapconfig-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/sql-wrap-mapconfig-adapter.js @@ -4,7 +4,7 @@ function SqlWrapMapConfigAdapter() { module.exports = SqlWrapMapConfigAdapter; -SqlWrapMapConfigAdapter.prototype.getMapConfig = function(requestMapConfig, callback) { +SqlWrapMapConfigAdapter.prototype.getMapConfig = function(user, requestMapConfig, params, context, callback) { if (requestMapConfig && Array.isArray(requestMapConfig.layers)) { requestMapConfig.layers = requestMapConfig.layers.map(function(layer) { if (layer.options) { diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index 25d9b50d..705d44ce 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -60,6 +60,10 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { var rendererParams; var apiKey; + var user = this.owner; + var params = this.params; + var context = {}; + step( function getTemplate() { self.getTemplate(this); @@ -99,7 +103,7 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { }, function prepareSqlWrap(err, requestMapConfig) { assert.ifError(err); - self.sqlWrapMapConfigAdapter.getMapConfig(requestMapConfig, this); + self.sqlWrapMapConfigAdapter.getMapConfig(user, requestMapConfig, params, context, this); }, function prepareAnalysisLayers(err, requestMapConfig) { assert.ifError(err); From 9c1db98f6786f998fe84e4a1615f980531743baf Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 16:44:14 +0200 Subject: [PATCH 21/46] Unifiy getMapConfig signature --- lib/cartodb/controllers/map.js | 16 +++------------- .../adapter/analysis-mapconfig-adapter.js | 14 ++++++++++++-- .../mapconfig/provider/named-map-provider.js | 15 +++------------ 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 82081544..bc5145d0 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -137,7 +137,6 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { var analysesResults = []; var user = req.context.user; - var params = req.params; var context = {}; step( @@ -147,11 +146,11 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { prepareConfigFn, function prepareSqlWrap(err, requestMapConfig) { assert.ifError(err); - self.sqlWrapMapConfigAdapter.getMapConfig(user, requestMapConfig, params, context, this); + self.sqlWrapMapConfigAdapter.getMapConfig(user, requestMapConfig, req.params, context, this); }, function prepareAnalysisLayers(err, requestMapConfig) { assert.ifError(err); - var analysisConfiguration = { + context.analysisConfiguration = { db: { host: req.params.dbhost, port: req.params.dbport, @@ -164,16 +163,7 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { apiKey: req.params.api_key } }; - - var filters = {}; - if (req.params.filters) { - try { - filters = JSON.parse(req.params.filters); - } catch (e) { - // ignore - } - } - self.analysisMapConfigAdapter.getMapConfig(analysisConfiguration, requestMapConfig, filters, this); + self.analysisMapConfigAdapter.getMapConfig(user, requestMapConfig, req.params, context, this); }, function beforeLayergroupCreate(err, requestMapConfig, _analysesResults) { assert.ifError(err); diff --git a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js index fa6aee47..0b61be80 100644 --- a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js @@ -69,15 +69,25 @@ function getFilter(dataview, params) { }; } -AnalysisMapConfigAdapter.prototype.getMapConfig = function(analysisConfiguration, requestMapConfig, filters, callback) { +AnalysisMapConfigAdapter.prototype.getMapConfig = function(user, requestMapConfig, params, context, callback) { // jshint maxcomplexity:7 var self = this; - filters = filters || {}; if (!shouldAdaptLayers(requestMapConfig)) { return callback(null, requestMapConfig); } + var analysisConfiguration = context.analysisConfiguration; + + var filters = {}; + if (params.filters) { + try { + filters = JSON.parse(params.filters); + } catch (e) { + // ignore + } + } + var dataviewsFilters = filters.dataviews || {}; debug(dataviewsFilters); var dataviews = requestMapConfig.dataviews || {}; diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index 705d44ce..f1f43971 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -61,7 +61,6 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { var apiKey; var user = this.owner; - var params = this.params; var context = {}; step( @@ -103,11 +102,11 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { }, function prepareSqlWrap(err, requestMapConfig) { assert.ifError(err); - self.sqlWrapMapConfigAdapter.getMapConfig(user, requestMapConfig, params, context, this); + self.sqlWrapMapConfigAdapter.getMapConfig(user, requestMapConfig, rendererParams, context, this); }, function prepareAnalysisLayers(err, requestMapConfig) { assert.ifError(err); - var analysisConfiguration = { + context.analysisConfiguration = { db: { host: rendererParams.dbhost, port: rendererParams.dbport, @@ -121,15 +120,7 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { } }; - var filters = {}; - if (self.params.filters) { - try { - filters = JSON.parse(self.params.filters); - } catch (e) { - // ignore - } - } - self.analysisMapConfigAdapter.getMapConfig(analysisConfiguration, requestMapConfig, filters, this); + self.analysisMapConfigAdapter.getMapConfig(user, requestMapConfig, rendererParams, context, this); }, function prepareLayergroup(err, _mapConfig, analysesResults) { assert.ifError(err); From 70750d2c430bbb320fa6ed5ebd1c5091c49440cf Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 16:50:26 +0200 Subject: [PATCH 22/46] Unify getMapConfig signature --- lib/cartodb/controllers/map.js | 14 ++++++++------ .../mapconfig/adapter/turbo-carto-adapter.js | 4 ++-- .../mapconfig/provider/named-map-provider.js | 14 ++++++++------ 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index bc5145d0..8a702a32 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -196,13 +196,15 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { assert.ifError(err); var next = this; - self.turboCartoAdapter.getMapConfig(req.context.user, requestMapConfig, function (err, requestMapConfig) { - if (err) { - return next(err); - } + self.turboCartoAdapter.getMapConfig(req.context.user, requestMapConfig, req.params, context, + function (err, requestMapConfig) { + if (err) { + return next(err); + } - return next(null, requestMapConfig, datasource); - }); + return next(null, requestMapConfig, datasource); + } + ); }, function createLayergroup(err, requestMapConfig, datasource) { assert.ifError(err); diff --git a/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js b/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js index fd2b0c20..3eb29197 100644 --- a/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js @@ -11,7 +11,7 @@ function TurboCartoAdapter(turboCartoParser) { module.exports = TurboCartoAdapter; -TurboCartoAdapter.prototype.getMapConfig = function (username, requestMapConfig, callback) { +TurboCartoAdapter.prototype.getMapConfig = function (user, requestMapConfig, params, context, callback) { var self = this; var layers = requestMapConfig.layers; @@ -23,7 +23,7 @@ TurboCartoAdapter.prototype.getMapConfig = function (username, requestMapConfig, var parseCartoQueue = queue(layers.length); layers.forEach(function(layer) { - parseCartoQueue.defer(self._parseCartoCss.bind(self), username, layer); + parseCartoQueue.defer(self._parseCartoCss.bind(self), user, layer); }); parseCartoQueue.awaitAll(function (err, layers) { diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index f1f43971..0eead347 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -152,13 +152,15 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { assert.ifError(err); var next = this; - self.turboCartoAdapter.getMapConfig(self.owner, _mapConfig, function (err, _mapConfig) { - if (err) { - return next(err); - } + self.turboCartoAdapter.getMapConfig(self.owner, _mapConfig, rendererParams, context, + function (err, _mapConfig) { + if (err) { + return next(err); + } - return next(null, _mapConfig, datasource); - }); + return next(null, _mapConfig, datasource); + } + ); }, function prepareContextLimits(err, _mapConfig, _datasource) { assert.ifError(err); From efcb73e0d1764ea1a67b9c546d75d8e9e2eabc73 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 18:03:45 +0200 Subject: [PATCH 23/46] Named layers adapter with getMapConfig signature --- lib/cartodb/cache/named_map_provider_cache.js | 2 +- lib/cartodb/controllers/map.js | 4 ++-- .../adapter/mapconfig-named-layers-adapter.js | 11 +++++----- .../mapconfig/provider/named-map-provider.js | 2 +- .../mapconfig_named_layers_datasource.js | 6 ++++-- .../mapconfig_named_layers_expanded.js | 20 ++++++++++--------- 6 files changed, 25 insertions(+), 20 deletions(-) diff --git a/lib/cartodb/cache/named_map_provider_cache.js b/lib/cartodb/cache/named_map_provider_cache.js index dac98b21..ddfea4a2 100644 --- a/lib/cartodb/cache/named_map_provider_cache.js +++ b/lib/cartodb/cache/named_map_provider_cache.js @@ -15,7 +15,7 @@ function NamedMapProviderCache(templateMaps, pgConnection, metadataBackend, anal this.metadataBackend = metadataBackend; this.userLimitsApi = userLimitsApi; - this.namedLayersAdapter = new MapConfigNamedLayersAdapter(templateMaps); + this.namedLayersAdapter = new MapConfigNamedLayersAdapter(templateMaps, pgConnection); this.analysisMapConfigAdapter = new AnalysisMapConfigAdapter(analysisBackend); this.overviewsAdapter = overviewsAdapter; this.turboCartoAdapter = turboCartoAdapter; diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 8a702a32..80150699 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -51,7 +51,7 @@ function MapController(authApi, pgConnection, templateMaps, mapBackend, metadata this.turboCartoAdapter = turboCartoAdapter; this.analysisMapConfigAdapter = new AnalysisMapConfigAdapter(analysisBackend); - this.namedLayersAdapter = new MapConfigNamedLayersAdapter(templateMaps); + this.namedLayersAdapter = new MapConfigNamedLayersAdapter(templateMaps, pgConnection); this.overviewsAdapter = overviewsAdapter; this.sqlWrapMapConfigAdapter = new SqlWrapMapConfigAdapter(); } @@ -169,7 +169,7 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { assert.ifError(err); var next = this; analysesResults = _analysesResults; - self.namedLayersAdapter.getMapConfig(req.context.user, requestMapConfig, self.pgConnection, + self.namedLayersAdapter.getMapConfig(user, requestMapConfig, req.params, context, function(err, requestMapConfig, datasource) { if (err) { return next(err); diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js index e8792def..8716bd9d 100644 --- a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js @@ -2,13 +2,14 @@ var queue = require('queue-async'); var _ = require('underscore'); var Datasource = require('windshaft').model.Datasource; -function MapConfigNamedLayersAdapter(templateMaps) { +function MapConfigNamedLayersAdapter(templateMaps, pgConnection) { this.templateMaps = templateMaps; + this.pgConnection = pgConnection; } module.exports = MapConfigNamedLayersAdapter; -MapConfigNamedLayersAdapter.prototype.getMapConfig = function(username, requestMapConfig, dbMetadata, callback) { +MapConfigNamedLayersAdapter.prototype.getMapConfig = function (user, requestMapConfig, params, context, callback) { var self = this; var layers = requestMapConfig.layers; @@ -30,9 +31,9 @@ MapConfigNamedLayersAdapter.prototype.getMapConfig = function(username, requestM var templateConfigParams = layer.options.config || {}; var templateAuthTokens = layer.options.auth_tokens; - self.templateMaps.getTemplate(username, templateName, function(err, template) { + self.templateMaps.getTemplate(user, templateName, function(err, template) { if (err || !template) { - return done(new Error("Template '" + templateName + "' of user '" + username + "' not found")); + return done(new Error("Template '" + templateName + "' of user '" + user + "' not found")); } if (self.templateMaps.isAuthorized(template, templateAuthTokens)) { @@ -108,7 +109,7 @@ MapConfigNamedLayersAdapter.prototype.getMapConfig = function(username, requestM if (_.some(layers, isNamedTypeLayer)) { // Lazy load dbAuth - dbMetadata.setDBAuth(username, dbAuth, function(err) { + this.pgConnection.setDBAuth(user, dbAuth, function(err) { if (err) { return callback(err); } diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index 0eead347..c9755fed 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -126,7 +126,7 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { assert.ifError(err); var next = this; self.analysesResults = analysesResults || []; - self.namedLayersAdapter.getMapConfig(self.owner, _mapConfig, self.pgConnection, + self.namedLayersAdapter.getMapConfig(self.owner, _mapConfig, rendererParams, context, function(err, _mapConfig, datasource) { if (err) { return next(err); diff --git a/test/integration/mapconfig_named_layers_datasource.js b/test/integration/mapconfig_named_layers_datasource.js index d372f138..ec37dddd 100644 --- a/test/integration/mapconfig_named_layers_datasource.js +++ b/test/integration/mapconfig_named_layers_datasource.js @@ -14,7 +14,7 @@ var templateMaps = new TemplateMaps(redisPool, { max_user_templates: global.environment.maxUserTemplates }); -var mapConfigNamedLayersAdapter = new MapConfigNamedLayersAdapter(templateMaps); +var mapConfigNamedLayersAdapter = new MapConfigNamedLayersAdapter(templateMaps, pgConnection); var wadusSql = 'select 1 wadusLayer, null::geometry the_geom_webmercator'; var wadusLayer = { @@ -294,7 +294,9 @@ describe('named_layers datasources', function() { testScenarios.forEach(function(testScenario) { it('should return a list of layers ' + testScenario.desc, function(done) { - mapConfigNamedLayersAdapter.getMapConfig(username, testScenario.config, pgConnection, + var params = {}; + var context = {}; + mapConfigNamedLayersAdapter.getMapConfig(username, testScenario.config, params, context, function(err, mapConfig, datasource) { testScenario.test(err, mapConfig.layers, datasource, done); } diff --git a/test/integration/mapconfig_named_layers_expanded.js b/test/integration/mapconfig_named_layers_expanded.js index 90c384f4..54245313 100644 --- a/test/integration/mapconfig_named_layers_expanded.js +++ b/test/integration/mapconfig_named_layers_expanded.js @@ -16,7 +16,7 @@ describe('mapconfig-named-layers-adapter', function() { max_user_templates: global.environment.maxUserTemplates }); - var mapConfigNamedLayersAdapter = new MapConfigNamedLayersAdapter(templateMaps); + var mapConfigNamedLayersAdapter = new MapConfigNamedLayersAdapter(templateMaps, pgConnection); var wadusLayer = { type: 'cartodb', @@ -134,6 +134,8 @@ describe('mapconfig-named-layers-adapter', function() { }; } + var params = {}; + var context = {}; beforeEach(function(done) { templateMaps.addTemplate(username, template, done); @@ -147,7 +149,7 @@ describe('mapconfig-named-layers-adapter', function() { var missingNamedMapLayerConfig = makeNamedMapLayerConfig({ config: {} }); - mapConfigNamedLayersAdapter.getMapConfig(username, missingNamedMapLayerConfig, pgConnection, + mapConfigNamedLayersAdapter.getMapConfig(username, missingNamedMapLayerConfig, params, context, function(err, mapConfig, datasource) { assert.ok(err); assert.ok(!mapConfig); @@ -164,7 +166,7 @@ describe('mapconfig-named-layers-adapter', function() { var nonExistentNamedMapLayerConfig = makeNamedMapLayerConfig({ name: missingTemplateName }); - mapConfigNamedLayersAdapter.getMapConfig(username, nonExistentNamedMapLayerConfig, pgConnection, + mapConfigNamedLayersAdapter.getMapConfig(username, nonExistentNamedMapLayerConfig, params, context, function(err, mapConfig, datasource) { assert.ok(err); assert.ok(!mapConfig); @@ -187,7 +189,7 @@ describe('mapconfig-named-layers-adapter', function() { var nonAuthTokensNamedMapLayerConfig = makeNamedMapLayerConfig({ name: tokenAuthTemplateName }); - mapConfigNamedLayersAdapter.getMapConfig(username, nonAuthTokensNamedMapLayerConfig, pgConnection, + mapConfigNamedLayersAdapter.getMapConfig(username, nonAuthTokensNamedMapLayerConfig, params, context, function(err, mapConfig, datasource) { assert.ok(err); assert.ok(!mapConfig); @@ -209,7 +211,7 @@ describe('mapconfig-named-layers-adapter', function() { var nestedNamedMapLayerConfig = makeNamedMapLayerConfig({ name: nestedNamedMapTemplateName }); - mapConfigNamedLayersAdapter.getMapConfig(username, nestedNamedMapLayerConfig, pgConnection, + mapConfigNamedLayersAdapter.getMapConfig(username, nestedNamedMapLayerConfig, params, context, function(err, mapConfig, datasource) { assert.ok(err); assert.ok(!mapConfig); @@ -226,7 +228,7 @@ describe('mapconfig-named-layers-adapter', function() { var validNamedMapMapLayerConfig = makeNamedMapLayerConfig({ name: templateName }); - mapConfigNamedLayersAdapter.getMapConfig(username, validNamedMapMapLayerConfig, pgConnection, + mapConfigNamedLayersAdapter.getMapConfig(username, validNamedMapMapLayerConfig, params, context, function(err, mapConfig, datasource) { assert.ok(!err); var layers = mapConfig.layers; @@ -249,7 +251,7 @@ describe('mapconfig-named-layers-adapter', function() { name: tokenAuthTemplateName, auth_tokens: ['valid1'] }); - mapConfigNamedLayersAdapter.getMapConfig(username, validAuthTokensNamedMapLayerConfig, pgConnection, + mapConfigNamedLayersAdapter.getMapConfig(username, validAuthTokensNamedMapLayerConfig, params, context, function(err, mapConfig, datasource) { assert.ok(!err); var layers = mapConfig.layers; @@ -272,7 +274,7 @@ describe('mapconfig-named-layers-adapter', function() { name: multipleLayersTemplateName, auth_tokens: ['valid2'] }); - mapConfigNamedLayersAdapter.getMapConfig(username, multipleLayersNamedMapLayerConfig, pgConnection, + mapConfigNamedLayersAdapter.getMapConfig(username, multipleLayersNamedMapLayerConfig, params, context, function(err, mapConfig, datasource) { assert.ok(!err); var layers = mapConfig.layers; @@ -309,7 +311,7 @@ describe('mapconfig-named-layers-adapter', function() { }, auth_tokens: ['valid2'] }); - mapConfigNamedLayersAdapter.getMapConfig(username, multipleLayersNamedMapLayerConfig, pgConnection, + mapConfigNamedLayersAdapter.getMapConfig(username, multipleLayersNamedMapLayerConfig, params, context, function(err, mapConfig, datasource) { assert.ok(!err); var layers = mapConfig.layers; From 31a0b01a27e97b70c9848ac79685ea3528b1da79 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 18:08:42 +0200 Subject: [PATCH 24/46] Rename param --- .../models/mapconfig/adapter/mapconfig-overviews-adapter.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js index a438d0ca..9c2dc062 100644 --- a/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js @@ -9,7 +9,7 @@ function MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsApi) { module.exports = MapConfigOverviewsAdapter; -MapConfigOverviewsAdapter.prototype.getMapConfig = function(username, requestMapConfig, analysesResults, callback) { +MapConfigOverviewsAdapter.prototype.getMapConfig = function(user, requestMapConfig, analysesResults, callback) { var self = this; var layers = requestMapConfig.layers; @@ -24,7 +24,7 @@ MapConfigOverviewsAdapter.prototype.getMapConfig = function(username, requestMap if ( layer.type !== 'mapnik' && layer.type !== 'cartodb' ) { return done(null, layer); } - self.overviewsMetadataApi.getOverviewsMetadata(username, layer.options.sql, function(err, metadata){ + self.overviewsMetadataApi.getOverviewsMetadata(user, layer.options.sql, function(err, metadata){ if (err) { done(err, layer); } else { @@ -53,7 +53,7 @@ MapConfigOverviewsAdapter.prototype.getMapConfig = function(username, requestMap var next_step = this; if ( filters ) { self.filterStatsApi.getFilterStats( - username, + user, unfiltered_query, filters, function(err, stats) { if ( !err ) { From 7ad8a993737b057f2b29a46d772b75bec18bf69e Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 18:35:16 +0200 Subject: [PATCH 25/46] Unify getMapConfig signature for overviews adapter --- lib/cartodb/controllers/map.js | 3 ++- .../mapconfig/adapter/mapconfig-overviews-adapter.js | 3 ++- .../models/mapconfig/provider/named-map-provider.js | 4 ++-- test/integration/mapconfig_overviews_adapter.js | 10 ++++++++-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 80150699..c573a298 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -182,7 +182,8 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { function addOverviewsInformation(err, requestMapConfig, datasource) { assert.ifError(err); var next = this; - self.overviewsAdapter.getMapConfig(req.context.user, requestMapConfig, analysesResults, + context.analysesResults = analysesResults; + self.overviewsAdapter.getMapConfig(req.context.user, requestMapConfig, req.params, context, function(err, requestMapConfig) { if (err) { return next(err); diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js index 9c2dc062..b8a473b5 100644 --- a/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js @@ -9,10 +9,11 @@ function MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsApi) { module.exports = MapConfigOverviewsAdapter; -MapConfigOverviewsAdapter.prototype.getMapConfig = function(user, requestMapConfig, analysesResults, callback) { +MapConfigOverviewsAdapter.prototype.getMapConfig = function(user, requestMapConfig, params, context, callback) { var self = this; var layers = requestMapConfig.layers; + var analysesResults = context.analysesResults; if (!layers || layers.length === 0) { return callback(null, requestMapConfig); diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index c9755fed..8597a07e 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -139,8 +139,8 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { function addOverviewsInformation(err, _mapConfig, datasource) { assert.ifError(err); var next = this; - - self.overviewsAdapter.getMapConfig(self.owner, _mapConfig, self.analysesResults, function(err, _mapConfig) { + context.analysesResults = self.analysesResults; + self.overviewsAdapter.getMapConfig(self.owner, _mapConfig, rendererParams, context, function(err, _mapConfig) { if (err) { return next(err); } diff --git a/test/integration/mapconfig_overviews_adapter.js b/test/integration/mapconfig_overviews_adapter.js index 6444f18f..87a87935 100644 --- a/test/integration/mapconfig_overviews_adapter.js +++ b/test/integration/mapconfig_overviews_adapter.js @@ -37,7 +37,10 @@ describe('MapConfigOverviewsAdapter', function() { layers: [layer_without_overviews] }; - mapConfigOverviewsAdapter.getMapConfig('localhost', _mapConfig, [], function(err, mapConfig) { + var params = {}; + var context = {}; + + mapConfigOverviewsAdapter.getMapConfig('localhost', _mapConfig, params, context, function(err, mapConfig) { assert.ok(!err); var layers = mapConfig.layers; assert.equal(layers.length, 1); @@ -70,7 +73,10 @@ describe('MapConfigOverviewsAdapter', function() { layers: [layer_with_overviews] }; - mapConfigOverviewsAdapter.getMapConfig('localhost', _mapConfig, [], function(err, mapConfig) { + var params = {}; + var context = {}; + + mapConfigOverviewsAdapter.getMapConfig('localhost', _mapConfig, params, context, function(err, mapConfig) { assert.ok(!err); var layers = mapConfig.layers; assert.equal(layers.length, 1); From a8fdd6726eef012bba4e05540c66e1f192e77940 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 18:36:03 +0200 Subject: [PATCH 26/46] Fix style --- .../mapconfig/provider/named-map-provider.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index 8597a07e..453fcab9 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -140,13 +140,15 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { assert.ifError(err); var next = this; context.analysesResults = self.analysesResults; - self.overviewsAdapter.getMapConfig(self.owner, _mapConfig, rendererParams, context, function(err, _mapConfig) { - if (err) { - return next(err); - } + self.overviewsAdapter.getMapConfig(self.owner, _mapConfig, rendererParams, context, + function(err, _mapConfig) { + if (err) { + return next(err); + } - return next(null, _mapConfig, datasource); - }); + return next(null, _mapConfig, datasource); + } + ); }, function parseTurboCarto(err, _mapConfig, datasource) { assert.ifError(err); From a11cc28dc7ee1ae3cbda97cf1e3ec9e19eb7f7c7 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 18:59:23 +0200 Subject: [PATCH 27/46] Use context for analyses results --- lib/cartodb/controllers/map.js | 20 ++++++++++--------- .../adapter/analysis-mapconfig-adapter.js | 4 +++- .../mapconfig/provider/named-map-provider.js | 20 ++++++++++--------- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index c573a298..5f7d0894 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -134,7 +134,6 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { var self = this; var mapConfig; - var analysesResults = []; var user = req.context.user; var context = {}; @@ -144,11 +143,7 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { self.req2params(req, this); }, prepareConfigFn, - function prepareSqlWrap(err, requestMapConfig) { - assert.ifError(err); - self.sqlWrapMapConfigAdapter.getMapConfig(user, requestMapConfig, req.params, context, this); - }, - function prepareAnalysisLayers(err, requestMapConfig) { + function prepareAdapterMapConfig(err, requestMapConfig) { assert.ifError(err); context.analysisConfiguration = { db: { @@ -163,12 +158,19 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { apiKey: req.params.api_key } }; + return requestMapConfig; + }, + function prepareSqlWrap(err, requestMapConfig) { + assert.ifError(err); + self.sqlWrapMapConfigAdapter.getMapConfig(user, requestMapConfig, req.params, context, this); + }, + function prepareAnalysisLayers(err, requestMapConfig) { + assert.ifError(err); self.analysisMapConfigAdapter.getMapConfig(user, requestMapConfig, req.params, context, this); }, - function beforeLayergroupCreate(err, requestMapConfig, _analysesResults) { + function beforeLayergroupCreate(err, requestMapConfig) { assert.ifError(err); var next = this; - analysesResults = _analysesResults; self.namedLayersAdapter.getMapConfig(user, requestMapConfig, req.params, context, function(err, requestMapConfig, datasource) { if (err) { @@ -182,7 +184,6 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { function addOverviewsInformation(err, requestMapConfig, datasource) { assert.ifError(err); var next = this; - context.analysesResults = analysesResults; self.overviewsAdapter.getMapConfig(req.context.user, requestMapConfig, req.params, context, function(err, requestMapConfig) { if (err) { @@ -218,6 +219,7 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { }, function afterLayergroupCreate(err, layergroup) { assert.ifError(err); + var analysesResults = context.analysesResults || []; self.afterLayergroupCreate(req, res, mapConfig, analysesResults, layergroup, this); }, function finish(err, layergroup) { diff --git a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js index 0b61be80..c48de8a4 100644 --- a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js @@ -178,7 +178,9 @@ AnalysisMapConfigAdapter.prototype.getMapConfig = function(user, requestMapConfi return callback(missingNodesErrors); } - return callback(null, requestMapConfig, analysesResults); + context.analysesResults = analysesResults; + + return callback(null, requestMapConfig); }); }; diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index 453fcab9..da17c93a 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -100,11 +100,7 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { assert.ifError(err); return self.templateMaps.instance(self.template, templateParams); }, - function prepareSqlWrap(err, requestMapConfig) { - assert.ifError(err); - self.sqlWrapMapConfigAdapter.getMapConfig(user, requestMapConfig, rendererParams, context, this); - }, - function prepareAnalysisLayers(err, requestMapConfig) { + function prepareAdapterMapConfig(err, requestMapConfig) { assert.ifError(err); context.analysisConfiguration = { db: { @@ -119,13 +115,20 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { apiKey: apiKey } }; - + return requestMapConfig; + }, + function prepareSqlWrap(err, requestMapConfig) { + assert.ifError(err); + self.sqlWrapMapConfigAdapter.getMapConfig(user, requestMapConfig, rendererParams, context, this); + }, + function prepareAnalysisLayers(err, requestMapConfig) { + assert.ifError(err); self.analysisMapConfigAdapter.getMapConfig(user, requestMapConfig, rendererParams, context, this); }, - function prepareLayergroup(err, _mapConfig, analysesResults) { + function prepareLayergroup(err, _mapConfig) { assert.ifError(err); var next = this; - self.analysesResults = analysesResults || []; + self.analysesResults = context.analysesResults || []; self.namedLayersAdapter.getMapConfig(self.owner, _mapConfig, rendererParams, context, function(err, _mapConfig, datasource) { if (err) { @@ -139,7 +142,6 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { function addOverviewsInformation(err, _mapConfig, datasource) { assert.ifError(err); var next = this; - context.analysesResults = self.analysesResults; self.overviewsAdapter.getMapConfig(self.owner, _mapConfig, rendererParams, context, function(err, _mapConfig) { if (err) { From e9d1951d48be400598c8626190184ae6e0cb019d Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 19:09:57 +0200 Subject: [PATCH 28/46] Use context for datasource 1/2 --- lib/cartodb/controllers/map.js | 5 +-- .../adapter/mapconfig-named-layers-adapter.js | 6 ++-- .../mapconfig/provider/named-map-provider.js | 5 ++- .../mapconfig_named_layers_datasource.js | 2 +- .../mapconfig_named_layers_expanded.js | 36 +++++++++---------- 5 files changed, 28 insertions(+), 26 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 5f7d0894..c3f698da 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -208,9 +208,10 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { } ); }, - function createLayergroup(err, requestMapConfig, datasource) { + function createLayergroup(err, requestMapConfig) { assert.ifError(err); - mapConfig = new MapConfig(requestMapConfig, datasource || Datasource.EmptyDatasource()); + var datasource = context.datasource || Datasource.EmptyDatasource(); + mapConfig = new MapConfig(requestMapConfig, datasource); self.mapBackend.createLayergroup( mapConfig, req.params, new CreateLayergroupMapConfigProvider(mapConfig, req.context.user, self.userLimitsApi, req.params), diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js index 8716bd9d..fd00e344 100644 --- a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js @@ -100,8 +100,9 @@ MapConfigNamedLayersAdapter.prototype.getMapConfig = function (user, requestMapC }); requestMapConfig.layers = layers; + context.datasource = datasourceBuilder.build(); - return callback(null, requestMapConfig, datasourceBuilder.build()); + return callback(null, requestMapConfig); } @@ -119,7 +120,8 @@ MapConfigNamedLayersAdapter.prototype.getMapConfig = function (user, requestMapC adaptLayersQueue.awaitAll(layersAdaptQueueFinish); }); } else { - return callback(null, requestMapConfig, datasourceBuilder.build()); + context.datasource = datasourceBuilder.build(); + return callback(null, requestMapConfig); } }; diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index da17c93a..73298b98 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -166,15 +166,14 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { } ); }, - function prepareContextLimits(err, _mapConfig, _datasource) { + function prepareContextLimits(err, _mapConfig) { assert.ifError(err); mapConfig = _mapConfig; - datasource = _datasource; self.userLimitsApi.getRenderLimits(self.owner, this); }, function cacheAndReturnMapConfig(err, renderLimits) { self.err = err; - self.mapConfig = (mapConfig === null) ? null : new MapConfig(mapConfig, datasource); + self.mapConfig = (mapConfig === null) ? null : new MapConfig(mapConfig, context.datasource); self.rendererParams = rendererParams; self.context.limits = renderLimits || {}; return callback(self.err, self.mapConfig, self.rendererParams, self.context); diff --git a/test/integration/mapconfig_named_layers_datasource.js b/test/integration/mapconfig_named_layers_datasource.js index ec37dddd..f644c3c5 100644 --- a/test/integration/mapconfig_named_layers_datasource.js +++ b/test/integration/mapconfig_named_layers_datasource.js @@ -298,7 +298,7 @@ describe('named_layers datasources', function() { var context = {}; mapConfigNamedLayersAdapter.getMapConfig(username, testScenario.config, params, context, function(err, mapConfig, datasource) { - testScenario.test(err, mapConfig.layers, datasource, done); + testScenario.test(err, mapConfig.layers, context.datasource, done); } ); }); diff --git a/test/integration/mapconfig_named_layers_expanded.js b/test/integration/mapconfig_named_layers_expanded.js index 54245313..fd542514 100644 --- a/test/integration/mapconfig_named_layers_expanded.js +++ b/test/integration/mapconfig_named_layers_expanded.js @@ -150,10 +150,10 @@ describe('mapconfig-named-layers-adapter', function() { config: {} }); mapConfigNamedLayersAdapter.getMapConfig(username, missingNamedMapLayerConfig, params, context, - function(err, mapConfig, datasource) { + function(err, mapConfig) { assert.ok(err); assert.ok(!mapConfig); - assert.ok(!datasource); + assert.ok(!context.datasource); assert.equal(err.message, 'Missing Named Map `name` in layer options'); done(); @@ -167,10 +167,10 @@ describe('mapconfig-named-layers-adapter', function() { name: missingTemplateName }); mapConfigNamedLayersAdapter.getMapConfig(username, nonExistentNamedMapLayerConfig, params, context, - function(err, mapConfig, datasource) { + function(err, mapConfig) { assert.ok(err); assert.ok(!mapConfig); - assert.ok(!datasource); + assert.ok(!context.datasource); assert.equal( err.message, "Template '" + missingTemplateName + "' of user '" + username + "' not found" ); @@ -190,10 +190,10 @@ describe('mapconfig-named-layers-adapter', function() { name: tokenAuthTemplateName }); mapConfigNamedLayersAdapter.getMapConfig(username, nonAuthTokensNamedMapLayerConfig, params, context, - function(err, mapConfig, datasource) { + function(err, mapConfig) { assert.ok(err); assert.ok(!mapConfig); - assert.ok(!datasource); + assert.ok(!context.datasource); assert.equal(err.message, "Unauthorized '" + tokenAuthTemplateName + "' template instantiation"); templateMaps.delTemplate(username, tokenAuthTemplateName, done); @@ -212,10 +212,10 @@ describe('mapconfig-named-layers-adapter', function() { name: nestedNamedMapTemplateName }); mapConfigNamedLayersAdapter.getMapConfig(username, nestedNamedMapLayerConfig, params, context, - function(err, mapConfig, datasource) { + function(err, mapConfig) { assert.ok(err); assert.ok(!mapConfig); - assert.ok(!datasource); + assert.ok(!context.datasource); assert.equal(err.message, 'Nested named layers are not allowed'); templateMaps.delTemplate(username, nestedNamedMapTemplateName, done); @@ -229,12 +229,12 @@ describe('mapconfig-named-layers-adapter', function() { name: templateName }); mapConfigNamedLayersAdapter.getMapConfig(username, validNamedMapMapLayerConfig, params, context, - function(err, mapConfig, datasource) { + function(err, mapConfig) { assert.ok(!err); var layers = mapConfig.layers; assert.ok(layers.length, 1); assert.ok(layers[0].type, 'cartodb'); - assert.notEqual(datasource.getLayerDatasource(0), undefined); + assert.notEqual(context.datasource.getLayerDatasource(0), undefined); done(); } @@ -252,11 +252,11 @@ describe('mapconfig-named-layers-adapter', function() { auth_tokens: ['valid1'] }); mapConfigNamedLayersAdapter.getMapConfig(username, validAuthTokensNamedMapLayerConfig, params, context, - function(err, mapConfig, datasource) { + function(err, mapConfig) { assert.ok(!err); var layers = mapConfig.layers; assert.equal(layers.length, 1); - assert.notEqual(datasource.getLayerDatasource(0), undefined); + assert.notEqual(context.datasource.getLayerDatasource(0), undefined); templateMaps.delTemplate(username, tokenAuthTemplateName, done); } @@ -275,18 +275,18 @@ describe('mapconfig-named-layers-adapter', function() { auth_tokens: ['valid2'] }); mapConfigNamedLayersAdapter.getMapConfig(username, multipleLayersNamedMapLayerConfig, params, context, - function(err, mapConfig, datasource) { + function(err, mapConfig) { assert.ok(!err); var layers = mapConfig.layers; assert.equal(layers.length, 2); assert.equal(layers[0].type, 'mapnik'); assert.equal(layers[0].options.cartocss, '#layer { polygon-fill: green; }'); - assert.notEqual(datasource.getLayerDatasource(0), undefined); + assert.notEqual(context.datasource.getLayerDatasource(0), undefined); assert.equal(layers[1].type, 'cartodb'); assert.equal(layers[1].options.cartocss, '#layer { marker-fill: red; }'); - assert.notEqual(datasource.getLayerDatasource(1), undefined); + assert.notEqual(context.datasource.getLayerDatasource(1), undefined); templateMaps.delTemplate(username, multipleLayersTemplateName, done); } @@ -312,18 +312,18 @@ describe('mapconfig-named-layers-adapter', function() { auth_tokens: ['valid2'] }); mapConfigNamedLayersAdapter.getMapConfig(username, multipleLayersNamedMapLayerConfig, params, context, - function(err, mapConfig, datasource) { + function(err, mapConfig) { assert.ok(!err); var layers = mapConfig.layers; assert.equal(layers.length, 2); assert.equal(layers[0].type, 'mapnik'); assert.equal(layers[0].options.cartocss, '#layer { polygon-fill: ' + polygonColor + '; }'); - assert.notEqual(datasource.getLayerDatasource(0), undefined); + assert.notEqual(context.datasource.getLayerDatasource(0), undefined); assert.equal(layers[1].type, 'cartodb'); assert.equal(layers[1].options.cartocss, '#layer { marker-fill: ' + color + '; }'); - assert.notEqual(datasource.getLayerDatasource(1), undefined); + assert.notEqual(context.datasource.getLayerDatasource(1), undefined); templateMaps.delTemplate(username, multipleLayersTemplateName, done); } From 02cb80daa181bc512ba00391ecd6741ec73632b5 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 19:14:03 +0200 Subject: [PATCH 29/46] Use context for datasource 2/2 --- lib/cartodb/controllers/map.js | 38 +++--------------- .../mapconfig/provider/named-map-provider.js | 39 +++---------------- 2 files changed, 10 insertions(+), 67 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index c3f698da..ecce9632 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -170,43 +170,15 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { }, function beforeLayergroupCreate(err, requestMapConfig) { assert.ifError(err); - var next = this; - self.namedLayersAdapter.getMapConfig(user, requestMapConfig, req.params, context, - function(err, requestMapConfig, datasource) { - if (err) { - return next(err); - } - - return next(null, requestMapConfig, datasource); - } - ); + self.namedLayersAdapter.getMapConfig(user, requestMapConfig, req.params, context, this); }, - function addOverviewsInformation(err, requestMapConfig, datasource) { + function addOverviewsInformation(err, requestMapConfig) { assert.ifError(err); - var next = this; - self.overviewsAdapter.getMapConfig(req.context.user, requestMapConfig, req.params, context, - function(err, requestMapConfig) { - if (err) { - return next(err); - } - - return next(null, requestMapConfig, datasource); - } - ); + self.overviewsAdapter.getMapConfig(req.context.user, requestMapConfig, req.params, context, this); }, - function parseTurboCarto(err, requestMapConfig, datasource) { + function parseTurboCarto(err, requestMapConfig) { assert.ifError(err); - - var next = this; - self.turboCartoAdapter.getMapConfig(req.context.user, requestMapConfig, req.params, context, - function (err, requestMapConfig) { - if (err) { - return next(err); - } - - return next(null, requestMapConfig, datasource); - } - ); + self.turboCartoAdapter.getMapConfig(req.context.user, requestMapConfig, req.params, context, this); }, function createLayergroup(err, requestMapConfig) { assert.ifError(err); diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index 73298b98..67522669 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -56,7 +56,6 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { var self = this; var mapConfig = null; - var datasource = null; var rendererParams; var apiKey; @@ -127,44 +126,16 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { }, function prepareLayergroup(err, _mapConfig) { assert.ifError(err); - var next = this; self.analysesResults = context.analysesResults || []; - self.namedLayersAdapter.getMapConfig(self.owner, _mapConfig, rendererParams, context, - function(err, _mapConfig, datasource) { - if (err) { - return next(err); - } - - return next(null, _mapConfig, datasource); - } - ); + self.namedLayersAdapter.getMapConfig(self.owner, _mapConfig, rendererParams, context, this); }, - function addOverviewsInformation(err, _mapConfig, datasource) { + function addOverviewsInformation(err, _mapConfig) { assert.ifError(err); - var next = this; - self.overviewsAdapter.getMapConfig(self.owner, _mapConfig, rendererParams, context, - function(err, _mapConfig) { - if (err) { - return next(err); - } - - return next(null, _mapConfig, datasource); - } - ); + self.overviewsAdapter.getMapConfig(self.owner, _mapConfig, rendererParams, context, this); }, - function parseTurboCarto(err, _mapConfig, datasource) { + function parseTurboCarto(err, _mapConfig) { assert.ifError(err); - var next = this; - - self.turboCartoAdapter.getMapConfig(self.owner, _mapConfig, rendererParams, context, - function (err, _mapConfig) { - if (err) { - return next(err); - } - - return next(null, _mapConfig, datasource); - } - ); + self.turboCartoAdapter.getMapConfig(self.owner, _mapConfig, rendererParams, context, this); }, function prepareContextLimits(err, _mapConfig) { assert.ifError(err); From 8efe84447436f2b5e04eb3bcb9d76dd6009f05a0 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 21:37:06 +0200 Subject: [PATCH 30/46] Use generic adapter --- lib/cartodb/controllers/map.js | 32 ++++++------------- lib/cartodb/models/mapconfig/adapter/index.js | 26 +++++++++++++++ 2 files changed, 36 insertions(+), 22 deletions(-) create mode 100644 lib/cartodb/models/mapconfig/adapter/index.js diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index ecce9632..4646eac3 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -20,6 +20,7 @@ var AnalysisMapConfigAdapter = require('../models/mapconfig/adapter/analysis-map var NamedMapMapConfigProvider = require('../models/mapconfig/provider/named-map-provider'); var CreateLayergroupMapConfigProvider = require('../models/mapconfig/provider/create-layergroup-provider'); var SqlWrapMapConfigAdapter = require('../models/mapconfig/adapter/sql-wrap-mapconfig-adapter'); +var MapConfigAdapter = require('../models/mapconfig/adapter'); /** * @param {AuthApi} authApi @@ -54,6 +55,14 @@ function MapController(authApi, pgConnection, templateMaps, mapBackend, metadata this.namedLayersAdapter = new MapConfigNamedLayersAdapter(templateMaps, pgConnection); this.overviewsAdapter = overviewsAdapter; this.sqlWrapMapConfigAdapter = new SqlWrapMapConfigAdapter(); + + this.mapConfigAdapter = new MapConfigAdapter([ + this.sqlWrapMapConfigAdapter, + this.analysisMapConfigAdapter, + this.namedLayersAdapter, + this.overviewsAdapter, + this.turboCartoAdapter + ]); } util.inherits(MapController, BaseController); @@ -135,7 +144,6 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { var mapConfig; - var user = req.context.user; var context = {}; step( @@ -158,27 +166,7 @@ MapController.prototype.create = function(req, res, prepareConfigFn) { apiKey: req.params.api_key } }; - return requestMapConfig; - }, - function prepareSqlWrap(err, requestMapConfig) { - assert.ifError(err); - self.sqlWrapMapConfigAdapter.getMapConfig(user, requestMapConfig, req.params, context, this); - }, - function prepareAnalysisLayers(err, requestMapConfig) { - assert.ifError(err); - self.analysisMapConfigAdapter.getMapConfig(user, requestMapConfig, req.params, context, this); - }, - function beforeLayergroupCreate(err, requestMapConfig) { - assert.ifError(err); - self.namedLayersAdapter.getMapConfig(user, requestMapConfig, req.params, context, this); - }, - function addOverviewsInformation(err, requestMapConfig) { - assert.ifError(err); - self.overviewsAdapter.getMapConfig(req.context.user, requestMapConfig, req.params, context, this); - }, - function parseTurboCarto(err, requestMapConfig) { - assert.ifError(err); - self.turboCartoAdapter.getMapConfig(req.context.user, requestMapConfig, req.params, context, this); + self.mapConfigAdapter.getMapConfig(req.context.user, requestMapConfig, req.params, context, this); }, function createLayergroup(err, requestMapConfig) { assert.ifError(err); diff --git a/lib/cartodb/models/mapconfig/adapter/index.js b/lib/cartodb/models/mapconfig/adapter/index.js new file mode 100644 index 00000000..f7b49ebc --- /dev/null +++ b/lib/cartodb/models/mapconfig/adapter/index.js @@ -0,0 +1,26 @@ +'use strict'; + +function MapConfigAdapter(adapters) { + this.adapters = adapters; +} + +module.exports = MapConfigAdapter; + +MapConfigAdapter.prototype.getMapConfig = function(user, requestMapConfig, params, context, callback) { + var self = this; + var i = 0; + var tasksLeft = this.adapters.length; + + function next(err, _requestMapConfig) { + if (err) { + return callback(err); + } + if (tasksLeft-- === 0) { + return callback(null, _requestMapConfig); + } + var nextAdapter = self.adapters[i++]; + nextAdapter.getMapConfig(user, _requestMapConfig, params, context, next); + } + + next(null, requestMapConfig); +}; From 9ce4929d875e78b5a671b18beb07ab1ffd88d94d Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 21:56:38 +0200 Subject: [PATCH 31/46] Use generic adapter in named maps --- .../mapconfig/provider/named-map-provider.js | 33 +++++++------------ 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index 67522669..598162ba 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -7,6 +7,7 @@ var MapConfig = require('windshaft').model.MapConfig; var templateName = require('../../../backends/template_maps').templateName; var QueryTables = require('cartodb-query-tables'); var SqlWrapMapConfigAdapter = require('./../adapter/sql-wrap-mapconfig-adapter'); +var MapConfigAdapter = require('./../adapter'); /** * @constructor @@ -25,6 +26,14 @@ function NamedMapMapConfigProvider(templateMaps, pgConnection, metadataBackend, this.overviewsAdapter = overviewsAdapter; this.sqlWrapMapConfigAdapter = new SqlWrapMapConfigAdapter(); + this.mapConfigAdapter = new MapConfigAdapter([ + this.sqlWrapMapConfigAdapter, + this.analysisMapConfigAdapter, + this.namedLayersAdapter, + this.overviewsAdapter, + this.turboCartoAdapter + ]); + this.owner = owner; this.templateName = templateName(templateId); this.config = config; @@ -114,28 +123,7 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { apiKey: apiKey } }; - return requestMapConfig; - }, - function prepareSqlWrap(err, requestMapConfig) { - assert.ifError(err); - self.sqlWrapMapConfigAdapter.getMapConfig(user, requestMapConfig, rendererParams, context, this); - }, - function prepareAnalysisLayers(err, requestMapConfig) { - assert.ifError(err); - self.analysisMapConfigAdapter.getMapConfig(user, requestMapConfig, rendererParams, context, this); - }, - function prepareLayergroup(err, _mapConfig) { - assert.ifError(err); - self.analysesResults = context.analysesResults || []; - self.namedLayersAdapter.getMapConfig(self.owner, _mapConfig, rendererParams, context, this); - }, - function addOverviewsInformation(err, _mapConfig) { - assert.ifError(err); - self.overviewsAdapter.getMapConfig(self.owner, _mapConfig, rendererParams, context, this); - }, - function parseTurboCarto(err, _mapConfig) { - assert.ifError(err); - self.turboCartoAdapter.getMapConfig(self.owner, _mapConfig, rendererParams, context, this); + self.mapConfigAdapter.getMapConfig(self.owner, requestMapConfig, rendererParams, context, this); }, function prepareContextLimits(err, _mapConfig) { assert.ifError(err); @@ -145,6 +133,7 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { function cacheAndReturnMapConfig(err, renderLimits) { self.err = err; self.mapConfig = (mapConfig === null) ? null : new MapConfig(mapConfig, context.datasource); + self.analysesResults = context.analysesResults || []; self.rendererParams = rendererParams; self.context.limits = renderLimits || {}; return callback(self.err, self.mapConfig, self.rendererParams, self.context); From f012e6092fe76a7b4de7322553b144af68dfe46c Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 21:58:42 +0200 Subject: [PATCH 32/46] Remove unused var --- lib/cartodb/models/mapconfig/provider/named-map-provider.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index 598162ba..94d6356e 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -68,7 +68,6 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { var rendererParams; var apiKey; - var user = this.owner; var context = {}; step( From 4137de5adf4c52f7094bbf98def320f8295ef2b3 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 22:01:08 +0200 Subject: [PATCH 33/46] Remove class members --- .../mapconfig/provider/named-map-provider.js | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index 94d6356e..f9c97e09 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -20,18 +20,13 @@ function NamedMapMapConfigProvider(templateMaps, pgConnection, metadataBackend, this.pgConnection = pgConnection; this.metadataBackend = metadataBackend; this.userLimitsApi = userLimitsApi; - this.namedLayersAdapter = namedLayersAdapter; - this.turboCartoAdapter = turboCartoAdapter; - this.analysisMapConfigAdapter = analysisMapConfigAdapter; - this.overviewsAdapter = overviewsAdapter; - this.sqlWrapMapConfigAdapter = new SqlWrapMapConfigAdapter(); this.mapConfigAdapter = new MapConfigAdapter([ - this.sqlWrapMapConfigAdapter, - this.analysisMapConfigAdapter, - this.namedLayersAdapter, - this.overviewsAdapter, - this.turboCartoAdapter + new SqlWrapMapConfigAdapter(), + analysisMapConfigAdapter, + namedLayersAdapter, + overviewsAdapter, + turboCartoAdapter ]); this.owner = owner; From a785ebef652b17f3001784a82360b94330fda765 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 23:29:06 +0200 Subject: [PATCH 34/46] Use generic map config adapter --- lib/cartodb/cache/named_map_provider_cache.js | 16 +++----------- lib/cartodb/controllers/map.js | 5 +---- .../mapconfig/provider/named-map-provider.js | 14 ++----------- lib/cartodb/server.js | 21 ++++++++++++++----- 4 files changed, 22 insertions(+), 34 deletions(-) diff --git a/lib/cartodb/cache/named_map_provider_cache.js b/lib/cartodb/cache/named_map_provider_cache.js index ddfea4a2..ebafbbac 100644 --- a/lib/cartodb/cache/named_map_provider_cache.js +++ b/lib/cartodb/cache/named_map_provider_cache.js @@ -1,24 +1,17 @@ var _ = require('underscore'); var dot = require('dot'); var NamedMapMapConfigProvider = require('../models/mapconfig/provider/named-map-provider'); -var MapConfigNamedLayersAdapter = require('../models/mapconfig/adapter/mapconfig-named-layers-adapter'); -var AnalysisMapConfigAdapter = require('../models/mapconfig/adapter/analysis-mapconfig-adapter'); var templateName = require('../backends/template_maps').templateName; var queue = require('queue-async'); var LruCache = require("lru-cache"); -function NamedMapProviderCache(templateMaps, pgConnection, metadataBackend, analysisBackend, userLimitsApi, - overviewsAdapter, turboCartoAdapter) { +function NamedMapProviderCache(templateMaps, pgConnection, metadataBackend, userLimitsApi, mapConfigAdapter) { this.templateMaps = templateMaps; this.pgConnection = pgConnection; this.metadataBackend = metadataBackend; this.userLimitsApi = userLimitsApi; - - this.namedLayersAdapter = new MapConfigNamedLayersAdapter(templateMaps, pgConnection); - this.analysisMapConfigAdapter = new AnalysisMapConfigAdapter(analysisBackend); - this.overviewsAdapter = overviewsAdapter; - this.turboCartoAdapter = turboCartoAdapter; + this.mapConfigAdapter = mapConfigAdapter; this.providerCache = new LruCache({ max: 2000 }); } @@ -36,10 +29,7 @@ NamedMapProviderCache.prototype.get = function(user, templateId, config, authTok this.pgConnection, this.metadataBackend, this.userLimitsApi, - this.namedLayersAdapter, - this.overviewsAdapter, - this.turboCartoAdapter, - this.analysisMapConfigAdapter, + this.mapConfigAdapter, user, templateId, config, diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 4646eac3..66b42e7b 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -218,10 +218,7 @@ MapController.prototype.instantiateTemplate = function(req, res, prepareParamsFn self.pgConnection, self.metadataBackend, self.userLimitsApi, - self.namedLayersAdapter, - self.overviewsAdapter, - self.turboCartoAdapter, - self.analysisMapConfigAdapter, + self.mapConfigAdapter, cdbuser, req.params.template_id, templateParams, diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index f9c97e09..7c9c0dc5 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -6,28 +6,18 @@ var step = require('step'); var MapConfig = require('windshaft').model.MapConfig; var templateName = require('../../../backends/template_maps').templateName; var QueryTables = require('cartodb-query-tables'); -var SqlWrapMapConfigAdapter = require('./../adapter/sql-wrap-mapconfig-adapter'); -var MapConfigAdapter = require('./../adapter'); /** * @constructor * @type {NamedMapMapConfigProvider} */ -function NamedMapMapConfigProvider(templateMaps, pgConnection, metadataBackend, userLimitsApi, - namedLayersAdapter, overviewsAdapter, turboCartoAdapter, analysisMapConfigAdapter, +function NamedMapMapConfigProvider(templateMaps, pgConnection, metadataBackend, userLimitsApi, mapConfigAdapter, owner, templateId, config, authToken, params) { this.templateMaps = templateMaps; this.pgConnection = pgConnection; this.metadataBackend = metadataBackend; this.userLimitsApi = userLimitsApi; - - this.mapConfigAdapter = new MapConfigAdapter([ - new SqlWrapMapConfigAdapter(), - analysisMapConfigAdapter, - namedLayersAdapter, - overviewsAdapter, - turboCartoAdapter - ]); + this.mapConfigAdapter = mapConfigAdapter; this.owner = owner; this.templateName = templateName(templateId); diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index cb8cc452..cc3ac029 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -34,11 +34,16 @@ var AnalysisBackend = require('./backends/analysis'); var timeoutErrorTilePath = __dirname + '/../../assets/render-timeout-fallback.png'; var timeoutErrorTile = require('fs').readFileSync(timeoutErrorTilePath, {encoding: null}); -var MapConfigOverviewsAdapter = require('./models/mapconfig/adapter/mapconfig-overviews-adapter'); - var TurboCartoParser = require('./utils/style/turbo-carto-parser'); + +var SqlWrapMapConfigAdapter = require('./models/mapconfig/adapter/sql-wrap-mapconfig-adapter'); +var MapConfigNamedLayersAdapter = require('./models/mapconfig/adapter/mapconfig-named-layers-adapter'); +var AnalysisMapConfigAdapter = require('./models/mapconfig/adapter/analysis-mapconfig-adapter'); +var MapConfigOverviewsAdapter = require('./models/mapconfig/adapter/mapconfig-overviews-adapter'); var TurboCartoAdapter = require('./models/mapconfig/adapter/turbo-carto-adapter'); +var MapConfigAdapter = require('./models/mapconfig/adapter'); + module.exports = function(serverOptions) { // Make stats client globally accessible global.statsClient = StatsClient.getInstance(serverOptions.statsd); @@ -155,14 +160,20 @@ module.exports = function(serverOptions) { var turboCartoParser = new TurboCartoParser(pgQueryRunner); var turboCartoAdapter = new TurboCartoAdapter(turboCartoParser); + var mapConfigAdapter = new MapConfigAdapter([ + new SqlWrapMapConfigAdapter(), + new AnalysisMapConfigAdapter(analysisBackend), + new MapConfigNamedLayersAdapter(templateMaps, pgConnection), + overviewsAdapter, + turboCartoAdapter + ]); + var namedMapProviderCache = new NamedMapProviderCache( templateMaps, pgConnection, metadataBackend, - analysisBackend, userLimitsApi, - overviewsAdapter, - turboCartoAdapter + mapConfigAdapter ); ['update', 'delete'].forEach(function(eventType) { From 5e6529363bab0b2638eb4245532a70c78e59ddd5 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 23:29:41 +0200 Subject: [PATCH 35/46] Remove unused var --- test/integration/mapconfig_named_layers_datasource.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/mapconfig_named_layers_datasource.js b/test/integration/mapconfig_named_layers_datasource.js index f644c3c5..aac8d335 100644 --- a/test/integration/mapconfig_named_layers_datasource.js +++ b/test/integration/mapconfig_named_layers_datasource.js @@ -297,7 +297,7 @@ describe('named_layers datasources', function() { var params = {}; var context = {}; mapConfigNamedLayersAdapter.getMapConfig(username, testScenario.config, params, context, - function(err, mapConfig, datasource) { + function(err, mapConfig) { testScenario.test(err, mapConfig.layers, context.datasource, done); } ); From faa24caf5ba303000df04c3953c0613aafe279ff Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 23:35:42 +0200 Subject: [PATCH 36/46] Use generic map config adapter --- lib/cartodb/controllers/map.js | 25 +++---------------------- lib/cartodb/server.js | 4 +--- 2 files changed, 4 insertions(+), 25 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 66b42e7b..32459059 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -15,12 +15,8 @@ var Datasource = windshaft.model.Datasource; var NamedMapsCacheEntry = require('../cache/model/named_maps_entry'); -var MapConfigNamedLayersAdapter = require('../models/mapconfig/adapter/mapconfig-named-layers-adapter'); -var AnalysisMapConfigAdapter = require('../models/mapconfig/adapter/analysis-mapconfig-adapter'); var NamedMapMapConfigProvider = require('../models/mapconfig/provider/named-map-provider'); var CreateLayergroupMapConfigProvider = require('../models/mapconfig/provider/create-layergroup-provider'); -var SqlWrapMapConfigAdapter = require('../models/mapconfig/adapter/sql-wrap-mapconfig-adapter'); -var MapConfigAdapter = require('../models/mapconfig/adapter'); /** * @param {AuthApi} authApi @@ -31,14 +27,11 @@ var MapConfigAdapter = require('../models/mapconfig/adapter'); * @param {SurrogateKeysCache} surrogateKeysCache * @param {UserLimitsApi} userLimitsApi * @param {LayergroupAffectedTables} layergroupAffectedTables - * @param {MapConfigOverviewsAdapter} overviewsAdapter - * @param {TurboCartoAdapter} turboCartoAdapter - * @param {AnalysisBackend} analysisBackend + * @param {MapConfigAdapter} mapConfigAdapter * @constructor */ function MapController(authApi, pgConnection, templateMaps, mapBackend, metadataBackend, - surrogateKeysCache, userLimitsApi, layergroupAffectedTables, - overviewsAdapter, turboCartoAdapter, analysisBackend) { + surrogateKeysCache, userLimitsApi, layergroupAffectedTables, mapConfigAdapter) { BaseController.call(this, authApi, pgConnection); @@ -49,20 +42,8 @@ function MapController(authApi, pgConnection, templateMaps, mapBackend, metadata this.surrogateKeysCache = surrogateKeysCache; this.userLimitsApi = userLimitsApi; this.layergroupAffectedTables = layergroupAffectedTables; - this.turboCartoAdapter = turboCartoAdapter; - this.analysisMapConfigAdapter = new AnalysisMapConfigAdapter(analysisBackend); - this.namedLayersAdapter = new MapConfigNamedLayersAdapter(templateMaps, pgConnection); - this.overviewsAdapter = overviewsAdapter; - this.sqlWrapMapConfigAdapter = new SqlWrapMapConfigAdapter(); - - this.mapConfigAdapter = new MapConfigAdapter([ - this.sqlWrapMapConfigAdapter, - this.analysisMapConfigAdapter, - this.namedLayersAdapter, - this.overviewsAdapter, - this.turboCartoAdapter - ]); + this.mapConfigAdapter = mapConfigAdapter; } util.inherits(MapController, BaseController); diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index cc3ac029..826fe2f8 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -212,9 +212,7 @@ module.exports = function(serverOptions) { surrogateKeysCache, userLimitsApi, layergroupAffectedTablesCache, - overviewsAdapter, - turboCartoAdapter, - analysisBackend + mapConfigAdapter ).register(app); new controller.NamedMaps( From 4759d178d3d1e7bff3b8006a476e28b5cb6db181 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 23 May 2016 23:40:21 +0200 Subject: [PATCH 37/46] No vars for adapters --- lib/cartodb/server.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 826fe2f8..d4866ebc 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -41,7 +41,6 @@ var MapConfigNamedLayersAdapter = require('./models/mapconfig/adapter/mapconfig- var AnalysisMapConfigAdapter = require('./models/mapconfig/adapter/analysis-mapconfig-adapter'); var MapConfigOverviewsAdapter = require('./models/mapconfig/adapter/mapconfig-overviews-adapter'); var TurboCartoAdapter = require('./models/mapconfig/adapter/turbo-carto-adapter'); - var MapConfigAdapter = require('./models/mapconfig/adapter'); module.exports = function(serverOptions) { @@ -155,17 +154,14 @@ module.exports = function(serverOptions) { var layergroupAffectedTablesCache = new LayergroupAffectedTablesCache(); app.layergroupAffectedTablesCache = layergroupAffectedTablesCache; - var overviewsAdapter = new MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsApi); - var turboCartoParser = new TurboCartoParser(pgQueryRunner); - var turboCartoAdapter = new TurboCartoAdapter(turboCartoParser); var mapConfigAdapter = new MapConfigAdapter([ new SqlWrapMapConfigAdapter(), new AnalysisMapConfigAdapter(analysisBackend), new MapConfigNamedLayersAdapter(templateMaps, pgConnection), - overviewsAdapter, - turboCartoAdapter + new MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsApi), + new TurboCartoAdapter(turboCartoParser) ]); var namedMapProviderCache = new NamedMapProviderCache( From 5a2afa9b898a2dea22c3ad0bb6d114b900c9a6b6 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Tue, 24 May 2016 19:16:38 +0200 Subject: [PATCH 38/46] Order of adapters: named maps should expand named layers as first step --- lib/cartodb/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index d4866ebc..837b8a74 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -157,9 +157,9 @@ module.exports = function(serverOptions) { var turboCartoParser = new TurboCartoParser(pgQueryRunner); var mapConfigAdapter = new MapConfigAdapter([ + new MapConfigNamedLayersAdapter(templateMaps, pgConnection), new SqlWrapMapConfigAdapter(), new AnalysisMapConfigAdapter(analysisBackend), - new MapConfigNamedLayersAdapter(templateMaps, pgConnection), new MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsApi), new TurboCartoAdapter(turboCartoParser) ]); From f34213a147f5fe56c03f5542fc3c3e976d5bb11f Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 25 May 2016 17:24:28 +0200 Subject: [PATCH 39/46] Reorder public/private functions --- .../adapter/analysis-mapconfig-adapter.js | 116 +++++++++--------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js index c48de8a4..b704ed06 100644 --- a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js @@ -11,64 +11,6 @@ function AnalysisMapConfigAdapter(analysisBackend) { module.exports = AnalysisMapConfigAdapter; -var SKIP_COLUMNS = { - 'the_geom': true, - 'the_geom_webmercator': true -}; - -function skipColumns(columnNames) { - return columnNames - .filter(function(columnName) { return !SKIP_COLUMNS[columnName]; }); -} - -var layerQueryTemplate = dot.template([ - 'SELECT {{=it._columns}}', - 'FROM ({{=it._query}}) _cdb_analysis_query' -].join('\n')); - -function layerQuery(node) { - if (node.type === 'source') { - return node.getQuery(); - } - var _columns = ['ST_Transform(the_geom, 3857) the_geom_webmercator'].concat(skipColumns(node.getColumns())); - return layerQueryTemplate({ _query: node.getQuery(), _columns: _columns.join(', ') }); -} - -function appendFiltersToNodes(requestMapConfig, dataviewsFiltersBySourceId) { - var analyses = requestMapConfig.analyses || []; - - requestMapConfig.analyses = analyses.map(function(analysisDefinition) { - var analysisGraph = new camshaft.reference.AnalysisGraph(analysisDefinition); - var definition = analysisDefinition; - Object.keys(dataviewsFiltersBySourceId).forEach(function(sourceId) { - definition = analysisGraph.getDefinitionWith(sourceId, {filters: dataviewsFiltersBySourceId[sourceId] }); - }); - - return definition; - }); - - return requestMapConfig; -} - -function shouldAdaptLayers(requestMapConfig) { - return Array.isArray(requestMapConfig.layers) && - Array.isArray(requestMapConfig.analyses) && requestMapConfig.analyses.length > 0; -} - -var DATAVIEW_TYPE_2_FILTER_TYPE = { - aggregation: 'category', - histogram: 'range' -}; -function getFilter(dataview, params) { - var type = dataview.type; - - return { - type: DATAVIEW_TYPE_2_FILTER_TYPE[type], - column: dataview.options.column, - params: params - }; -} - AnalysisMapConfigAdapter.prototype.getMapConfig = function(user, requestMapConfig, params, context, callback) { // jshint maxcomplexity:7 var self = this; @@ -184,6 +126,64 @@ AnalysisMapConfigAdapter.prototype.getMapConfig = function(user, requestMapConfi }); }; +var SKIP_COLUMNS = { + 'the_geom': true, + 'the_geom_webmercator': true +}; + +function skipColumns(columnNames) { + return columnNames + .filter(function(columnName) { return !SKIP_COLUMNS[columnName]; }); +} + +var layerQueryTemplate = dot.template([ + 'SELECT {{=it._columns}}', + 'FROM ({{=it._query}}) _cdb_analysis_query' +].join('\n')); + +function layerQuery(node) { + if (node.type === 'source') { + return node.getQuery(); + } + var _columns = ['ST_Transform(the_geom, 3857) the_geom_webmercator'].concat(skipColumns(node.getColumns())); + return layerQueryTemplate({ _query: node.getQuery(), _columns: _columns.join(', ') }); +} + +function appendFiltersToNodes(requestMapConfig, dataviewsFiltersBySourceId) { + var analyses = requestMapConfig.analyses || []; + + requestMapConfig.analyses = analyses.map(function(analysisDefinition) { + var analysisGraph = new camshaft.reference.AnalysisGraph(analysisDefinition); + var definition = analysisDefinition; + Object.keys(dataviewsFiltersBySourceId).forEach(function(sourceId) { + definition = analysisGraph.getDefinitionWith(sourceId, {filters: dataviewsFiltersBySourceId[sourceId] }); + }); + + return definition; + }); + + return requestMapConfig; +} + +function shouldAdaptLayers(requestMapConfig) { + return Array.isArray(requestMapConfig.layers) && + Array.isArray(requestMapConfig.analyses) && requestMapConfig.analyses.length > 0; +} + +var DATAVIEW_TYPE_2_FILTER_TYPE = { + aggregation: 'category', + histogram: 'range' +}; +function getFilter(dataview, params) { + var type = dataview.type; + + return { + type: DATAVIEW_TYPE_2_FILTER_TYPE[type], + column: dataview.options.column, + params: params + }; +} + function getLayerSourceId(layer) { return layer.options.source && layer.options.source.id; } From c4b4a93a0d535a8dd052d5c7092edd9336149d9a Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 25 May 2016 17:53:09 +0200 Subject: [PATCH 40/46] Add map config extension for analyses --- docs/MapConfig-Analyses-extension.md | 93 ++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 docs/MapConfig-Analyses-extension.md diff --git a/docs/MapConfig-Analyses-extension.md b/docs/MapConfig-Analyses-extension.md new file mode 100644 index 00000000..53271eb3 --- /dev/null +++ b/docs/MapConfig-Analyses-extension.md @@ -0,0 +1,93 @@ +# 1. Purpose + +This specification describes an extension for +[MapConfig 1.4.0](https://github.com/CartoDB/Windshaft/blob/master/doc/MapConfig-1.4.0.md) version. + + +# 2. Changes over specification + +This extension targets layers with `sql` option, including layer types: `cartodb`, `mapnik`, and `torque`. + +It extends MapConfig with a new attribute: `analyses`. + +## 2.1 Analyses attribute + +The new analyses attribute must be an array of analyses as per [camshaft](https://github.com/CartoDB/camshaft). Each +analysis must adhere to the [camshaft-reference](https://github.com/CartoDB/camshaft/blob/0.8.0/reference/versions/0.7.0/reference.json) specification. + +Each node can have an id that can be later references to consume the query from MapConfig's layers. + +Basic analyses example: + +```javascript +[ + { + // REQUIRED + // string, `id` free identifier that can be reference from any layer + "id": "HEAD", + // REQUIRED + // string, `type` camshaft's analysis type + "type": "source", + // REQUIRED + // object, `params` will depend on `type`, check camshaft-reference for more information + "params": { + "query": "select * from your_table" + } + } +] +``` + +# 2.2. Integration with layers + +As pointed before an analysis node id can be referenced from layers to consume its output query. + +The layer consuming the output must reference it with the following option: + +``` +{ + "options": { + // REQUIRED + // object, `source` as in the future we might want to have other source options + "source": { + // REQUIRED + // string, `id` the analysis node identifier + "id": "HEAD" + } + } +} +``` + +## 2.3. Complete example + +``` +{ + "version": "1.4.0", + "layers": [ + { + "type": "cartodb", + "options": { + "source": { + "id": "HEAD" + }, + "cartocss": "...", + "cartocss_version": "2.3.0" + } + } + ], + "analyses": [ + { + "id": "HEAD", + "type": "source", + "params": { + "query": "select * from your_table" + } + } + ] +} +``` + +# History + +## 1.0.0 + + - Initial version From 730486b27b811a8f9c0aaf07721ac9381aaed2b6 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 25 May 2016 18:36:59 +0200 Subject: [PATCH 41/46] Initial description of dataviews mapconfig extension --- docs/MapConfig-Dataviews-extension.md | 314 ++++++++++++++++++++++++++ 1 file changed, 314 insertions(+) create mode 100644 docs/MapConfig-Dataviews-extension.md diff --git a/docs/MapConfig-Dataviews-extension.md b/docs/MapConfig-Dataviews-extension.md new file mode 100644 index 00000000..d8e23a82 --- /dev/null +++ b/docs/MapConfig-Dataviews-extension.md @@ -0,0 +1,314 @@ +# 1. Purpose + +This specification describes an extension for +[MapConfig 1.4.0](https://github.com/CartoDB/Windshaft/blob/master/doc/MapConfig-1.4.0.md) version. + + +# 2. Changes over specification + +This extension depends on Analyses extension. It extends MapConfig with a new attribute: `dataviews`. + +It makes possible to get tabular data from analysis nodes: lists, aggregated lists, aggregations, and histograms. + +## 2.1. Dataview types + +### List + +A list is a simple result set per row where is possible to retrieve several columns from the original layer query. + +Definition +``` +{ + // REQUIRED + // string, `type` the list type + “type”: “list”, + // REQUIRED + // object, `options` dataview params + “options”: { + // REQUIRED + // array, `columns` to select for the list + “columns”: [“name”, “description”] + } +} +``` + +Expected output +``` +{ + "type": "list", + "rows": [ + { + "{columnName1}": "val1", + "{columnName2}": 100 + }, + { + "{columnName1}": "val2", + "{columnName2}": 200 + } + ] +} +``` + +### Aggregation + +An aggregation is very similar to a list but results are aggregated by a column and a given aggregation function. + +Definition +``` +{ + // REQUIRED + // string, `type` the aggregation type + “type”: “aggregation”, + // REQUIRED + // object, `options` dataview params + “options”: { + // REQUIRED + // string, `column` column name to aggregate by + “column”: “country”, + // REQUIRED + // string, `aggregation` operation to perform + “aggregation”: “count” + // OPTIONAL + // string, `aggregationColumn` column value to aggregate + // This param is required when `aggregation` is different than "count" + “aggregationColumn”: “population” + } +} +``` + +Expected output +``` +{ + "type": "aggregation", + "categories": [ + { + "category": "foo", + "value": 100 + }, + { + "category": "bar", + "value": 200 + } + ] +} +``` + +### Histograms + +Histograms represent the data distribution for a column. + +Definition +``` +{ + // REQUIRED + // string, `type` the histogram type + “type”: “histogram”, + // REQUIRED + // object, `options` dataview params + “options”: { + // REQUIRED + // string, `column` column name to aggregate by + “column”: “name”, + // OPTIONAL + // number, `bins` how many buckets the histogram should use + “bins”: 10 + } +} +``` + +Expected output +``` +{ + "type": "histogram", + "bins": [{"bin": 0, "start": 2, "end": 2, "min": 2, "max": 2, "freq": 1}, null, null, {"bin": 3, "min": 40, "max": 44, "freq": 2}, null], + "width": 10 +} +``` + +### Formula + +Formulas given a final value representing the whole dataset. + +Definition +``` +{ + // REQUIRED + // string, `type` the formula type + “type”: “formula”, + // REQUIRED + // object, `options` dataview params + “options”: { + // REQUIRED + // string, `column` column name to aggregate by + “column”: “name”, + // REQUIRED + // string, `aggregation` operation to perform + “operation”: “count” + } +} +``` + +Operation must be: “min”, “max”, “count”, “avg”, or “sum”. + +Result +``` +{ + "type": "formula", + "operation": "count", + "result": 1000, + "nulls": 0 +} +``` + + +## 2.2 Dataviews attribute + +The new dataviews attribute must be a dictionary of dataviews. + +An analysis node id can be referenced from dataviews to consume its output query. + + +The layer consuming the output must reference it with the following option: + +``` +{ + // REQUIRED + // object, `source` as in the future we might want to have other source options + "source": { + // REQUIRED + // string, `id` the analysis node identifier + "id": "HEAD" + } +} +``` + +## 2.3. Complete example + +``` +{ + "version": "1.4.0", + "layers": [ + { + "type": "cartodb", + "options": { + "source": { + "id": "HEAD" + }, + "cartocss": "...", + "cartocss_version": "2.3.0" + } + } + ], + "dataviews" { + "basic_histogram": { + "source": { + "id": "HEAD" + }, + "type": "histogram", + "options": { + "column": "pop_max" + } + } + }, + "analyses": [ + { + "id": "HEAD", + "type": "source", + "params": { + "query": "select * from your_table" + } + } + ] +} +``` + +## 3. Filters + +Camshaft's analyses expose a filtering capability and `aggregation` and `histogram` dataviews get them for free with + this extension. Filters are available with the very dataview id, so if you have a "basic_histogram" histogram dataview + you can filter with a range filter with "basic_histogram" name. + + +## 3.1 Filter types + +### Category + +Allows to remove results that are not contained within a set of elements. +Initially this filter can be applied to a `numeric` or `text` columns. + +Params + +``` +{ + “accept”: [“Spain”, “Germany”] + “reject”: [“Japan”] +} +``` + +### Range filter + +Allows to remove results that don’t satisfy numeric min and max values. +Filter is applied to a numeric column. + +Params + +``` +{ + “min”: 0, + “max”: 1000 +} +``` + +## 3.2. How to apply filters + +Filters must be applied at map instantiation time. + +With :mapconfig as a valid MapConfig and with :filters (a valid JSON) as: + +### Anonymous map + +`GET /api/v1/map?config=:mapconfig&filters=:filters` + +`POST /api/v1/map?filters=:filters` +with `BODY=:mapconfig` + +If in the future we need to support a bigger filters param and it doesn’t fit in the query string, + we might solve it by accepting: + +`POST /api/v1/map` +with `BODY={“config”: :mapconfig, “filters”: :filters}` + +### Named map + +Assume :params (a valid JSON) as named maps params, like in: `{“color”: “red”}` + +`GET /api/v1/named/:name/jsonp?config=:params&filters=:filters&callback=cb` + +`POST /api/v1/named/:name?filters=:filters` +with `BODY=:params` + +If, again, in the future we need to support a bigger filters param that doesn’t fit in the query string, + we might solve it by accepting: + +`POST /api/v1/named/:name` +with `BODY={“config”: :params, “filters”: :filters}` + + +## 3.3 Bounding box special filter + +A bounding box filter allows to remove results that don’t satisfy a geospatial range. + +The bounding box special filter is available per dataview and there is no need to create a bounding box definition as +it’s always possible to apply a bbox filter per dataview. + +A dataview can get its result filtered by bounding box by sending a bbox param in the query string, +param must be in the form `west,south,east,north`. + +So applying a bbox filter to a dataview looks like: +GET /api/v1/map/:layergroupid/dataview/:dataview_name?bbox=-90,-45,90,45 + +# History + +## 1.0.0-alpha + + - WIP document From 2ff33b501065e28ae988975a9059cadef7625601 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 26 May 2016 11:02:43 +0200 Subject: [PATCH 42/46] Generic MapConfig adapter can receive an arbitrary number of adapters --- lib/cartodb/models/mapconfig/adapter/index.js | 4 ++-- lib/cartodb/server.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/cartodb/models/mapconfig/adapter/index.js b/lib/cartodb/models/mapconfig/adapter/index.js index f7b49ebc..bf64e611 100644 --- a/lib/cartodb/models/mapconfig/adapter/index.js +++ b/lib/cartodb/models/mapconfig/adapter/index.js @@ -1,7 +1,7 @@ 'use strict'; -function MapConfigAdapter(adapters) { - this.adapters = adapters; +function MapConfigAdapter() { + this.adapters = Array.apply(null, arguments); } module.exports = MapConfigAdapter; diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 837b8a74..825ae2b7 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -156,13 +156,13 @@ module.exports = function(serverOptions) { var turboCartoParser = new TurboCartoParser(pgQueryRunner); - var mapConfigAdapter = new MapConfigAdapter([ + var mapConfigAdapter = new MapConfigAdapter( new MapConfigNamedLayersAdapter(templateMaps, pgConnection), new SqlWrapMapConfigAdapter(), new AnalysisMapConfigAdapter(analysisBackend), new MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsApi), new TurboCartoAdapter(turboCartoParser) - ]); + ); var namedMapProviderCache = new NamedMapProviderCache( templateMaps, From f7c528277bacd2c3b323aa6d9fcfb84945871d98 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 26 May 2016 11:23:19 +0200 Subject: [PATCH 43/46] Add tests for generic MapConfig adapter --- lib/cartodb/models/mapconfig/adapter/index.js | 4 +- test/unit/cartodb/mapconfig/adapter.test.js | 76 +++++++++++++++++++ 2 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 test/unit/cartodb/mapconfig/adapter.test.js diff --git a/lib/cartodb/models/mapconfig/adapter/index.js b/lib/cartodb/models/mapconfig/adapter/index.js index bf64e611..70704bea 100644 --- a/lib/cartodb/models/mapconfig/adapter/index.js +++ b/lib/cartodb/models/mapconfig/adapter/index.js @@ -1,7 +1,7 @@ 'use strict'; -function MapConfigAdapter() { - this.adapters = Array.apply(null, arguments); +function MapConfigAdapter(adapters) { + this.adapters = Array.isArray(adapters) ? adapters : Array.apply(null, arguments); } module.exports = MapConfigAdapter; diff --git a/test/unit/cartodb/mapconfig/adapter.test.js b/test/unit/cartodb/mapconfig/adapter.test.js new file mode 100644 index 00000000..872cb3f7 --- /dev/null +++ b/test/unit/cartodb/mapconfig/adapter.test.js @@ -0,0 +1,76 @@ +//require('../../../support/test_helper'); +var assert = require('assert'); + +var MapConfigAdapter = require('../../../../lib/cartodb/models/mapconfig/adapter'); + +describe('MapConfigAdapter', function() { + var user = 'wadus'; + function requestMapConfig() { + return { + val: 0 + }; + } + function params() { + return {}; + } + function context() { + return {}; + } + + function IncValMapConfigAdapter() { + this.getMapConfig = function(user, requestMapConfig, params, context, callback) { + requestMapConfig.val += 1; + return callback(null, requestMapConfig); + }; + } + + function validateMapConfig(adapter, expectedNumAdapters, validatorFn, callback) { + assert.equal(adapter.adapters.length, expectedNumAdapters); + adapter.getMapConfig(user, requestMapConfig(), params(), context(), function(err, mapConfig) { + validatorFn(mapConfig); + return callback(err); + }); + } + + it('works with no adapters', function(done) { + var adapter = new MapConfigAdapter(); + validateMapConfig(adapter, 0, function(mapConfig) { + assert.equal(mapConfig.val, 0); + }, done); + }); + + it('works with no adapters as empty array', function(done) { + var adapter = new MapConfigAdapter([]); + validateMapConfig(adapter, 0, function(mapConfig) { + assert.equal(mapConfig.val, 0); + }, done); + }); + + it('works with basic adapter', function(done) { + var adapter = new MapConfigAdapter(new IncValMapConfigAdapter()); + validateMapConfig(adapter, 1, function(mapConfig) { + assert.equal(mapConfig.val, 1); + }, done); + }); + + it('works with basic adapter as array', function(done) { + var adapter = new MapConfigAdapter([new IncValMapConfigAdapter()]); + validateMapConfig(adapter, 1, function(mapConfig) { + assert.equal(mapConfig.val, 1); + }, done); + }); + + it('works with several adapters', function(done) { + var adapter = new MapConfigAdapter(new IncValMapConfigAdapter(), new IncValMapConfigAdapter()); + validateMapConfig(adapter, 2, function(mapConfig) { + assert.equal(mapConfig.val, 2); + }, done); + }); + + it('works with several adapters as array', function(done) { + var adapter = new MapConfigAdapter([new IncValMapConfigAdapter(), new IncValMapConfigAdapter()]); + validateMapConfig(adapter, 2, function(mapConfig) { + assert.equal(mapConfig.val, 2); + }, done); + }); +}); From 5c3dd8b09d72ac1a74dcdc50cf27eac23b589fdb Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 26 May 2016 11:30:28 +0200 Subject: [PATCH 44/46] validate execution order --- test/unit/cartodb/mapconfig/adapter.test.js | 45 +++++++++++++++++++-- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/test/unit/cartodb/mapconfig/adapter.test.js b/test/unit/cartodb/mapconfig/adapter.test.js index 872cb3f7..a2a1710c 100644 --- a/test/unit/cartodb/mapconfig/adapter.test.js +++ b/test/unit/cartodb/mapconfig/adapter.test.js @@ -17,12 +17,16 @@ describe('MapConfigAdapter', function() { return {}; } - function IncValMapConfigAdapter() { - this.getMapConfig = function(user, requestMapConfig, params, context, callback) { - requestMapConfig.val += 1; - return callback(null, requestMapConfig); + function createAdapter(valOperatorFn) { + return function ValMapConfigAdapter() { + this.getMapConfig = function(user, requestMapConfig, params, context, callback) { + requestMapConfig.val = valOperatorFn(requestMapConfig.val); + return callback(null, requestMapConfig); + }; }; } + var IncValMapConfigAdapter = createAdapter(function(val) { return val + 1; }); + var Mul2ValMapConfigAdapter = createAdapter(function(val) { return val * 2; }); function validateMapConfig(adapter, expectedNumAdapters, validatorFn, callback) { assert.equal(adapter.adapters.length, expectedNumAdapters); @@ -73,4 +77,37 @@ describe('MapConfigAdapter', function() { assert.equal(mapConfig.val, 2); }, done); }); + + it('should execute in order 1', function(done) { + var adapter = new MapConfigAdapter([new Mul2ValMapConfigAdapter(), new IncValMapConfigAdapter()]); + validateMapConfig(adapter, 2, function(mapConfig) { + assert.equal(mapConfig.val, 1); + }, done); + }); + + it('should execute in order 2', function(done) { + var adapter = new MapConfigAdapter([new IncValMapConfigAdapter(), new Mul2ValMapConfigAdapter()]); + validateMapConfig(adapter, 2, function(mapConfig) { + assert.equal(mapConfig.val, 2); + }, done); + }); + + it('should execute in order 3', function(done) { + var adapter = new MapConfigAdapter([new Mul2ValMapConfigAdapter(), new Mul2ValMapConfigAdapter()]); + validateMapConfig(adapter, 2, function(mapConfig) { + assert.equal(mapConfig.val, 0); + }, done); + }); + + it('should execute in order 4', function(done) { + var Mul5ValMapConfigAdapter = createAdapter(function(val) { return val * 5; }); + var adapter = new MapConfigAdapter( + new IncValMapConfigAdapter(), + new Mul2ValMapConfigAdapter(), + new Mul5ValMapConfigAdapter() + ); + validateMapConfig(adapter, 3, function(mapConfig) { + assert.equal(mapConfig.val, 10); + }, done); + }); }); From c667e64d7f9e4fe9125ff7db1e5bbb423ebe7c28 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Thu, 26 May 2016 11:36:03 +0200 Subject: [PATCH 45/46] Simplify test as we just validate val value --- test/unit/cartodb/mapconfig/adapter.test.js | 44 ++++++--------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/test/unit/cartodb/mapconfig/adapter.test.js b/test/unit/cartodb/mapconfig/adapter.test.js index a2a1710c..eeb71896 100644 --- a/test/unit/cartodb/mapconfig/adapter.test.js +++ b/test/unit/cartodb/mapconfig/adapter.test.js @@ -28,75 +28,57 @@ describe('MapConfigAdapter', function() { var IncValMapConfigAdapter = createAdapter(function(val) { return val + 1; }); var Mul2ValMapConfigAdapter = createAdapter(function(val) { return val * 2; }); - function validateMapConfig(adapter, expectedNumAdapters, validatorFn, callback) { + function validateMapConfig(adapter, expectedNumAdapters, expectedVal, callback) { assert.equal(adapter.adapters.length, expectedNumAdapters); adapter.getMapConfig(user, requestMapConfig(), params(), context(), function(err, mapConfig) { - validatorFn(mapConfig); + assert.equal(mapConfig.val, expectedVal); return callback(err); }); } it('works with no adapters', function(done) { var adapter = new MapConfigAdapter(); - validateMapConfig(adapter, 0, function(mapConfig) { - assert.equal(mapConfig.val, 0); - }, done); + validateMapConfig(adapter, 0, 0, done); }); it('works with no adapters as empty array', function(done) { var adapter = new MapConfigAdapter([]); - validateMapConfig(adapter, 0, function(mapConfig) { - assert.equal(mapConfig.val, 0); - }, done); + validateMapConfig(adapter, 0, 0, done); }); it('works with basic adapter', function(done) { var adapter = new MapConfigAdapter(new IncValMapConfigAdapter()); - validateMapConfig(adapter, 1, function(mapConfig) { - assert.equal(mapConfig.val, 1); - }, done); + validateMapConfig(adapter, 1, 1, done); }); it('works with basic adapter as array', function(done) { var adapter = new MapConfigAdapter([new IncValMapConfigAdapter()]); - validateMapConfig(adapter, 1, function(mapConfig) { - assert.equal(mapConfig.val, 1); - }, done); + validateMapConfig(adapter, 1, 1, done); }); it('works with several adapters', function(done) { var adapter = new MapConfigAdapter(new IncValMapConfigAdapter(), new IncValMapConfigAdapter()); - validateMapConfig(adapter, 2, function(mapConfig) { - assert.equal(mapConfig.val, 2); - }, done); + validateMapConfig(adapter, 2, 2, done); }); it('works with several adapters as array', function(done) { var adapter = new MapConfigAdapter([new IncValMapConfigAdapter(), new IncValMapConfigAdapter()]); - validateMapConfig(adapter, 2, function(mapConfig) { - assert.equal(mapConfig.val, 2); - }, done); + validateMapConfig(adapter, 2, 2, done); }); it('should execute in order 1', function(done) { var adapter = new MapConfigAdapter([new Mul2ValMapConfigAdapter(), new IncValMapConfigAdapter()]); - validateMapConfig(adapter, 2, function(mapConfig) { - assert.equal(mapConfig.val, 1); - }, done); + validateMapConfig(adapter, 2, 1, done); }); it('should execute in order 2', function(done) { var adapter = new MapConfigAdapter([new IncValMapConfigAdapter(), new Mul2ValMapConfigAdapter()]); - validateMapConfig(adapter, 2, function(mapConfig) { - assert.equal(mapConfig.val, 2); - }, done); + validateMapConfig(adapter, 2, 2, done); }); it('should execute in order 3', function(done) { var adapter = new MapConfigAdapter([new Mul2ValMapConfigAdapter(), new Mul2ValMapConfigAdapter()]); - validateMapConfig(adapter, 2, function(mapConfig) { - assert.equal(mapConfig.val, 0); - }, done); + validateMapConfig(adapter, 2, 0, done); }); it('should execute in order 4', function(done) { @@ -106,8 +88,6 @@ describe('MapConfigAdapter', function() { new Mul2ValMapConfigAdapter(), new Mul5ValMapConfigAdapter() ); - validateMapConfig(adapter, 3, function(mapConfig) { - assert.equal(mapConfig.val, 10); - }, done); + validateMapConfig(adapter, 3, 10, done); }); }); From 65523768f98cb40d6b59afe62d7f432a6528a927 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Fri, 27 May 2016 15:26:52 +0200 Subject: [PATCH 46/46] Upgrades camshaft to 0.10.0 --- NEWS.md | 1 + npm-shrinkwrap.json | 63 +++++++++++++++++++++++---------------------- package.json | 2 +- 3 files changed, 34 insertions(+), 32 deletions(-) diff --git a/NEWS.md b/NEWS.md index 041491ef..62c2009e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -5,6 +5,7 @@ Released 2016-mm-dd Announcements: + - Upgrades camshaft to [0.10.0](https://github.com/CartoDB/camshaft/releases/tag/0.10.0) - Upgrades turbo-carto to [0.10.0](https://github.com/CartoDB/turbo-carto/releases/tag/0.10.0) New features: diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 512abfc7..c37e5370 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -80,7 +80,7 @@ }, "type-is": { "version": "1.6.13", - "from": "type-is@>=1.6.10 <1.7.0", + "from": "type-is@>=1.6.6 <1.7.0", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.13.tgz", "dependencies": { "media-typer": { @@ -90,7 +90,7 @@ }, "mime-types": { "version": "2.1.11", - "from": "mime-types@>=2.1.2 <2.2.0", + "from": "mime-types@>=2.1.11 <2.2.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "dependencies": { "mime-db": { @@ -105,9 +105,9 @@ } }, "camshaft": { - "version": "0.8.0", - "from": "camshaft@0.8.0", - "resolved": "https://registry.npmjs.org/camshaft/-/camshaft-0.8.0.tgz", + "version": "0.10.0", + "from": "camshaft@0.10.0", + "resolved": "https://registry.npmjs.org/camshaft/-/camshaft-0.10.0.tgz", "dependencies": { "async": { "version": "1.5.2", @@ -1212,7 +1212,8 @@ }, "step-profiler": { "version": "0.3.0", - "from": "step-profiler@>=0.3.0 <0.4.0" + "from": "step-profiler@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/step-profiler/-/step-profiler-0.3.0.tgz" }, "turbo-carto": { "version": "0.10.0", @@ -3009,16 +3010,16 @@ "from": "combined-stream@>=1.0.5 <1.1.0", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz" }, - "commander": { - "version": "2.9.0", - "from": "commander@>=2.9.0 <3.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" - }, "concat-map": { "version": "0.0.1", "from": "concat-map@0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" }, + "commander": { + "version": "2.9.0", + "from": "commander@>=2.9.0 <3.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" + }, "core-util-is": { "version": "1.0.2", "from": "core-util-is@>=1.0.0 <1.1.0", @@ -3199,16 +3200,16 @@ "from": "jsbn@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz" }, - "json-stringify-safe": { - "version": "5.0.1", - "from": "json-stringify-safe@>=5.0.1 <5.1.0", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - }, "json-schema": { "version": "0.2.2", "from": "json-schema@0.2.2", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz" }, + "json-stringify-safe": { + "version": "5.0.1", + "from": "json-stringify-safe@>=5.0.1 <5.1.0", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + }, "jsonpointer": { "version": "2.0.0", "from": "jsonpointer@2.0.0", @@ -3279,16 +3280,16 @@ "from": "ms@0.7.1", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" }, - "node-uuid": { - "version": "1.4.7", - "from": "node-uuid@>=1.4.7 <1.5.0", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" - }, "nopt": { "version": "3.0.6", "from": "nopt@>=3.0.1 <3.1.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" }, + "node-uuid": { + "version": "1.4.7", + "from": "node-uuid@>=1.4.7 <1.5.0", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" + }, "npmlog": { "version": "2.0.3", "from": "npmlog@>=2.0.0 <2.1.0", @@ -3299,16 +3300,16 @@ "from": "oauth-sign@>=0.8.1 <0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz" }, - "path-is-absolute": { - "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" - }, "once": { "version": "1.3.3", "from": "once@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz" }, + "path-is-absolute": { + "version": "1.0.0", + "from": "path-is-absolute@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" + }, "pinkie": { "version": "2.0.4", "from": "pinkie@>=2.0.0 <3.0.0", @@ -3339,16 +3340,16 @@ "from": "request@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/request/-/request-2.72.0.tgz" }, - "semver": { - "version": "5.1.0", - "from": "semver@>=5.1.0 <5.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz" - }, "rimraf": { "version": "2.5.2", "from": "rimraf@>=2.5.0 <2.6.0", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz" }, + "semver": { + "version": "5.1.0", + "from": "semver@>=5.1.0 <5.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz" + }, "sntp": { "version": "1.0.9", "from": "sntp@>=1.0.0 <2.0.0", diff --git a/package.json b/package.json index 57f219c5..baf6d069 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ ], "dependencies": { "body-parser": "~1.14.0", - "camshaft": "0.8.0", + "camshaft": "0.10.0", "cartodb-psql": "~0.6.1", "cartodb-query-tables": "~0.1.0", "cartodb-redis": "~0.13.0",