From 2b1f12e9d546437f85e71cb1d417be808fe8670a Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 2 Oct 2017 19:16:44 +0200 Subject: [PATCH] Allow to instantiate maps with analyses filters This decouples filters from dataviews. They are more verbose now. Misses validation of filters. --- .../adapter/analysis-mapconfig-adapter.js | 8 ++ test/acceptance/analysis/analyses-filters.js | 84 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 test/acceptance/analysis/analyses-filters.js diff --git a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js index 8cb63f48..6cd0241d 100644 --- a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js @@ -58,6 +58,13 @@ AnalysisMapConfigAdapter.prototype.getMapConfig = function(user, requestMapConfi requestMapConfig = appendFiltersToNodes(requestMapConfig, dataviewsFiltersBySourceId); + // Expected format for analyses filters + // filters = {analyses: { + // a1: [{min, max}, {accept, reject}], + // b1: [{range, column, min, max}, {category, column, accept, reject}] + // }} + requestMapConfig = appendFiltersToNodes(requestMapConfig, filters.analyses); + function createAnalysis(analysisDefinition, done) { self.analysisBackend.create(analysisConfiguration, analysisDefinition, function (err, analysis) { if (err) { @@ -200,6 +207,7 @@ function dataviewQuery(node, dataviewName, ownFilter) { function appendFiltersToNodes(requestMapConfig, dataviewsFiltersBySourceId) { var analyses = requestMapConfig.analyses || []; + dataviewsFiltersBySourceId = dataviewsFiltersBySourceId || {}; requestMapConfig.analyses = analyses.map(function(analysisDefinition) { var analysisGraph = new camshaft.reference.AnalysisGraph(analysisDefinition); diff --git a/test/acceptance/analysis/analyses-filters.js b/test/acceptance/analysis/analyses-filters.js new file mode 100644 index 00000000..152b29e6 --- /dev/null +++ b/test/acceptance/analysis/analyses-filters.js @@ -0,0 +1,84 @@ +require('../../support/test_helper'); + +const assert = require('../../support/assert'); +const TestClient = require('../../support/test-client'); + +describe('analysis-layers-dataviews', () => { + + const CARTOCSS = `#layer { + marker-fill-opacity: 1; + marker-line-color: white; + marker-line-width: 0.5; + marker-line-opacity: 1; + marker-placement: point; + marker-type: ellipse; + marker-width: 8; + marker-fill: red; + marker-allow-overlap: true; + }`; + + const mapConfig = { + version: '1.6.0', + layers: [ + { + "type": "cartodb", + "options": { + "source": { + "id": "a1" + }, + "cartocss": CARTOCSS, + "cartocss_version": "2.3.0" + } + } + ], + dataviews: { + pop_max_histogram: { + source: { + id: 'a1' + }, + type: 'histogram', + options: { + column: 'pop_max' + } + } + }, + analyses: [ + { + "id": "a1", + "type": "source", + "params": { + "query": "select * from populated_places_simple_reduced" + } + } + ] + }; + + it('should get a filtered histogram dataview', function(done) { + const testClient = new TestClient(mapConfig, 1234); + + const params = { + filters: { + analyses: { + 'a1': [ + { + type: 'range', + column: 'pop_max', + params: { + min: 2e6 + } + } + ] + } + } + }; + + testClient.getDataview('pop_max_histogram', params, (err, dataview) => { + assert.ok(!err, err); + + assert.equal(dataview.type, 'histogram'); + assert.equal(dataview.bins_start, 2008000); + + testClient.drain(done); + }); + }); +});