Merge remote-tracking branch 'origin/turbo-carto-substitution-tokens'
Conflicts: NEWS.md
This commit is contained in:
commit
f6f58a71b3
4
NEWS.md
4
NEWS.md
@ -4,6 +4,10 @@
|
|||||||
|
|
||||||
Released 2016-mm-dd
|
Released 2016-mm-dd
|
||||||
|
|
||||||
|
New features:
|
||||||
|
- turbo-carto: mapnik substitution tokens support #455
|
||||||
|
|
||||||
|
|
||||||
## 2.42.1
|
## 2.42.1
|
||||||
|
|
||||||
Released 2016-05-17
|
Released 2016-05-17
|
||||||
|
@ -1,24 +1,18 @@
|
|||||||
|
var SubstitutionTokens = require('../utils/substitution-tokens');
|
||||||
|
|
||||||
function OverviewsMetadataApi(pgQueryRunner) {
|
function OverviewsMetadataApi(pgQueryRunner) {
|
||||||
this.pgQueryRunner = pgQueryRunner;
|
this.pgQueryRunner = pgQueryRunner;
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = OverviewsMetadataApi;
|
module.exports = OverviewsMetadataApi;
|
||||||
|
|
||||||
// TODO: share this with QueryTablesApi? ... or maintain independence?
|
|
||||||
var affectedTableRegexCache = {
|
|
||||||
bbox: /!bbox!/g,
|
|
||||||
scale_denominator: /!scale_denominator!/g,
|
|
||||||
pixel_width: /!pixel_width!/g,
|
|
||||||
pixel_height: /!pixel_height!/g
|
|
||||||
};
|
|
||||||
|
|
||||||
function prepareSql(sql) {
|
function prepareSql(sql) {
|
||||||
return sql && sql
|
return sql && SubstitutionTokens.replace(sql, {
|
||||||
.replace(affectedTableRegexCache.bbox, 'ST_MakeEnvelope(0,0,0,0)')
|
bbox: 'ST_MakeEnvelope(0,0,0,0)',
|
||||||
.replace(affectedTableRegexCache.scale_denominator, '0')
|
scale_denominator: '0',
|
||||||
.replace(affectedTableRegexCache.pixel_width, '1')
|
pixel_width: '1',
|
||||||
.replace(affectedTableRegexCache.pixel_height, '1')
|
pixel_height: '1'
|
||||||
;
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
OverviewsMetadataApi.prototype.getOverviewsMetadata = function (username, sql, callback) {
|
OverviewsMetadataApi.prototype.getOverviewsMetadata = function (username, sql, callback) {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var queue = require('queue-async');
|
var queue = require('queue-async');
|
||||||
|
var SubstitutionTokens = require('../substitution-tokens');
|
||||||
|
|
||||||
function TurboCartoAdapter(turboCartoParser) {
|
function TurboCartoAdapter(turboCartoParser) {
|
||||||
this.turboCartoParser = turboCartoParser;
|
this.turboCartoParser = turboCartoParser;
|
||||||
@ -37,7 +38,14 @@ TurboCartoAdapter.prototype._parseCartoCss = function (username, layer, callback
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this.turboCartoParser.process(username, layer.options.cartocss, layer.options.sql, function (err, cartocss) {
|
var sql = SubstitutionTokens.replace(layer.options.sql, {
|
||||||
|
bbox: 'ST_MakeEnvelope(-20037508.34,-20037508.34,20037508.34,20037508.34,3857)',
|
||||||
|
scale_denominator: '500000001',
|
||||||
|
pixel_width: '156412',
|
||||||
|
pixel_height: '156412'
|
||||||
|
});
|
||||||
|
|
||||||
|
this.turboCartoParser.process(username, layer.options.cartocss, sql, function (err, cartocss) {
|
||||||
// Only return turbo-carto errors
|
// Only return turbo-carto errors
|
||||||
if (err && err.name === 'TurboCartoError') {
|
if (err && err.name === 'TurboCartoError') {
|
||||||
err = new Error('turbo-carto: ' + err.message);
|
err = new Error('turbo-carto: ' + err.message);
|
||||||
|
19
lib/cartodb/utils/substitution-tokens.js
Normal file
19
lib/cartodb/utils/substitution-tokens.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
var SUBSTITUTION_TOKENS = {
|
||||||
|
bbox: /!bbox!/g,
|
||||||
|
scale_denominator: /!scale_denominator!/g,
|
||||||
|
pixel_width: /!pixel_width!/g,
|
||||||
|
pixel_height: /!pixel_height!/g
|
||||||
|
};
|
||||||
|
|
||||||
|
var SubstitutionTokens = {
|
||||||
|
replace: function(sql, replaceValues) {
|
||||||
|
Object.keys(replaceValues).forEach(function(token) {
|
||||||
|
if (SUBSTITUTION_TOKENS[token]) {
|
||||||
|
sql = sql.replace(SUBSTITUTION_TOKENS[token], replaceValues[token]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return sql;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = SubstitutionTokens;
|
2
npm-shrinkwrap.json
generated
2
npm-shrinkwrap.json
generated
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "windshaft-cartodb",
|
"name": "windshaft-cartodb",
|
||||||
"version": "2.42.1",
|
"version": "2.42.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"body-parser": {
|
"body-parser": {
|
||||||
"version": "1.14.2",
|
"version": "1.14.2",
|
||||||
|
@ -3,7 +3,7 @@ require('../../support/test_helper');
|
|||||||
var assert = require('../../support/assert');
|
var assert = require('../../support/assert');
|
||||||
var TestClient = require('../../support/test-client');
|
var TestClient = require('../../support/test-client');
|
||||||
|
|
||||||
function makeMapconfig(cartocss) {
|
function makeMapconfig(sql, cartocss) {
|
||||||
return {
|
return {
|
||||||
"version": "1.4.0",
|
"version": "1.4.0",
|
||||||
"layers": [
|
"layers": [
|
||||||
@ -11,19 +11,7 @@ function makeMapconfig(cartocss) {
|
|||||||
"type": 'mapnik',
|
"type": 'mapnik',
|
||||||
"options": {
|
"options": {
|
||||||
"cartocss_version": '2.3.0',
|
"cartocss_version": '2.3.0',
|
||||||
"sql": [
|
"sql": sql,
|
||||||
'SELECT test_table.*, _prices.price FROM test_table JOIN (' +
|
|
||||||
' SELECT 1 AS cartodb_id, 10.00 AS price',
|
|
||||||
' UNION',
|
|
||||||
' SELECT 2, 10.50',
|
|
||||||
' UNION',
|
|
||||||
' SELECT 3, 11.00',
|
|
||||||
' UNION',
|
|
||||||
' SELECT 4, 12.00',
|
|
||||||
' UNION',
|
|
||||||
' SELECT 5, 21.00',
|
|
||||||
') _prices ON _prices.cartodb_id = test_table.cartodb_id'
|
|
||||||
].join('\n'),
|
|
||||||
"cartocss": cartocss
|
"cartocss": cartocss
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -33,6 +21,13 @@ function makeMapconfig(cartocss) {
|
|||||||
|
|
||||||
describe('turbo-carto regressions', function() {
|
describe('turbo-carto regressions', function() {
|
||||||
|
|
||||||
|
afterEach(function (done) {
|
||||||
|
if (this.testClient) {
|
||||||
|
this.testClient.drain(done);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should accept // comments', function(done) {
|
||||||
var cartocss = [
|
var cartocss = [
|
||||||
"/** simple visualization */",
|
"/** simple visualization */",
|
||||||
"",
|
"",
|
||||||
@ -48,9 +43,9 @@ describe('turbo-carto regressions', function() {
|
|||||||
" marker-placement: point;",
|
" marker-placement: point;",
|
||||||
" marker-type: ellipse;",
|
" marker-type: ellipse;",
|
||||||
" //marker-comp-op: overlay;",
|
" //marker-comp-op: overlay;",
|
||||||
" marker-width: [price];",
|
" marker-width: [cartodb_id];",
|
||||||
" [zoom=5]{marker-width: [price]*2;}",
|
" [zoom=5]{marker-width: [cartodb_id]*2;}",
|
||||||
" [zoom=6]{marker-width: [price]*4;}",
|
" [zoom=6]{marker-width: [cartodb_id]*4;}",
|
||||||
" marker-fill: #000000;",
|
" marker-fill: #000000;",
|
||||||
" marker-allow-overlap: true;",
|
" marker-allow-overlap: true;",
|
||||||
" ",
|
" ",
|
||||||
@ -58,15 +53,46 @@ describe('turbo-carto regressions', function() {
|
|||||||
"}"
|
"}"
|
||||||
].join('\n');
|
].join('\n');
|
||||||
|
|
||||||
beforeEach(function () {
|
this.testClient = new TestClient(makeMapconfig('SELECT * FROM populated_places_simple_reduced', cartocss));
|
||||||
this.testClient = new TestClient(makeMapconfig(cartocss));
|
this.testClient.getLayergroup(function(err, layergroup) {
|
||||||
|
assert.ok(!err, err);
|
||||||
|
|
||||||
|
assert.ok(layergroup.hasOwnProperty('layergroupid'));
|
||||||
|
assert.ok(!layergroup.hasOwnProperty('errors'));
|
||||||
|
|
||||||
|
done();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(function (done) {
|
it('should work with mapnik substitution tokens', function(done) {
|
||||||
this.testClient.drain(done);
|
var cartocss = [
|
||||||
});
|
"#layer {",
|
||||||
|
" line-width: 2;",
|
||||||
|
" line-color: #3B3B58;",
|
||||||
|
" line-opacity: 1;",
|
||||||
|
" polygon-opacity: 0.7;",
|
||||||
|
" polygon-fill: ramp([points_count], (#E5F5F9,#99D8C9,#2CA25F))",
|
||||||
|
"}"
|
||||||
|
].join('\n');
|
||||||
|
|
||||||
it('should accept // comments', function(done) {
|
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 populated_places_simple_reduced) i',
|
||||||
|
'where ST_Intersects(i.the_geom_webmercator, hgrid.cell)',
|
||||||
|
'GROUP BY hgrid.cell'
|
||||||
|
].join('\n');
|
||||||
|
|
||||||
|
this.testClient = new TestClient(makeMapconfig(sql, cartocss));
|
||||||
this.testClient.getLayergroup(function(err, layergroup) {
|
this.testClient.getLayergroup(function(err, layergroup) {
|
||||||
assert.ok(!err, err);
|
assert.ok(!err, err);
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ if test x"$PREPARE_PGSQL" = xyes; then
|
|||||||
|
|
||||||
cat sql/_CDB_QueryStatements.sql | psql -v ON_ERROR_STOP=1 ${TEST_DB} || exit 1
|
cat sql/_CDB_QueryStatements.sql | psql -v ON_ERROR_STOP=1 ${TEST_DB} || exit 1
|
||||||
|
|
||||||
SQL_SCRIPTS='CDB_QueryTables CDB_CartodbfyTable CDB_TableMetadata CDB_ForeignTable CDB_UserTables CDB_ColumnNames CDB_ZoomFromScale CDB_Overviews CDB_QuantileBins CDB_JenksBins CDB_HeadsTailsBins CDB_EqualIntervalBins'
|
SQL_SCRIPTS='CDB_QueryTables CDB_CartodbfyTable CDB_TableMetadata CDB_ForeignTable CDB_UserTables CDB_ColumnNames CDB_ZoomFromScale CDB_Overviews CDB_QuantileBins CDB_JenksBins CDB_HeadsTailsBins CDB_EqualIntervalBins CDB_Hexagon CDB_XYZ'
|
||||||
for i in ${SQL_SCRIPTS}
|
for i in ${SQL_SCRIPTS}
|
||||||
do
|
do
|
||||||
curl -L -s https://github.com/CartoDB/cartodb-postgresql/raw/master/scripts-available/$i.sql -o sql/$i.sql
|
curl -L -s https://github.com/CartoDB/cartodb-postgresql/raw/master/scripts-available/$i.sql -o sql/$i.sql
|
||||||
|
Loading…
Reference in New Issue
Block a user