Browse Source

Merge branch 'master' into search-bbox

Conflicts:
	package.json
pull/60/head
Harish Krishna 10 years ago
parent
commit
392494d8fb
  1. 9
      EXAMPLES.md
  2. 1
      package.json
  3. 4
      query/indeces.js
  4. 30
      sanitiser/_layers.js
  5. 2
      test/unit/query/indeces.js
  6. 20
      test/unit/sanitiser/suggest.js

9
EXAMPLES.md

@ -0,0 +1,9 @@
#### Search:
- Nearest Museums: http://pelias.mapzen.com/search?lat=51.533&lon=-0.0652&input=museum&size=40
- Nearest Hotels: http://pelias.mapzen.com/search?lat=51.533&lon=-0.0652&input=hotel&size=40
#### Autocomplete:
- Local Neighborhoods: http://pelias.mapzen.com/suggest/nearby?lat=40.7259&lon=-73.9806&input=e&layers=neighborhood&size=40

1
package.json

@ -37,6 +37,7 @@
"geojson": "^0.2.0", "geojson": "^0.2.0",
"geojson-extent": "^0.3.1", "geojson-extent": "^0.3.1",
"geopipes-elasticsearch-backend": "git://github.com/geopipes/elasticsearch-backend#geo_bbox", "geopipes-elasticsearch-backend": "git://github.com/geopipes/elasticsearch-backend#geo_bbox",
"is-object": "^1.0.1",
"pelias-esclient": "0.0.25", "pelias-esclient": "0.0.25",
"toobusy": "^0.2.4" "toobusy": "^0.2.4"
}, },

4
query/indeces.js

@ -8,5 +8,7 @@ module.exports = [
'admin0', 'admin0',
'admin1', 'admin1',
'admin2', 'admin2',
'neighborhood' 'neighborhood',
'osmaddress',
'openaddresses'
]; ];

30
sanitiser/_layers.js

@ -1,4 +1,6 @@
var indeces = require('../query/indeces');
var isObject = require('is-object'),
indeces = require('../query/indeces');
// validate inputs, convert types and apply defaults // validate inputs, convert types and apply defaults
function sanitize( req ){ function sanitize( req ){
@ -7,19 +9,26 @@ function sanitize( req ){
var params= req.query; var params= req.query;
// ensure the input params are a valid object // ensure the input params are a valid object
if( Object.prototype.toString.call( params ) !== '[object Object]' ){ if( !isObject( params ) ){
params = {}; params = {};
} }
// which layers to query // default case (no layers specified in GET params)
if('string' === typeof params.layers && params.layers.length){ if('string' !== typeof params.layers || !params.layers.length){
// @note: 'address' alias disabled by default until feature testing completed
params.layers = 'poi,admin'; // default layers
}
var alias_layers = ['poi', 'admin']; // decide which layers can be queried
var alias_layers = ['poi', 'admin', 'address'];
var alias_indeces = indeces.concat(alias_layers); var alias_indeces = indeces.concat(alias_layers);
// parse GET params
var layers = params.layers.split(',').map( function( layer ){ var layers = params.layers.split(',').map( function( layer ){
return layer.toLowerCase(); // lowercase inputs return layer.toLowerCase(); // lowercase inputs
}); });
// validate layer names
for( var x=0; x<layers.length; x++ ){ for( var x=0; x<layers.length; x++ ){
if( -1 === alias_indeces.indexOf( layers[x] ) ){ if( -1 === alias_indeces.indexOf( layers[x] ) ){
return { return {
@ -28,6 +37,8 @@ function sanitize( req ){
}; };
} }
} }
// expand aliases
var expand_aliases = function(alias, layers, layer_indeces) { var expand_aliases = function(alias, layers, layer_indeces) {
var alias_index = layers.indexOf(alias); var alias_index = layers.indexOf(alias);
if (alias_index !== -1 ) { if (alias_index !== -1 ) {
@ -39,18 +50,15 @@ function sanitize( req ){
layers = expand_aliases('poi', layers, ['geoname','osmnode','osmway']); layers = expand_aliases('poi', layers, ['geoname','osmnode','osmway']);
layers = expand_aliases('admin', layers, ['admin0','admin1','admin2','neighborhood']); layers = expand_aliases('admin', layers, ['admin0','admin1','admin2','neighborhood']);
layers = expand_aliases('address', layers, ['osmaddress','openaddresses']);
// de-dup // de-dupe
layers = layers.filter(function(item, pos) { layers = layers.filter(function(item, pos) {
return layers.indexOf(item) === pos; return layers.indexOf(item) === pos;
}); });
// pass validated params to next middleware
clean.layers = layers; clean.layers = layers;
}
else {
clean.layers = indeces; // default (all layers)
}
req.clean = clean; req.clean = clean;
return { 'error': false }; return { 'error': false };

2
test/unit/query/indeces.js

@ -6,7 +6,7 @@ module.exports.tests = {};
module.exports.tests.interface = function(test, common) { module.exports.tests.interface = function(test, common) {
test('valid interface', function(t) { test('valid interface', function(t) {
t.true(Array.isArray(indeces), 'valid array'); t.true(Array.isArray(indeces), 'valid array');
t.equal(indeces.length, 7, 'valid array'); t.equal(indeces.length, 9, 'valid array');
t.end(); t.end();
}); });
}; };

20
test/unit/sanitiser/suggest.js

@ -220,8 +220,9 @@ module.exports.tests.sanitize_layers = function(test, common) {
}); });
test('invalid layer', function(t) { test('invalid layer', function(t) {
sanitize({ layers: 'test_layer', input: 'test', lat: 0, lon: 0 }, function( err, clean ){ sanitize({ layers: 'test_layer', input: 'test', lat: 0, lon: 0 }, function( err, clean ){
var msg = 'invalid param \'layer\': must be one or more of geoname,osmnode,osmway,admin0,admin1,admin2,neighborhood,poi,admin'; var msg = 'invalid param \'layer\': must be one or more of ';
t.equal(err, msg, 'invalid layer requested'); t.true(err.match(msg), 'invalid layer requested');
t.true(err.length > msg.length, 'invalid error message');
t.end(); t.end();
}); });
}); });
@ -239,6 +240,13 @@ module.exports.tests.sanitize_layers = function(test, common) {
t.end(); t.end();
}); });
}); });
test('address (alias) layer', function(t) {
var address_layers = ['osmaddress','openaddresses'];
sanitize({ layers: 'address', input: 'test', lat: 0, lon: 0 }, function( err, clean ){
t.deepEqual(clean.layers, address_layers, 'address layers set');
t.end();
});
});
test('poi alias layer plus regular layers', function(t) { test('poi alias layer plus regular layers', function(t) {
var poi_layers = ['geoname','osmnode','osmway']; var poi_layers = ['geoname','osmnode','osmway'];
var reg_layers = ['admin0', 'admin1']; var reg_layers = ['admin0', 'admin1'];
@ -255,6 +263,14 @@ module.exports.tests.sanitize_layers = function(test, common) {
t.end(); t.end();
}); });
}); });
test('address alias layer plus regular layers', function(t) {
var address_layers = ['osmaddress','openaddresses'];
var reg_layers = ['geoname', 'osmway'];
sanitize({ layers: 'address,geoname,osmway', input: 'test', lat: 0, lon: 0 }, function( err, clean ){
t.deepEqual(clean.layers, reg_layers.concat(address_layers), 'address + regular layers set');
t.end();
});
});
test('alias layer plus regular layers (no duplicates)', function(t) { test('alias layer plus regular layers (no duplicates)', function(t) {
var poi_layers = ['geoname','osmnode','osmway']; var poi_layers = ['geoname','osmnode','osmway'];
sanitize({ layers: 'poi,geoname,osmnode', input: 'test', lat: 0, lon: 0 }, function( err, clean ){ sanitize({ layers: 'poi,geoname,osmnode', input: 'test', lat: 0, lon: 0 }, function( err, clean ){

Loading…
Cancel
Save