Browse Source

Adding support for unit field in structured search. If libpostal finds it in input use it for searching

pull/1127/head
semhul 7 years ago
parent
commit
a0aa5ed7f2
  1. 33
      controller/structured_libpostal.js
  2. 49
      test/unit/controller/structured_libpostal.js

33
controller/structured_libpostal.js

@ -3,19 +3,20 @@ const Debug = require('../helper/debug');
const debugLog = new Debug('controller:libpostal'); const debugLog = new Debug('controller:libpostal');
const logger = require('pelias-logger').get('api'); const logger = require('pelias-logger').get('api');
// if there's a house_number in the libpostal response, return it // Find field in libpostal response
// otherwise return the postcode field (which may be undefined) function findField(response, field, replacementField) {
function findHouseNumberField(response) { const libpostalField = response.find(f => f.label === field);
const house_number_field = response.find(f => f.label === 'house_number');
if (libpostalField) {
if (house_number_field) { return libpostalField;
return house_number_field; } else if(replacementField) {
return response.find(f => f.label === replacementField);
} else {
return;
} }
return response.find(f => f.label === 'postcode');
} }
function setup(libpostalService, should_execute) { function setup(libpostalService, should_execute) {
function controller( req, res, next ){ function controller( req, res, next ){
// bail early if req/res don't pass conditions for execution // bail early if req/res don't pass conditions for execution
@ -35,7 +36,9 @@ function setup(libpostalService, should_execute) {
// libpostal parses some inputs, like `3370 cobbe ave`, as a postcode+street // libpostal parses some inputs, like `3370 cobbe ave`, as a postcode+street
// so because we're treating the entire field as a street address, it's safe // so because we're treating the entire field as a street address, it's safe
// to assume that an identified postcode is actually a house number. // to assume that an identified postcode is actually a house number.
const house_number_field = findHouseNumberField(response); // if there's a house_number in the libpostal response, return it
// otherwise return the postcode field (which may be undefined)
const house_number_field = findField(response, 'house_number', 'postcode');
// if we're fairly certain that libpostal identified a house number // if we're fairly certain that libpostal identified a house number
// (from either the house_number or postcode field), place it into the // (from either the house_number or postcode field), place it into the
@ -48,6 +51,14 @@ function setup(libpostalService, should_execute) {
// remove the first instance of the number and trim whitespace // remove the first instance of the number and trim whitespace
req.clean.parsed_text.street = _.trim(_.replace(req.clean.parsed_text.address, req.clean.parsed_text.number, '')); req.clean.parsed_text.street = _.trim(_.replace(req.clean.parsed_text.address, req.clean.parsed_text.number, ''));
// If libpostal have parsed unit then add it for search
const unit_field = findField(response, 'unit');
if(unit_field) {
req.clean.parsed_text.unit = unit_field.value;
// Removing unit from street and trim
req.clean.parsed_text.street = _.trim(_.replace(req.clean.parsed_text.street, req.clean.parsed_text.unit, ''));
}
} else { } else {
// otherwise no house number was identifiable, so treat the entire input // otherwise no house number was identifiable, so treat the entire input
// as a street // as a street

49
test/unit/controller/structured_libpostal.js

@ -291,6 +291,55 @@ module.exports.tests.success_conditions = (test, common) => {
}); });
test('service returning house_number and unit should set req.clean.parsed_text.unit', t => {
const service = (req, callback) => {
const response = [
{
label: 'road',
value: 'the street'
},
{
label: 'house_number',
value: '22'
},
{
label: 'unit',
value: '1 th'
}
];
callback(null, response);
};
const controller = libpostal(service, () => true);
const req = {
clean: {
parsed_text: {
address: 'the street 22 1 th'
}
},
errors: []
};
controller(req, undefined, () => {
t.deepEquals(req, {
clean: {
parsed_text: {
street: 'the street',
number: '22',
unit: '1 th'
}
},
errors: []
}, 'req should have been modified');
t.end();
});
});
// test('service returning valid response should convert and append', t => { // test('service returning valid response should convert and append', t => {
// const service = (req, callback) => { // const service = (req, callback) => {
// const response = [ // const response = [

Loading…
Cancel
Save