Exemple #1
0
        private TextEntities ConvertToTextEntities(List <EnrichTextDataItem> enrichTextItems)
        {
            var result = new TextEntities();

            foreach (EnrichTextDataItem item in enrichTextItems)
            {
                if (item.JsonData.IsNullOrEmpty())
                {
                    continue;
                }
                if (item.Type == EnrchTextEntityType.Organization)
                {
                    result.Organizations.Add(Json.Deserialize <OrganizationEntity>(item.JsonData));
                }
                else if (item.Type == EnrchTextEntityType.Address)
                {
                    result.Addresses.Add(Json.Deserialize <AddressEntity>(item.JsonData));
                }
                else if (item.Type == EnrchTextEntityType.Communication)
                {
                    result.Communications.Add(Json.Deserialize <CommunicationEntity>(item.JsonData));
                }
                else if (item.Type == EnrchTextEntityType.Contact)
                {
                    result.Contacts.Add(Json.Deserialize <ContactEntity>(item.JsonData));
                }
                else if (item.Type == EnrchTextEntityType.Job)
                {
                    result.Jobs.Add(Json.Deserialize <JobEntity>(item.JsonData));
                }
            }
            return(result);
        }
Exemple #2
0
        private void UpdateAccountIdentificationInfo(Guid enrchEmailDataId, TextEntities textEntities,
                                                     bool isNewEnrichedData)
        {
            HashSet <OrganizationEntity> organizations = textEntities.Organizations;

            foreach (OrganizationEntity organizationEntity in organizations)
            {
                bool isAccountIdentified = false;
                if (!isNewEnrichedData)
                {
                    string organizationHash = organizationEntity.GetHash();
                    isAccountIdentified = CheckActualAccountIdentification(organizationHash, enrchEmailDataId);
                }
                if (isAccountIdentified)
                {
                    continue;
                }
                IEnumerable <Guid>        accountIds;
                AccountIdentificationType identificationType = _enrichEntitySearchHelper
                                                               .IdentifyAccount(organizationEntity, textEntities, out accountIds);
                if (!accountIds.IsNullOrEmpty())
                {
                    Guid entityId = GetTextEntityId(enrchEmailDataId, isNewEnrichedData, organizationEntity);
                    if (entityId.IsEmpty())
                    {
                        continue;
                    }
                    _enrichEntitySearchHelper.AddFoundAccounts(entityId, accountIds, identificationType);
                }
            }
        }
Exemple #3
0
        /// <summary>
        /// Updates the account identification information.
        /// </summary>
        /// <param name="enrichTextItems">The enrich text items.</param>
        /// <returns></returns>
        public List <EnrichAccountItem> UpdateAccountIdentificationInfo(List <EnrichTextDataItem> enrichTextItems)
        {
            TextEntities textEntities = ConvertToTextEntities(enrichTextItems);
            HashSet <OrganizationEntity> organizations = textEntities.Organizations;
            var result = new List <EnrichAccountItem>();

            foreach (OrganizationEntity organizationEntity in organizations)
            {
                IEnumerable <Guid>        accountIds;
                AccountIdentificationType identificationType = IdentifyAccount(organizationEntity, textEntities,
                                                                               out accountIds);
                var guids = accountIds != null?accountIds.ToList() : null;

                if (!guids.IsNullOrEmpty())
                {
                    Guid entityId = organizationEntity.Id;
                    AddFoundAccounts(entityId, guids, identificationType);
                    foreach (Guid id in guids)
                    {
                        result.Add(new EnrichAccountItem {
                            Id = id,
                            EnrchTextEntityId = entityId
                        });
                    }
                }
            }
            return(result);
        }
Exemple #4
0
        /// <summary>
        /// Gets the emails.
        /// </summary>
        /// <param name="textEntities">The text entities.</param>
        /// <param name="parentEntityId">The parent entity identifier.</param>
        /// <returns></returns>
        public static List <string> GetEmails(TextEntities textEntities, Guid parentEntityId)
        {
            List <string> emails = textEntities.Communications
                                   .Where(entity => entity.Type == EnrchCommunicationType.Email && entity.ContactId == parentEntityId)
                                   .Select(entity => entity.Value)
                                   .ToList();

            return(emails);
        }
