Exemplo n.º 1
0
        private void UpdateIndexerTags(List <int> ids, UpdateAction action, int tagId)
        {
            if (!FactoryIndexer <MailWrapper> .Support || !FactoryIndexer.CheckState(false))
            {
                return;
            }

            if (ids == null || !ids.Any())
            {
                return;
            }

            var data = new MailWrapper
            {
                Tags = new List <TagWrapper>
                {
                    new TagWrapper
                    {
                        Id = tagId
                    }
                }
            };

            Expression <Func <Selector <MailWrapper>, Selector <MailWrapper> > > exp =
                s => s.In(m => m.Id, ids.ToArray());

            Factory.IndexEngine.Update(data, exp, action, s => s.Tags);
        }
Exemplo n.º 2
0
        public bool IsIndexAvailable()
        {
            if (!FactoryIndexer <MailWrapper> .Support)
            {
                Log.Info("[SKIP INDEX] IsIndexAvailable->FactoryIndexer<MailWrapper>.Support == false");
                return(false);
            }

            if (!FactoryIndexer.CheckState(false))
            {
                Log.Info("[SKIP INDEX] IsIndexAvailable->FactoryIndexer.CheckState(false) == false");
                return(false);
            }

            return(true);
        }
Exemplo n.º 3
0
 public override string Check(int tenantId)
 {
     try
     {
         return(FactoryIndexer.CheckState()
             ? HealthCheckResource.FullTextIndexServiceWorksCorrectMsg
             : HealthCheckResource.FullTextIndexServiceWorksIncorrectMsg);
     }
     catch (Exception ex)
     {
         log.ErrorFormat("TextIndexer is failed! {0}, innerException = {1}", ex,
                         ex.InnerException != null ? ex.InnerException.Message : string.Empty);
         ReflectionTypeLoadException reflectionTypeLoadException = ex as ReflectionTypeLoadException;
         if (reflectionTypeLoadException != null)
         {
             foreach (var loaderException in reflectionTypeLoadException.LoaderExceptions)
             {
                 log.ErrorFormat("loaderException = {0}", loaderException.ToString());
             }
         }
         return(HealthCheckResource.FullTextIndexServiceWorksIncorrectMsg);
     }
 }
        public override Exp GetExpression()
        {
            var exp = base.GetExpression();

            if (!string.IsNullOrEmpty(SearchTerm))
            {
                var bySearch = Exp.Empty;

                if (FactoryIndexer <MailContactWrapper> .Support && FactoryIndexer.CheckState(false))
                {
                    var selector = new Selector <MailContactWrapper>()
                                   .MatchAll(SearchTerm)
                                   .Where(s => s.User, new Guid(User));

                    if (InfoType.HasValue)
                    {
                        selector.InAll(s => s.InfoList.Select(i => i.InfoType), new[] { (int)InfoType.Value });
                    }

                    if (IsPrimary.HasValue)
                    {
                        selector.InAll(s => s.InfoList.Select(i => i.IsPrimary), new[] { IsPrimary.Value });
                    }

                    List <int> ids;
                    if (FactoryIndexer <MailContactWrapper> .TrySelectIds(s => selector, out ids))
                    {
                        bySearch = Exp.In(ContactsTable.Columns.Id.Prefix(MAIL_CONTACTS), ids); // if ids.length == 0 then IN (1=0) - equals to no results
                    }
                }

                if (bySearch == Exp.Empty)
                {
                    var contactInfoQuery = new SqlQuery(ContactInfoTable.TABLE_NAME.Alias(CONTACT_INFO))
                                           .Distinct()
                                           .Select(ContactInfoTable.Columns.ContactId.Prefix(CONTACT_INFO))
                                           .Where(ContactInfoTable.Columns.Tenant.Prefix(CONTACT_INFO), Tenant)
                                           .Where(ContactInfoTable.Columns.User.Prefix(CONTACT_INFO), User)
                                           .Where(Exp.Like(ContactInfoTable.Columns.Data.Prefix(CONTACT_INFO), SearchTerm, SqlLike.AnyWhere));

                    if (IsPrimary.HasValue)
                    {
                        contactInfoQuery.Where(Exp.Eq(ContactInfoTable.Columns.IsPrimary.Prefix(CONTACT_INFO), IsPrimary.Value));
                    }

                    if (InfoType.HasValue)
                    {
                        contactInfoQuery.Where(Exp.Eq(ContactInfoTable.Columns.Type.Prefix(CONTACT_INFO), (int)InfoType.Value));
                    }

                    bySearch =
                        Exp.Or(
                            Exp.Like(ContactsTable.Columns.Description.Prefix(MAIL_CONTACTS), SearchTerm,
                                     SqlLike.AnyWhere),
                            Exp.Or(
                                Exp.Like(ContactsTable.Columns.ContactName.Prefix(MAIL_CONTACTS), SearchTerm,
                                         SqlLike.AnyWhere),
                                Exp.In(ContactsTable.Columns.Id.Prefix(MAIL_CONTACTS), contactInfoQuery)));
                }

                exp &= bySearch;
            }

            if (Type.HasValue)
            {
                exp &= Exp.Eq(ContactsTable.Columns.Type.Prefix(MAIL_CONTACTS), Type.Value);
            }

            return(exp);
        }
 public object Test()
 {
     return(FactoryIndexer.CheckState() ?
            new { success = true, message = Resource.FullTextSearchServiceIsRunning } :
            new { success = false, message = Resource.FullTextSearchServiceIsNotRunning });
 }
