mirror of https://github.com/pelias/api.git
Stephen Hess
8 years ago
3 changed files with 823 additions and 0 deletions
@ -0,0 +1,179 @@ |
|||||||
|
const peliasQuery = require('pelias-query'); |
||||||
|
const defaults = require('./search_defaults'); |
||||||
|
const logger = require('pelias-logger').get('api'); |
||||||
|
const _ = require('lodash'); |
||||||
|
const check = require('check-types'); |
||||||
|
|
||||||
|
//------------------------------
|
||||||
|
// general-purpose search query
|
||||||
|
//------------------------------
|
||||||
|
const addressUsingIdsQuery = new peliasQuery.layout.AddressesUsingIdsQuery(); |
||||||
|
|
||||||
|
// scoring boost
|
||||||
|
// addressUsingIdsQuery.score( peliasQuery.view.focus_only_function( peliasQuery.view.phrase ) );
|
||||||
|
addressUsingIdsQuery.score( peliasQuery.view.popularity_only_function ); |
||||||
|
addressUsingIdsQuery.score( peliasQuery.view.population_only_function ); |
||||||
|
// --------------------------------
|
||||||
|
|
||||||
|
// non-scoring hard filters
|
||||||
|
addressUsingIdsQuery.filter( peliasQuery.view.boundary_country ); |
||||||
|
addressUsingIdsQuery.filter( peliasQuery.view.boundary_circle ); |
||||||
|
addressUsingIdsQuery.filter( peliasQuery.view.boundary_rect ); |
||||||
|
addressUsingIdsQuery.filter( peliasQuery.view.sources ); |
||||||
|
// --------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// Red Lion, PA -- parsed as locality/state, localadmin/state, and neighbourhood/state
|
||||||
|
// Chelsea -- parsed as neighbourhood, localadmin, and locality
|
||||||
|
// Manhattan -- parsed as borough, locality, and localadmin
|
||||||
|
// Luxembourg -- parsed as country, locality, and region
|
||||||
|
|
||||||
|
// if any placeholder results are at neighbourhood, borough, locality, or localadmin layers, filter by those ids at those layers
|
||||||
|
// fallback to county
|
||||||
|
// if any placeholder results are at county or macrocounty layers, filter by those ids at those layers
|
||||||
|
// fallback to region
|
||||||
|
// if any placeholder results are at region or macroregion layers, filter by those ids at those layers
|
||||||
|
// fallback to dependency/country
|
||||||
|
// if any placeholder results are at dependency or country layers, filter by those ids at those layers
|
||||||
|
|
||||||
|
|
||||||
|
// address in Red Lion, PA -- find results at layer=address
|
||||||
|
// neighbourhood_id in [85844063, 85844067]
|
||||||
|
// locality_id in [101717221]
|
||||||
|
// localadmin_id in [404487867]
|
||||||
|
// search all of the above
|
||||||
|
|
||||||
|
// address in Chelsea
|
||||||
|
// neighbourhood_id in [85786511, 85810589, 85769021, 85890029, 85810579, 85810591, 85810575, 85772883, 420514219]
|
||||||
|
// locality_id in [85950359, 85914491, 101932747, 85951865, 101715289, 85943049, 101733697, 101722101, 101738587]
|
||||||
|
// localadmin_id in [404476575, 404508239, 404474971, 404527169, 404494675, 404503811, 404519887, 404488679, 404538119]
|
||||||
|
|
||||||
|
// address in Manhattan
|
||||||
|
// neighbourhood_id in []
|
||||||
|
// borough_id in [421205771]
|
||||||
|
// locality_id in [85945171, 85940551, 85972655]
|
||||||
|
// localadmin_id in [404502889, 404499147, 404502891, 85972655]
|
||||||
|
// search all of the above
|
||||||
|
|
||||||
|
// address in Luxembourg
|
||||||
|
// country_id in [85633275]
|
||||||
|
// region_id in [85681727, 85673875]
|
||||||
|
// locality_id in [101751765]
|
||||||
|
// search locality first, then region perhaps
|
||||||
|
|
||||||
|
|
||||||
|
// if there are locality/localadmin layers, return ['locality', 'localadmin']
|
||||||
|
// if there are region/macroregion layers, return ['region', 'macroregion']
|
||||||
|
|
||||||
|
const granularity_bands = [ |
||||||
|
['neighbourhood', 'borough', 'locality', 'localadmin'], |
||||||
|
['county', 'macrocounty'], |
||||||
|
['region', 'macroregion'], |
||||||
|
['dependency', 'country'] |
||||||
|
]; |
||||||
|
|
||||||
|
function anyResultsAtGranularityBand(results, band) { |
||||||
|
return results.some((result) => { return _.includes(band, result.layer); }); |
||||||
|
} |
||||||
|
|
||||||
|
function getIdsAtLayer(results, layer) { |
||||||
|
return results.filter((result) => { return result.layer === layer; }).map(_.property('source_id')); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
map request variables to query variables for all inputs |
||||||
|
provided by this HTTP request. |
||||||
|
**/ |
||||||
|
function generateQuery( clean, res ){ |
||||||
|
const vs = new peliasQuery.Vars( defaults ); |
||||||
|
const results = _.defaultTo(res.data, []); |
||||||
|
|
||||||
|
const logParts = ['query:address_search_using_ids', 'parser:libpostal']; |
||||||
|
|
||||||
|
// sources
|
||||||
|
if( !_.isEmpty(clean.sources) ) { |
||||||
|
vs.var( 'sources', clean.sources); |
||||||
|
logParts.push('param:sources'); |
||||||
|
} |
||||||
|
|
||||||
|
// size
|
||||||
|
if( clean.querySize ) { |
||||||
|
vs.var( 'size', clean.querySize ); |
||||||
|
logParts.push('param:querySize'); |
||||||
|
} |
||||||
|
|
||||||
|
if( ! _.isEmpty(clean.parsed_text.number) ){ |
||||||
|
vs.var( 'input:housenumber', clean.parsed_text.number ); |
||||||
|
} |
||||||
|
vs.var( 'input:street', clean.parsed_text.street ); |
||||||
|
|
||||||
|
const granularity_band = granularity_bands.find((band) => { |
||||||
|
return anyResultsAtGranularityBand(results, band); |
||||||
|
}); |
||||||
|
|
||||||
|
if (granularity_band) { |
||||||
|
const layers_to_ids = granularity_band.reduce((acc, layer) => { |
||||||
|
acc[layer] = getIdsAtLayer(res.data, layer); |
||||||
|
return acc; |
||||||
|
}, {}); |
||||||
|
|
||||||
|
vs.var('input:layers', JSON.stringify(layers_to_ids)); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
// focus point
|
||||||
|
if( check.number(clean['focus.point.lat']) && |
||||||
|
check.number(clean['focus.point.lon']) ){ |
||||||
|
vs.set({ |
||||||
|
'focus:point:lat': clean['focus.point.lat'], |
||||||
|
'focus:point:lon': clean['focus.point.lon'] |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
// boundary rect
|
||||||
|
if( check.number(clean['boundary.rect.min_lat']) && |
||||||
|
check.number(clean['boundary.rect.max_lat']) && |
||||||
|
check.number(clean['boundary.rect.min_lon']) && |
||||||
|
check.number(clean['boundary.rect.max_lon']) ){ |
||||||
|
vs.set({ |
||||||
|
'boundary:rect:top': clean['boundary.rect.max_lat'], |
||||||
|
'boundary:rect:right': clean['boundary.rect.max_lon'], |
||||||
|
'boundary:rect:bottom': clean['boundary.rect.min_lat'], |
||||||
|
'boundary:rect:left': clean['boundary.rect.min_lon'] |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
// boundary circle
|
||||||
|
// @todo: change these to the correct request variable names
|
||||||
|
if( check.number(clean['boundary.circle.lat']) && |
||||||
|
check.number(clean['boundary.circle.lon']) ){ |
||||||
|
vs.set({ |
||||||
|
'boundary:circle:lat': clean['boundary.circle.lat'], |
||||||
|
'boundary:circle:lon': clean['boundary.circle.lon'] |
||||||
|
}); |
||||||
|
|
||||||
|
if( check.number(clean['boundary.circle.radius']) ){ |
||||||
|
vs.set({ |
||||||
|
'boundary:circle:radius': Math.round( clean['boundary.circle.radius'] ) + 'km' |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// boundary country
|
||||||
|
if( check.string(clean['boundary.country']) ){ |
||||||
|
vs.set({ |
||||||
|
'boundary:country': clean['boundary.country'] |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
// format the log parts into a single coherent string
|
||||||
|
logger.info(logParts.map((part) => { return `[${part}]`;} ).join(' ') ); |
||||||
|
|
||||||
|
return { |
||||||
|
type: 'fallback_using_ids', |
||||||
|
body: addressUsingIdsQuery.render(vs) |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
module.exports = generateQuery; |
@ -0,0 +1,27 @@ |
|||||||
|
'use strict'; |
||||||
|
|
||||||
|
module.exports = class MockQuery { |
||||||
|
constructor() { |
||||||
|
this._score_functions = []; |
||||||
|
this._filter_functions = []; |
||||||
|
} |
||||||
|
|
||||||
|
render(vs) { |
||||||
|
return { |
||||||
|
vs: vs, |
||||||
|
score_functions: this._score_functions, |
||||||
|
filter_functions: this._filter_functions |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
score(view) { |
||||||
|
this._score_functions.push(view); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
filter(view) { |
||||||
|
this._filter_functions.push(view); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
}; |
@ -0,0 +1,617 @@ |
|||||||
|
const generateQuery = require('../../../query/address_search_using_ids'); |
||||||
|
const _ = require('lodash'); |
||||||
|
const proxyquire = require('proxyquire').noCallThru(); |
||||||
|
const mock_logger = require('pelias-mock-logger'); |
||||||
|
const MockQuery = require('./MockQuery'); |
||||||
|
|
||||||
|
module.exports.tests = {}; |
||||||
|
|
||||||
|
module.exports.tests.interface = (test, common) => { |
||||||
|
test('valid interface', (t) => { |
||||||
|
t.ok(_.isFunction(generateQuery)); |
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
// helper for canned views
|
||||||
|
const views = { |
||||||
|
popularity_only_function: 'popularity_only_function view', |
||||||
|
population_only_function: 'population_only_function view', |
||||||
|
boundary_country: 'boundary_country view', |
||||||
|
boundary_circle: 'boundary_circle view', |
||||||
|
boundary_rect: 'boundary_rect view', |
||||||
|
sources: 'sources view' |
||||||
|
}; |
||||||
|
|
||||||
|
module.exports.tests.base_query = (test, common) => { |
||||||
|
test('basic', (t) => { |
||||||
|
const logger = mock_logger(); |
||||||
|
|
||||||
|
const clean = { |
||||||
|
parsed_text: { |
||||||
|
number: 'housenumber value', |
||||||
|
street: 'street value' |
||||||
|
} |
||||||
|
}; |
||||||
|
const res = { |
||||||
|
data: [] |
||||||
|
}; |
||||||
|
|
||||||
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', { |
||||||
|
'pelias-logger': logger, |
||||||
|
'pelias-query': { |
||||||
|
layout: { |
||||||
|
AddressesUsingIdsQuery: MockQuery |
||||||
|
}, |
||||||
|
view: views, |
||||||
|
Vars: require('pelias-query').Vars |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
const generatedQuery = generateQuery(clean, res); |
||||||
|
|
||||||
|
t.equals(generatedQuery.type, 'fallback_using_ids'); |
||||||
|
|
||||||
|
t.equals(generatedQuery.body.vs.var('input:housenumber').toString(), 'housenumber value'); |
||||||
|
t.equals(generatedQuery.body.vs.var('input:street').toString(), 'street value'); |
||||||
|
t.notOk(generatedQuery.body.vs.isset('sources')); |
||||||
|
t.equals(generatedQuery.body.vs.var('size').toString(), 20); |
||||||
|
|
||||||
|
t.deepEquals(generatedQuery.body.score_functions, [ |
||||||
|
'popularity_only_function view', |
||||||
|
'population_only_function view' |
||||||
|
]); |
||||||
|
|
||||||
|
t.deepEquals(generatedQuery.body.filter_functions, [ |
||||||
|
'boundary_country view', |
||||||
|
'boundary_circle view', |
||||||
|
'boundary_rect view', |
||||||
|
'sources view' |
||||||
|
]); |
||||||
|
|
||||||
|
t.deepEquals(logger.getInfoMessages(), ['[query:address_search_using_ids] [parser:libpostal]']); |
||||||
|
t.end(); |
||||||
|
|
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
module.exports.tests.other_parameters = (test, common) => { |
||||||
|
test('explicit size set', (t) => { |
||||||
|
const logger = mock_logger(); |
||||||
|
|
||||||
|
const clean = { |
||||||
|
parsed_text: { |
||||||
|
number: 'housenumber value', |
||||||
|
street: 'street value' |
||||||
|
}, |
||||||
|
querySize: 'querySize value' |
||||||
|
}; |
||||||
|
const res = { |
||||||
|
data: [] |
||||||
|
}; |
||||||
|
|
||||||
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', { |
||||||
|
'pelias-logger': logger, |
||||||
|
'pelias-query': { |
||||||
|
layout: { |
||||||
|
AddressesUsingIdsQuery: MockQuery |
||||||
|
}, |
||||||
|
view: views, |
||||||
|
Vars: require('pelias-query').Vars |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
const generatedQuery = generateQuery(clean, res); |
||||||
|
|
||||||
|
t.equals(generatedQuery.body.vs.var('size').toString(), 'querySize value'); |
||||||
|
t.deepEquals(logger.getInfoMessages(), ['[query:address_search_using_ids] [parser:libpostal] [param:querySize]']); |
||||||
|
t.end(); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
test('explicit sources set', (t) => { |
||||||
|
const logger = mock_logger(); |
||||||
|
|
||||||
|
const clean = { |
||||||
|
parsed_text: { |
||||||
|
number: 'housenumber value', |
||||||
|
street: 'street value' |
||||||
|
}, |
||||||
|
sources: ['source 1', 'source 2'] |
||||||
|
}; |
||||||
|
const res = { |
||||||
|
data: [] |
||||||
|
}; |
||||||
|
|
||||||
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', { |
||||||
|
'pelias-logger': logger, |
||||||
|
'pelias-query': { |
||||||
|
layout: { |
||||||
|
AddressesUsingIdsQuery: MockQuery |
||||||
|
}, |
||||||
|
view: views, |
||||||
|
Vars: require('pelias-query').Vars |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
const generatedQuery = generateQuery(clean, res); |
||||||
|
|
||||||
|
t.deepEquals(generatedQuery.body.vs.var('sources').toString(), ['source 1', 'source 2']); |
||||||
|
t.deepEquals(logger.getInfoMessages(), ['[query:address_search_using_ids] [parser:libpostal] [param:sources]']); |
||||||
|
t.end(); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
module.exports.tests.granularity_bands = (test, common) => { |
||||||
|
test('neighbourhood/borough/locality/localadmin granularity band', (t) => { |
||||||
|
const logger = mock_logger(); |
||||||
|
|
||||||
|
const clean = { |
||||||
|
parsed_text: { |
||||||
|
number: 'housenumber value', |
||||||
|
street: 'street value' |
||||||
|
} |
||||||
|
}; |
||||||
|
const res = { |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
layer: 'neighbourhood', |
||||||
|
source_id: 1 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'borough', |
||||||
|
source_id: 2 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'locality', |
||||||
|
source_id: 3 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'localadmin', |
||||||
|
source_id: 4 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'county', |
||||||
|
source_id: 5 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'neighbourhood', |
||||||
|
source_id: 6 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'borough', |
||||||
|
source_id: 7 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'locality', |
||||||
|
source_id: 8 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'localadmin', |
||||||
|
source_id: 9 |
||||||
|
} |
||||||
|
] |
||||||
|
}; |
||||||
|
|
||||||
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', { |
||||||
|
'pelias-logger': logger, |
||||||
|
'pelias-query': { |
||||||
|
layout: { |
||||||
|
AddressesUsingIdsQuery: MockQuery |
||||||
|
}, |
||||||
|
view: views, |
||||||
|
Vars: require('pelias-query').Vars |
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
const generatedQuery = generateQuery(clean, res); |
||||||
|
|
||||||
|
t.deepEquals(JSON.parse(generatedQuery.body.vs.var('input:layers')), { |
||||||
|
neighbourhood: [1, 6], |
||||||
|
borough: [2, 7], |
||||||
|
locality: [3, 8], |
||||||
|
localadmin: [4, 9] |
||||||
|
}); |
||||||
|
|
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
test('only band members with ids should be passed', (t) => { |
||||||
|
const logger = mock_logger(); |
||||||
|
|
||||||
|
const clean = { |
||||||
|
parsed_text: { |
||||||
|
number: 'housenumber value', |
||||||
|
street: 'street value' |
||||||
|
} |
||||||
|
}; |
||||||
|
const res = { |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
layer: 'neighbourhood', |
||||||
|
source_id: 1 |
||||||
|
} |
||||||
|
] |
||||||
|
}; |
||||||
|
|
||||||
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', { |
||||||
|
'pelias-logger': logger, |
||||||
|
'pelias-query': { |
||||||
|
layout: { |
||||||
|
AddressesUsingIdsQuery: MockQuery |
||||||
|
}, |
||||||
|
view: views, |
||||||
|
Vars: require('pelias-query').Vars |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
const generatedQuery = generateQuery(clean, res); |
||||||
|
|
||||||
|
t.deepEquals(JSON.parse(generatedQuery.body.vs.var('input:layers')), { |
||||||
|
neighbourhood: [1], |
||||||
|
borough: [], |
||||||
|
locality: [], |
||||||
|
localadmin: [] |
||||||
|
}); |
||||||
|
|
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
test('county/macrocounty granularity band', (t) => { |
||||||
|
const logger = mock_logger(); |
||||||
|
|
||||||
|
const clean = { |
||||||
|
parsed_text: { |
||||||
|
number: 'housenumber value', |
||||||
|
street: 'street value' |
||||||
|
} |
||||||
|
}; |
||||||
|
const res = { |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
layer: 'county', |
||||||
|
source_id: 1 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'macrocounty', |
||||||
|
source_id: 2 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'region', |
||||||
|
source_id: 3 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'county', |
||||||
|
source_id: 4 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'macrocounty', |
||||||
|
source_id: 5 |
||||||
|
} |
||||||
|
] |
||||||
|
}; |
||||||
|
|
||||||
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', { |
||||||
|
'pelias-logger': logger, |
||||||
|
'pelias-query': { |
||||||
|
layout: { |
||||||
|
AddressesUsingIdsQuery: MockQuery |
||||||
|
}, |
||||||
|
view: views, |
||||||
|
Vars: require('pelias-query').Vars |
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
const generatedQuery = generateQuery(clean, res); |
||||||
|
|
||||||
|
t.deepEquals(JSON.parse(generatedQuery.body.vs.var('input:layers')), { |
||||||
|
county: [1, 4], |
||||||
|
macrocounty: [2, 5] |
||||||
|
}); |
||||||
|
|
||||||
|
t.end(); |
||||||
|
}); |
||||||
|
|
||||||
|
test('region/macroregion granularity band', (t) => { |
||||||
|
const logger = mock_logger(); |
||||||
|
|
||||||
|
const clean = { |
||||||
|
parsed_text: { |
||||||
|
number: 'housenumber value', |
||||||
|
street: 'street value' |
||||||
|
} |
||||||
|
}; |
||||||
|
const res = { |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
layer: 'region', |
||||||
|
source_id: 1 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'macroregion', |
||||||
|
source_id: 2 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'country', |
||||||
|
source_id: 3 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'region', |
||||||
|
source_id: 4 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'macroregion', |
||||||
|
source_id: 5 |
||||||
|
} |
||||||
|
] |
||||||
|
}; |
||||||
|
|
||||||
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', { |
||||||
|
'pelias-logger': logger, |
||||||
|
'pelias-query': { |
||||||
|
layout: { |
||||||
|
AddressesUsingIdsQuery: MockQuery |
||||||
|
}, |
||||||
|
view: views, |
||||||
|
Vars: require('pelias-query').Vars |
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
const generatedQuery = generateQuery(clean, res); |
||||||
|
|
||||||
|
t.deepEquals(JSON.parse(generatedQuery.body.vs.var('input:layers')), { |
||||||
|
region: [1, 4], |
||||||
|
macroregion: [2, 5] |
||||||
|
}); |
||||||
|
|
||||||
|
t.end(); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
test('dependency/country granularity band', (t) => { |
||||||
|
const logger = mock_logger(); |
||||||
|
|
||||||
|
const clean = { |
||||||
|
parsed_text: { |
||||||
|
number: 'housenumber value', |
||||||
|
street: 'street value' |
||||||
|
} |
||||||
|
}; |
||||||
|
const res = { |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
layer: 'dependency', |
||||||
|
source_id: 1 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'country', |
||||||
|
source_id: 2 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'dependency', |
||||||
|
source_id: 3 |
||||||
|
}, |
||||||
|
{ |
||||||
|
layer: 'country', |
||||||
|
source_id: 4 |
||||||
|
} |
||||||
|
] |
||||||
|
}; |
||||||
|
|
||||||
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', { |
||||||
|
'pelias-logger': logger, |
||||||
|
'pelias-query': { |
||||||
|
layout: { |
||||||
|
AddressesUsingIdsQuery: MockQuery |
||||||
|
}, |
||||||
|
view: views, |
||||||
|
Vars: require('pelias-query').Vars |
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
const generatedQuery = generateQuery(clean, res); |
||||||
|
|
||||||
|
t.deepEquals(JSON.parse(generatedQuery.body.vs.var('input:layers')), { |
||||||
|
dependency: [1, 3], |
||||||
|
country: [2, 4] |
||||||
|
}); |
||||||
|
|
||||||
|
t.end(); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
module.exports.tests.boundary_filters = (test, common) => { |
||||||
|
test('boundary.country available should add to query', (t) => { |
||||||
|
const logger = mock_logger(); |
||||||
|
|
||||||
|
const clean = { |
||||||
|
parsed_text: { |
||||||
|
number: 'housenumber value', |
||||||
|
street: 'street value' |
||||||
|
}, |
||||||
|
'boundary.country': 'boundary.country value' |
||||||
|
}; |
||||||
|
const res = {}; |
||||||
|
|
||||||
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', { |
||||||
|
'pelias-logger': logger, |
||||||
|
'pelias-query': { |
||||||
|
layout: { |
||||||
|
AddressesUsingIdsQuery: MockQuery |
||||||
|
}, |
||||||
|
view: views, |
||||||
|
Vars: require('pelias-query').Vars |
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
const generatedQuery = generateQuery(clean, res); |
||||||
|
|
||||||
|
t.equals(generatedQuery.body.vs.var('boundary:country').toString(), 'boundary.country value'); |
||||||
|
|
||||||
|
t.end(); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
test('focus.point.lat/lon w/both numbers should add to query', (t) => { |
||||||
|
const logger = mock_logger(); |
||||||
|
|
||||||
|
const clean = { |
||||||
|
parsed_text: { |
||||||
|
number: 'housenumber value', |
||||||
|
street: 'street value' |
||||||
|
}, |
||||||
|
'focus.point.lat': 12.121212, |
||||||
|
'focus.point.lon': 21.212121 |
||||||
|
}; |
||||||
|
const res = {}; |
||||||
|
|
||||||
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', { |
||||||
|
'pelias-logger': logger, |
||||||
|
'pelias-query': { |
||||||
|
layout: { |
||||||
|
AddressesUsingIdsQuery: MockQuery |
||||||
|
}, |
||||||
|
view: views, |
||||||
|
Vars: require('pelias-query').Vars |
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
const generatedQuery = generateQuery(clean, res); |
||||||
|
|
||||||
|
t.equals(generatedQuery.body.vs.var('focus:point:lat').toString(), 12.121212); |
||||||
|
t.equals(generatedQuery.body.vs.var('focus:point:lon').toString(), 21.212121); |
||||||
|
|
||||||
|
t.end(); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
test('boundary.rect with all numbers should add to query', (t) => { |
||||||
|
const logger = mock_logger(); |
||||||
|
|
||||||
|
const clean = { |
||||||
|
parsed_text: { |
||||||
|
number: 'housenumber value', |
||||||
|
street: 'street value' |
||||||
|
}, |
||||||
|
'boundary.rect.min_lat': 12.121212, |
||||||
|
'boundary.rect.max_lat': 13.131313, |
||||||
|
'boundary.rect.min_lon': 21.212121, |
||||||
|
'boundary.rect.max_lon': 31.313131 |
||||||
|
}; |
||||||
|
const res = {}; |
||||||
|
|
||||||
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', { |
||||||
|
'pelias-logger': logger, |
||||||
|
'pelias-query': { |
||||||
|
layout: { |
||||||
|
AddressesUsingIdsQuery: MockQuery |
||||||
|
}, |
||||||
|
view: views, |
||||||
|
Vars: require('pelias-query').Vars |
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
const generatedQuery = generateQuery(clean, res); |
||||||
|
|
||||||
|
t.equals(generatedQuery.body.vs.var('boundary:rect:top').toString(), 13.131313); |
||||||
|
t.equals(generatedQuery.body.vs.var('boundary:rect:right').toString(), 31.313131); |
||||||
|
t.equals(generatedQuery.body.vs.var('boundary:rect:bottom').toString(), 12.121212); |
||||||
|
t.equals(generatedQuery.body.vs.var('boundary:rect:left').toString(), 21.212121); |
||||||
|
|
||||||
|
t.end(); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
test('boundary circle without radius should set radius to default', (t) => { |
||||||
|
const logger = mock_logger(); |
||||||
|
|
||||||
|
const clean = { |
||||||
|
parsed_text: { |
||||||
|
number: 'housenumber value', |
||||||
|
street: 'street value' |
||||||
|
}, |
||||||
|
'boundary.circle.lat': 12.121212, |
||||||
|
'boundary.circle.lon': 21.212121 |
||||||
|
}; |
||||||
|
const res = {}; |
||||||
|
|
||||||
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', { |
||||||
|
'pelias-logger': logger, |
||||||
|
'pelias-query': { |
||||||
|
layout: { |
||||||
|
AddressesUsingIdsQuery: MockQuery |
||||||
|
}, |
||||||
|
view: views, |
||||||
|
Vars: require('pelias-query').Vars |
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
const generatedQuery = generateQuery(clean, res); |
||||||
|
|
||||||
|
t.equals(generatedQuery.body.vs.var('boundary:circle:lat').toString(), 12.121212); |
||||||
|
t.equals(generatedQuery.body.vs.var('boundary:circle:lon').toString(), 21.212121); |
||||||
|
t.equals(generatedQuery.body.vs.var('boundary:circle:radius').toString(), '50km'); |
||||||
|
|
||||||
|
t.end(); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
test('boundary circle with radius set radius to that value rounded', (t) => { |
||||||
|
const logger = mock_logger(); |
||||||
|
|
||||||
|
const clean = { |
||||||
|
parsed_text: { |
||||||
|
number: 'housenumber value', |
||||||
|
street: 'street value' |
||||||
|
}, |
||||||
|
'boundary.circle.lat': 12.121212, |
||||||
|
'boundary.circle.lon': 21.212121, |
||||||
|
'boundary.circle.radius': 17.6 |
||||||
|
}; |
||||||
|
const res = {}; |
||||||
|
|
||||||
|
const generateQuery = proxyquire('../../../query/address_search_using_ids', { |
||||||
|
'pelias-logger': logger, |
||||||
|
'pelias-query': { |
||||||
|
layout: { |
||||||
|
AddressesUsingIdsQuery: MockQuery |
||||||
|
}, |
||||||
|
view: views, |
||||||
|
Vars: require('pelias-query').Vars |
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
const generatedQuery = generateQuery(clean, res); |
||||||
|
|
||||||
|
t.equals(generatedQuery.body.vs.var('boundary:circle:lat').toString(), 12.121212); |
||||||
|
t.equals(generatedQuery.body.vs.var('boundary:circle:lon').toString(), 21.212121); |
||||||
|
t.equals(generatedQuery.body.vs.var('boundary:circle:radius').toString(), '18km'); |
||||||
|
|
||||||
|
t.end(); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
module.exports.all = (tape, common) => { |
||||||
|
function test(name, testFunction) { |
||||||
|
return tape(`address_search_using_ids query ${name}`, testFunction); |
||||||
|
} |
||||||
|
|
||||||
|
for( var testCase in module.exports.tests ){ |
||||||
|
module.exports.tests[testCase](test, common); |
||||||
|
} |
||||||
|
}; |
Loading…
Reference in new issue