Merge pull request #637 from CartoDB/histogram-type-discovery

Histogram column type discovery query uses non-filtered query
This commit is contained in:
Raul Ochoa 2017-03-17 11:03:15 +01:00 committed by GitHub
commit 5f87417d9e
6 changed files with 131 additions and 6 deletions

View File

@ -11,7 +11,7 @@ var DataviewFactory = {
if (!this.dataviews[type]) { if (!this.dataviews[type]) {
throw new Error('Invalid dataview type: "' + type + '"'); throw new Error('Invalid dataview type: "' + type + '"');
} }
return new this.dataviews[type](query, dataviewDefinition.options); return new this.dataviews[type](query, dataviewDefinition.options, dataviewDefinition.sql);
} }
}; };

View File

@ -109,12 +109,13 @@ var TYPE = 'histogram';
} }
} }
*/ */
function Histogram(query, options) { function Histogram(query, options, queries) {
if (!_.isString(options.column)) { if (!_.isString(options.column)) {
throw new Error('Histogram expects `column` in widget options'); throw new Error('Histogram expects `column` in widget options');
} }
this.query = query; this.query = query;
this.queries = queries;
this.column = options.column; this.column = options.column;
this.bins = options.bins; this.bins = options.bins;
@ -143,7 +144,7 @@ Histogram.prototype.sql = function(psql, override, callback) {
var _column = this.column; var _column = this.column;
var columnTypeQuery = columnTypeQueryTpl({ var columnTypeQuery = columnTypeQueryTpl({
column: _column, query: this.query column: _column, query: this.queries.no_filters
}); });
if (this._columnType === null) { if (this._columnType === null) {

View File

@ -14,7 +14,8 @@ OverviewsDataviewFactory.prototype.getDataview = function(query, dataviewDefinit
return parentFactory.getDataview(query, dataviewDefinition); return parentFactory.getDataview(query, dataviewDefinition);
} }
return new dataviews[type]( return new dataviews[type](
query, dataviewDefinition.options, this.queryRewriter, this.queryRewriteData, this.options query, dataviewDefinition.options, this.queryRewriter, this.queryRewriteData, this.options,
dataviewDefinition.sql
); );
}; };

View File

@ -96,10 +96,11 @@ var histogramQueryTpl = dot.template([
'ORDER BY bin' 'ORDER BY bin'
].join('\n')); ].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); BaseOverviewsDataview.call(this, query, options, BaseDataview, queryRewriter, queryRewriteData, params);
this.query = query; this.query = query;
this.queries = queries;
this.column = options.column; this.column = options.column;
this.bins = options.bins; this.bins = options.bins;
@ -129,7 +130,7 @@ Histogram.prototype.sql = function(psql, override, callback) {
var _column = this.column; var _column = this.column;
var columnTypeQuery = columnTypeQueryTpl({ var columnTypeQuery = columnTypeQueryTpl({
column: _column, query: this.rewrittenQuery(this.query) column: _column, query: this.rewrittenQuery(this.queries.no_filters)
}); });
if (this._columnType === null) { if (this._columnType === null) {

View File

@ -144,6 +144,22 @@ describe('dataviews using tables with overviews', function() {
aggregationColumn: 'name', 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: { test_avg: {
type: 'formula', type: 'formula',
source: {id: 'data-source'}, 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('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 () { describe('category', function () {
var params = { var params = {

View File

@ -304,6 +304,37 @@ describe('widgets', function() {
}); });
}); });
it('can use a datetime filtered column with no results', function(done) {
this.testClient = new TestClient(histogramsMapConfig({
updated_at: {
type: 'histogram',
options: {
column: 'updated_at'
}
}
}));
var params = {
own_filter: 1,
filters: {
layers: [{
updated_at: {
// this will remove all results
max: -1
}
}]
}
};
this.testClient.getWidget('updated_at', params, function (err, res, histogram) {
assert.ok(!err, err);
assert.ok(histogram);
assert.equal(histogram.type, 'histogram');
assert.equal(histogram.bins.length, 0);
done();
});
});
it('can getTile with datetime filtered column', function(done) { it('can getTile with datetime filtered column', function(done) {
this.testClient = new TestClient(histogramsMapConfig({ this.testClient = new TestClient(histogramsMapConfig({
updated_at: { updated_at: {