diff --git a/NEWS.md b/NEWS.md index f82143c4..63a0fc8b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,8 @@ Released 2016-mm-dd +Bug fixes: + - Uses node list so identical nodes are not de-duplicated and can be used with different ids #528. ## 2.53.4 diff --git a/lib/cartodb/backends/dataview.js b/lib/cartodb/backends/dataview.js index 53911a7f..4481d8be 100644 --- a/lib/cartodb/backends/dataview.js +++ b/lib/cartodb/backends/dataview.js @@ -85,7 +85,7 @@ DataviewBackend.prototype.getDataview = function (mapConfigProvider, user, param sourceId2Node[rootNode.params.id] = rootNode; } - analysis.getSortedNodes().forEach(function(node) { + analysis.getNodes().forEach(function(node) { if (node.params && node.params.id) { sourceId2Node[node.params.id] = node; } @@ -232,7 +232,7 @@ DataviewBackend.prototype.search = function (mapConfigProvider, user, params, ca sourceId2Node[rootNode.params.id] = rootNode; } - analysis.getSortedNodes().forEach(function(node) { + analysis.getNodes().forEach(function(node) { if (node.params && node.params.id) { sourceId2Node[node.params.id] = node; } diff --git a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js index e1b5620f..7fd2316b 100644 --- a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js @@ -92,7 +92,7 @@ AnalysisMapConfigAdapter.prototype.getMapConfig = function(user, requestMapConfi sourceId2Query[rootNode.params.id] = rootNode; } - analysis.getSortedNodes().forEach(function(node) { + analysis.getNodes().forEach(function(node) { if (node.params && node.params.id) { sourceId2Query[node.params.id] = node; } diff --git a/test/acceptance/analysis/regressions.js b/test/acceptance/analysis/regressions.js new file mode 100644 index 00000000..fde97dc0 --- /dev/null +++ b/test/acceptance/analysis/regressions.js @@ -0,0 +1,107 @@ +require('../../support/test_helper'); + +var assert = require('../../support/assert'); +var TestClient = require('../../support/test-client'); + +describe('analysis-layers error cases', function() { + it('should handle missing analysis nodes for layers', function(done) { + var mapConfig = { + "version": "1.5.0", + "layers": [ + { + "type": "cartodb", + "options": { + "cartocss": TestClient.CARTOCSS.POINTS, + "cartocss_version": "2.1.1", + "interactivity": [], + "source": { + "id": "a4" + } + } + }, + { + "type": "cartodb", + "options": { + "cartocss": TestClient.CARTOCSS.POINTS, + "cartocss_version": "2.1.0", + "interactivity": [], + "source": { + "id": "b1" + } + } + } + ], + "dataviews": { + "74493a30-4679-4b72-a60c-b6f808b57c98": { + "type": "histogram", + "source": { + "id": "b0" + }, + "options": { + "column": "customer_value", + "bins": 10 + } + } + }, + "analyses": [ + { + "id": "a4", + "type": "intersection", + "params": { + "source": { + "id": "a3", + "type": "buffer", + "params": { + "source": { + "id": "a2", + "type": "centroid", + "params": { + "source": { + "id": "b1", + "type": "kmeans", + "params": { + "source": { + "id": "b0", + "type": "source", + "params": { + "query": "SELECT * FROM populated_places_simple_reduced" + } + }, + "clusters": 5 + } + }, + "category_column": "cluster_no" + } + }, + "radius": 200000 + } + }, + "target": { + "id": "customer_home_locations", + "type": "source", + "params": { + "query": "SELECT * FROM populated_places_simple_reduced" + } + } + } + } + ] + }; + + var testClient = new TestClient(mapConfig, 1234); + + testClient.getLayergroup(function(err, layergroupResult) { + assert.ok(!err, err); + + assert.ok(layergroupResult); + assert.ok(layergroupResult.metadata); + var analyses = layergroupResult.metadata.analyses; + assert.ok(analyses); + assert.equal(analyses.length, 1); + assert.equal(Object.keys(analyses[0].nodes).length, 5); + + testClient.drain(done); + }); + }); + +}); diff --git a/test/support/sql/windshaft.test.sql b/test/support/sql/windshaft.test.sql index 7920a88d..bea439a2 100644 --- a/test/support/sql/windshaft.test.sql +++ b/test/support/sql/windshaft.test.sql @@ -633,3 +633,18 @@ GRANT SELECT ON TABLE analysis_rent_listings TO :PUBLICUSER; -- GRANT SELECT, UPDATE, INSERT, DELETE ON cdb_analysis_catalog TO :TESTUSER; + +create schema cdb_crankshaft; +GRANT USAGE ON SCHEMA cdb_crankshaft TO :TESTUSER; +CREATE TYPE kmeans_type as (cartodb_id numeric, cluster_no numeric); +CREATE OR REPLACE FUNCTION cdb_crankshaft.CDB_KMeans(query text, no_clusters integer,no_init integer default 20) + RETURNS setof kmeans_type as $$ + DECLARE r kmeans_type; + BEGIN + FOR r IN EXECUTE format('select cartodb_id, ceil(random() * 10) AS cluster_no from (%s) _cdb_query', query) loop + RETURN NEXT r; + END LOOP; + RETURN; + END; +$$ LANGUAGE plpgsql; +GRANT ALL ON FUNCTION cdb_crankshaft.CDB_KMeans(text, integer, integer) TO :TESTUSER; diff --git a/test/support/test-client.js b/test/support/test-client.js index b52835f5..f5d3789c 100644 --- a/test/support/test-client.js +++ b/test/support/test-client.js @@ -33,6 +33,39 @@ module.exports.RESPONSE = { } }; +module.exports.CARTOCSS = { + POINTS: [ + '#layer{', + ' marker-placement: point;', + ' marker-allow-overlap: true;', + ' marker-line-opacity: 0.2;', + ' marker-line-width: 0.5;', + ' marker-opacity: 1;', + ' marker-width: 5;', + ' marker-fill: red;', + '}' + ].join('\n'), + + LINES: [ + '#lines {', + ' line-color: black;', + ' line-width: 1;', + ' line-opacity: 1;', + '}' + ].join('\n'), + + POLYGONS: [ + '#layer {', + ' polygon-fill: red;', + ' polygon-opacity: 0.6;', + ' polygon-opacity: 0.7;', + ' line-color: #FFF;', + ' line-width: 0.5;', + ' line-opacity: 1;', + '}' + ].join('\n') +}; + TestClient.prototype.getWidget = function(widgetName, params, callback) { var self = this;