public BlacklistQueryResult Search(SearchCompanyBlacklistRequest model) { Establish.For(model, nameof(model)).IsNotNull() .Property(x => x.Name, nameof(model.Name), e => e.IsNotNullOrEmpty()) .Property(x => x.CountryCode, nameof(model.CountryCode), e => e.IsNotNullOrEmpty().HasExactLength(2)); // name and country are manditory var query = new DplSearch(); query.AddClause(DplFields.Name, DplSearchMatchType.Similar, model.Name); query.AddClause(DplFields.CountryCode, DplSearchMatchType.Exact, model.CountryCode); if (!string.IsNullOrEmpty(model.City)) { query.AddClause(DplFields.City, DplSearchMatchType.Exact, model.City); } if (model.Uri != null && Uri.IsWellFormedUriString(model.Uri, UriKind.Absolute)) { var uri = new Uri(model.Uri, UriKind.Absolute); query.AddClause(DplFields.Notes, DplSearchMatchType.Contains, uri.DnsSafeHost); } if (!string.IsNullOrEmpty(model.StateCode)) { query.AddClause(DplFields.StateCode, DplSearchMatchType.Exact, model.StateCode); } var dplResult = CSDenialService.SearchDpl(query); var result = new BlacklistQueryResult(dplResult.Hits.Select(x => x.Id)); return(result); }
public BlacklistQueryResult Search(SearchPersonBlacklistRequest model) { Establish.For(model, nameof(model)).IsNotNull() .Property(x => x.Name, nameof(model.Name), e => e.IsNotNullOrEmpty()) .Property(x => x.CountryCode, nameof(model.CountryCode), e => e.IsNotNullOrEmpty().HasExactLength(2)); // name and country are manditory var query = new DplSearch(); query.AddClause(DplFields.Name, DplSearchMatchType.Similar, model.Name); query.AddClause(DplFields.CountryCode, DplSearchMatchType.Exact, model.CountryCode); if (!string.IsNullOrEmpty(model.City)) { query.AddClause(DplFields.City, DplSearchMatchType.Exact, model.City); } if (!string.IsNullOrEmpty(model.Email)) { query.AddClause(DplFields.Notes, DplSearchMatchType.Contains, model.Email); } if (!string.IsNullOrEmpty(model.StateCode)) { query.AddClause(DplFields.StateCode, DplSearchMatchType.Exact, model.StateCode); } var dplResult = CSDenialService.SearchDpl(query); var result = new BlacklistQueryResult(dplResult.Hits.Select(x => x.Id)); return(result); }
public BlacklistQueryResult Search(SearchEmailBlacklistRequest model) { Establish.For(model, nameof(model)).IsNotNull() .Property(x => x.Email, nameof(model.Email), e => e.IsNotNullOrEmpty().MatchesPattern(EmailRegex)); var query = new DplSearch(); query.AddClause(DplFields.Notes, DplSearchMatchType.Contains, model.Email); var dplResult = CSDenialService.SearchDpl(query); var result = new BlacklistQueryResult(dplResult.Hits.Select(x => x.Id)); return(result); }
public BlacklistQueryResult Search(SearchDomainBlacklistRequest model) { Establish.For(model, nameof(model)).IsNotNull() .Property(x => x.Uri, nameof(model.Uri), e => e.IsNotNull().Satisfies(x => Uri.IsWellFormedUriString(x, UriKind.Absolute))); var uri = new Uri(model.Uri); var query = new DplSearch(); query.AddClause(DplFields.Notes, DplSearchMatchType.Contains, uri.DnsSafeHost); var dplResult = CSDenialService.SearchDpl(query); var result = new BlacklistQueryResult(dplResult.Hits.Select(x => x.Id)); return(result); }
public DplSearchResult SearchDpl(DplSearch searchQuery) { if (searchQuery == null) { throw new ArgumentNullException(nameof(searchQuery)); } var clauses = searchQuery.GetClauses(); if (!clauses.Any()) { throw new ArgumentException("DPL Search does not contain any clauses.", nameof(searchQuery)); } IEnumerable <DplEntry> entries = Repository.DplEntries; foreach (var clause in clauses) { switch (clause.MatchType) { case DplSearchMatchType.Exact: switch (clause.DplField) { case DplFields.City: entries = entries.Where(x => string.Equals(x.City, clause.Value, StringComparison.OrdinalIgnoreCase)); break; case DplFields.CountryCode: entries = entries.Where(x => string.Equals(x.CountryCode, clause.Value, StringComparison.OrdinalIgnoreCase)); break; case DplFields.Name: entries = entries.Where(x => string.Equals(x.Name, clause.Value, StringComparison.OrdinalIgnoreCase)); break; case DplFields.Notes: entries = entries.Where(x => string.Equals(x.Notes, clause.Value, StringComparison.OrdinalIgnoreCase)); break; case DplFields.StateCode: entries = entries.Where(x => string.Equals(x.StateCode, clause.Value, StringComparison.OrdinalIgnoreCase)); break; } break; case DplSearchMatchType.Similar: float threshold = 0.3125f; switch (clause.DplField) { case DplFields.City: entries = entries.Where(x => (Levenshtein.CalculateDistance(x.City, clause.Value, 1) / (float)clause.Value.Length) < threshold); break; case DplFields.CountryCode: entries = entries.Where(x => (Levenshtein.CalculateDistance(x.CountryCode, clause.Value, 1) / (float)clause.Value.Length) < threshold); break; case DplFields.Name: entries = entries.Where(x => (Levenshtein.CalculateDistance(x.Name, clause.Value, 1) / (float)clause.Value.Length) < threshold); break; case DplFields.Notes: entries = entries.Where(x => (Levenshtein.CalculateDistance(x.Notes, clause.Value, 1) / (float)clause.Value.Length) < threshold); break; case DplFields.StateCode: entries = entries.Where(x => (Levenshtein.CalculateDistance(x.StateCode, clause.Value, 1) / (float)clause.Value.Length) < threshold); break; } break; case DplSearchMatchType.Contains: switch (clause.DplField) { case DplFields.City: entries = entries.Where(x => x.City.IndexOf(clause.Value, StringComparison.OrdinalIgnoreCase) != -1); break; case DplFields.CountryCode: entries = entries.Where(x => x.CountryCode.IndexOf(clause.Value, StringComparison.OrdinalIgnoreCase) != -1); break; case DplFields.Name: entries = entries.Where(x => x.Name.IndexOf(clause.Value, StringComparison.OrdinalIgnoreCase) != -1); break; case DplFields.Notes: entries = entries.Where(x => x.Notes.IndexOf(clause.Value, StringComparison.OrdinalIgnoreCase) != -1); break; case DplFields.StateCode: entries = entries.Where(x => x.StateCode.IndexOf(clause.Value, StringComparison.OrdinalIgnoreCase) != -1); break; } break; default: throw new ArgumentException($"{nameof(DplSearchMatchType)} value not defined.", nameof(searchQuery)); } } var hits = entries.ToList(); var result = new DplSearchResult() { Hits = hits, TotalHits = hits.Count, ReportDateTime = DateTime.Now }; return(result); }