Merge pull request #987 from CartoDB/ignore-null-values-formula-dataview
ensuring formula dataview filters infinities, nans and nulls
This commit is contained in:
commit
028c3f9aec
@ -288,7 +288,7 @@ describe('aggregation-dataview: special float values', function() {
|
|||||||
filters.forEach(function (filter) {
|
filters.forEach(function (filter) {
|
||||||
it('should handle special float values using filter: ' + JSON.stringify(filter), function(done) {
|
it('should handle special float values using filter: ' + JSON.stringify(filter), function(done) {
|
||||||
this.testClient = new TestClient(mapConfig, 1234);
|
this.testClient = new TestClient(mapConfig, 1234);
|
||||||
this.testClient.getDataview('val_aggregation', { own_filter: 0 }, function(err, dataview) {
|
this.testClient.getDataview('val_aggregation', filter, function(err, dataview) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert.ok(dataview.infinities === (250 + 250));
|
assert.ok(dataview.infinities === (250 + 250));
|
||||||
assert.ok(dataview.nans === 250);
|
assert.ok(dataview.nans === 250);
|
||||||
@ -303,7 +303,7 @@ describe('aggregation-dataview: special float values', function() {
|
|||||||
|
|
||||||
it('should handle special numeric values using filter: ' + JSON.stringify(filter), function(done) {
|
it('should handle special numeric values using filter: ' + JSON.stringify(filter), function(done) {
|
||||||
this.testClient = new TestClient(mapConfig, 1234);
|
this.testClient = new TestClient(mapConfig, 1234);
|
||||||
this.testClient.getDataview('sum_aggregation_numeric', { own_filter: 0 }, function(err, dataview) {
|
this.testClient.getDataview('sum_aggregation_numeric', filter, function(err, dataview) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert.ok(dataview.nans === 333);
|
assert.ok(dataview.nans === 333);
|
||||||
assert.ok(dataview.categories.length === 2);
|
assert.ok(dataview.categories.length === 2);
|
||||||
|
@ -11,70 +11,125 @@ function createMapConfig(layers, dataviews, analysis) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
describe('formula-dataview: special float values', function() {
|
function getMapConfig(operation, lastNumber) {
|
||||||
|
return createMapConfig([
|
||||||
afterEach(function(done) {
|
{
|
||||||
if (this.testClient) {
|
"type": "cartodb",
|
||||||
this.testClient.drain(done);
|
"options": {
|
||||||
} else {
|
"source": {
|
||||||
done();
|
"id": "a0"
|
||||||
|
},
|
||||||
|
"cartocss": "#points { marker-width: 10; marker-fill: red; }",
|
||||||
|
"cartocss_version": "2.3.0"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
{
|
||||||
|
val_formula: {
|
||||||
|
source: {
|
||||||
|
id: 'a0'
|
||||||
|
},
|
||||||
|
type: 'formula',
|
||||||
|
options: {
|
||||||
|
column: 'val',
|
||||||
|
operation: operation
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[
|
||||||
|
{
|
||||||
|
id: "a0",
|
||||||
|
type: "source",
|
||||||
|
params: {
|
||||||
|
query: `
|
||||||
|
SELECT
|
||||||
|
null::geometry the_geom_webmercator,
|
||||||
|
CASE
|
||||||
|
WHEN x % 5 = 1 THEN 'infinity'::float
|
||||||
|
WHEN x % 5 = 2 THEN '-infinity'::float
|
||||||
|
WHEN x % 5 = 3 THEN 'NaN'::float
|
||||||
|
WHEN x % 5 = 4 THEN NULL
|
||||||
|
ELSE x
|
||||||
|
END AS val
|
||||||
|
FROM generate_series(1, ${lastNumber}) x
|
||||||
|
`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('formula-dataview: special float values', function() {
|
||||||
|
describe('easy numbers', function() { // not needed, but I keep it here to help human calc
|
||||||
|
afterEach(function(done) {
|
||||||
|
if (this.testClient) {
|
||||||
|
this.testClient.drain(done);
|
||||||
|
} else {
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const lastNumber = 10;
|
||||||
|
|
||||||
|
[
|
||||||
|
{operation: 'count', result: 2},
|
||||||
|
{operation: 'avg', result: 7.5},
|
||||||
|
{operation: 'sum', result: 15},
|
||||||
|
{operation: 'min', result: 5},
|
||||||
|
{operation: 'max', result: 10}
|
||||||
|
]
|
||||||
|
.forEach(operationData => {
|
||||||
|
it(operationData.operation, function(done) {
|
||||||
|
this.testClient = new TestClient(getMapConfig(operationData.operation, lastNumber), 1234);
|
||||||
|
this.testClient.getDataview('val_formula', {}, function(err, dataview) {
|
||||||
|
assert.ok(!err, err);
|
||||||
|
assert.deepStrictEqual(dataview, {
|
||||||
|
type: 'formula',
|
||||||
|
operation: operationData.operation,
|
||||||
|
result: operationData.result,
|
||||||
|
nulls: lastNumber / 5,
|
||||||
|
nans: lastNumber / 5,
|
||||||
|
infinities: 2 * lastNumber / 5
|
||||||
|
});
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
var mapConfig = createMapConfig(
|
describe('bigger numbers', function() {
|
||||||
[
|
afterEach(function(done) {
|
||||||
{
|
if (this.testClient) {
|
||||||
"type": "cartodb",
|
this.testClient.drain(done);
|
||||||
"options": {
|
} else {
|
||||||
"source": {
|
done();
|
||||||
"id": "a0"
|
|
||||||
},
|
|
||||||
"cartocss": "#points { marker-width: 10; marker-fill: red; }",
|
|
||||||
"cartocss_version": "2.3.0"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
});
|
||||||
{
|
|
||||||
val_formula: {
|
|
||||||
source: {
|
|
||||||
id: 'a0'
|
|
||||||
},
|
|
||||||
type: 'formula',
|
|
||||||
options: {
|
|
||||||
column: 'val',
|
|
||||||
operation: 'avg'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"id": "a0",
|
|
||||||
"type": "source",
|
|
||||||
"params": {
|
|
||||||
"query": [
|
|
||||||
'SELECT',
|
|
||||||
' null::geometry the_geom_webmercator,',
|
|
||||||
' CASE',
|
|
||||||
' WHEN x % 4 = 0 THEN \'infinity\'::float',
|
|
||||||
' WHEN x % 4 = 1 THEN \'-infinity\'::float',
|
|
||||||
' WHEN x % 4 = 2 THEN \'NaN\'::float',
|
|
||||||
' ELSE x',
|
|
||||||
' END AS val',
|
|
||||||
'FROM generate_series(1, 1000) x'
|
|
||||||
].join('\n')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
it('should filter infinities out and count them in the summary', function(done) {
|
const lastNumber = 1000;
|
||||||
this.testClient = new TestClient(mapConfig, 1234);
|
|
||||||
this.testClient.getDataview('val_formula', {}, function(err, dataview) {
|
[
|
||||||
assert.ok(!err, err);
|
{operation: 'count', result: 200},
|
||||||
assert.equal(dataview.result, 501);
|
{operation: 'avg', result: 502.5},
|
||||||
assert.ok(dataview.infinities === (250 + 250));
|
{operation: 'sum', result: 100500},
|
||||||
assert.ok(dataview.nans === 250);
|
{operation: 'min', result: 5},
|
||||||
done();
|
{operation: 'max', result: 1000}
|
||||||
|
]
|
||||||
|
.forEach(operationData => {
|
||||||
|
it(operationData.operation, function(done) {
|
||||||
|
this.testClient = new TestClient(getMapConfig(operationData.operation, lastNumber), 1234);
|
||||||
|
this.testClient.getDataview('val_formula', {}, function(err, dataview) {
|
||||||
|
assert.ok(!err, err);
|
||||||
|
assert.deepStrictEqual(dataview, {
|
||||||
|
type: 'formula',
|
||||||
|
operation: operationData.operation,
|
||||||
|
result: operationData.result,
|
||||||
|
nulls: lastNumber / 5,
|
||||||
|
nans: lastNumber / 5,
|
||||||
|
infinities: 2 * lastNumber / 5
|
||||||
|
});
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user