Exemple #5
0
        /// <summary>
        /// Gets the phones.
        /// </summary>
        /// <param name="textEntities">The text entities.</param>
        /// <param name="parentEntityId">The parent entity identifier.</param>
        /// <returns></returns>
        public static List <string> GetPhones(TextEntities textEntities, Guid parentEntityId)
        {
            List <string> phones = textEntities.Communications
                                   .Where(entity => entity.IsPhone && entity.Type == EnrchCommunicationType.Mobile &&
                                          entity.ContactId == parentEntityId)
                                   .Select(entity => entity.Value)
                                   .ToList();

            return(phones);
        }
Exemple #6
0
        private Entity CreateNewEnrichedData(TextEntities emailEntities)
        {
            EntitySchema enrchEmailDataSchema = _userConnection.EntitySchemaManager.GetInstanceByName("EnrchEmailData");
            Entity       newEnrichedData      = enrchEmailDataSchema.CreateEntity(_userConnection);

            newEnrichedData.SetDefColumnValues();
            newEnrichedData.SetColumnValue("JsonData", JsonConvert.SerializeObject(emailEntities));
            newEnrichedData.SetColumnValue("Hash", emailEntities.GetHash());
            newEnrichedData.Save();
            return(newEnrichedData);
        }
        public ActionResult Details(string id)
        {
            if (!string.IsNullOrEmpty(id))
            {
                var               db     = new TextEntities();
                List <UserInfo>   dbInfo = db.UserInfo.ToList();
                UserInfoViewModel a      = new UserInfoViewModel();
                a.UserID   = dbInfo[int.Parse(id)].UserID;
                a.UserName = dbInfo[int.Parse(id)].UserName;
                a.Phone    = dbInfo[int.Parse(id)].Phone;
                a.Email    = dbInfo[int.Parse(id)].Email;

                return(View(a));
            }
            return(View());
        }
 public ActionResult Delete(string id)
 {
     try
     {
         var             db     = new TextEntities();
         List <UserInfo> dbInfo = db.UserInfo.ToList();
         db.UserInfo.Remove(dbInfo[int.Parse(id)]);
         db.SaveChanges();
         return(RedirectToAction("UserList"));
     }
     catch
     {
         ViewData["Message"] = "刪除失敗了唷!";
         return(View("UserList"));
     }
 }
        public ActionResult Edit(string id)
        {
            var             db            = new TextEntities();
            List <UserInfo> dbInfo        = db.UserInfo.ToList();
            var             viewModelList = new List <UserInfoViewModel>();
            var             tmpInfo       = new UserInfoViewModel()
            {
                UserID   = dbInfo[int.Parse(id)].UserID,
                UserName = dbInfo[int.Parse(id)].UserName,
                Phone    = dbInfo[int.Parse(id)].Phone,
                Email    = dbInfo[int.Parse(id)].Email,
            };

            viewModelList.Add(tmpInfo);
            return(View(viewModelList));
        }
Exemple #10
0
 private void ActualizeTextEntityHash(List <TextEntityData> textEntityDatas, Type type)
 {
     foreach (TextEntityData textEntityData in textEntityDatas)
     {
         var entity = (MiningEntity)JsonConvert.DeserializeObject(textEntityData.EteJsonData, type);
         if (entity != null)
         {
             textEntityData.EteUpdatedHash = entity.GetHash();
         }
         TextEntities textEntities = JsonConvert.DeserializeObject <TextEntities>(textEntityData.EedJsonData);
         if (textEntities != null)
         {
             textEntityData.EedUpdatedHash = textEntities.GetHash();
         }
     }
 }
