diff --git a/NEWS.md b/NEWS.md index 2ccaccf5..b296243a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -14,6 +14,7 @@ Announcements: - Upgrades turbo-carto to [0.11.0](https://github.com/CartoDB/turbo-carto/releases/tag/0.11.0) Bug fixes: + - Column provided for geojson renderer should not be null #476 - Dataviews/widgets adapter working with non sql, non source, and non widgets layers diff --git a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js index b704ed06..b0b5548e 100644 --- a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js @@ -101,10 +101,7 @@ AnalysisMapConfigAdapter.prototype.getMapConfig = function(user, requestMapConfi analysisSql = sqlQueryWrap.replace(/<%=\s*sql\s*%>/g, analysisSql); } layer.options.sql = analysisSql; - var layerDataviews = getLayerDataviews(layer, dataviews); - layer.options.columns = layerDataviews.reduce(function(columns, dataview) { - return columns.concat(getDataviewColumns(dataview)); - }, []); + layer.options.columns = getDataviewsColumns(getLayerDataviews(layer, dataviews)); } else { missingNodesErrors.push( new Error('Missing analysis node.id="' + layerSourceId +'" for layer='+layerIndex) @@ -208,11 +205,22 @@ function getLayerDataviews(layer, dataviews) { return layerDataviews; } +function getDataviewsColumns(dataviews) { + return Object.keys(dataviews.reduce(function(columnsDict, dataview) { + getDataviewColumns(dataview).forEach(function(columnName) { + if (!!columnName) { + columnsDict[columnName] = true; + } + }); + return columnsDict; + }, {})); +} + function getDataviewColumns(dataview) { var columns = []; var options = dataview.options; ['column', 'aggregationColumn'].forEach(function(opt) { - if (options.hasOwnProperty(opt)) { + if (options.hasOwnProperty(opt) && !!options[opt]) { columns.push(options[opt]); } }); diff --git a/test/acceptance/geojson-renderer.js b/test/acceptance/geojson-renderer.js index 63c17ab0..089e09b5 100644 --- a/test/acceptance/geojson-renderer.js +++ b/test/acceptance/geojson-renderer.js @@ -221,4 +221,123 @@ describe('use only needed columns', function() { }); }); + it('should skip empty and null columns for geojson tiles', function(done) { + + var mapConfig = { + "analyses": [ + { + "id": "a0", + "params": { + "query": "SELECT * FROM test_table" + }, + "type": "source" + } + ], + "dataviews": { + "4e7b0e07-6d21-4b83-9adb-6d7e17eea6ca": { + "options": { + "aggregationColumn": null, + "column": "cartodb_id", + "operation": "avg" + }, + "source": { + "id": "a0" + }, + "type": "formula" + }, + "74f590f8-625c-4e95-922f-34ad3e9919c0": { + "options": { + "aggregation": "sum", + "aggregationColumn": "cartodb_id", + "column": "name" + }, + "source": { + "id": "a0" + }, + "type": "aggregation" + }, + "98a75757-3006-400a-b028-fb613a6c0b69": { + "options": { + "aggregationColumn": null, + "column": "cartodb_id", + "operation": "sum" + }, + "source": { + "id": "a0" + }, + "type": "formula" + }, + "ebbc97b2-87d2-4895-9e1f-2f012df3679d": { + "options": { + "aggregationColumn": null, + "bins": "12", + "column": "cartodb_id" + }, + "source": { + "id": "a0" + }, + "type": "histogram" + }, + "ebc0653f-3581-469c-8b31-c969e440a865": { + "options": { + "aggregationColumn": null, + "column": "cartodb_id", + "operation": "avg" + }, + "source": { + "id": "a0" + }, + "type": "formula" + } + }, + "layers": [ + { + "options": { + "subdomains": "abcd", + "urlTemplate": "http://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png" + }, + "type": "http" + }, + { + "options": { + "attributes": { + "columns": [ + "name", + "address" + ], + "id": "cartodb_id" + }, + "cartocss": "#layer { marker-width: 10; marker-fill: red; }", + "cartocss_version": "2.3.0", + "interactivity": "cartodb_id", + "layer_name": "wadus", + "source": { + "id": "a0" + } + }, + "type": "cartodb" + }, + { + "options": { + "subdomains": "abcd", + "urlTemplate": "http://{s}.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}.png" + }, + "type": "http" + } + ] + }; + + this.testClient = new TestClient(mapConfig); + this.testClient.getTile(0, 0, 0, { format: 'geojson', layer: 0 }, function(err, res, geojson) { + assert.ok(!err, err); + + assert.ok(geojson); + assert.equal(geojson.features.length, 5); + + assert.deepEqual(Object.keys(geojson.features[0].properties), ['cartodb_id', 'name']); + + done(); + }); + }); + });