mirror of https://github.com/pelias/api.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.6 KiB
86 lines
2.6 KiB
|
|
var parser = require('addressit'); |
|
var extend = require('extend'); |
|
var type_mapping = require('../helper/type_mapping'); |
|
var check = require('check-types'); |
|
var logger = require('pelias-logger').get('api'); |
|
|
|
var DELIM = ','; |
|
|
|
/* |
|
* For performance, and to prefer POI and admin records, express a preference |
|
* to only search coarse layers on very short text inputs. |
|
*/ |
|
module.exports.get_layers = function get_layers(query) { |
|
if (query.length <= 3 ) { |
|
// no address parsing required |
|
return type_mapping.layer_mapping.coarse; |
|
} |
|
}; |
|
|
|
module.exports.get_parsed_address = function get_parsed_address(query) { |
|
|
|
var getAdminPartsBySplittingOnDelim = function(queryParts) { |
|
// naive approach - for admin matching during query time |
|
// split 'flatiron, new york, ny' into 'flatiron' and 'new york, ny' |
|
|
|
var address = {}; |
|
|
|
if (queryParts.length > 1) { |
|
address.name = queryParts[0].trim(); |
|
|
|
// 1. slice away all parts after the first one |
|
// 2. trim spaces from each part just in case |
|
// 3. join the parts back together with appropriate delimiter and spacing |
|
address.admin_parts = queryParts.slice(1) |
|
.map(function (part) { return part.trim(); }) |
|
.join(DELIM + ' '); |
|
} |
|
|
|
return address; |
|
}; |
|
|
|
var getAddressParts = function(query) { |
|
// perform full address parsing |
|
// except on queries so short they obviously can't contain an address |
|
if (query.length > 3) { |
|
return parser( query ); |
|
} |
|
}; |
|
|
|
var queryParts = query.split(DELIM); |
|
|
|
var addressWithAdminParts = getAdminPartsBySplittingOnDelim(queryParts); |
|
var addressWithAddressParts= getAddressParts(queryParts.join(DELIM + ' ')); |
|
|
|
var parsedAddress = extend(addressWithAdminParts, |
|
addressWithAddressParts); |
|
|
|
var address_parts = [ 'name', |
|
'number', |
|
'street', |
|
'city', |
|
'state', |
|
'country', |
|
'postalcode', |
|
'regions', |
|
'admin_parts' |
|
]; |
|
|
|
var parsed_text = {}; |
|
|
|
address_parts.forEach(function(part){ |
|
if (parsedAddress[part]) { |
|
parsed_text[part] = parsedAddress[part]; |
|
} |
|
}); |
|
|
|
// if all we found was regions, ignore it as it is not enough information to make smarter decisions |
|
if (Object.keys(parsed_text).length === 1 && !check.undefined(parsed_text.regions)) |
|
{ |
|
logger.info('Ignoring address parser output, regions only'); |
|
return null; |
|
} |
|
|
|
return parsed_text; |
|
};
|
|
|