From fa19f90a6a41042e02c836389df8b07aea40ab02 Mon Sep 17 00:00:00 2001 From: Javier Goizueta Date: Wed, 11 May 2016 18:16:18 +0200 Subject: [PATCH] Apply overviews query rewriter to dataviews This requires the QueryRewriter to handle a filters parametes in its data (with Camshaft filter definitions) and a final options parameters with a bounding_box parameter. --- lib/cartodb/backends/dataview.js | 37 ++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/lib/cartodb/backends/dataview.js b/lib/cartodb/backends/dataview.js index 510709c4..946ea0d8 100644 --- a/lib/cartodb/backends/dataview.js +++ b/lib/cartodb/backends/dataview.js @@ -9,6 +9,10 @@ var Timer = require('../stats/timer'); var BBoxFilter = require('../models/filter/bbox'); var DataviewFactory = require('../models/dataview/factory'); +var OverviewsQueryRewriter = require('../utils/overviews_query_rewriter'); +var overviewsQueryRewriter = new OverviewsQueryRewriter({ + zoom_level: 'CDB_ZoomFromScale(!scale_denominator!)' +}); function DataviewBackend(analysisBackend) { this.analysisBackend = analysisBackend; @@ -101,12 +105,31 @@ DataviewBackend.prototype.getDataview = function (mapConfigProvider, user, param ownFilter = !!ownFilter; var query; - if (ownFilter) { - query = node.getQuery(); - } else { - var applyFilters = {}; - applyFilters[dataviewName] = false; - query = node.getQuery(applyFilters); + + var sourceId = dataviewDefinition.source.id; // node.id + var layer = _.find(mapConfig.obj().layers, function(l){ return l.options.source && (l.options.source.id === sourceId); }) + var queryRewriteData = layer.options.query_rewrite_data; + if ( queryRewriteData ) { + if ( node.type == 'source' ) { + var filters = node.filters; // TODO: node.getFilters() when available in camshaft + var filters_disabler = _.keys(filters).reduce(function(disabler, filter_id){ disabler[filter_id] = false; return disabler; }, {}); + var unfiltered_query = node.getQuery(filters_disabler); + queryRewriteData = _.extend({}, queryRewriteData, { filters: filters }); + var rewritten_query = overviewsQueryRewriter.query(unfiltered_query, queryRewriteData, { bounding_box: params.bbox }); + if ( rewritten_query !== unfiltered_query ) { + query = rewritten_query; + } + } + } + + if ( !query ) { + if (ownFilter) { + query = node.getQuery(); + } else { + var applyFilters = {}; + applyFilters[dataviewName] = false; + query = node.getQuery(applyFilters); + } } if (params.bbox) { @@ -277,4 +300,4 @@ function dbParamsFromReqParams(params) { dbParams.dbname = params.dbname; } return dbParams; -} \ No newline at end of file +}