Exemple #11
0
        /// <summary>
        /// Executes chain identification for account by name and communicatications.
        /// </summary>
        /// <param name="organizationEntity">The organization entity.</param>
        /// <param name="textEntities">The text entities.</param>
        /// <param name="accountIds">The account ids.</param>
        /// <returns></returns>
        public AccountIdentificationType IdentifyAccount(OrganizationEntity organizationEntity,
                                                         TextEntities textEntities, out IEnumerable <Guid> accountIds)
        {
            accountIds = _accountSearcher.SearchByName(organizationEntity.Value);
            if (!accountIds.IsNullOrEmpty())
            {
                return(AccountIdentificationType.Name);
            }
            IEnumerable <CommunicationEntity> organizationCommunications =
                from communication in textEntities.Communications
                join contact in textEntities.Contacts on communication.ContactId equals contact.Id
                where contact.OrganizationId == organizationEntity.Id
                select communication;

            return(IdentifyAccountByEte(organizationCommunications.ToList(), out accountIds));
        }
Exemple #12
0
        private Guid FindPrimaryContact(TextEntities textEntities, Guid enrchEmailDataId, bool newContact)
        {
            ContactEntity primaryContact = textEntities.Contacts
                                           .FirstOrDefault(contact => contact.IsFoundInLastEmail);

            if (primaryContact == null)
            {
                return(Guid.Empty);
            }
            if (newContact)
            {
                return(primaryContact.Id);
            }
            else
            {
                string hash = primaryContact.GetHash();
                return(GetTextEntityId(hash, enrchEmailDataId));
            }
        }
Exemple #13
0
        public ActionResult UserList()
        {
            var             db            = new TextEntities();
            List <UserInfo> dbInfo        = db.UserInfo.ToList();
            var             viewModelList = new List <UserInfoViewModel>();

            foreach (UserInfo info in dbInfo)
            {
                var tmpInfo = new UserInfoViewModel()
                {
                    UserID   = info.UserID,
                    UserName = info.UserName,
                    Phone    = info.Phone,
                    Email    = info.Email,
                };
                viewModelList.Add(tmpInfo);
            }
            return(View(viewModelList));
        }
Exemple #14
0
        public ActionResult Create(UserInfo info)
        {
            var             db          = new TextEntities();
            List <UserInfo> dbInfo      = db.UserInfo.ToList();
            var             newuserinfo = new UserInfo();

            foreach (UserInfo theinfo in dbInfo)
            {
                if (info.UserID.Equals(theinfo.UserID))
                {
                    ViewData["Message"] = "客戶編號重複,請更改編號!";
                    return(View());
                }
            }
            newuserinfo = info;
            db.UserInfo.Add(newuserinfo);
            db.SaveChanges();
            return(RedirectToAction("UserList"));
        }
