diff --git a/lib/cartodb/utils/substitution-tokens.js b/lib/cartodb/utils/substitution-tokens.js index af09f838..5905fa4d 100644 --- a/lib/cartodb/utils/substitution-tokens.js +++ b/lib/cartodb/utils/substitution-tokens.js @@ -6,6 +6,16 @@ var SUBSTITUTION_TOKENS = { }; var SubstitutionTokens = { + tokens: function(sql) { + return Object.keys(SUBSTITUTION_TOKENS).filter(function(tokenName) { + return !!sql.match(SUBSTITUTION_TOKENS[tokenName]); + }); + }, + + hasTokens: function(sql) { + return this.tokens(sql).length > 0; + }, + replace: function(sql, replaceValues) { Object.keys(replaceValues).forEach(function(token) { if (SUBSTITUTION_TOKENS[token]) { diff --git a/test/unit/cartodb/substitution-tokens.test.js b/test/unit/cartodb/substitution-tokens.test.js new file mode 100644 index 00000000..70c3a0d0 --- /dev/null +++ b/test/unit/cartodb/substitution-tokens.test.js @@ -0,0 +1,40 @@ +var assert = require('assert'); +var SubstitutionTokens = require('../../../lib/cartodb/utils/substitution-tokens'); + +describe('SubstitutionTokens', function() { + + var sql = [ + 'WITH hgrid AS (', + ' SELECT CDB_HexagonGrid(', + ' ST_Expand(!bbox!, greatest(!pixel_width!,!pixel_height!) * 100),', + ' greatest(!pixel_width!,!pixel_height!) * 100', + ' ) as cell', + ')', + 'SELECT', + ' hgrid.cell as the_geom_webmercator,', + ' count(1) as points_count,', + ' count(1)/power(100 * CDB_XYZ_Resolution(CDB_ZoomFromScale(!scale_denominator!)), 2) as points_density,', + ' 1 as cartodb_id', + 'FROM hgrid, (select * from table) i', + 'where ST_Intersects(i.the_geom_webmercator, hgrid.cell)', + 'GROUP BY hgrid.cell' + ].join('\n'); + + it('should return tokens present in sql', function() { + assert.deepEqual(SubstitutionTokens.tokens(sql), ['bbox', 'scale_denominator', 'pixel_width', 'pixel_height']); + }); + + it('should return just one token', function() { + assert.deepEqual(SubstitutionTokens.tokens('select !bbox! from wadus'), ['bbox']); + }); + + it('should not return other tokens', function() { + assert.deepEqual(SubstitutionTokens.tokens('select !wadus! from wadus'), []); + }); + + it('should report sql has tokens', function() { + assert.equal(SubstitutionTokens.hasTokens(sql), true); + assert.equal(SubstitutionTokens.hasTokens('select !bbox! from wadus'), true); + assert.equal(SubstitutionTokens.hasTokens('select !wadus! from wadus'), false); + }); +});