Merge pull request #637 from CartoDB/histogram-type-discovery
Histogram column type discovery query uses non-filtered query
This commit is contained in:
commit
5f87417d9e
@ -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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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 = {
|
||||||
|
@ -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: {
|
||||||
|
Loading…
Reference in New Issue
Block a user