Exemplo n.º 6
0
        private List <MailMessageData> GetFilteredConversations(IDaoFactory daoFactory, MailSearchFilterData filter, out bool hasMore)
        {
            var conversations = new List <MailMessageData>();
            var skipFlag      = false;
            var chunkIndex    = 0;

            if (filter.FromDate.HasValue && filter.FromMessage.HasValue && filter.FromMessage.Value > 0)
            {
                skipFlag = true;
            }

            var prevFlag   = filter.PrevFlag.GetValueOrDefault(false);
            var tenantInfo = CoreContext.TenantManager.GetTenant(Tenant);
            var utcNow     = DateTime.UtcNow;
            var pageSize   = filter.PageSize.GetValueOrDefault(25);

            var daoMailInfo = daoFactory.CreateMailInfoDao(Tenant, User);

            while (conversations.Count < pageSize + 1)
            {
                filter.PageSize = CHUNK_SIZE * pageSize;

                IMessagesExp exp = null;

                if (!filter.IsDefault() && FactoryIndexer <MailWrapper> .Support && FactoryIndexer.CheckState(false))
                {
                    filter.Page = chunkIndex * CHUNK_SIZE * pageSize; // Elastic Limit from {index of last message} to {count of messages}

                    List <MailWrapper> mailWrappers;
                    if (FilterChainMessagesExp.TryGetFullTextSearchChains(filter, User, out mailWrappers))
                    {
                        if (!mailWrappers.Any())
                        {
                            break;
                        }

                        var ids = mailWrappers.Select(c => c.Id).ToList();

                        var query = SimpleMessagesExp.CreateBuilder(Tenant, User)
                                    .SetMessageIds(ids)
                                    .SetOrderBy(filter.Sort);

                        if (prevFlag)
                        {
                            query.SetOrderAsc(!(filter.SortOrder == Defines.ASCENDING));
                        }
                        else
                        {
                            query.SetOrderAsc(filter.SortOrder == Defines.ASCENDING);
                        }

                        exp = query
                              .Build();
                    }
                }
                else
                {
                    filter.Page = chunkIndex; // MySQL Limit from {page by size} to {size}

                    exp = new FilterChainMessagesExp(filter, Tenant, User);
                }

                chunkIndex++;

                var listMessages = daoMailInfo.GetMailInfoList(exp, true)
                                   .ConvertAll(m => MessageEngine.ToMailMessage(m, tenantInfo, utcNow));

                if (0 == listMessages.Count)
                {
                    break;
                }

                if (skipFlag && filter.FromMessage.HasValue)
                {
                    var messageData = listMessages.FirstOrDefault(m => m.Id == filter.FromMessage.Value);

                    if (messageData != null)
                    {
                        // Skip chain messages by FromMessage.
                        listMessages =
                            listMessages.Where(
                                m => !(m.ChainId.Equals(messageData.ChainId) && m.MailboxId == messageData.MailboxId))
                            .ToList();
                    }

                    skipFlag = false;
                }

                foreach (var messageData in listMessages)
                {
                    var existingChainIndex =
                        conversations.FindIndex(
                            c => c.ChainId == messageData.ChainId && c.MailboxId == messageData.MailboxId);

                    if (existingChainIndex > -1)
                    {
                        if (conversations[existingChainIndex].Date < messageData.Date)
                        {
                            conversations[existingChainIndex] = messageData;
                        }
                    }
                    else
                    {
                        conversations.Add(messageData);
                    }
                }

                if (conversations.Count > pageSize)
                {
                    break;
                }
            }

            hasMore = conversations.Count > pageSize;

            if (hasMore)
            {
                conversations = conversations.Take(pageSize).ToList();
            }

            if (prevFlag)
            {
                conversations.Reverse();
            }

            return(conversations);
        }
Exemplo n.º 7
0
 public bool CheckFullTextSearchEnable()
 {
     return(_factoryIndexer.CheckState());
 }