Пользовательский отчет Sitecore Analytics - PullRequest
0 голосов
/ 28 сентября 2018

Мы разработали специальный аналитический отчет в Sitecore 8.2.6, чтобы получать контактные визиты разных компаний из БД Mongo и запускать его как пользовательский отчет вместо Sitecore из коробки в соответствии с пользовательскими условиями.Использует Solr Search (4.6.1).Он отлично работает на Dev и staging, но возвращает ошибку из-за большого объема записей в базе данных prod (200000 индексов). Ошибка в том, что он останавливает обработку и сайт не загружается.

Ниже приведенисходный код.

открытый класс NewPageVisitors {public static ISearchIndex AnalyticsIndex {get {return SolrContentSearchManager.GetIndex ("sitecore_analytics_index");}}

    public List<string> getCompanies()
    {
        List<string> lstCompanies = new List<string>();
        try
        {
            var indexedContacts = getIndexedContacts();
            foreach (IndexedContact contact in indexedContacts)
            {
                lstCompanies.Add(contact.Tags.Distinct().Where(item => item.Contains("Company")).FirstOrDefault().Split(':')[1]);
            }
            return lstCompanies.Distinct().ToList();
        }
        catch (Exception ex)
        {
            Sitecore.Diagnostics.Log.Error("ExportDataException", ex, this);
            return lstCompanies;
        };
    }
    public List<IndexedContact> getIndexedContacts()
    {
        List<IndexedContact> lstIndexedContacts = new List<IndexedContact>();
        try
        {
            using (var context = AnalyticsIndex.CreateSearchContext(SearchSecurityOptions.DisableSecurityCheck))
            {
                var indexedIdentifiedContacts = context.GetQueryable<IndexedContact>().ToList();
                lstIndexedContacts.AddRange(indexedIdentifiedContacts.Where(con => !string.IsNullOrWhiteSpace(con.Identifier) && con.Tags != null).ToList());
                lstIndexedContacts.AddRange(indexedIdentifiedContacts.Where(con => string.IsNullOrWhiteSpace(con.Identifier) && con.Tags != null).ToList());

                return lstIndexedContacts.ToList();
            }

        }
        catch (Exception ex)
        {
            Sitecore.Diagnostics.Log.Error("ExportDataException", ex, this);
            return lstIndexedContacts;
        }

    }

    public List<Guid> getCompanySpecificContactIDs(List<string> lstcompanyNames, List<IndexedContact> lstcontacts)
    {
        List<Guid> lstcontactids = new List<Guid>();
        try
        {
            if (lstcompanyNames != null && lstcompanyNames.Count>0)
            {
                foreach (string companyname in lstcompanyNames)
                {
                    foreach (IndexedContact contact in lstcontacts)
                    {
                        string contactcompanyname = contact.Tags.Distinct().Where(item => item.Contains("Company")).FirstOrDefault().Split(':')[1];
                        if (contactcompanyname.Trim() == companyname.Trim())
                        {
                            lstcontactids.Add(contact.ContactId);
                        }
                    }
                }
            }
            return lstcontactids;
        }
        catch (Exception ex)
        {
            Sitecore.Diagnostics.Log.Error("ExportDataException", ex, this);
            return lstcontactids;
        }
    }

    public List<Guid> getAllContactIDs(List<IndexedContact> indexedContacts)
    {
        try
        {
            List<Guid> contactids = indexedContacts.Select(s => s.ContactId).ToList();

            return contactids;
        }
        catch (Exception ex)
        {
            Sitecore.Diagnostics.Log.Error("ExportDataException", ex, this);
            return null;

        }
    }

    public List<IndexedVisit> getIndexedVisits(List<Guid> contactIds,bool isCompanySelected)
    {
        List<IndexedVisit> lstindexedVisists = new List<IndexedVisit>();
        try
        {
            using (var context = AnalyticsIndex.CreateSearchContext(SearchSecurityOptions.DisableSecurityCheck))
            {
                if (isCompanySelected)
                {
                    lstindexedVisists = context.GetQueryable<IndexedVisit>().Where(visit => contactIds.Contains(visit.ContactId)).ToList();
                }
                else
                {
                    lstindexedVisists = context.GetQueryable<IndexedVisit>().ToList();
                    lstindexedVisists = lstindexedVisists.Where(visit => contactIds.Contains(visit.ContactId)).ToList();
                }
                return lstindexedVisists;
            }
        }
        catch (Exception ex)
        {
            Sitecore.Diagnostics.Log.Error("ExportDataException", ex, this);
            return lstindexedVisists;
        }

    }
    public List<Guid> getAllInteractionIDs(List<IndexedVisit> indexedVisits)
    {
        try
        {
            if (indexedVisits != null)
            {

                List<Guid> interactionids = new List<Guid>(indexedVisits.Select(s => s.InteractionId));
                return interactionids;
            }
            else
            {
                return null;
            }
        }
        catch (Exception ex)
        {
            Sitecore.Diagnostics.Log.Error("ExportDataException", ex, this);
            return null;

        }
    }
    public List<IndexedVisitPage> getIndexedVisitPages(List<Guid> interactionIds,bool IsCompanySelected)
    {
        List<IndexedVisitPage> lstIndexedVisitPages = new List<IndexedVisitPage>();
        try
        {
            using (var context = AnalyticsIndex.CreateSearchContext(SearchSecurityOptions.DisableSecurityCheck))
            {
                if (IsCompanySelected)
                {
                    lstIndexedVisitPages = context.GetQueryable<IndexedVisitPage>().Where(visitpage => interactionIds.Contains(visitpage.InteractionId)).ToList();
                }
                else
                {
                    lstIndexedVisitPages = context.GetQueryable<IndexedVisitPage>().ToList();
                    lstIndexedVisitPages=lstIndexedVisitPages.Where(visitpage => interactionIds.Contains(visitpage.InteractionId)).ToList();
                }
                return lstIndexedVisitPages;
            }
        }
        catch (Exception ex)
        {
            Sitecore.Diagnostics.Log.Error("ExportDataException", ex, this);
            return lstIndexedVisitPages;
        }

    }

    public object BindChartData(List<IndexedContact> indexedContacts, List<IndexedVisit> indexedVisitresult, List<IndexedVisitPage> indexedVisitPageresult)
    {
        try
        {
            var finalreportdata = from IndexedVisit in indexedVisitresult
                                  join IndexedContact in indexedContacts
                                  on IndexedVisit.ContactId equals IndexedContact.ContactId
                                  let contactVisit = new { IndexedVisit, IndexedContact }
                                  join IndexedVisitPage in indexedVisitPageresult
                                  on contactVisit.IndexedVisit.InteractionId equals IndexedVisitPage.InteractionId
                                      into entireVisit
                                  select new
                                  {
                                      contactVisit.IndexedVisit,
                                      contactVisit.IndexedContact,
                                      entireVisit
                                  };
            return finalreportdata;
        }
        catch (Exception ex)
        {
            return null;
        }
    }
    public static string getItemname(string itempath)
    {
        try
        {
            Database webdb = Factory.GetDatabase("web");
            string itemPath = itempath.Split('?')[0];
            if (!string.IsNullOrEmpty(itemPath))
            {
                Item item = webdb.GetItem(StringConstants.SitecoreItemsPrefixPath + itemPath);
                if (item != null)
                {
                    return item.Name;

                }
            }


        }
        catch (Exception ex)
        {
            return "";
        }
        return "";
    }

    public List<string> getproductcodes(string itempath)
    {
        List<string> lstProductCodeNames = new List<string>();
        try
        {
            Item item = null;
            Database webdb = Factory.GetDatabase("web");
            string itemPath = itempath.Split('?')[0];

            if (!string.IsNullOrEmpty(itemPath))
            {
                item = webdb.GetItem(StringConstants.SitecoreItemsPrefixPath + itemPath);
            }
            if (item != null)
            {
                if (ismembertemplate(item))
                {
                    MultilistField mlfProductCodes = item.Fields["Product Codes"];
                    if (!(mlfProductCodes.GetItems().Length == 0))
                    {
                        foreach (var product in mlfProductCodes.GetItems())
                        {
                            lstProductCodeNames.Add(product.Name);
                        }
                        return lstProductCodeNames;
                    }

                }
            }
            return lstProductCodeNames;

        }
        catch (Exception ex)
        {
            return lstProductCodeNames;
        }


    }
    public bool ismembertemplate(Item item)
    {
        if (item.TemplateID.ToString() == ItemIDs.GenericMemberContentTemplateID.ToString() || item.TemplateID.ToString() == ItemIDs.MemberServiceOverviewTemplateID.ToString() || item.TemplateID.ToString() == ItemIDs.MemberContentPagenoToCTemplateID.ToString() || item.TemplateID.ToString() == ItemIDs.MemberContentPageTemplateID.ToString())
        {
            return true;

        }
        return false;
    }


}

Пожалуйста, сообщите, если подход должен быть изменен, или настройки, которые могут быть выполнены в приведенном выше коде.

Спасибо, Паван

...