From d1373bec6614d91ea93f1a0acc8b3afe73d701a6 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Mon, 4 Aug 2014 17:48:59 +0200 Subject: [PATCH] Improves SQL query for affected tables and last updated time --- lib/cartodb/api/query_tables_api.js | 7 +++---- test/acceptance/multilayer.js | 29 +++++++++++++---------------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/lib/cartodb/api/query_tables_api.js b/lib/cartodb/api/query_tables_api.js index 18920b59..52e3a989 100644 --- a/lib/cartodb/api/query_tables_api.js +++ b/lib/cartodb/api/query_tables_api.js @@ -66,11 +66,10 @@ QueryTablesApi.prototype.getAffectedTablesAndLastUpdatedTime = function (usernam ; var query = [ - 'SELECT', - 'CDB_QueryTables($windshaft$' + sql + '$windshaft$) as tablenames,', - 'EXTRACT(EPOCH FROM max(updated_at)) as max', + 'WITH querytables AS (SELECT * FROM CDB_QueryTables($windshaft$' + sql + '$windshaft$) as tablenames)', + 'SELECT (SELECT tablenames FROM querytables), EXTRACT(EPOCH FROM max(updated_at)) as max', 'FROM CDB_TableMetadata m', - 'WHERE m.tabname = any (CDB_QueryTables($windshaft$' + sql + '$windshaft$)::regclass[])' + 'WHERE m.tabname = any ((SELECT tablenames from querytables)::regclass[])' ].join(' '); sqlApi.query(username, api_key, query, function(err, rows){ diff --git a/test/acceptance/multilayer.js b/test/acceptance/multilayer.js index 89e4c25d..fd95edd7 100644 --- a/test/acceptance/multilayer.js +++ b/test/acceptance/multilayer.js @@ -112,13 +112,12 @@ suite('multilayer', function() { var jsonquery = cc.substring(dbname.length+1); var sentquery = JSON.parse(jsonquery); var expectedQuery = [layergroup.layers[0].options.sql, ';', layergroup.layers[1].options.sql].join(''); - assert.equal(sentquery.q, 'SELECT CDB_QueryTables($windshaft$' + assert.equal(sentquery.q, 'WITH querytables AS (SELECT * FROM CDB_QueryTables($windshaft$' + expectedQuery - + '$windshaft$) as tablenames, EXTRACT(EPOCH FROM max(updated_at)) as max' + + '$windshaft$) as tablenames)' + + ' SELECT (SELECT tablenames FROM querytables), EXTRACT(EPOCH FROM max(updated_at)) as max' + ' FROM CDB_TableMetadata m' - + ' WHERE m.tabname = any (CDB_QueryTables($windshaft$' - + expectedQuery - + '$windshaft$)::regclass[])'); + + ' WHERE m.tabname = any ((SELECT tablenames from querytables)::regclass[])'); assert.imageEqualsFile(res.body, 'test/fixtures/test_table_0_0_0_multilayer1.png', IMAGE_EQUALS_HIGHER_TOLERANCE_PER_MIL, function(err, similarity) { @@ -395,13 +394,12 @@ suite('multilayer', function() { .replace(/!bbox!/g, 'ST_MakeEnvelope(0,0,0,0)') .replace(/!pixel_width!/g, '1') .replace(/!pixel_height!/g, '1'); - assert.equal(sentquery.q, 'SELECT CDB_QueryTables($windshaft$' + assert.equal(sentquery.q, 'WITH querytables AS (SELECT * FROM CDB_QueryTables($windshaft$' + expectedQuery - + '$windshaft$) as tablenames, EXTRACT(EPOCH FROM max(updated_at)) as max' + + '$windshaft$) as tablenames)' + + ' SELECT (SELECT tablenames FROM querytables), EXTRACT(EPOCH FROM max(updated_at)) as max' + ' FROM CDB_TableMetadata m' - + ' WHERE m.tabname = any (CDB_QueryTables($windshaft$' - + expectedQuery - + '$windshaft$)::regclass[])'); + + ' WHERE m.tabname = any ((SELECT tablenames from querytables)::regclass[])'); assert.imageEqualsFile(res.body, 'test/fixtures/test_multilayer_bbox.png', IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err, similarity) { @@ -433,13 +431,12 @@ suite('multilayer', function() { .replace('!bbox!', 'ST_MakeEnvelope(0,0,0,0)') .replace('!pixel_width!', '1') .replace('!pixel_height!', '1'); - assert.equal(sentquery.q, 'SELECT CDB_QueryTables($windshaft$' - + expectedQuery - + '$windshaft$) as tablenames, EXTRACT(EPOCH FROM max(updated_at)) as max' - + ' FROM CDB_TableMetadata m' - + ' WHERE m.tabname = any (CDB_QueryTables($windshaft$' + assert.equal(sentquery.q, 'WITH querytables AS (SELECT * FROM CDB_QueryTables($windshaft$' + expectedQuery - + '$windshaft$)::regclass[])'); + + '$windshaft$) as tablenames)' + + ' SELECT (SELECT tablenames FROM querytables), EXTRACT(EPOCH FROM max(updated_at)) as max' + + ' FROM CDB_TableMetadata m' + + ' WHERE m.tabname = any ((SELECT tablenames from querytables)::regclass[])'); assert.imageEqualsFile(res.body, 'test/fixtures/test_multilayer_bbox.png', IMAGE_EQUALS_TOLERANCE_PER_MIL, function(err, similarity) {