From e45b41f55ad3a3ddac21d431b09b4234fba5f852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Mart=C3=ADn?= Date: Wed, 27 Jun 2018 18:04:48 +0200 Subject: [PATCH 1/3] ensuring formula dataview filters infinities, nans and nulls --- test/acceptance/dataviews/formula.js | 173 ++++++++++++++++++--------- 1 file changed, 114 insertions(+), 59 deletions(-) diff --git a/test/acceptance/dataviews/formula.js b/test/acceptance/dataviews/formula.js index 941dc07e..53ff2da2 100644 --- a/test/acceptance/dataviews/formula.js +++ b/test/acceptance/dataviews/formula.js @@ -11,70 +11,125 @@ function createMapConfig(layers, dataviews, analysis) { }; } -describe('formula-dataview: special float values', function() { - - afterEach(function(done) { - if (this.testClient) { - this.testClient.drain(done); - } else { - done(); +function getMapConfig(operation, lastNumber) { + return createMapConfig([ + { + "type": "cartodb", + "options": { + "source": { + "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: should filter infinities out and count them in the summary', 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( - [ - { - "type": "cartodb", - "options": { - "source": { - "id": "a0" - }, - "cartocss": "#points { marker-width: 10; marker-fill: red; }", - "cartocss_version": "2.3.0" - } + describe('bigger numbers', function() { + afterEach(function(done) { + if (this.testClient) { + this.testClient.drain(done); + } else { + done(); } - ], - { - 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) { - this.testClient = new TestClient(mapConfig, 1234); - this.testClient.getDataview('val_formula', {}, function(err, dataview) { - assert.ok(!err, err); - assert.equal(dataview.result, 501); - assert.ok(dataview.infinities === (250 + 250)); - assert.ok(dataview.nans === 250); - done(); + const lastNumber = 1000; + + [ + {operation: 'count', result: 200}, + {operation: 'avg', result: 502.5}, + {operation: 'sum', result: 100500}, + {operation: 'min', result: 5}, + {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(); + }); + }); }); }); }); From 66f38e8ecdd8616c0c0fa5782fa3f73238c3d841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Mart=C3=ADn?= Date: Wed, 27 Jun 2018 18:38:20 +0200 Subject: [PATCH 2/3] keep the original test name --- test/acceptance/dataviews/formula.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/acceptance/dataviews/formula.js b/test/acceptance/dataviews/formula.js index 53ff2da2..c6f92afc 100644 --- a/test/acceptance/dataviews/formula.js +++ b/test/acceptance/dataviews/formula.js @@ -58,7 +58,7 @@ function getMapConfig(operation, lastNumber) { ]); } -describe('formula-dataview: should filter infinities out and count them in the summary', function() { +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) { From 1329f1f53577fbf9f80eb98aba348b45b7495fd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Mart=C3=ADn?= Date: Thu, 28 Jun 2018 12:41:52 +0200 Subject: [PATCH 3/3] fix aggregation-dataview test filter --- test/acceptance/dataviews/aggregation.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/acceptance/dataviews/aggregation.js b/test/acceptance/dataviews/aggregation.js index 9330b36f..fb46fb26 100644 --- a/test/acceptance/dataviews/aggregation.js +++ b/test/acceptance/dataviews/aggregation.js @@ -288,7 +288,7 @@ describe('aggregation-dataview: special float values', function() { filters.forEach(function (filter) { it('should handle special float values using filter: ' + JSON.stringify(filter), function(done) { 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.ok(dataview.infinities === (250 + 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) { 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.ok(dataview.nans === 333); assert.ok(dataview.categories.length === 2);