Exemple #15
0
        public ActionResult Details(string id, UserInfo info)
        {
            var             db     = new TextEntities();
            List <UserInfo> dbInfo = db.UserInfo.ToList();

            try
            {
                dbInfo[int.Parse(id)].UserID   = info.UserID;
                dbInfo[int.Parse(id)].UserName = info.UserName;
                dbInfo[int.Parse(id)].Phone    = info.Phone;
                dbInfo[int.Parse(id)].Email    = info.Email;
                db.SaveChanges();
                return(RedirectToAction("UserList"));
            }
            catch
            {
                ViewData["Message"] = "修改出錯了唷!";
                return(RedirectToAction("Edit"));
            }
        }
        private IEnumerable <Guid> FindDuplicateCommunications(Dictionary <Guid, Guid> identifiedContacts,
                                                               TextEntities textEntities)
        {
            List <Guid> duplicateCommunications = new List <Guid>();
            IEnumerable <CommunicationEntity> minedCommunicationEntities = textEntities.Communications
                                                                           .Where(minedCommunication => identifiedContacts.ContainsKey(minedCommunication.ContactId));

            if (minedCommunicationEntities.IsEmpty())
            {
                return(duplicateCommunications);
            }
            Dictionary <Guid, HashSet <string> > phones;
            Dictionary <Guid, HashSet <string> > others;
            HashSet <Guid> contactIds = new HashSet <Guid>(identifiedContacts.Values);

            LoadCommunications(contactIds, out phones, out others);
            foreach (CommunicationEntity minedCommunication in minedCommunicationEntities)
            {
                Guid identifiedContact = identifiedContacts[minedCommunication.ContactId];
                if (minedCommunication.IsPhone)
                {
                    HashSet <string> knownContactPhones = phones[identifiedContact];
                    if (PhoneComparer.MatchAny(minedCommunication.Value, knownContactPhones))
                    {
                        duplicateCommunications.Add(minedCommunication.Id);
                    }
                }
                else
                {
                    HashSet <string> knownOtherCommunications = others[identifiedContact];
                    if (knownOtherCommunications.Contains(minedCommunication.Value))
                    {
                        duplicateCommunications.Add(minedCommunication.Id);
                    }
                }
            }
            return(duplicateCommunications);
        }
        private IEnumerable <Guid> FindDuplicateJobs(Dictionary <Guid, Guid> identifiedContacts,
                                                     TextEntities textEntities)
        {
            List <Guid>             duplicateJobs    = new List <Guid>();
            IEnumerable <JobEntity> minedJobEntities = textEntities.Jobs
                                                       .Where(minedJob => identifiedContacts.ContainsKey(minedJob.ContactId));

            if (minedJobEntities.IsNotEmpty())
            {
                HashSet <Guid>            contactIds = new HashSet <Guid>(identifiedContacts.Values);
                Dictionary <Guid, string> jobs       = LoadInfo(contactIds, "Contact", "JobTitle");
                foreach (JobEntity minedJob in minedJobEntities)
                {
                    Guid   identifiedContact = identifiedContacts[minedJob.ContactId];
                    string knownJob          = jobs[identifiedContact];
                    if (knownJob == minedJob.Value)
                    {
                        duplicateJobs.Add(minedJob.Id);
                    }
                }
            }
            return(duplicateJobs);
        }
        private IEnumerable <Guid> FindDuplicateAddresses(Dictionary <Guid, Guid> identifiedContacts,
                                                          TextEntities textEntities)
        {
            List <Guid> duplicateAddresses = new List <Guid>();
            IEnumerable <AddressEntity> minedAddressEntities = textEntities.Addresses
                                                               .Where(minedAddress => identifiedContacts.ContainsKey(minedAddress.ContactId));

            if (minedAddressEntities.IsNotEmpty())
            {
                HashSet <Guid>            contactIds = new HashSet <Guid>(identifiedContacts.Values);
                Dictionary <Guid, string> addresses  = LoadInfo(contactIds, "Contact", "Address");
                foreach (AddressEntity minedAddress in minedAddressEntities)
                {
                    Guid   identifiedContact = identifiedContacts[minedAddress.ContactId];
                    string knownAddress      = addresses[identifiedContact];
                    if (knownAddress == minedAddress.Value)
                    {
                        duplicateAddresses.Add(minedAddress.Id);
                    }
                }
            }
            return(duplicateAddresses);
        }
Exemple #19
0
        private void AppendSenderEmail(Guid enrchEmailDataId, string senderEmail, bool isFreeDomain,
                                       Guid primaryContact, TextEntities textEntities)
        {
            if (primaryContact.IsEmpty())
            {
                return;
            }
            CommunicationEntity senderEmailEte = new CommunicationEntity {
                Id                 = Guid.NewGuid(),
                Value              = senderEmail,
                ContactId          = primaryContact,
                Type               = EnrchCommunicationType.Email.ToString(),
                IsFoundInLastEmail = true,
                IsPhone            = false,
                IsFreeDomain       = isFreeDomain
            };

            if (textEntities.Communications.Contains(senderEmailEte))
            {
                return;
            }
            string entityHash = senderEmailEte.GetHash();
            var    select     = (Select) new Select(_userConnection)
                                .Column(Func.Count("Id"))
                                .From("EnrchTextEntity")
                                .Where("Hash").IsEqual(Column.Parameter(entityHash))
                                .And("ParentId").IsEqual(Column.Parameter(primaryContact));
            int emailsWithSameHash = select.ExecuteScalar <int>();

            if (emailsWithSameHash > 0)
            {
                return;
            }
            textEntities.Communications.Add(senderEmailEte);
            CreateTextEntity(enrchEmailDataId, senderEmailEte, EnrchTextEntityType.Communication, primaryContact,
                             EnrchTextEntitySource.AppDbActivity, entityHash);
        }
