mirror of https://github.com/pelias/api.git
Harish Krishna
10 years ago
4 changed files with 196 additions and 3 deletions
@ -0,0 +1,48 @@
|
||||
|
||||
var picker = function( results, size ){ |
||||
var combined = []; |
||||
var num_results = 0; |
||||
|
||||
for (var i=0; i<results.length && num_results<size; i++) { |
||||
if (results[i] && results[i].length) { |
||||
combined[i] = combined[i] || []; |
||||
combined[i].push(results[i][0]); |
||||
results[i].splice(0,1); |
||||
num_results++; |
||||
} else { |
||||
results.splice(i,1); |
||||
i--; |
||||
} |
||||
|
||||
if (i === results.length-1) { |
||||
i=0; |
||||
} |
||||
} |
||||
return (combined.length > 0) ? sort_by_score(combined) : combined; |
||||
}; |
||||
|
||||
var dedup = function(arr) { |
||||
var unique_ids = []; |
||||
return arr.filter(function(item, pos) { |
||||
if (unique_ids.indexOf(item.name.default) === -1) { |
||||
unique_ids.push(item.name.default); |
||||
return true; |
||||
} |
||||
return false; |
||||
}); |
||||
}; |
||||
|
||||
var sort_by_score = function(arr) { |
||||
return arr.map(function(doc) { |
||||
return doc.sort(function(a,b) { |
||||
return b.score - a.score; |
||||
}); |
||||
}).reduce(function(a,b) { //flatten
|
||||
return a.concat(b); |
||||
}); |
||||
}; |
||||
|
||||
module.exports = { |
||||
picker: picker, |
||||
dedup: dedup |
||||
}; |
@ -0,0 +1,97 @@
|
||||
|
||||
var logger = require('../src/logger'); |
||||
|
||||
// Build pelias suggest query
|
||||
function generate( params, precision ){ |
||||
|
||||
var getPrecision = function(zoom) { |
||||
switch (true) { |
||||
case (zoom > 15): |
||||
return 5; // zoom: >= 16
|
||||
case (zoom > 9): |
||||
return 4; // zoom: 10-15
|
||||
case (zoom > 5): |
||||
return 3; // zoom: 6-9
|
||||
case (zoom > 3): |
||||
return 2; // zoom: 4-5
|
||||
default: |
||||
return 1; // zoom: 1-3 or when zoom: undefined
|
||||
} |
||||
}; |
||||
|
||||
var cmd = { |
||||
'text' : params.input, |
||||
'pelias_1' : { |
||||
'completion' : { |
||||
'size' : params.size, |
||||
'field' : 'suggest', |
||||
'context': { |
||||
'dataset': params.layers, |
||||
'location': { |
||||
'value': [ params.lon, params.lat ], |
||||
'precision': 5 |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
'pelias_2' : { |
||||
'completion' : { |
||||
'size' : params.size, |
||||
'field' : 'suggest', |
||||
'context': { |
||||
'dataset': params.layers, |
||||
'location': { |
||||
'value': [ params.lon, params.lat ], |
||||
'precision': 3 |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
'pelias_3' : { |
||||
'completion' : { |
||||
'size' : params.size, |
||||
'field' : 'suggest', |
||||
'context': { |
||||
'dataset': params.layers, |
||||
'location': { |
||||
'value': [ params.lon, params.lat ], |
||||
'precision': 1 |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
'pelias_4' : { |
||||
'completion' : { |
||||
'size' : params.size, |
||||
'field' : 'suggest', |
||||
'context': { |
||||
'dataset': ['admin0', 'admin1', 'admin2'], |
||||
'location': { |
||||
'value': [ params.lon, params.lat ], |
||||
'precision': precision || getPrecision(params.zoom) |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
'pelias_5' : { |
||||
'completion' : { |
||||
'size' : params.size, |
||||
'field' : 'suggest', |
||||
'context': { |
||||
'dataset': params.layers, |
||||
'location': { |
||||
'value': [ params.lon, params.lat ], |
||||
'precision': 3 |
||||
} |
||||
}, |
||||
'fuzzy': {} |
||||
} |
||||
} |
||||
}; |
||||
|
||||
// logger.log( 'cmd', JSON.stringify( cmd, null, 2 ) );
|
||||
return cmd; |
||||
|
||||
} |
||||
|
||||
module.exports = generate; |
@ -0,0 +1,44 @@
|
||||
|
||||
/** |
||||
|
||||
cmd can be any valid ES suggest command |
||||
|
||||
**/ |
||||
|
||||
function service( backend, cmd, cb ){ |
||||
// query new backend
|
||||
backend().client.suggest( cmd, function( err, data ){ |
||||
// handle backend errors
|
||||
if( err ){ return cb( err ); } |
||||
|
||||
// map returned documents
|
||||
|
||||
var docs = []; |
||||
var unique_ids = []; |
||||
var num_keys = Object.keys(data).length; |
||||
var has_docs = function(obj) { |
||||
return Array.isArray( obj ) && obj.length && obj[0].options && obj[0].options.length; |
||||
}; |
||||
for (var i=1, j=0; i<num_keys && j<num_keys; i++) { |
||||
var keys = 'pelias_'+i; |
||||
if ( has_docs(data[keys]) ){ |
||||
docs[i] = docs[i] || []; |
||||
var res = data[keys][0].options[0]; |
||||
if (unique_ids.indexOf(res.text) === -1) { |
||||
docs[i].push(res); |
||||
unique_ids.push(res.text); |
||||
}
|
||||
data[keys][0].options.splice(0,1); |
||||
} else { |
||||
j++; |
||||
} |
||||
i = i === num_keys-1 ? 1 : i; |
||||
} |
||||
|
||||
// fire callback
|
||||
return cb( null, docs); |
||||
}); |
||||
|
||||
} |
||||
|
||||
module.exports = service; |
Loading…
Reference in new issue