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); }
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); }
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 }); }
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); }
public bool CheckFullTextSearchEnable() { return(_factoryIndexer.CheckState()); }