Exemple #1
0
        public ResultSet <List <IContactSearchResult> > Find(ContactSearchParameters parameters)
        {
            var resultSet = new ResultSet <List <IContactSearchResult> >(parameters.PageNumber, parameters.PageSize);
            var ctx       = ContentSearchManager.GetIndex(CustomerIntelligenceConfig.ContactSearch.SearchIndexName).CreateSearchContext();

            try
            {
                var searchResults = QueryIndex(ctx, parameters);
                var list1         = searchResults.Hits.Select(h => h.Document).ToList();
                resultSet.TotalResultCount = searchResults.TotalSearchResults;
                var list2 = list1.Select(sr =>
                {
                    var contact = BuildBaseResult(sr);
                    var visit   = ctx.GetQueryable <IndexedVisit>().Where(iv => iv.ContactId == contact.ContactId).OrderByDescending(iv => iv.StartDateTime).Take(1).FirstOrDefault();
                    if (visit != null)
                    {
                        PopulateLatestVisit(visit, ref contact);
                    }
                    return(contact);
                }).OrderBy(c => c.FirstName).ThenBy(c => c.LatestVisitStartDateTime).ToList();
                resultSet.Data.Dataset.Add("ContactSearchResults", list2);
            }
            finally
            {
                if (ctx != null)
                {
                    ctx.Dispose();
                }
            }
            return(resultSet);
        }
Exemple #2
0
        public IEnumerable <ContactSearchResult> SearchContacts([FromBody] ContactSearchParameters searchParms)
        {
            TokenManager tm            = new TokenManager();
            int          currentUserId = int.Parse(tm.Payload(Constants.Token_UserId));

            ContactsManager cm = new ContactsManager();

            return(cm.SearchContacts(currentUserId, searchParms));
        }
Exemple #3
0
        /// <summary>
        /// Returns a list of contacts that meet the specified search criteria.
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="searchParms"></param>
        /// <returns></returns>
        public IEnumerable <ContactSearchResult> SearchContacts(int userId, ContactSearchParameters searchParms)
        {
            List <ContactSearchResult> results = new List <ContactSearchResult>();

            // A malformed JSON string can result in a null searchParms argument
            if (searchParms == null)
            {
                return(results);
            }

            // Get out quick if called with no parms.  Is there any need to call this with no parms?
            if (string.IsNullOrEmpty(searchParms.FirstName) &&
                string.IsNullOrEmpty(searchParms.LastName) &&
                string.IsNullOrEmpty(searchParms.PrimaryEmail))
            {
                return(results);
            }

            // Change any null values to empty strings to make the query more forgiving
            if (searchParms.FirstName == null)
            {
                searchParms.FirstName = string.Empty;
            }
            if (searchParms.LastName == null)
            {
                searchParms.LastName = string.Empty;
            }
            if (searchParms.PrimaryEmail == null)
            {
                searchParms.PrimaryEmail = string.Empty;
            }


            using (var db = new CSET_Context())
            {
                var email = db.USERS.Where(x => x.UserId == userId).FirstOrDefault();
                if (email == null)
                {
                    return(results);
                }

                // create a list of user emails already attached to the assessment
                var attachedEmails = db.ASSESSMENT_CONTACTS.Where(x => x.Assessment_Id == searchParms.AssessmentId).ToList().Select(x => x.PrimaryEmail);

                var query = from ac in db.ASSESSMENT_CONTACTS
                            join a in db.ASSESSMENTS on ac.Assessment_Id equals a.Assessment_Id
                            join myac in db.ASSESSMENT_CONTACTS on a.Assessment_Id equals myac.Assessment_Id
                            where ac.FirstName.Contains(searchParms.FirstName) &&
                            ac.LastName.Contains(searchParms.LastName) &&
                            ac.PrimaryEmail.Contains(searchParms.PrimaryEmail)

                            && myac.PrimaryEmail == email.PrimaryEmail

                            // don't include anyone already attached to the current assessment
                            && !attachedEmails.Contains(ac.PrimaryEmail)

                            select new { ac.UserId, ac.FirstName, ac.LastName, ac.PrimaryEmail };

                // Generate a distinct, case-insensitive result list
                var candidates         = query.ToList();
                var filteredCandidates = query.ToList();
                filteredCandidates.Clear();
                foreach (var candidate in candidates)
                {
                    if (!filteredCandidates.Exists(x => String.Equals(x.FirstName, candidate.FirstName, StringComparison.InvariantCultureIgnoreCase) &&
                                                   String.Equals(x.LastName, candidate.LastName, StringComparison.InvariantCultureIgnoreCase) &&
                                                   String.Equals(x.PrimaryEmail, candidate.PrimaryEmail, StringComparison.InvariantCultureIgnoreCase)))
                    {
                        filteredCandidates.Add(candidate);

                        ContactSearchResult r = new ContactSearchResult
                        {
                            UserId       = (int)candidate.UserId,
                            FirstName    = candidate.FirstName,
                            LastName     = candidate.LastName,
                            PrimaryEmail = candidate.PrimaryEmail
                        };

                        results.Add(r);
                    }
                }

                return(results);
            }
        }
Exemple #4
0
        private SearchResults <IndexedContact> QueryIndex(IProviderSearchContext ctx, ContactSearchParameters parameters)
        {
            var queryable = ctx.GetQueryable <IndexedContact>();
            var text      = parameters.Match;

            if (string.IsNullOrEmpty(text.Trim()) || text == "*")
            {
                return(queryable.Page(parameters.PageNumber - 1, parameters.PageSize).GetResults());
            }
            var wildcard = "*" + text + "*";
            var slop     = 10;
            var source   = queryable.Where(q => q.FullName.MatchWildcard(wildcard) || q.Emails.MatchWildcard(wildcard) || q["contact.company"].MatchWildcard(wildcard));

            if (!source.Any())
            {
                source = queryable.Where(q => q.FullName.Like(text, slop) || q.Emails.Like(text, slop) || q["contact.company"].Like(text, slop));
            }
            return(source.Page(parameters.PageNumber - 1, parameters.PageSize).GetResults());
        }