1- const defaultLabelGenerator = require ( 'pelias-labels' ) ;
1+ const defaultLabelGenerator = require ( 'pelias-labels' ) . partsGenerator ;
2+ const _ = require ( 'lodash' ) ;
23
34function setup ( labelGenerator ) {
45 function middleware ( req , res , next ) {
@@ -8,17 +9,55 @@ function setup(labelGenerator) {
89 return middleware ;
910}
1011
12+ function getLabelFromLayer ( parts , layer ) {
13+ const part = parts . find ( p => p . layer === layer ) ;
14+ return _ . get ( part , 'label' ) ;
15+ }
16+
17+ function filterUnambiguousParts ( part , second ) {
18+ if ( part . role === 'required' ) {
19+ return false ;
20+ }
21+ const label = getLabelFromLayer ( second . parts , part . layer ) ;
22+ return label && label !== part . label ;
23+ }
24+
25+ function getBestLayers ( results ) {
26+ const first = results [ 0 ] ;
27+ const second = results [ 1 ] ;
28+ return first . parts . filter ( p => filterUnambiguousParts ( p , second ) ) . map ( p => p . layer ) ;
29+ }
30+
1131function assignLabel ( req , res , next , labelGenerator ) {
1232
1333 // do nothing if there's nothing to process
1434 if ( ! res || ! res . data ) {
1535 return next ( ) ;
1636 }
1737
38+ // This object will help for label deduplication
39+ const dedupLabel = { } ;
40+
41+ // First we assign for all result the default label with all required layers
1842 res . data . forEach ( function ( result ) {
19- result . label = labelGenerator ( result ) ;
43+ const { parts, separator } = labelGenerator ( result ) ;
44+ result . label = parts . filter ( e => e . role === 'required' ) . map ( e => e . label ) . join ( separator ) ;
45+ dedupLabel [ result . label ] = dedupLabel [ result . label ] || [ ] ;
46+ dedupLabel [ result . label ] . push ( { result, parts, separator } ) ;
2047 } ) ;
2148
49+ // We check all values with more than one entry
50+ Object . values ( dedupLabel )
51+ . filter ( results => results . length > 1 )
52+ . forEach ( results => {
53+ // This array will contain all optional layers that should be displayed
54+ const bestLayers = getBestLayers ( results ) ;
55+ // We reassign the label with the new value
56+ results . forEach ( ( { result, parts, separator } ) => {
57+ result . label = parts . filter ( e => e . role === 'required' || bestLayers . indexOf ( e . layer ) >= 0 ) . map ( e => e . label ) . join ( separator ) ;
58+ } ) ;
59+ } ) ;
60+
2261 next ( ) ;
2362}
2463
0 commit comments