Exemple #20
0
        private Dictionary <Guid, Guid> UpdateContactIdentificationInfo(Guid enrchEmailDataId,
                                                                        TextEntities textEntities, string senderEmail, bool isNewEnrichedData)
        {
            HashSet <ContactEntity> contacts           = textEntities.Contacts;
            Dictionary <Guid, Guid> identifiedContacts = new Dictionary <Guid, Guid>();

            foreach (ContactEntity contactEntity in contacts)
            {
                bool isContactIdentified = false;
                if (!isNewEnrichedData)
                {
                    string contactHash = contactEntity.GetHash();
                    isContactIdentified = CheckActualContactIdentification(contactHash, enrchEmailDataId);
                }
                if (isContactIdentified)
                {
                    continue;
                }
                IEnumerable <Guid>        contactIds;
                ContactIdentificationType identificationType = IdentifyContact(contactEntity, textEntities, senderEmail,
                                                                               out contactIds);
                if (!contactIds.IsNullOrEmpty())
                {
                    if (contactIds.Count() == 1)
                    {
                        identifiedContacts.Add(contactEntity.Id, contactIds.First());
                    }
                    Guid entityId = GetTextEntityId(enrchEmailDataId, isNewEnrichedData, contactEntity);
                    if (entityId.IsEmpty())
                    {
                        continue;
                    }
                    _enrichEntitySearchHelper.AddFoundContacts(entityId, contactIds, identificationType);
                }
            }
            return(identifiedContacts);
        }
Exemple #21
0
 private void CreateEnrichedTextEntities(Guid enrchEmailDataId, TextEntities emailEntities)
 {
     foreach (OrganizationEntity organization in emailEntities.Organizations)
     {
         CreateTextEntity(enrchEmailDataId, organization, EnrchTextEntityType.Organization, Guid.Empty);
     }
     foreach (ContactEntity contact in emailEntities.Contacts)
     {
         CreateTextEntity(enrchEmailDataId, contact, EnrchTextEntityType.Contact, contact.OrganizationId);
     }
     foreach (CommunicationEntity communication in emailEntities.Communications)
     {
         CreateTextEntity(enrchEmailDataId, communication, EnrchTextEntityType.Communication,
                          communication.ContactId);
     }
     foreach (AddressEntity address in emailEntities.Addresses)
     {
         CreateTextEntity(enrchEmailDataId, address, EnrchTextEntityType.Address, address.ContactId);
     }
     foreach (JobEntity job in emailEntities.Jobs)
     {
         CreateTextEntity(enrchEmailDataId, job, EnrchTextEntityType.Job, job.ContactId);
     }
 }
Exemple #22
0
        private ContactIdentificationType IdentifyContact(ContactEntity contactEntity, TextEntities textEntities,
                                                          string senderEmail, out IEnumerable <Guid> contactIds)
        {
            if (contactEntity.IsFoundInLastEmail)
            {
                contactIds = _contactSearcher.SearchByEmails(new List <string> {
                    senderEmail
                });
                if (!contactIds.IsNullOrEmpty())
                {
                    return(ContactIdentificationType.SenderEmail);
                }
            }
            List <string> emails = EnrichEntitySearchHelper.GetEmails(textEntities, contactEntity.Id);

            contactIds = _contactSearcher.SearchByEmails(emails);
            if (!contactIds.IsNullOrEmpty())
            {
                return(ContactIdentificationType.Email);
            }
            contactIds = _contactSearcher.SearchByName(contactEntity.Value);
            if (!contactIds.IsNullOrEmpty())
            {
                return(ContactIdentificationType.Name);
            }
            contactIds = _contactSearcher.SearchByFirstAndLastName(contactEntity.GivenName, contactEntity.Surname);
            if (!contactIds.IsNullOrEmpty())
            {
                return(ContactIdentificationType.FirstLastName);
            }
            List <string> phones = EnrichEntitySearchHelper.GetPhones(textEntities, contactEntity.Id);

            contactIds = _contactSearcher.SearchByPhones(phones);
            if (!contactIds.IsNullOrEmpty())
            {
                return(ContactIdentificationType.Phone);
            }
            return(null);
        }
        /// <summary>
        /// Marks mined entities, that are already present in contact, as duplicates.
        /// </summary>
        /// <param name="identifiedContact">
        /// Dictionary, where key is mined contact text entity id and value is identified contact.
        /// </param>
        /// <param name="entities">Mined entities.</param>
        public void DeduplicateContactData(Dictionary <Guid, Guid> identifiedContacts, TextEntities entities)
        {
            var duplicateCommunications = FindDuplicateCommunications(identifiedContacts, entities);
            var duplicateAddresses      = FindDuplicateAddresses(identifiedContacts, entities);
            var duplicateJobs           = FindDuplicateJobs(identifiedContacts, entities);
            var duplicates = duplicateCommunications.Concat(duplicateAddresses).Concat(duplicateJobs);

            if (duplicates.IsNotEmpty())
            {
                UpdateDuplicateEntities(duplicates);
            }
        }
Exemple #24
0
        private List <MiningResult> ProcessEntities(Dictionary <Entity, GetEmailEntitiesResponse> minedInfo)
        {
            var results = new List <MiningResult>();

            foreach (KeyValuePair <Entity, GetEmailEntitiesResponse> pairs in minedInfo)
            {
                Entity activity = pairs.Key;
                GetEmailEntitiesResponse response = pairs.Value;
                try {
                    if (response.IsFailure)
                    {
                        SetAcivityIsEnriched(activity.PrimaryColumnValue, Guid.Empty, EnrichStatus.Error);
                        continue;
                    }
                    TextEntities          emailEntities     = response.TextEntities;
                    string                entitiesHash      = emailEntities.GetHash();
                    Entity                enrichedRecord    = FindEnrichedData(entitiesHash);
                    bool                  isNewEnrichedData = enrichedRecord == null;
                    Guid                  enrchEmailDataId;
                    EnrichEmailDataStatus status;
                    if (isNewEnrichedData)
                    {
                        enrichedRecord   = CreateNewEnrichedData(emailEntities);
                        enrchEmailDataId = enrichedRecord.PrimaryColumnValue;
                        status           = EnrichEmailDataStatus.Mined;
                        CreateEnrichedTextEntities(enrchEmailDataId, emailEntities);
                    }
                    else
                    {
                        enrchEmailDataId = enrichedRecord.PrimaryColumnValue;
                        status           = enrichedRecord.GetTypedColumnValue <string>("Status");
                    }
                    Guid primaryContactTextEntityId =
                        FindPrimaryContact(emailEntities, enrchEmailDataId, isNewEnrichedData);
                    string sender      = activity.GetTypedColumnValue <string>("Sender");
                    string senderEmail = sender.ExtractEmailAddress();
                    Dictionary <Guid, Guid> identifiedContacts = UpdateContactIdentificationInfo(enrchEmailDataId,
                                                                                                 emailEntities, senderEmail, isNewEnrichedData);
                    UpdateAccountIdentificationInfo(enrchEmailDataId, emailEntities, isNewEnrichedData);
                    if (senderEmail.IsNotNullOrEmpty())
                    {
                        AppendSenderEmail(enrchEmailDataId, senderEmail, response.IsSenderEmailDomainFree,
                                          primaryContactTextEntityId, emailEntities);
                    }
                    _deduplicator.DeduplicateContactData(identifiedContacts, emailEntities);
                    results.Add(new MiningResult {
                        ActivityId           = activity.PrimaryColumnValue,
                        EnrchEmailDataId     = enrchEmailDataId,
                        EnrichStatus         = EnrichStatus.Done,
                        EnrchEmailDataStatus = status
                    });
                    SetAcivityIsEnriched(activity.PrimaryColumnValue, enrichedRecord.PrimaryColumnValue,
                                         EnrichStatus.Done);
                    PublishEmailEnrichmentMetrics(activity);
                } catch (Exception ex) {
                    _log.ErrorFormat("Cannot save enriched data for email id = {0}. Error: {1}",
                                     activity.PrimaryColumnValue, ex);
                }
            }
            return(results);
        }