diff --git a/lib/cartodb/models/dataview/overviews/base.js b/lib/cartodb/models/dataview/overviews/base.js index f7ee7e5c..95901869 100644 --- a/lib/cartodb/models/dataview/overviews/base.js +++ b/lib/cartodb/models/dataview/overviews/base.js @@ -1,14 +1,29 @@ var _ = require('underscore'); var BaseWidget = require('../base'); -function BaseOverviewsDataview() {} +function BaseOverviewsDataview(query, queryOptions, BaseDataview, queryRewriter, queryRewriteData, options) { + this.BaseDataview = BaseDataview; + this.query = query; + this.queryOptions = queryOptions; + this.queryRewriter = queryRewriter; + this.queryRewriteData = queryRewriteData; + this.options = options; + this.baseDataview = new this.BaseDataview(this.query, this.queryOptions); +} module.exports = BaseOverviewsDataview; BaseOverviewsDataview.prototype = new BaseWidget(); BaseOverviewsDataview.prototype.constructor = BaseOverviewsDataview; -var zoomLevelFactor = 100.0; +// TODO: parameterized these settings +var SETTINGS = { + // use overviews as a default fallback strategy + defaultOverviews: false, + + // minimum ratio of bounding box size to grid size + zoomLevelFactor: 100.0 +}; // Compute zoom level so that the the resolution grid size of the // selected overview is smaller (zoomLevelFactor times smaller at least) @@ -27,8 +42,46 @@ BaseOverviewsDataview.prototype.zoomLevelForBbox = function(bbox) { // 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)); + var z = Math.ceil(-Math.log(maxDim*pxPerTile/earthWidth/SETTINGS.zoomLevelFactor)/Math.log(2.0)); return Math.max(z, 0); } return 0; }; + +BaseOverviewsDataview.prototype.rewrittenQuery = function(query) { + var zoom_level = this.zoomLevelForBbox(this.options.bbox); + return this.queryRewriter.query(query, this.queryRewriteData, { zoom_level: zoom_level }); +}; + +// Default behaviour +BaseOverviewsDataview.prototype.defaultSql = function(psql, filters, override, callback) { + var query = this.query; + var dataview = this.baseDataview; + if ( SETTINGS.defaultOverviews ) { + query = this.rewrittenQuery(query); + dataview = new this.BaseDataview(query, this.queryOptions); + } + return dataview.sql(psql, filters, override, callback); +}; + +// default implementation that can be override in derived classes: + +BaseOverviewsDataview.prototype.sql = function(psql, filters, override, callback) { + return this.defaultSql(psql, filters, override, callback); +}; + +BaseOverviewsDataview.prototype.search = function(psql, userQuery, callback) { + return this.baseDataview.search(psql, userQuery, callback); +}; + +BaseOverviewsDataview.prototype.format = function(result) { + return this.baseDataview.format(result); +}; + +BaseOverviewsDataview.prototype.getType = function() { + return this.baseDataview.getType(); +}; + +BaseOverviewsDataview.prototype.toString = function() { + return this.baseDataview.toString(); +}; diff --git a/lib/cartodb/models/dataview/overviews/formula.js b/lib/cartodb/models/dataview/overviews/formula.js index 54b4e0eb..c3fb442e 100644 --- a/lib/cartodb/models/dataview/overviews/formula.js +++ b/lib/cartodb/models/dataview/overviews/formula.js @@ -28,16 +28,12 @@ var formulaQueryTpls = { }; function Formula(query, options, queryRewriter, queryRewriteData, params) { - this.base_dataview = new BaseDataview(query, options); - this.query = query; + BaseOverviewsWidget.call(this, query, options, BaseDataview, queryRewriter, queryRewriteData, params); this.column = options.column || '1'; this.operation = options.operation; - this.queryRewriter = queryRewriter; - this.queryRewriteData = queryRewriteData; - this.options = params; } -Formula.prototype = new BaseOverviewsWidget(); +Formula.prototype = Object.create(BaseOverviewsWidget.prototype); Formula.prototype.constructor = Formula; module.exports = Formula; @@ -61,18 +57,6 @@ Formula.prototype.sql = function(psql, filters, override, callback) { return callback(null, formulaSql); } - // For non supported operations (min, max) we're not using overviews. - return this.base_dataview.sql(psql, filters, override, callback); -}; - -Formula.prototype.format = function(result) { - return this.base_dataview.format(result); -}; - -Formula.prototype.getType = function() { - return this.base_dataview.getType(); -}; - -Formula.prototype.toString = function() { - return this.base_dataview.toString(); + // default behaviour + return this.defaultSql(psql, filters, override, callback); };