@@ -3,7 +3,7 @@ import { doubleMetaphone } from './double-metaphone';
33import { Pool , PoolConnection } from './mysql-await-async' ;
44import {
55 closeMatchForState , code3ToName , countyStateCleanUp , getFlagCode , LocationMap , makeLocationKey ,
6- ParsedSearchString , simplify , closeMatchForCity , code3ToNameByLang , admin1ToNameByLang , admin1s , code2ToCode3 , admin2s
6+ ParsedSearchString , simplify , closeMatchForCity , code3ToNameByLang , admin1ToNameByLang , admin1s , code2ToCode3 , admin2s , admin1Abbreviations
77} from './gazetteer' ;
88import { AtlasLocation } from './atlas-location' ;
99import { MIN_EXTERNAL_SOURCE } from './common' ;
@@ -24,11 +24,25 @@ const MAX_MONTHS_BEFORE_REDOING_EXTENDED_SEARCH = 12;
2424const ZIP_RANK = 9 ;
2525const ZIP_SUPPLEMENT_RANK = 1 ;
2626
27+ const logTimersByIp = new Map < string , NodeJS . Timeout > ( ) ;
28+
2729export function logMessage ( message : string , lang ?: string , ip ?: string , noTrace = false ) : void {
2830 svcApiConsole . info ( message ) ;
2931
30- if ( ! noTrace )
31- logMessageAux ( message , lang , ip , false ) ;
32+ if ( ! noTrace ) {
33+ if ( ! ip )
34+ logMessageAux ( message , lang , '' , false ) ;
35+ else {
36+ let timer = logTimersByIp . get ( ip ) ;
37+
38+ if ( timer )
39+ clearTimeout ( timer ) ;
40+
41+ timer = setTimeout ( ( ) => { logTimersByIp . delete ( ip ) ; logMessageAux ( message , lang , ip , false ) ; } , 3000 ) ;
42+ timer . unref ( ) ;
43+ logTimersByIp . set ( ip , timer ) ;
44+ }
45+ }
3246}
3347
3448export function logWarning ( message : string , noTrace = false ) : void {
@@ -132,22 +146,27 @@ export async function doDataBaseSearch(connection: PoolConnection, parsed: Parse
132146 const matches = new LocationMap ( ) ;
133147 const postal = ! ! parsed . postalCode ;
134148 let altParseMatches = 0 ;
149+ let passRankAdj = 0 ;
135150
136151 for ( let pass = 0 ; pass < 2 ; ++ pass ) {
137152 const altParse = ( pass > 0 && ! ! parsed . altCity ) ;
138153 const city = ( altParse ? parsed . altCity : parsed . targetCity ) ;
139154 const targetState = ( altParse ? parsed . altState : parsed . targetState ) ;
140155 const simplifiedCity = simplify ( city ) ;
141- const condition = ( pass === 0 ? ' AND rank > 0' : '' ) ;
142156
143157 examined . clear ( ) ;
144158
145159 for ( let matchType : number = MatchType . EXACT_MATCH ; matchType <= MatchType . SOUNDS_LIKE ; ++ matchType ) {
146- let rankAdjust = 0 ;
160+ if ( lang && lang !== 'en' && matchType === MatchType . SOUNDS_LIKE )
161+ continue ;
162+
163+ let rankAdjust = - passRankAdj ;
147164 let query : string ;
148165 let values : any [ ] ;
149166 let fromAlt = false ;
150167
168+ passRankAdj = 0 ;
169+
151170 switch ( matchType ) {
152171 case MatchType . EXACT_MATCH :
153172 if ( postal ) {
@@ -165,7 +184,7 @@ export async function doDataBaseSearch(connection: PoolConnection, parsed: Parse
165184 query = `SELECT * FROM gazetteer_alt_names WHERE key_name = ? AND lang = ? AND type = 'P' AND colloquial = 0 AND historic = 0` ;
166185 }
167186 else
168- query = 'SELECT * FROM gazetteer WHERE key_name = ?' + condition ;
187+ query = 'SELECT * FROM gazetteer WHERE key_name = ?' ;
169188 }
170189 break ;
171190
@@ -184,7 +203,7 @@ export async function doDataBaseSearch(connection: PoolConnection, parsed: Parse
184203 fromAlt = true ;
185204 }
186205 else
187- query = 'SELECT * FROM gazetteer WHERE key_name >= ? AND key_name < ? ' + condition ;
206+ query = 'SELECT * FROM gazetteer WHERE key_name >= ? AND key_name < ? ' ;
188207
189208 break ;
190209
@@ -193,7 +212,7 @@ export async function doDataBaseSearch(connection: PoolConnection, parsed: Parse
193212 continue ;
194213
195214 rankAdjust = - 1 ;
196- query = 'SELECT * FROM gazetteer WHERE mphone1 = ? OR mphone2 = ?' + condition ;
215+ query = 'SELECT * FROM gazetteer WHERE mphone1 = ? OR mphone2 = ?' ;
197216 values = doubleMetaphone ( parsed . targetCity ) ;
198217 break ;
199218 }
@@ -211,7 +230,7 @@ export async function doDataBaseSearch(connection: PoolConnection, parsed: Parse
211230 values = [ results . map ( ( row : any ) => row . gazetteer_id ) . filter ( ( id : number ) => id !== 0 ) . join ( ', ' ) ] ;
212231
213232 if ( values [ 0 ] ) {
214- query = `SELECT * FROM gazetteer WHERE id IN (${ values [ 0 ] } )` + condition ;
233+ query = `SELECT * FROM gazetteer WHERE id IN (${ values [ 0 ] } )` ;
215234 results = ( await connection . queryResults ( query ) ) || [ ] ;
216235 }
217236 else
@@ -338,11 +357,17 @@ export async function doDataBaseSearch(connection: PoolConnection, parsed: Parse
338357 location . source = source ;
339358 location . geonamesID = geonamesID ;
340359
341- if ( / ^ \d + $ / . test ( location . state ) || ( country !== 'USA' && country !== 'CAN' && / ^ [ A - Z ] { 3 , } $ / . test ( location . state ) ) ) {
360+ const numericState = / ^ \d + $ / . test ( location . state ) ;
361+
362+ if ( numericState || ( country !== 'USA' && country !== 'CAN' && / ^ [ A - Z ] { 3 , } $ / . test ( location . state ) ) ) {
342363 const key = country + '.' + location . state ;
364+ const abbr = admin1Abbreviations [ key ] ;
343365
344- location . state = ( admin1ToNameByLang [ key ] || { } ) [ lang || 'en' ] || ( admin1ToNameByLang [ key ] || { } ) [ '' ] ||
345- admin1s [ key ] || location . state ;
366+ if ( numericState && abbr )
367+ location . state = abbr ;
368+ else
369+ location . state = ( admin1ToNameByLang [ key ] || { } ) [ lang || 'en' ] || ( admin1ToNameByLang [ key ] || { } ) [ '' ] ||
370+ admin1s [ key ] || location . state ;
346371 }
347372
348373 if ( matchType === MatchType . EXACT_MATCH_ALT )
@@ -364,8 +389,25 @@ export async function doDataBaseSearch(connection: PoolConnection, parsed: Parse
364389 break ;
365390 }
366391
367- if ( postal )
392+ let postalOnce = postal ;
393+
394+ if ( postal && parsed . postalCode . includes ( ' ' ) ) {
395+ parsed . postalCode = parsed . postalCode . replace ( / \s + \S .* $ / , '' ) ;
396+ postalOnce = false ;
397+ }
398+
399+ if ( postalOnce )
368400 break ;
401+ else if ( lang && lang !== 'en' ) {
402+ -- pass ;
403+ lang = '' ;
404+ passRankAdj = ( matches . size > 0 ? 2 : 0 ) ;
405+ }
406+ else if ( pass === 0 && matches . size === 0 &&
407+ parsed . targetState && simplifiedCity === simplify ( parsed . targetState ) ) {
408+ -- pass ;
409+ parsed . targetState = '' ;
410+ }
369411 }
370412
371413 if ( altParseMatches === 0 ) {
0 commit comments