From 965e1cd0c4f3b4ef9444b5c50f4ce9b53661e0b9 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Fri, 22 Aug 2014 10:16:39 +0200 Subject: [PATCH] Supports `!scale_denominator!` dynamic param in SQL queries --- NEWS.md | 1 + lib/cartodb/api/query_tables_api.js | 33 +++++++++++++++-------------- test/acceptance/multilayer.js | 12 +++++------ 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/NEWS.md b/NEWS.md index 5a43a921..661fbceb 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,6 +3,7 @@ Enhancements: - Upgrades windshaft + - Supports `!scale_denominator!` dynamic param in SQL queries 1.16.1 -- 2014-08-19 -------------------- diff --git a/lib/cartodb/api/query_tables_api.js b/lib/cartodb/api/query_tables_api.js index 61ef8d92..728d1b24 100644 --- a/lib/cartodb/api/query_tables_api.js +++ b/lib/cartodb/api/query_tables_api.js @@ -6,6 +6,7 @@ function QueryTablesApi() { var affectedTableRegexCache = { bbox: /!bbox!/g, + scale_denominator: /!scale_denominator!/g, pixel_width: /!pixel_width!/g, pixel_height: /!pixel_height!/g }; @@ -35,25 +36,18 @@ QueryTablesApi.prototype.getLastUpdatedTime = function (username, api_key, table }; QueryTablesApi.prototype.getAffectedTablesInQuery = function (username, options, sql, callback) { - // Replace mapnik tokens - sql = sql - .replace(affectedTableRegexCache.bbox, 'ST_MakeEnvelope(0,0,0,0)') - .replace(affectedTableRegexCache.pixel_width, '1') - .replace(affectedTableRegexCache.pixel_height, '1') - ; - // Pass to CDB_QueryTables - sql = 'SELECT CDB_QueryTables($windshaft$' + sql + '$windshaft$)'; + var query = 'SELECT CDB_QueryTables($windshaft$' + prepareSql(sql) + '$windshaft$)'; // call sql api if (shouldQueryPostgresDirectly()) { var psql = new PSQL(options); - psql.query(sql, function(err, resultSet) { + psql.query(query, function(err, resultSet) { var rows = resultSet.rows || []; handleAffectedTablesInQueryRows(err, rows, callback); }); } else { - sqlApi.query(username, options.api_key, sql, function(err, rows) { + sqlApi.query(username, options.api_key, query, function(err, rows) { handleAffectedTablesInQueryRows(err, rows, callback); }); } @@ -72,14 +66,11 @@ function handleAffectedTablesInQueryRows(err, rows, callback) { } QueryTablesApi.prototype.getAffectedTablesAndLastUpdatedTime = function (username, options, sql, callback) { - sql = sql - .replace(affectedTableRegexCache.bbox, 'ST_MakeEnvelope(0,0,0,0)') - .replace(affectedTableRegexCache.pixel_width, '1') - .replace(affectedTableRegexCache.pixel_height, '1') - ; var query = [ - 'WITH querytables AS (SELECT * FROM CDB_QueryTables($windshaft$' + sql + '$windshaft$) as tablenames)', + 'WITH querytables AS (', + 'SELECT * FROM CDB_QueryTables($windshaft$' + prepareSql(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 ((SELECT tablenames from querytables)::regclass[])' @@ -119,6 +110,16 @@ function handleAffectedTablesAndLastUpdatedTimeRows(err, rows, callback) { } +function prepareSql(sql) { + return sql + .replace(affectedTableRegexCache.bbox, 'ST_MakeEnvelope(0,0,0,0)') + .replace(affectedTableRegexCache.scale_denominator, '0') + .replace(affectedTableRegexCache.pixel_width, '1') + .replace(affectedTableRegexCache.pixel_height, '1') + ; +} + + function shouldQueryPostgresDirectly() { return global.environment && global.environment.enabledFeatures diff --git a/test/acceptance/multilayer.js b/test/acceptance/multilayer.js index 48cefbce..77474a6b 100644 --- a/test/acceptance/multilayer.js +++ b/test/acceptance/multilayer.js @@ -115,9 +115,9 @@ suite('multilayer:postgres=' + cdbQueryTablesFromPostgresEnabledValue, 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, 'WITH querytables AS (SELECT * FROM CDB_QueryTables($windshaft$' + assert.equal(sentquery.q, 'WITH querytables AS ( SELECT * FROM CDB_QueryTables($windshaft$' + expectedQuery - + '$windshaft$) as tablenames)' + + '$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[])'); @@ -397,9 +397,9 @@ suite('multilayer:postgres=' + cdbQueryTablesFromPostgresEnabledValue, function( .replace(/!bbox!/g, 'ST_MakeEnvelope(0,0,0,0)') .replace(/!pixel_width!/g, '1') .replace(/!pixel_height!/g, '1'); - assert.equal(sentquery.q, 'WITH querytables AS (SELECT * FROM CDB_QueryTables($windshaft$' + assert.equal(sentquery.q, 'WITH querytables AS ( SELECT * FROM CDB_QueryTables($windshaft$' + expectedQuery - + '$windshaft$) as tablenames)' + + '$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[])'); @@ -434,9 +434,9 @@ suite('multilayer:postgres=' + cdbQueryTablesFromPostgresEnabledValue, function( .replace('!bbox!', 'ST_MakeEnvelope(0,0,0,0)') .replace('!pixel_width!', '1') .replace('!pixel_height!', '1'); - assert.equal(sentquery.q, 'WITH querytables AS (SELECT * FROM CDB_QueryTables($windshaft$' + assert.equal(sentquery.q, 'WITH querytables AS ( SELECT * FROM CDB_QueryTables($windshaft$' + expectedQuery - + '$windshaft$) as tablenames)' + + '$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[])');