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.
 
 

99 lines
2.7 KiB

var logger = require('pelias-logger').get('api');
var _ = require('lodash');
// all the address parsing logic
function addParsedVariablesToQueryVariables( parsed_text, vs ){
// ==== add parsed matches [address components] ====
// query - Mexitaly, Sunoco, Lowes
if ( ! _.isEmpty(parsed_text.query) ) {
vs.var('input:query', parsed_text.query);
}
// categories - restaurants, hotels, bars
if ( ! _.isEmpty(parsed_text.category) ) {
vs.var('input:category', parsed_text.category);
}
if ( ! _.isEmpty(parsed_text.address) ) {
vs.var( 'input:address', parsed_text.address );
}
// house number
if( ! _.isEmpty(parsed_text.number) ){
vs.var( 'input:housenumber', parsed_text.number );
}
// street name
if( ! _.isEmpty(parsed_text.street) ){
vs.var( 'input:street', parsed_text.street );
}
// neighbourhood
if ( ! _.isEmpty(parsed_text.neighbourhood) ) {
vs.var( 'input:neighbourhood', parsed_text.neighbourhood);
}
// borough
if ( ! _.isEmpty(parsed_text.borough) ) {
vs.var( 'input:borough', parsed_text.borough);
}
// postal code
if( ! _.isEmpty(parsed_text.postalcode) ){
vs.var( 'input:postcode', parsed_text.postalcode );
}
// ==== add parsed matches [admin components] ====
// city
if( ! _.isEmpty(parsed_text.city) ){
vs.var( 'input:locality', parsed_text.city );
}
// county
if( ! _.isEmpty(parsed_text.county) ){
vs.var( 'input:county', parsed_text.county );
}
// state
if( ! _.isEmpty(parsed_text.state) ){
vs.var( 'input:region', parsed_text.state );
}
// country
if( ! _.isEmpty(parsed_text.country) ){
vs.var( 'input:country', parsed_text.country );
}
// libpostal sometimes parses addresses with prefix house numbers in places where
// the house number is normally postfix incorrectly, for instance:
// ```> 1 Grolmanstraße, Berlin, Germany
//
// Result:
//
// {
// "house": "1",
// "road": "grolmanstrasse",
// "state": "berlin",
// "country": "germany"
// }```
//
// In libpostal parlance, `house` is just a query term, not the house number.
// This special case moves the query term to the house number field if there's a street,
// there's no house number, and the query is parseable as an integer, then use the
// query as the house number and blank out the query.
if (shouldSetQueryIntoHouseNumber(vs)) {
vs.var( 'input:housenumber', vs.var('input:query').toString());
vs.unset( 'input:query' );
}
}
function shouldSetQueryIntoHouseNumber(vs) {
return !vs.isset('input:housenumber') &&
vs.isset('input:street') &&
/^[0-9]+$/.test(vs.var('input:query').toString());
}
module.exports = addParsedVariablesToQueryVariables;