Exemplo n.º 1
0
        /// <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);
            }
        }
Exemplo n.º 3
0
        /// <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);
            }
        }
Exemplo n.º 4
0
        /// <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());
            }
        }
Exemplo n.º 5
0
        /// <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);
            }
        }
Exemplo n.º 7
0
        /// <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(',', ' '));
        }
Exemplo n.º 11
0
        /// <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);
        }
Exemplo n.º 13
0
        /// <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);
        }
Exemplo n.º 17
0
        /// <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);
        }
Exemplo n.º 18
0
 /// <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);
 }
Exemplo n.º 19
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="location">ElasticsearchLocation object</param>
 /// <param name="languageCode">Language Code</param>
 ///
 public SecondOrderDivisionLocationSuggestion(ElasticsearchLocation location, string languageCode) : base(location, languageCode)
 {
 }
Exemplo n.º 20
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="location">ElasticsearchLocation object</param>
 ///
 public CityLocationSuggestion(ElasticsearchLocation location) : base(location)
 {
 }
Exemplo n.º 21
0
 /// <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));
 }
Exemplo n.º 24
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="location">ElasticsearchLocation object</param>
 ///
 public LocationSuggestion(ElasticsearchLocation location)
 {
     this.Location = location;
 }
Exemplo n.º 25
0
 /// <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)
 {
 }
Exemplo n.º 26
0
 /// <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);
 }
Exemplo n.º 27
0
 /// <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)
 {
 }