/// <summary> /// Entrypoint to create the suggestion object for the submitted ES location object. /// </summary> /// <param name="esDocument">ElasticsearchLocation object</param> /// <param name="globalContext">GlobalContex object</param> /// public static ElasticsearchLocation SetSuggestion(ElasticsearchLocation esDocument, GlobalContext globalContext) { esDocument = ProcessSuggest(esDocument, globalContext.LocationAliases, globalContext.EnvironmentContext.IndexLanguage); esDocument = SetFormattedName(esDocument); return(esDocument); }
private ElasticsearchLocation SetLocationName(ElasticsearchLocation location, LocationType locationType, LocationView locationView) { switch (locationType) { case LocationType.Country: location.Country = locationView.Name; location.CountryCode = locationView.Code; return(location); case LocationType.FirstOrderDivision: location.Division1 = locationView.Name; location.Division1Code = locationView.Code; return(location); case LocationType.SecondOrderDivision: location.Division2 = locationView.Name; location.Division2Code = locationView.Code; return(location); case LocationType.ThirdOrderDivision: location.Division3 = locationView.Name; return(location); case LocationType.FourthOrderDivision: location.Division4 = locationView.Name; return(location); case LocationType.City: location.City = locationView.Name; return(location); default: return(location); } }
/// <summary> /// Set the previously determined preferred name for the ElasticsearchLocation object. /// </summary> /// <param name="esDocument">ElasticsearchLocation object</param> /// <param name="location">Messages.Location object</param> /// private ElasticsearchLocation SetLocationsPreferredName(ElasticsearchLocation esDocument, string preferredName) { switch (esDocument.TypeID) { case 0: esDocument.Country = preferredName; return(esDocument); case 1: esDocument.Division1 = preferredName; return(esDocument); case 2: esDocument.Division2 = preferredName; return(esDocument); case 3: esDocument.Division3 = preferredName; return(esDocument); case 4: esDocument.Division4 = preferredName; return(esDocument); case 5: esDocument.City = preferredName; return(esDocument); default: return(esDocument); } }
/// <summary> /// Specifies if the submitted location is to be indexed based on rules. /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// public bool IsValidLocation(ElasticsearchLocation location) { if (string.IsNullOrWhiteSpace(location.CountryCode)) { return(false); } var countryCode = location.CountryCode; var locations = new List <ElasticsearchLocation> { location }; switch (location.CountryCode.ToLower()) { case "us": case "de": return(RemoveUnwantedUsLocations(locations, countryCode).Any()); case "gb": return(RemoveUnwantedLocationsIncludeThirdFourthDivs(locations, countryCode).Any()); default: return(DefaultRemoveUnwantedLocations(locations, countryCode).Any()); } }
/// <summary> /// Create Location Suggestion object. /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// <param name="locationAliases">List of LocationAlias objects</param> /// public static ElasticsearchLocation.Suggestion Create(ElasticsearchLocation location, List <LocationAlias> locationAliases, string languageCode) { switch (GetLocationType(location)) { case LocationType.Country: return(new CountryLocationSuggestion(location).ToDocument()); case LocationType.FirstOrderDivision: return(new FirstOrderDivisionLocationSuggestion(location).ToDocument()); // Language used by LocationNameUtility class to ensure abbreviation for location names not used with ZH. case LocationType.SecondOrderDivision: return(new SecondOrderDivisionLocationSuggestion(location, languageCode).ToDocument()); case LocationType.ThirdOrderDivision: return(new ThirdOrderDivisionLocationSuggestion(location).ToDocument()); case LocationType.FourthOrderDivision: return(new FourthOrderDivisionLocationSuggestion(location).ToDocument()); // Language used by LocationNameUtility class to ensure abbreviation for location names not used with ZH. case LocationType.City: return(new CityLocationSuggestion(location, languageCode).ToDocument()); default: return(null); } }
/// <summary> /// Returns the output name what will be used for auto-complete. /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// public static string GetFormattedName(ElasticsearchLocation location, string languageCode) { if (location == null) { throw new ArgumentNullException("location", "An object of type ElasticsearchLocation was not provided."); } var type = (LocationType)location.TypeID; switch (type) { case LocationType.Country: return(GetCountryFormattedName(location)); case LocationType.FirstOrderDivision: return(GetFirstOrderDivisionFormattedName(location)); case LocationType.SecondOrderDivision: return(GetSecondOrderDivisionFormattedName(location, languageCode)); case LocationType.ThirdOrderDivision: return(GetThirdOrderDivisionFormattedName(location)); case LocationType.FourthOrderDivision: return(GetFourthOrderDivisionFormattedName(location)); case LocationType.City: return(GetCityFormattedName(location, languageCode)); default: return(string.Empty); } }
/// <summary> /// Provides the correct location name for processing. /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// private string GetLocationName(ElasticsearchLocation location) { switch (location.TypeID) { case 0: return(location.Country); case 1: return(location.Division1); case 2: return(location.Division2); case 3: return(location.Division3); case 4: return(location.Division4); case 5: return(location.City); default: return(string.Empty); } }
/// <summary> /// Second order division name /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// private static string GetSecondOrderDivisionFormattedName(ElasticsearchLocation location, string languageCode) { if (location.CountryCode.ToLower().Equals("us") && !languageCode.ToLower().Equals("zh")) { return(string.Format("{0}, {1}", location.Division2, location.Division1Code)); } return(string.Join(", ", (new[] { location.Division2, location.Division1, location.Country } .Where(x => !string.IsNullOrEmpty(x) && !x.ContainsDigits()))) .TrimEnd(',', ' ')); }
/// <summary> /// Populates the ElasticsearchLocation object with Division information. /// </summary> /// <param name="location">ElasticsearchLocation object that is being constructed</param> /// <param name="parentLocation">Parent ElasticsearchLocation object</param> /// private ElasticsearchLocation SetDivisions(ElasticsearchLocation location, ElasticsearchLocation parentLocation) { if (location.TypeID == (int)LocationType.Country) { return(location); } location.Division1Code = parentLocation.Division1Code; location.Division1 = parentLocation.Division1; location.Division2Code = parentLocation.Division2Code; location.Division2 = parentLocation.Division2; location.Division3 = parentLocation.Division3; location.Division4 = parentLocation.Division4; return(location); }
/// <summary> /// Fourth Order Division Name /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// <returns></returns> private static string GetFourthOrderDivisionFormattedName(ElasticsearchLocation location) { if (location.CountryCode.ToLower().Equals("us")) { return(string.Format("{0}, {1}, {2}", location.Division4, location.Division2, location.Division1Code)); } if (location.CountryCode.ToLower().Equals("gb")) { return(string.Format("{0}, {1}, {2}, {3}", location.Division4, location.Division3, location.Division2, location.Division1)); } return(string.Join(", ", (new[] { location.Division4, location.Division2, location.Division1, location.Country } .Where(x => !string.IsNullOrEmpty(x) && !x.ContainsDigits()))) .TrimEnd(',', ' ')); }
/// <summary> /// /// </summary> /// <param name="locations"></param> /// <param name="locationType"></param> /// <param name="locationView"></param> /// <returns></returns> private ElasticsearchLocation GetParentLocation(List <ElasticsearchLocation> locations, LocationType locationType, LocationView locationView) { if (locationType == LocationType.Country) { return(null); } if (_previousId == locationView.Id) { return(_parentLocation); } _previousId = GetParentId(locationView); _parentLocation = locations.SingleOrDefault(x => x.ID == _previousId); return(_parentLocation); }
/// <summary> /// Resolves duplicate names for the Suggest.Output /// </summary> /// <param name="esDocument">ElasticsearchLocation document</param> /// public ElasticsearchLocation Resolve(ElasticsearchLocation esDocument, string countryCode, string indexLanguage) { if (esDocument.TypeID == 0 || esDocument.TypeID == 1) { return(esDocument); } var uniqueName = _uniqueNames.SingleOrDefault(x => x.Id == esDocument.ID && x.CountryCode.ToLower().Equals(countryCode.ToLower()) && x.IndexLanguage.ToLower().Equals(indexLanguage.ToLower())); if (uniqueName == null) { return(esDocument); } esDocument.FormattedName = uniqueName.Name; esDocument.Suggest.Output = uniqueName.Name; return(esDocument); }
/// <summary> /// Entrypoint to determine the name to use for a location. The ordering is (short-circuit) as follows: /// Custom Name - Short Name - Preferred Name - General Name (in specified language) - Default Name /// </summary> /// <param name="esDocument">ElasticsearchLocatio object</param> /// <param name="globalContext">GlobalContext object</param> /// public ElasticsearchLocation SetPreferredName(ElasticsearchLocation esDocument, GlobalContext globalContext) { _locationAliases = globalContext.LocationAliases; // Get custom selection for the specified location. var selection = _preferredNameSelectionList.SingleOrDefault(x => x.SourceID == esDocument.ID && x.LanguageCode.ToLower().Equals(globalContext.EnvironmentContext.IndexLanguage.ToLower())); if (selection != null) { var name = GetCustomNameSelection(selection, esDocument.ID); if (!string.IsNullOrWhiteSpace(name)) { return(SetLocationsPreferredName(esDocument, name)); } } // The short name for the location in the specified language. var shortNameForLocation = _locationAliases.FirstOrDefault(x => x.SourceId == esDocument.ID && x.LanguageCode.ToLower().Equals(globalContext.EnvironmentContext.IndexLanguage.ToLower()) && x.IsShortName); if (shortNameForLocation != null) { return(SetLocationsPreferredName(esDocument, shortNameForLocation.Name)); } // The preferred name for the location in the specified language. var preferredNameForLocation = _locationAliases.FirstOrDefault(x => x.SourceId == esDocument.ID && x.LanguageCode.ToLower().Equals(globalContext.EnvironmentContext.IndexLanguage.ToLower()) && x.IsPreferredName); if (preferredNameForLocation != null) { return(SetLocationsPreferredName(esDocument, preferredNameForLocation.Name)); } // The general name of the location in the specified language. var languageNameForlocation = _locationAliases.FirstOrDefault(x => x.SourceId == esDocument.ID && x.LanguageCode.ToLower().Equals(globalContext.EnvironmentContext.IndexLanguage.ToLower()) && !x.IsPreferredName && !x.IsColloquial && !x.IsHistoric && !x.IsShortName); if (languageNameForlocation != null) { return(SetLocationsPreferredName(esDocument, languageNameForlocation.Name)); } return(esDocument); }
/// <summary> /// Get the parent object for the provided GeoLocation object. /// </summary> /// <param name="locations">List of ElasticsearchLocation objects</param> /// <param name="locationType">LocationType enum</param> /// <param name="locationView">LocationView object</param> /// private ElasticsearchLocation GetParentLocation(List <ElasticsearchLocation> locations, LocationType locationType, LocationView locationView) { if (locationType == LocationType.Country) { return(null); } var items = locationView.ParentLocationPath.Split('/'); var index = items.Length - 2; var id = Convert.ToUInt32(items[index]); if (_parentLocation != null && _parentLocation.ID == id) { return(_parentLocation); } _parentLocation = locations.SingleOrDefault(x => x.ID == id); return(_parentLocation); }
/// <summary> /// Returns a list of abbreviated names for a location. /// NOTE: To reduce execution time 'Air Force Base' is only checked for locations in the US. /// Analysis of the Location table shows that the string 'Air Force Base' is only used in the US. /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// public ElasticsearchLocation AddAbbreviatedNames(ElasticsearchLocation location) { if (location.TypeID != 5) { return(location); } var abbreviations = GetAbbreviatedNames(location.City, location.CountryCode); if (!abbreviations.Any()) { return(location); } var suggestionInputs = location.Suggest.Input.ToList(); suggestionInputs.AddRange(abbreviations); location.Suggest.Input = suggestionInputs.Distinct().ToList(); return(location); }
private ElasticsearchLocation BuildBaseObject(LocationContext locationContext) { var esLocation = new ElasticsearchLocation { Country = (locationContext.ParentLocation == null) ? locationContext.LocationView.Name : locationContext.ParentLocation.Country, CountryCode = (locationContext.ParentLocation == null) ? locationContext.LocationView.CountryCode : locationContext.ParentLocation.CountryCode, CountryCtx = GetCountryCtx(locationContext.LocationView), Geometry = new ElasticsearchGeometry { Latitude = (float)locationContext.LocationView.Latitude, Longitude = (float)locationContext.LocationView.Longitude }, HierarchyPath = locationContext.LocationView.LocationPath, ID = locationContext.LocationView.Id, Population = SetPopulation(locationContext.LocationType, locationContext.LocationView), TypeID = (int)locationContext.LocationType }; esLocation = SetDivisions(esLocation, locationContext.ParentLocation); esLocation = SetLocationName(esLocation, locationContext.LocationType, locationContext.LocationView); return(esLocation); }
/// <summary> /// Takes in a location object and adds suggestions to Suggest.Input list. /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// public ElasticsearchLocation AddInputs(ElasticsearchLocation location) { var suggestions = GetSuggestions(location.ID); var transformations = GetSuggestionWithCharacterTransformation(location.CountryCode, GetLocationName(location)); if (!string.IsNullOrWhiteSpace(transformations)) { suggestions.Add(transformations); } if (!suggestions.Any()) { return(location); } var suggestionInputs = location.Suggest.Input.ToList(); suggestionInputs.AddRange(suggestions); suggestionInputs.AddRange(location.AlternateNames); location.Suggest.Input = suggestionInputs.Distinct().ToList(); return(location); }
/// <summary> /// Factory object that orchestras the suggestion object creation process. /// </summary> /// <param name="esDocument">ElasticsearchLocation object</param> /// <param name="alternateNames">List of LocationAlias objects</param> /// <param name="languageCode">Language code</param> /// private static ElasticsearchLocation ProcessSuggest(ElasticsearchLocation esDocument, List <LocationAlias> locationAliases, string languageCode) { esDocument.Suggest = LocationSuggestionFactory.Create(esDocument, locationAliases, languageCode); return(esDocument); }
/// <summary> /// Constructor /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// <param name="languageCode">Language Code</param> /// public SecondOrderDivisionLocationSuggestion(ElasticsearchLocation location, string languageCode) : base(location, languageCode) { }
/// <summary> /// Constructor /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// public CityLocationSuggestion(ElasticsearchLocation location) : base(location) { }
/// <summary> /// Sets the Formatted Name for the location object to the value contained in the Suggest.Output property. /// </summary> /// <param name="esDocument">ElasticsearchLocation</param> /// private static ElasticsearchLocation SetFormattedName(ElasticsearchLocation esDocument) { esDocument.FormattedName = esDocument.Suggest.Output; return(esDocument); }
/// <summary> /// Country Name /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// private static string GetCountryFormattedName(ElasticsearchLocation location) { return(location.Country); }
/// <summary> /// First order division name /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// private static string GetFirstOrderDivisionFormattedName(ElasticsearchLocation location) { return(string.Format("{0}, {1}", location.Division1, location.Country)); }
/// <summary> /// Constructor /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// public LocationSuggestion(ElasticsearchLocation location) { this.Location = location; }
/// <summary> /// Constructor /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// <param name="alternateNames">List of preferred names for the location</param> /// public CityLocationSuggestion(ElasticsearchLocation location, string languageCode) : base(location, languageCode) { }
/// <summary> /// Determine if Earth is being processed (TypeID = -1) /// If Earth is being processed set location type to Unknown. /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// private static LocationType GetLocationType(ElasticsearchLocation location) { return((location.TypeID == -1) ? LocationType.Unknown : (LocationType)location.TypeID); }
/// <summary> /// Constructor /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// <param name="languageCode">Language Code</param> /// public LocationSuggestion(ElasticsearchLocation location, string languageCode) { this.Location = location; LanguageCode = languageCode; }
/// <summary> /// Constructor /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// <param name="alternateNames">List containing preferred names</param> /// public ThirdOrderDivisionLocationSuggestion(ElasticsearchLocation location, List <string> alternateNames) : base(location) { _alternateNames = alternateNames.Distinct().ToList(); }
/// <summary> /// Constructor /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// public ThirdOrderDivisionLocationSuggestion(ElasticsearchLocation location) : base(location) { }
/// <summary> /// Constructor /// </summary> /// <param name="location">ElasticsearchLocation object</param> /// public FourthOrderDivisionLocationSuggestion(ElasticsearchLocation location) : base(location) { }