Browse Source

Merge pull request #122 from pelias/doc-details

Add categories and address properties to result doc
pull/131/head
Diana Shkolnikov 10 years ago
parent
commit
289cb1ba37
  1. 67
      helper/geojsonify.js
  2. 5
      sanitiser/reverse.js
  3. 23
      test/unit/helper/geojsonify.js
  4. 4
      test/unit/sanitiser/reverse.js

67
helper/geojsonify.js

@ -3,23 +3,33 @@ var GeoJSON = require('geojson'),
extent = require('geojson-extent'), extent = require('geojson-extent'),
outputGenerator = require('./outputGenerator'); outputGenerator = require('./outputGenerator');
function search( docs, params ){ // Properties to be copied when details=true
var DETAILS_PROPS = [
'alpha3',
'admin0',
'admin1',
'admin1_abbr',
'admin2',
'local_admin',
'locality',
'neighborhood',
'category',
'address'
];
// emit a warning if the doc format is invalid
// @note: if you see this error, fix it ASAP! function search( docs, params ){
function warning(){
console.error( 'error: invalid doc', __filename );
return false; // remove offending doc from results
}
var details = params ? params.details : {}; var details = params ? params.details : {};
details = details === true || details === 1; details = details === true || details === 1;
// flatten & expand data for geojson conversion // flatten & expand data for geojson conversion
var geodata = docs.map( function( doc ){ var geodata = docs.map( function( doc ) {
// something went very wrong // something went very wrong
if( !doc ) { return warning(); } if( !doc || !doc.hasOwnProperty( 'center_point' ) ) {
return warning();
}
var output = {}; var output = {};
@ -28,7 +38,6 @@ function search( docs, params ){
output.layer = doc._type; output.layer = doc._type;
// map center_point // map center_point
if( !doc.center_point ) { return warning(); }
output.lat = parseFloat( doc.center_point.lat ); output.lat = parseFloat( doc.center_point.lat );
output.lng = parseFloat( doc.center_point.lon ); output.lng = parseFloat( doc.center_point.lon );
@ -37,15 +46,7 @@ function search( docs, params ){
if( !doc.name || !doc.name.default ) { return warning(); } if( !doc.name || !doc.name.default ) { return warning(); }
output.name = doc.name.default; output.name = doc.name.default;
// map admin values copyProperties( doc, DETAILS_PROPS, output );
if( doc.alpha3 ){ output.alpha3 = doc.alpha3; }
if( doc.admin0 ){ output.admin0 = doc.admin0; }
if( doc.admin1 ){ output.admin1 = doc.admin1; }
if( doc.admin1_abbr ){ output.admin1_abbr = doc.admin1_abbr; }
if( doc.admin2 ){ output.admin2 = doc.admin2; }
if( doc.local_admin ){ output.local_admin = doc.local_admin; }
if( doc.locality ){ output.locality = doc.locality; }
if( doc.neighborhood ){ output.neighborhood = doc.neighborhood; }
} }
// generate region-specific text string // generate region-specific text string
@ -77,4 +78,32 @@ function search( docs, params ){
return geojson; return geojson;
} }
/**
* Copy specified properties from source to dest.
* Ignore missing properties.
*
* @param {object} source
* @param {[]} props
* @param {object} dest
*/
function copyProperties( source, props, dest ) {
props.forEach( function ( prop ) {
if ( source.hasOwnProperty( prop ) ) {
dest[prop] = source[prop];
}
});
}
/**
* emit a warning if the doc format is invalid
*
* @note: if you see this error, fix it ASAP!
*/
function warning( doc ) {
console.error( 'error: invalid doc', __filename, doc );
return false; // remove offending doc from results
}
module.exports.search = search; module.exports.search = search;

5
sanitiser/reverse.js

@ -7,10 +7,7 @@ var _sanitize = require('../sanitiser/_sanitize'),
}, },
layers: require('../sanitiser/_layers'), layers: require('../sanitiser/_layers'),
details: require('../sanitiser/_details'), details: require('../sanitiser/_details'),
size: function( req ) { size: require('../sanitiser/_size'),
var size = require('../sanitiser/_size');
return size(req, 1);
},
categories: function ( req ) { categories: function ( req ) {
var categories = require('../sanitiser/_categories'); var categories = require('../sanitiser/_categories');
return categories(req); return categories(req);

23
test/unit/helper/geojsonify.js

@ -67,7 +67,11 @@ module.exports.tests.search = function(test, common) {
'\'round midnight jazz and blues bar' '\'round midnight jazz and blues bar'
], ],
'output': 'osmnode:2208150035' 'output': 'osmnode:2208150035'
} },
'category': [
'food',
'nightlife'
]
}, },
{ {
'_id': 'id2', '_id': 'id2',
@ -119,7 +123,11 @@ module.exports.tests.search = function(test, common) {
'empire state building' 'empire state building'
], ],
'output': 'osmway:34633854' 'output': 'osmway:34633854'
} },
'category': [
'tourism',
'transport'
]
} }
]; ];
@ -148,7 +156,13 @@ module.exports.tests.search = function(test, common) {
'admin2': 'Angel', 'admin2': 'Angel',
'local_admin': 'test1', 'local_admin': 'test1',
'locality': 'test2', 'locality': 'test2',
'neighborhood': 'test3' 'neighborhood': 'test3',
'category': [ 'food', 'nightlife' ],
'address': {
'number': '13',
'street': 'Liverpool Road',
'zip': 'N1 0RW'
}
} }
}, },
{ {
@ -196,7 +210,8 @@ module.exports.tests.search = function(test, common) {
'admin2': 'New York', 'admin2': 'New York',
'local_admin': 'Manhattan', 'local_admin': 'Manhattan',
'locality': 'New York', 'locality': 'New York',
'neighborhood': 'Koreatown' 'neighborhood': 'Koreatown',
'category': [ 'tourism', 'transport' ]
} }
} }
] ]

4
test/unit/sanitiser/reverse.js

@ -8,7 +8,7 @@ var suggest = require('../../../sanitiser/reverse'),
layers: [ 'geoname', 'osmnode', 'osmway', 'admin0', 'admin1', 'admin2', 'neighborhood', layers: [ 'geoname', 'osmnode', 'osmway', 'admin0', 'admin1', 'admin2', 'neighborhood',
'locality', 'local_admin', 'osmaddress', 'openaddresses' ], 'locality', 'local_admin', 'osmaddress', 'openaddresses' ],
lon: 0, lon: 0,
size: 1, size: 10,
details: true, details: true,
categories: [] categories: []
}, },
@ -108,7 +108,7 @@ module.exports.tests.sanitize_lon = function(test, common) {
module.exports.tests.sanitize_size = function(test, common) { module.exports.tests.sanitize_size = function(test, common) {
test('invalid size value', function(t) { test('invalid size value', function(t) {
sanitize({ size: 'a', input: 'test', lat: 0, lon: 0 }, function( err, clean ){ sanitize({ size: 'a', input: 'test', lat: 0, lon: 0 }, function( err, clean ){
t.equal(clean.size, 1, 'default size set'); t.equal(clean.size, 10, 'default size set');
t.end(); t.end();
}); });
}); });

Loading…
Cancel
Save