diff --git a/lib/cartodb/models/dataview/overviews/factory.js b/lib/cartodb/models/dataview/overviews/factory.js index b63b004a..d7a07d54 100644 --- a/lib/cartodb/models/dataview/overviews/factory.js +++ b/lib/cartodb/models/dataview/overviews/factory.js @@ -14,7 +14,8 @@ OverviewsDataviewFactory.prototype.getDataview = function(query, dataviewDefinit return parentFactory.getDataview(query, dataviewDefinition); } return new dataviews[type]( - query, dataviewDefinition.options, this.queryRewriter, this.queryRewriteData, this.options + query, dataviewDefinition.options, this.queryRewriter, this.queryRewriteData, this.options, + dataviewDefinition.sql ); }; diff --git a/lib/cartodb/models/dataview/overviews/histogram.js b/lib/cartodb/models/dataview/overviews/histogram.js index 5f4d97d9..67da4514 100644 --- a/lib/cartodb/models/dataview/overviews/histogram.js +++ b/lib/cartodb/models/dataview/overviews/histogram.js @@ -96,10 +96,11 @@ var histogramQueryTpl = dot.template([ 'ORDER BY bin' ].join('\n')); -function Histogram(query, options, queryRewriter, queryRewriteData, params) { +function Histogram(query, options, queryRewriter, queryRewriteData, params, queries) { BaseOverviewsDataview.call(this, query, options, BaseDataview, queryRewriter, queryRewriteData, params); this.query = query; + this.queries = queries; this.column = options.column; this.bins = options.bins; @@ -129,7 +130,7 @@ Histogram.prototype.sql = function(psql, override, callback) { var _column = this.column; var columnTypeQuery = columnTypeQueryTpl({ - column: _column, query: this.rewrittenQuery(this.query) + column: _column, query: this.rewrittenQuery(this.queries.no_filters) }); if (this._columnType === null) { diff --git a/test/acceptance/dataviews/overviews.js b/test/acceptance/dataviews/overviews.js index 601124a7..d23519ae 100644 --- a/test/acceptance/dataviews/overviews.js +++ b/test/acceptance/dataviews/overviews.js @@ -144,6 +144,22 @@ describe('dataviews using tables with overviews', function() { aggregationColumn: 'name', } }, + test_histogram: { + type: 'histogram', + source: {id: 'data-source'}, + options: { + column: 'value', + bins: 2 + } + }, + test_histogram_date: { + type: 'histogram', + source: {id: 'data-source'}, + options: { + column: 'updated_at', + bins: 2 + } + }, test_avg: { type: 'formula', source: {id: 'data-source'}, @@ -265,8 +281,83 @@ describe('dataviews using tables with overviews', function() { }); }); + it("should expose a histogram", function (done) { + var testClient = new TestClient(overviewsMapConfig); + testClient.getDataview('test_histogram', function (err, histogram) { + if (err) { + return done(err); + } + assert.ok(histogram); + assert.equal(histogram.type, 'histogram'); + assert.ok(Array.isArray(histogram.bins)); + testClient.drain(done); + }); + }); + describe('filters', function() { + describe('histogram', function () { + + it("should expose a filtered histogram", function (done) { + var params = { + filters: { + dataviews: { test_histogram: { min: 2 } } + } + }; + var testClient = new TestClient(overviewsMapConfig); + testClient.getDataview('test_histogram', params, function (err, histogram) { + if (err) { + return done(err); + } + assert.ok(histogram); + assert.equal(histogram.type, 'histogram'); + assert.ok(Array.isArray(histogram.bins)); + assert.equal(histogram.bins.length, 4); + testClient.drain(done); + }); + }); + + it("should expose a filtered histogram with no results", function (done) { + var params = { + filters: { + dataviews: { test_histogram: { max: -1 } } + } + }; + var testClient = new TestClient(overviewsMapConfig); + testClient.getDataview('test_histogram', params, function (err, histogram) { + if (err) { + return done(err); + } + assert.ok(histogram); + assert.equal(histogram.type, 'histogram'); + assert.ok(Array.isArray(histogram.bins)); + assert.equal(histogram.bins.length, 0); + testClient.drain(done); + }); + }); + + it("should expose a filtered date histogram with no results", function (done) { + // This most likely works because the overviews will pass + // the responsibility to the normal dataviews. + var params = { + filters: { + dataviews: { test_histogram_date: { max: -1 } } + } + }; + var testClient = new TestClient(overviewsMapConfig); + testClient.getDataview('test_histogram_date', params, function (err, histogram) { + if (err) { + return done(err); + } + assert.ok(histogram); + assert.equal(histogram.type, 'histogram'); + assert.ok(Array.isArray(histogram.bins)); + assert.equal(histogram.bins.length, 0); + testClient.drain(done); + }); + }); + }); + describe('category', function () { var params = {