forked from MapComplete/MapComplete
		
	Performance: speed up loading of the NSI
This commit is contained in:
		
							parent
							
								
									a5b3342415
								
							
						
					
					
						commit
						4b05acf338
					
				
					 1 changed files with 37 additions and 5 deletions
				
			
		|  | @ -261,6 +261,15 @@ export default class NameSuggestionIndex { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  |      * Caching for the resolved sets, as they can take a while | ||||||
|  |      * @private | ||||||
|  |      */ | ||||||
|  |     private static resolvedSets: Record<string, any> = {} | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Returns all suggestions for the given type (brand|operator) and main tag. | ||||||
|  |      * Can optionally be filtered by countries and location set | ||||||
|  |      * | ||||||
|      * |      * | ||||||
|      * @param country: a string containing one or more country codes, separated by ";" |      * @param country: a string containing one or more country codes, separated by ";" | ||||||
|      * @param location: center point of the feature, should be [lon, lat] |      * @param location: center point of the feature, should be [lon, lat] | ||||||
|  | @ -274,24 +283,47 @@ export default class NameSuggestionIndex { | ||||||
|     ): NSIItem[] { |     ): NSIItem[] { | ||||||
|         const path = `${type}s/${key}/${value}` |         const path = `${type}s/${key}/${value}` | ||||||
|         const entry = NameSuggestionIndex.nsiFile.nsi[path] |         const entry = NameSuggestionIndex.nsiFile.nsi[path] | ||||||
|  |         const countries = country?.split(";") ?? [] | ||||||
|         return entry?.items?.filter((i) => { |         return entry?.items?.filter((i) => { | ||||||
|             if (i.locationSet.include.indexOf("001") >= 0) { |             if (i.locationSet.include.indexOf("001") >= 0) { | ||||||
|  |                 // this brand is spread globally
 | ||||||
|  |                 return true | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (country === undefined) { | ||||||
|  |                 // IF the country is not set, we are probably in some international area, it isn't loaded yet,
 | ||||||
|  |                 // or we are in a code path where we need everything (e.g. a script)
 | ||||||
|  |                 // We just allow everything
 | ||||||
|                 return true |                 return true | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             if ( |             if ( | ||||||
|                 country === undefined || |                 i.locationSet.include.some((c) => countries.indexOf(c) >= 0) | ||||||
|                 // We prefer the countries provided by lonlat2country, they are more precise
 |  | ||||||
|                 // Country might contain multiple countries, separated by ';'
 |  | ||||||
|                 i.locationSet.include.some((c) => country.indexOf(c) >= 0) |  | ||||||
|             ) { |             ) { | ||||||
|  |                 // We prefer the countries provided by lonlat2country, they are more precise and are loaded already anyway (cheap)
 | ||||||
|  |                 // Country might contain multiple countries, separated by ';'
 | ||||||
|                 return true |                 return true | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             if (i.locationSet.exclude?.some(c => countries.indexOf(c) >= 0)) { | ||||||
|  |                 return false | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             if (location === undefined) { |             if (location === undefined) { | ||||||
|                 return true |                 return true | ||||||
|             } |             } | ||||||
|             const resolvedSet = NameSuggestionIndex.loco.resolveLocationSet(i.locationSet) | 
 | ||||||
|  |             const hasSpecial = i.locationSet.include?.some(i => i.endsWith(".geojson") || Array.isArray(i)) || i.locationSet.exclude?.some(i => i.endsWith(".geojson") || Array.isArray(i)) | ||||||
|  |             if (!hasSpecial) { | ||||||
|  |                 return false | ||||||
|  |             } | ||||||
|  |             const key = i.locationSet.include?.join(";") + "-" + i.locationSet.exclude?.join(";") | ||||||
|  |             const fromCache = NameSuggestionIndex.resolvedSets[key] | ||||||
|  |             const resolvedSet = fromCache ?? NameSuggestionIndex.loco.resolveLocationSet(i.locationSet) | ||||||
|  |             if (!fromCache) { | ||||||
|  |                 NameSuggestionIndex.resolvedSets[key] = resolvedSet | ||||||
|  |             } | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|             if (resolvedSet) { |             if (resolvedSet) { | ||||||
|                 // We actually have a location set, so we can check if the feature is in it, by determining if our point is inside the MultiPolygon using @turf/boolean-point-in-polygon
 |                 // We actually have a location set, so we can check if the feature is in it, by determining if our point is inside the MultiPolygon using @turf/boolean-point-in-polygon
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue