From 5ba72b4894e84ad63f36cf9bb5da29f819c2e63f Mon Sep 17 00:00:00 2001 From: Javier Goizueta Date: Mon, 23 May 2016 14:18:45 +0200 Subject: [PATCH] Create base class for overviews dataviews --- lib/cartodb/models/dataview/overviews/base.js | 34 +++++++++++++++++++ .../models/dataview/overviews/formula.js | 32 ++--------------- 2 files changed, 37 insertions(+), 29 deletions(-) create mode 100644 lib/cartodb/models/dataview/overviews/base.js diff --git a/lib/cartodb/models/dataview/overviews/base.js b/lib/cartodb/models/dataview/overviews/base.js new file mode 100644 index 00000000..f7ee7e5c --- /dev/null +++ b/lib/cartodb/models/dataview/overviews/base.js @@ -0,0 +1,34 @@ +var _ = require('underscore'); +var BaseWidget = require('../base'); + +function BaseOverviewsDataview() {} + +module.exports = BaseOverviewsDataview; + +BaseOverviewsDataview.prototype = new BaseWidget(); +BaseOverviewsDataview.prototype.constructor = BaseOverviewsDataview; + +var zoomLevelFactor = 100.0; + +// Compute zoom level so that the the resolution grid size of the +// selected overview is smaller (zoomLevelFactor times smaller at least) +// than the bounding box size. +BaseOverviewsDataview.prototype.zoomLevelForBbox = function(bbox) { + var pxPerTile = 256.0; + var earthWidth = 360.0; + // TODO: now we assume overviews are computed for 1-pixel tolerance; + // should use extended overviews metadata to compute this properly. + if ( bbox ) { + var bboxValues = _.map(bbox.split(','), function(v) { return +v; }); + var w = Math.abs(bboxValues[2]-bboxValues[0]); + var h = Math.abs(bboxValues[3]-bboxValues[1]); + var maxDim = Math.min(w, h); + + // Find minimum suitable z + // note that the QueryRewirter will use the minimum level overview + // of level >= z if it exists, and otherwise the base table + var z = Math.ceil(-Math.log(maxDim*pxPerTile/earthWidth/zoomLevelFactor)/Math.log(2.0)); + return Math.max(z, 0); + } + return 0; +}; diff --git a/lib/cartodb/models/dataview/overviews/formula.js b/lib/cartodb/models/dataview/overviews/formula.js index aa57792e..54b4e0eb 100644 --- a/lib/cartodb/models/dataview/overviews/formula.js +++ b/lib/cartodb/models/dataview/overviews/formula.js @@ -1,5 +1,4 @@ -var _ = require('underscore'); -var BaseWidget = require('../base'); +var BaseOverviewsWidget = require('./base'); var BaseDataview = require('../formula'); var debug = require('debug')('windshaft:widget:formula:overviews'); @@ -38,43 +37,18 @@ function Formula(query, options, queryRewriter, queryRewriteData, params) { this.options = params; } -Formula.prototype = new BaseWidget(); +Formula.prototype = new BaseOverviewsWidget(); Formula.prototype.constructor = Formula; module.exports = Formula; -var zoom_level_factor = 100.0; - -// Compute zoom level so that the the resolution grid size of the -// selected overview is smaller (zoom_level_factor times smaller at least) -// than the bounding box size. -function zoom_level_for_bbox(bbox) { - var px_per_tile = 256.0; - var earth_width = 360.0; - // TODO: now we assume overviews are computed for 1-pixel tolerance; - // should use extended overviews metadata to compute this properly. - if ( bbox ) { - var bbox_values = _.map(bbox.split(','), function(v) { return +v; }); - var w = Math.abs(bbox_values[2]-bbox_values[0]); - var h = Math.abs(bbox_values[3]-bbox_values[1]); - var max_dim = Math.min(w, h); - - // Find minimum suitable z - // note that the QueryRewirter will use the minimum level overview - // of level >= z if it exists, and otherwise the base table - var z = Math.ceil(-Math.log(max_dim*px_per_tile/earth_width/zoom_level_factor)/Math.log(2.0)); - return Math.max(z, 0); - } - return 0; -} - Formula.prototype.sql = function(psql, filters, override, callback) { var _query = this.query; var formulaQueryTpl = formulaQueryTpls[this.operation]; if ( formulaQueryTpl ) { // supported formula for use with overviews - var zoom_level = zoom_level_for_bbox(this.options.bbox); + var zoom_level = this.zoomLevelForBbox(this.options.bbox); _query = this.queryRewriter.query(_query, this.queryRewriteData, { zoom_level: zoom_level }); var formulaSql = formulaQueryTpl({ _query: _query,