diff --git a/lib/server.js b/lib/server.js index 0eb17eb73..752dc8c43 100644 --- a/lib/server.js +++ b/lib/server.js @@ -86,8 +86,8 @@ module.exports = function(opts){ function preTileRender(err) { if (err) throw err; + if(!req.params.sql) throw new Error("SQL is required after parameter parsing"); if(!req.params.style) delete req.params.style - if(!req.params.sql) delete req.params.sql _.defaults(req.params, app.getDefaults(req.params)); @@ -169,7 +169,7 @@ module.exports = function(opts){ layers.forEach(function(layer, i){ params.ids.push(layer.id); - params.sql.push("("+layer.sql+") as " + layer.id + "_subquery"); + params.sql.push(app.wrapSql(layer.sql, layer.id)); params.style.push(layer.style); params.interactivity.push(layer.interactivity); if(typeof params.layer === 'undefined' && layer.interactivity) { // The first valid interactivity is the layer @@ -177,6 +177,15 @@ module.exports = function(opts){ } }); } + + app.wrapSql = function(sql, layerId) { + var preWrapped = /\(.*?\)\s+(as )?\w+$/.test(sql) + if(!preWrapped) { + sql = "("+sql+") as " + layerId + "_subquery"; + } + + return sql; + } app.getDefaults = function(params) { var params = params || {}; @@ -191,15 +200,11 @@ module.exports = function(opts){ '#<%= id %>[mapnik-geometry-type=1] ' + def_style_point + '#<%= id %>[mapnik-geometry-type=2] ' + def_style_line + '#<%= id %>[mapnik-geometry-type=3] ' + def_style_poly); - - // If table parameter exists, use it as default sql - var default_sql = _.template("SELECT * FROM <%= table %>"); return { dbtype: options[params.mapKey].dbtype, id: params.id, style: default_style(params), - sql: default_sql(params), format: 'png', geom_type: 'polygon', interactivity: null diff --git a/package.json b/package.json index a8e2286b7..5162a435d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "windwalker", - "version": "0.1.1", + "version": "0.1.2", "main": "./lib/index.js", "description": "A Node.js based map tile server using Mapnik", "url": "https://github.com/BHare1985/Windwalker", diff --git a/test/support/server_options.js b/test/support/server_options.js index ae15d1ccc..fb30286c7 100644 --- a/test/support/server_options.js +++ b/test/support/server_options.js @@ -16,9 +16,12 @@ module.exports = function(opts) { // no default interactivity. to enable specify the database column you'd like to interact with req.params.interactivity = null; + req.params.sql = "SELECT * FROM "+req.params.table; + // this is in case you want to test sql parameters eg ...png?sql=select * from my_table limit 10 req.params = _.extend({}, req.params); _.extend(req.params, req.query); + // send the finished req object on callback(null,req);