public IHttpActionResult LoggedInClientsThisWeek() { var now = DateTime.Now.Date; var firstDAyOfWeek = now; DateTime tommorw = now.AddDays(1); while (firstDAyOfWeek.DayOfWeek != DayOfWeek.Monday) { firstDAyOfWeek = firstDAyOfWeek.AddDays(-1); } var query = new AnalyticQuery { TabelId = "ga:77407066", StartDate = firstDAyOfWeek, EndDate = now, }; query.Metrics.AddMany("ga:visitors"); query.MaxResults = 500; query.Filters.AddMany("ga:customVarValue3==client"); var result = gaService.Get <NumLoginsThisWeek>(query); if (result.Count() > 0) { var numLoginsThisWeek = result.First().Visitors; return(Ok(new { numLogins = numLoginsThisWeek })); } else { return(Ok(new { numLogins = 0 })); } }
public void WhenIRunQueryResultsAndEnterAFlightIdOfAndAQueryWithAnAnalyticIdOf(int p0, string p1) { var query = new AnalyticQuery(); query.SelectAnalytic(p1); m_result.Object = m_api.Analytics.QueryResults(p0, query); }
public void ImportEvents(int clientId, DateTime fromDate, DateTime toDate) { var exceptions = new List <Exception>(); var clientInDb = clienRepository.Where(c => c.Id == clientId && c.IsActive); if (!clientInDb.Any()) { return; } var client = clientInDb.Single(); var analyticsId = client.AnalyticsTableId; if (string.IsNullOrEmpty(analyticsId)) { throw new Exception("Client has no analytic table Id; client Id:" + clientId); } var query = new AnalyticQuery { TabelId = analyticsId, StartDate = fromDate, EndDate = toDate, }; query.Metrics.AddMany("ga:uniqueEvents", "ga:eventValue"); query.Dimenssions.AddMany("ga:eventAction", "ga:eventLabel", "ga:keyword", "ga:sourceMedium", "ga:dateHour", "ga:campaign", "ga:minute"); query.MaxResults = 10000; query.Filters.AddMany("ga:eventCategory==Helloy Event"); var dataFeed = gaService.Get <EventAnalyticData>(query); if (dataFeed != null && dataFeed.Any()) { foreach (var Event in dataFeed) { try { AddEvent(Event, clientId); } catch (Exception ex) { exceptions.Add(ex); } } contactRepository.SaveChanges(); } if (exceptions.Count > 0) { throw new AggregateException(exceptions); } }
public void NoEntriesNoInsertionInDataBase() { var clientRepositoryMoq = new LocalRepository <Client>(); var contactRepositoryMoq = new Mock <IRepository <Contact> >(); var contactProductService = new Mock <IProductService>(); var contactAutoRating = new Mock <IContactAutoRating>(); var gaService = new Mock <IGoogleAnalyticsApi>(); var client = new Client() { Id = 1, IsActive = true, AnalyticsTableId = "ga:123456" }; clientRepositoryMoq.Add(client); var startDate = new DateTime(2014, 01, 01); var endDate = new DateTime(2014, 01, 03); var analyticQuery = new AnalyticQuery(); analyticQuery.Dimenssions.AddMany("ga:eventAction", "ga:eventLabel", "ga:keyword", "ga:sourceMedium", "ga:dateHour", "ga:minute", "ga:campaign"); analyticQuery.TabelId = clientRepositoryMoq.All().First().AnalyticsTableId; analyticQuery.StartDate = startDate; analyticQuery.EndDate = endDate; analyticQuery.Metrics.AddMany("ga:uniqueEvents", "ga:eventValue"); analyticQuery.Filters.Add("ga:eventCategory==Helloy Event"); gaService.Setup( ga => ga.Get <EventAnalyticData>(It.Is <AnalyticQuery>( aq => !aq.Dimenssions.Except(analyticQuery.Dimenssions).Any() && !aq.Metrics.Except(analyticQuery.Metrics).Any() && !aq.Filters.Except(analyticQuery.Filters).Any() && aq.StartDate == analyticQuery.StartDate && aq.EndDate == analyticQuery.EndDate && aq.TabelId == analyticQuery.TabelId))).Returns((IEnumerable <EventAnalyticData>)null); var customEventsExtractor = new CustomEventsExtractor( clientRepositoryMoq, contactRepositoryMoq.Object, new ServerTime(), contactProductService.Object, contactAutoRating.Object, gaService.Object); customEventsExtractor.ImportEvents(client.Id, startDate, endDate); contactRepositoryMoq.Verify(l => l.SaveChanges(), Times.Never); contactRepositoryMoq.Verify(l => l.Add(It.IsAny <Contact>()), Times.Never); }
public void UpdateContact(int clientId, DateTime fromDate, DateTime toDate) { var clientForAnalytics = clientRepository.Where(l => l.Id == clientId).Single(); var exceptions = new List <Exception>(); if (!clientForAnalytics.IsActive) { throw new InvalidOperationException("Client Not Active"); } if (String.IsNullOrEmpty(clientForAnalytics.AnalyticsTableId)) { throw new InvalidOperationException("No Analytic Table Id for Client:" + clientForAnalytics.Id); } var query = new AnalyticQuery { TabelId = clientForAnalytics.AnalyticsTableId, StartDate = fromDate, EndDate = toDate, }; query.Metrics.AddMany("ga:uniqueEvents"); query.Dimenssions.AddMany("ga:eventAction", "ga:eventLabel", "ga:keyword", "ga:source", "ga:medium", "ga:campaign", "ga:eventCategory"); query.MaxResults = 10000; var dataFeed = gaService.Get <ProductAnalyticData>(query); if (dataFeed != null) { foreach (var analyticForContact in dataFeed) { try { SetContactPropertiesForAnalyticData(analyticForContact); } catch (Exception ex) { exceptions.Add(ex); } } } if (exceptions.Count > 0) { throw new AggregateException(exceptions); } }
public IHttpActionResult GetSearchKeywords(int clientId, DateTime startDate, DateTime endDate) { if (userManager.IsInRole(User.Identity.GetUserId(), "demo")) { var demoKeywords = new List <SearchDetailsRow>(); AddKeywordDemoData(demoKeywords); return(Ok(demoKeywords.OrderByDescending(k => k.ContactCollection.IndexValue))); } var client = clienRepository.Where(c => c.Id == clientId).Single(); var tableId = client.AnalyticsTableId; var query = new AnalyticQuery { TabelId = tableId, StartDate = startDate, EndDate = endDate, }; query.Metrics.AddMany("ga:adClicks", "ga:adCost", "ga:impressions"); query.Dimenssions.AddMany("ga:keyword"); query.MaxResults = 50; query.Filters.AddMany("ga:campaign!~(display)|(retargeting)|(Display)|(Retargeting)|(remarketing)|(Remarketing)", "ga:medium==cpc"); query.Sort = "-ga:adCost"; var keywordFeed = gaService.Get <SearchDetailsRow>(query).ToList(); foreach (var searchDetailsRow in keywordFeed) { var row = searchDetailsRow; var contactsForKeyword = client.Leads.Where( c => c.SearchPhrase != null && c.SearchPhrase.Equals(row.Keyword) && c.Date >= startDate && c.Date <= endDate); var cost = searchDetailsRow.AdCost.HasValue ? (decimal)searchDetailsRow.AdCost : 0m; var clicks = searchDetailsRow.AdClicks.HasValue ? (int)searchDetailsRow.AdClicks : 0; searchDetailsRow.ContactCollection = new ContactCollection(searchDetailsRow.Name, cost, clicks, contactsForKeyword.ToList()); searchDetailsRow.NumContacts = contactsForKeyword.Count(); } if (keywordFeed.Any()) { contactIndexCalculator.SetIndexValues(keywordFeed.Select(k => k.ContactCollection)); } return(Ok(keywordFeed.OrderByDescending(k => k.ContactCollection.IndexValue))); }
public void CanGetCampaignDetailsWithServeralCampaignsIgnoreInvalidData() { var clientRepository = RepositoryHelper.RepositoryLocalWithOneClient; var gaService = new Mock <IGoogleAnalyticsApi>(); var userManager = new Mock <IIdentityMembershipProvider>(); var contactProductService = new Mock <IProductService>(); var contactIndexCalculator = new Mock <IContactIndexCalculator>(); var controller = new SourceController(clientRepository, contactProductService.Object, userManager.Object, gaService.Object, contactIndexCalculator.Object); var startDate = new DateTime(2014, 1, 1); var endDate = new DateTime(2014, 2, 1); var mapRowResponse = new List <CampaignDetails>(); var row1 = new CampaignDetails { Campaign = "Campaign1", SourceMedium = "google/cpc", AdCost = 20, Sessions = 10 }; var row2 = new CampaignDetails { Campaign = "Campaign2", SourceMedium = "Adroll/cpc", AdCost = 30, AdClicksMetric = 20, Sessions = 0 }; var invalidRow = new CampaignDetails { Campaign = "Campaign1", SourceMedium = "google/direct", AdCost = 20, Sessions = 0 }; mapRowResponse.Add(row1); mapRowResponse.Add(row2); mapRowResponse.Add(invalidRow); var contact1 = new Contact() { Date = startDate.AddDays(1), Campaign = "Campaign1" }; var contact2 = new Contact() { Date = startDate.AddDays(1), Campaign = "Campaign2" }; var contactNotInRange = new Contact() { Date = endDate.AddDays(1), Campaign = "Campaign1" }; clientRepository.All().First().Leads.Add(contact1); clientRepository.All().First().Leads.Add(contact2); clientRepository.All().First().Leads.Add(contactNotInRange); var analyticQuery = new AnalyticQuery(); analyticQuery.Dimenssions.AddMany("ga:sourceMedium", "ga:campaign"); analyticQuery.TabelId = clientRepository.All().First().AnalyticsTableId; analyticQuery.StartDate = startDate; analyticQuery.EndDate = endDate; analyticQuery.Metrics.AddMany("ga:adClicks", "ga:adCost", "ga:impressions", "ga:sessions"); analyticQuery.Filters.Add("ga:campaign!=(not set)"); gaService.Setup( ga => ga.Get <CampaignDetails>(It.Is <AnalyticQuery>( aq => !aq.Dimenssions.Except(analyticQuery.Dimenssions).Any() && !aq.Metrics.Except(analyticQuery.Metrics).Any() && !aq.Filters.Except(analyticQuery.Filters).Any() && aq.StartDate == analyticQuery.StartDate && aq.EndDate == analyticQuery.EndDate && aq.TabelId == analyticQuery.TabelId))).Returns(mapRowResponse); contactProductService.Setup(cp => cp.IsValidProduct(It.IsAny <string>(), "cpc")).Returns(true); contactProductService.Setup(cp => cp.GetProduct(It.IsAny <string>(), "cpc")).Returns("Display"); var result = controller.GetCampaignsDetail(1, startDate, endDate) as OkNegotiatedContentResult <IEnumerable <CampaignDetails> >; Assert.AreEqual(2, result.Content.Count()); Assert.AreEqual(10, result.Content.Single(c => c.Campaign == "Campaign1").AdClicks); Assert.AreEqual(10, result.Content.Single(c => c.Campaign == "Campaign1").Sessions); Assert.AreEqual(false, result.Content.Single(c => c.Campaign == "Campaign1").AdClicksMetric.HasValue); Assert.AreEqual(20, result.Content.Single(c => c.Campaign == "Campaign1").AdCost); Assert.AreEqual("Adwords", result.Content.Single(c => c.Campaign == "Campaign1").AdProvider); Assert.AreEqual("google", result.Content.Single(c => c.Campaign == "Campaign1").Source); Assert.AreEqual("cpc", result.Content.Single(c => c.Campaign == "Campaign1").Medium); Assert.AreEqual("Display", result.Content.Single(c => c.Campaign == "Campaign1").Product); Assert.AreEqual(1, result.Content.Single(c => c.Campaign == "Campaign1").NumContacts); Assert.AreEqual(20, result.Content.Single(c => c.Campaign == "Campaign2").AdClicks); Assert.AreEqual(0, result.Content.Single(c => c.Campaign == "Campaign2").Sessions); Assert.AreEqual(true, result.Content.Single(c => c.Campaign == "Campaign2").AdClicksMetric.HasValue); Assert.AreEqual(20, result.Content.Single(c => c.Campaign == "Campaign2").AdClicksMetric); Assert.AreEqual(30, result.Content.Single(c => c.Campaign == "Campaign2").AdCost); Assert.AreEqual("Adroll", result.Content.Single(c => c.Campaign == "Campaign2").AdProvider); Assert.AreEqual("Adroll", result.Content.Single(c => c.Campaign == "Campaign2").Source); Assert.AreEqual("cpc", result.Content.Single(c => c.Campaign == "Campaign2").Medium); Assert.AreEqual("Display", result.Content.Single(c => c.Campaign == "Campaign2").Product); Assert.AreEqual(1, result.Content.Single(c => c.Campaign == "Campaign2").NumContacts); }
public void CanGetCampaignDetailsReturnsNoCampaignForNoProductAndNoAdClick() { var clientRepository = RepositoryHelper.RepositoryLocalWithOneClient; var gaService = new Mock <IGoogleAnalyticsApi>(); var userManager = new Mock <IIdentityMembershipProvider>(); var contactProductService = new Mock <IProductService>(); var contactIndexCalculator = new Mock <IContactIndexCalculator>(); var controller = new SourceController(clientRepository, contactProductService.Object, userManager.Object, gaService.Object, contactIndexCalculator.Object); var startDate = new DateTime(2014, 1, 1); var endDate = new DateTime(2014, 2, 1); var mapRowResponse = new List <CampaignDetails>(); var row1 = new CampaignDetails { Campaign = "Campaign1", SourceMedium = "google/cpc", AdCost = 20, Sessions = 0 }; var row2 = new CampaignDetails { Campaign = "Campaign2", SourceMedium = "Adroll/cpc", AdCost = 30, AdClicksMetric = 10 }; mapRowResponse.Add(row1); mapRowResponse.Add(row2); var analyticQuery = new AnalyticQuery(); analyticQuery.Dimenssions.AddMany("ga:sourceMedium", "ga:campaign"); analyticQuery.TabelId = clientRepository.All().First().AnalyticsTableId; analyticQuery.StartDate = startDate; analyticQuery.EndDate = endDate; analyticQuery.Metrics.AddMany("ga:adClicks", "ga:adCost", "ga:impressions", "ga:sessions"); analyticQuery.Filters.Add("ga:campaign!=(not set)"); gaService.Setup( ga => ga.Get <CampaignDetails>(It.Is <AnalyticQuery>( aq => !aq.Dimenssions.Except(analyticQuery.Dimenssions).Any() && !aq.Metrics.Except(analyticQuery.Metrics).Any() && !aq.Filters.Except(analyticQuery.Filters).Any() && aq.StartDate == analyticQuery.StartDate && aq.EndDate == analyticQuery.EndDate && aq.TabelId == analyticQuery.TabelId))).Returns(mapRowResponse); contactProductService.Setup(cp => cp.IsValidProduct(It.IsAny <string>(), "cpc")).Returns(false); var result = controller.GetCampaignsDetail(1, startDate, endDate) as OkNegotiatedContentResult <IEnumerable <CampaignDetails> >; Assert.AreEqual(0, result.Content.Count()); }
public void CreateLeadForMoreThanOneEventWithSameDateDifferentTime() { var clientRepositoryMoq = new LocalRepository <Client>(); var contactRepositoryMoq = new Mock <IRepository <Contact> >(); var contactProductService = new Mock <IProductService>(); var contactAutoRating = new Mock <IContactAutoRating>(); var gaService = new Mock <IGoogleAnalyticsApi>(); var dataEntries = new List <EventAnalyticData>(); var dataEntry1 = new EventAnalyticData(); dataEntry1.NumberOfUniqueEvents = 1; dataEntry1.RatingValue = 1; dataEntry1.EventAction = "Test Action"; dataEntry1.EventLabel = "Test Lable"; dataEntry1.EventSearchPhrase = "Some Search Phrase"; dataEntry1.EventSourceMedium = "Source/Medium"; dataEntry1.EventCampaign = "Campaign"; dataEntry1.EventDateHour = "2014010100"; dataEntry1.EventMinute = "00"; dataEntries.Add(dataEntry1); var dataEntry2 = new EventAnalyticData(); dataEntry2.NumberOfUniqueEvents = 1; dataEntry2.RatingValue = 1; dataEntry2.EventAction = "Test Action"; dataEntry2.EventLabel = "Test Lable"; dataEntry2.EventSearchPhrase = "Some Search Phrase"; dataEntry2.EventSourceMedium = "Source/Medium"; dataEntry2.EventCampaign = "Campaign"; dataEntry2.EventDateHour = "2014010100"; dataEntry2.EventMinute = "01"; //======> different Minute dataEntries.Add(dataEntry2); var startDate = new DateTime(2014, 01, 01); var endDate = new DateTime(2014, 01, 03); var client = new Client() { Id = 1, IsActive = true, AnalyticsTableId = "ga:123456" }; clientRepositoryMoq.Add(client); var analyticQuery = new AnalyticQuery(); analyticQuery.Dimenssions.AddMany("ga:eventAction", "ga:eventLabel", "ga:keyword", "ga:sourceMedium", "ga:dateHour", "ga:minute", "ga:campaign"); analyticQuery.TabelId = clientRepositoryMoq.All().First().AnalyticsTableId; analyticQuery.StartDate = startDate; analyticQuery.EndDate = endDate; analyticQuery.Metrics.AddMany("ga:uniqueEvents", "ga:eventValue"); analyticQuery.Filters.Add("ga:eventCategory==Helloy Event"); gaService.Setup( ga => ga.Get <EventAnalyticData>(It.Is <AnalyticQuery>( aq => !aq.Dimenssions.Except(analyticQuery.Dimenssions).Any() && !aq.Metrics.Except(analyticQuery.Metrics).Any() && !aq.Filters.Except(analyticQuery.Filters).Any() && aq.StartDate == analyticQuery.StartDate && aq.EndDate == analyticQuery.EndDate && aq.TabelId == analyticQuery.TabelId))).Returns(dataEntries); var customEventsExtractor = new CustomEventsExtractor( clientRepositoryMoq, contactRepositoryMoq.Object, new ServerTime(), contactProductService.Object, contactAutoRating.Object, gaService.Object); customEventsExtractor.ImportEvents(client.Id, startDate, endDate); contactRepositoryMoq.Verify(l => l.SaveChanges(), Times.Exactly(1)); contactRepositoryMoq.Verify(l => l.Add(It.IsAny <Contact>()), Times.Exactly(2)); }
/// <summary> /// Queries offsets and values in time-series data for a specified flight and analytic. /// </summary> /// <param name="emsSystem"> /// The unique identifier of the EMS system. /// </param> /// <param name="flightId"> /// The integer ID of the flight record for which to query data. /// </param> /// <param name="query"> /// The information used to construct a query for which results are returned. /// </param> public virtual Task <QueryResult> QueryResultsAsync(int flightId, AnalyticQuery query, int emsSystem = NoEmsServerSpecified) { int ems = GetEmsSystemForMethodCall(emsSystem); return(CallApiTask(api => api.GetAnalyticResults(ems, flightId, query.Raw))); }
public void CreateLeadForMoreThanOneUniqueEventIgnoreNullProperties() { var clientRepositoryMoq = new LocalRepository <Client>(); var contactRepository = new LocalRepository <Contact>(); var contactProductService = new Mock <IProductService>(); var contactAutoRating = new Mock <IContactAutoRating>(); var gaService = new Mock <IGoogleAnalyticsApi>(); var dataEntries = new List <EventAnalyticData>(); var dataEntry1 = new EventAnalyticData(); dataEntry1.NumberOfUniqueEvents = 2; dataEntry1.RatingValue = 1; dataEntry1.EventAction = "Test Action"; dataEntry1.EventLabel = "Test Lable"; dataEntry1.EventSearchPhrase = ""; dataEntry1.EventSourceMedium = "Source/Medium"; dataEntry1.EventCampaign = "Campaign"; dataEntry1.EventDateHour = "2014010100"; dataEntry1.EventMinute = "00"; dataEntries.Add(dataEntry1); var startDate = new DateTime(2014, 01, 01); var endDate = new DateTime(2014, 01, 03); var client = new Client() { Id = 1, IsActive = true, AnalyticsTableId = "ga:123456" }; clientRepositoryMoq.Add(client); var analyticQuery = new AnalyticQuery(); analyticQuery.Dimenssions.AddMany("ga:eventAction", "ga:eventLabel", "ga:keyword", "ga:sourceMedium", "ga:dateHour", "ga:minute", "ga:campaign"); analyticQuery.TabelId = clientRepositoryMoq.All().First().AnalyticsTableId; analyticQuery.StartDate = startDate; analyticQuery.EndDate = endDate; analyticQuery.Metrics.AddMany("ga:uniqueEvents", "ga:eventValue"); analyticQuery.Filters.Add("ga:eventCategory==Helloy Event"); gaService.Setup( ga => ga.Get <EventAnalyticData>(It.Is <AnalyticQuery>( aq => !aq.Dimenssions.Except(analyticQuery.Dimenssions).Any() && !aq.Metrics.Except(analyticQuery.Metrics).Any() && !aq.Filters.Except(analyticQuery.Filters).Any() && aq.StartDate == analyticQuery.StartDate && aq.EndDate == analyticQuery.EndDate && aq.TabelId == analyticQuery.TabelId))).Returns(dataEntries); var customEventsExtractor = new CustomEventsExtractor( clientRepositoryMoq, contactRepository, new ServerTime(), contactProductService.Object, contactAutoRating.Object, gaService.Object); contactProductService.Setup(cp => cp.IsValidProduct("Campaign", "Medium")).Returns(true); contactProductService.Setup(cp => cp.GetProduct("Campaign", "Medium")).Returns("Product"); customEventsExtractor.ImportEvents(client.Id, startDate, endDate); Assert.AreEqual(2, contactRepository.All().Count()); Assert.AreEqual("Campaign", contactRepository.All().First().Campaign); Assert.AreEqual("Medium", contactRepository.All().First().Medium); Assert.AreEqual("Source", contactRepository.All().First().Source); Assert.AreEqual("Test Action", contactRepository.All().First().Property.Single(lp => lp.Type == "Action").Value); Assert.AreEqual("Test Lable", contactRepository.All().First().Property.Single(lp => lp.Type == "Label").Value); Assert.AreEqual("Product", contactRepository.All().First().Product); Assert.IsFalse(contactRepository.All().First().Property.Any(lp => lp.Type == "SearchPhrase")); Assert.AreEqual("Campaign", contactRepository.All().Last().Campaign); Assert.AreEqual("Medium", contactRepository.All().Last().Medium); Assert.AreEqual("Source", contactRepository.All().Last().Source); Assert.AreEqual("Test Action", contactRepository.All().Last().Property.Single(lp => lp.Type == "Action").Value); Assert.AreEqual("Test Lable", contactRepository.All().Last().Property.Single(lp => lp.Type == "Label").Value); Assert.AreEqual("Product", contactRepository.All().Last().Product); Assert.IsFalse(contactRepository.All().Last().Property.Any(lp => lp.Type == "SearchPhrase")); }
public void DefaultAnalyticsValuesAreNotImportad() { var clientRepositoryMoq = new LocalRepository <Client>(); var contactRepository = new LocalRepository <Contact>(); var contactProductService = new Mock <IProductService>(); var contactAutoRating = new Mock <IContactAutoRating>(); var gaService = new Mock <IGoogleAnalyticsApi>(); var dataEntries = new List <EventAnalyticData>(); var dataEntry1 = new EventAnalyticData(); dataEntry1.NumberOfUniqueEvents = 1; dataEntry1.RatingValue = 0; dataEntry1.EventAction = "Test Action"; dataEntry1.EventLabel = "Test Lable"; dataEntry1.EventSearchPhrase = "Some Search Phrase"; dataEntry1.EventSourceMedium = "SourceValue / MediumValue"; dataEntry1.EventCampaign = "Campaign 1"; dataEntry1.EventDateHour = "2014010100"; dataEntry1.EventMinute = "00"; dataEntries.Add(dataEntry1); var dataEntry2 = new EventAnalyticData(); dataEntry2.NumberOfUniqueEvents = 1; dataEntry2.RatingValue = 1; dataEntry2.EventAction = "Test Action2"; dataEntry2.EventLabel = "Test Lable2"; dataEntry2.EventSearchPhrase = "(not provided)"; dataEntry2.EventSourceMedium = "(direct) / (none)"; dataEntry2.EventCampaign = "(not set)"; dataEntry2.EventDateHour = "2014010100"; dataEntry2.EventMinute = "01"; dataEntries.Add(dataEntry2); var startDate = new DateTime(2014, 01, 01); var endDate = new DateTime(2014, 01, 03); var client = new Client() { Id = 1, IsActive = true, AnalyticsTableId = "ga:123456" }; clientRepositoryMoq.Add(client); var analyticQuery = new AnalyticQuery(); analyticQuery.Dimenssions.AddMany("ga:eventAction", "ga:eventLabel", "ga:keyword", "ga:sourceMedium", "ga:dateHour", "ga:minute", "ga:campaign"); analyticQuery.TabelId = clientRepositoryMoq.All().First().AnalyticsTableId; analyticQuery.StartDate = startDate; analyticQuery.EndDate = endDate; analyticQuery.Metrics.AddMany("ga:uniqueEvents", "ga:eventValue"); analyticQuery.Filters.Add("ga:eventCategory==Helloy Event"); gaService.Setup( ga => ga.Get <EventAnalyticData>(It.Is <AnalyticQuery>( aq => !aq.Dimenssions.Except(analyticQuery.Dimenssions).Any() && !aq.Metrics.Except(analyticQuery.Metrics).Any() && !aq.Filters.Except(analyticQuery.Filters).Any() && aq.StartDate == analyticQuery.StartDate && aq.EndDate == analyticQuery.EndDate && aq.TabelId == analyticQuery.TabelId))).Returns(dataEntries); var customEventsExtractor = new CustomEventsExtractor( clientRepositoryMoq, contactRepository, new ServerTime(), contactProductService.Object, contactAutoRating.Object, gaService.Object); contactProductService.Setup(ps => ps.IsValidProduct("Campaign 1", "MediumValue")).Returns(true); contactProductService.Setup(ps => ps.GetProduct("Campaign 1", "MediumValue")).Returns("Product1"); customEventsExtractor.ImportEvents(client.Id, startDate, endDate); var contact1 = contactRepository.All().ElementAt(0); var contact2 = contactRepository.All().ElementAt(1); Assert.AreEqual("Some Search Phrase", contact1.SearchPhrase); Assert.AreEqual("SourceValue", contact1.Source); Assert.AreEqual("MediumValue", contact1.Medium); Assert.AreEqual("Campaign 1", contact1.Campaign); Assert.AreEqual("Product1", contact1.Product); Assert.IsNull(contact2.SearchPhrase); Assert.IsNull(contact2.Source); Assert.IsNull(contact2.Medium); Assert.IsNull(contact2.Campaign); }
public void CreateLeadForEventValueDayLightSaving() { var clientRepositoryMoq = new LocalRepository <Client>(); var contactRepository = new LocalRepository <Contact>(); var contactProductService = new Mock <IProductService>(); var contactAutoRating = new Mock <IContactAutoRating>(); var gaService = new Mock <IGoogleAnalyticsApi>(); var dataEntries = new List <EventAnalyticData>(); var dataEntry1 = new EventAnalyticData(); dataEntry1.NumberOfUniqueEvents = 1; dataEntry1.RatingValue = 0; dataEntry1.EventAction = "Test Action"; dataEntry1.EventLabel = "Test Lable"; dataEntry1.EventSearchPhrase = "Some Search Phrase"; dataEntry1.EventSourceMedium = "Source/Medium"; dataEntry1.EventCampaign = "Campaign"; dataEntry1.EventDateHour = "2014052703"; dataEntry1.EventMinute = "00"; dataEntries.Add(dataEntry1); var startDate = new DateTime(2014, 05, 26); var endDate = new DateTime(2014, 05, 28); Client client = new Client() { Id = 1, IsActive = true, AnalyticsTableId = "ga:123456" }; clientRepositoryMoq.Add(client); var analyticQuery = new AnalyticQuery(); analyticQuery.Dimenssions.AddMany("ga:eventAction", "ga:eventLabel", "ga:keyword", "ga:sourceMedium", "ga:dateHour", "ga:minute", "ga:campaign"); analyticQuery.TabelId = clientRepositoryMoq.All().First().AnalyticsTableId; analyticQuery.StartDate = startDate; analyticQuery.EndDate = endDate; analyticQuery.Metrics.AddMany("ga:uniqueEvents", "ga:eventValue"); analyticQuery.Filters.Add("ga:eventCategory==Helloy Event"); gaService.Setup( ga => ga.Get <EventAnalyticData>(It.Is <AnalyticQuery>( aq => !aq.Dimenssions.Except(analyticQuery.Dimenssions).Any() && !aq.Metrics.Except(analyticQuery.Metrics).Any() && !aq.Filters.Except(analyticQuery.Filters).Any() && aq.StartDate == analyticQuery.StartDate && aq.EndDate == analyticQuery.EndDate && aq.TabelId == analyticQuery.TabelId))).Returns(dataEntries); contactProductService.Setup(cp => cp.GetProduct("Campaign", "Medium")).Returns("Product"); var customEventsExtractor = new CustomEventsExtractor( clientRepositoryMoq, contactRepository, new ServerTime(), contactProductService.Object, contactAutoRating.Object, gaService.Object); customEventsExtractor.ImportEvents(client.Id, startDate, endDate); Assert.AreEqual(1, contactRepository.All().Count()); var createdContact = contactRepository.All().First(); Assert.AreEqual(new DateTime(2014, 05, 27, 1, 0, 0), createdContact.Date); Assert.AreEqual("Event", createdContact.LeadType); Assert.AreEqual(1, createdContact.ClientId); }
public void DontCreateLeadForEventsWithSameDateAndTimeWithLeadInDatabase() { var clientRepositoryMoq = new LocalRepository <Client>(); var contactRepositoryMoq = new LocalRepository <Contact>(); var contactProductService = new Mock <IProductService>(); var contactAutoRating = new Mock <IContactAutoRating>(); var serverTime = new Mock <IServerTime>(); var actionProperty = new ContactProperty() { ContactId = 1, Type = "Action", Value = "Test Action" }; var lableProperty = new ContactProperty() { ContactId = 1, Type = "Label", Value = "Test Lable" }; var leadEntry1 = new Contact() { Id = 1, ClientId = 1, LeadType = "Event", Date = new DateTime(2014, 01, 01, 00, 00, 00) }; leadEntry1.Property.Add(actionProperty); leadEntry1.Property.Add(lableProperty); contactRepositoryMoq.Add(leadEntry1); var gaService = new Mock <IGoogleAnalyticsApi>(); var dataEntries = new List <EventAnalyticData>(); var dataEntry1 = new EventAnalyticData(); dataEntry1.NumberOfUniqueEvents = 1; dataEntry1.RatingValue = 1; dataEntry1.EventAction = "Test Action"; dataEntry1.EventLabel = "Test Lable"; dataEntry1.EventSearchPhrase = "Some Search Phrase"; dataEntry1.EventSourceMedium = "Source/Medium"; dataEntry1.EventCampaign = "Campaign"; dataEntry1.EventDateHour = "2014010101"; //==>anothe time zone dataEntry1.EventMinute = "00"; dataEntries.Add(dataEntry1); var startDate = new DateTime(2014, 01, 01); var endDate = new DateTime(2014, 01, 03); var client = new Client() { Id = 1, IsActive = true, AnalyticsTableId = "ga:123456" }; clientRepositoryMoq.Add(client); serverTime.Setup(st => st.ParseToServerTimeZoneFromStandardUser("20140101 01:00:00", "yyyyMMdd HH:mm:ss")) .Returns(leadEntry1.Date); var analyticQuery = new AnalyticQuery(); analyticQuery.Dimenssions.AddMany("ga:eventAction", "ga:eventLabel", "ga:keyword", "ga:sourceMedium", "ga:dateHour", "ga:minute", "ga:campaign"); analyticQuery.TabelId = clientRepositoryMoq.All().First().AnalyticsTableId; analyticQuery.StartDate = startDate; analyticQuery.EndDate = endDate; analyticQuery.Metrics.AddMany("ga:uniqueEvents", "ga:eventValue"); analyticQuery.Filters.Add("ga:eventCategory==Helloy Event"); gaService.Setup( ga => ga.Get <EventAnalyticData>(It.Is <AnalyticQuery>( aq => !aq.Dimenssions.Except(analyticQuery.Dimenssions).Any() && !aq.Metrics.Except(analyticQuery.Metrics).Any() && !aq.Filters.Except(analyticQuery.Filters).Any() && aq.StartDate == analyticQuery.StartDate && aq.EndDate == analyticQuery.EndDate && aq.TabelId == analyticQuery.TabelId))).Returns(dataEntries); var customEventsExtractor = new CustomEventsExtractor( clientRepositoryMoq, contactRepositoryMoq, serverTime.Object, contactProductService.Object, contactAutoRating.Object, gaService.Object); customEventsExtractor.ImportEvents(client.Id, startDate, endDate); Assert.AreEqual(contactRepositoryMoq.All().Count(), 1); }
public void CanGetKeywordsForSearch() { var gaService = new Mock <IGoogleAnalyticsApi>(); var clientRepository = RepositoryHelper.RepositoryLocalWithOneClient; var clientInRepository = clientRepository.All().First(); var contactProductService = new Mock <IProductService>(); var userManager = new Mock <IIdentityMembershipProvider>(); var contactIndexCalculator = new Mock <IContactIndexCalculator>(); var startDate = new DateTime(2013, 1, 1); var endDate = new DateTime(2013, 1, 3); var mapRowResponse = new List <SearchDetailsRow>(); var row1 = new SearchDetailsRow { Keyword = "Keyword1", AdClicks = 10, AdCost = 20, NumVisitors = 40, }; var row2 = new SearchDetailsRow { Keyword = "Keyword2", AdClicks = 11, AdCost = 21, Impressions = 31, ContactCollection = new ContactCollection("Keyword2", 21, 31, new List <Contact>()) { IndexValue = 0.5m } }; var contact1 = new Contact() { Date = startDate.AddDays(1), SearchPhrase = "Keyword1" }; var contact2 = new Contact() { Date = startDate.AddDays(1), SearchPhrase = "Keyword2" }; var contactNotInRange = new Contact() { Date = endDate.AddDays(1), SearchPhrase = "Keyword1" }; clientRepository.All().First().Leads.Add(contact1); clientRepository.All().First().Leads.Add(contact2); clientRepository.All().First().Leads.Add(contactNotInRange); mapRowResponse.Add(row1); mapRowResponse.Add(row2); var analyticQuery = new AnalyticQuery(); analyticQuery.Dimenssions.Add("ga:keyword"); analyticQuery.TabelId = clientRepository.All().First().AnalyticsTableId; analyticQuery.StartDate = startDate; analyticQuery.EndDate = endDate; analyticQuery.Metrics.AddMany("ga:adClicks", "ga:adCost", "ga:impressions"); analyticQuery.Filters.AddMany("ga:campaign!~(display)|(retargeting)|(Display)|(Retargeting)|(remarketing)|(Remarketing)", "ga:medium==cpc"); gaService.Setup( ga => ga.Get <SearchDetailsRow>(It.Is <AnalyticQuery>( aq => !aq.Dimenssions.Except(analyticQuery.Dimenssions).Any() && !aq.Metrics.Except(analyticQuery.Metrics).Any() && !aq.Filters.Except(analyticQuery.Filters).Any() && aq.StartDate == analyticQuery.StartDate && aq.EndDate == analyticQuery.EndDate && aq.TabelId == analyticQuery.TabelId))).Returns(mapRowResponse); var controller = new SourceController(clientRepository, contactProductService.Object, userManager.Object, gaService.Object, contactIndexCalculator.Object); contactIndexCalculator.Setup(ic => ic.SetIndexValues(It.IsAny <IEnumerable <ContactCollection> >())).Callback( (IEnumerable <ContactCollection> contactColletions) => { foreach (var contactCollection in contactColletions) { if (contactCollection.Id == "Keyword1") { contactCollection.IndexValue = 1.0m; } else { contactCollection.IndexValue = 0.5m; } } }); var result = controller.GetSearchKeywords(clientInRepository.Id, startDate, endDate) as OkNegotiatedContentResult <IOrderedEnumerable <SearchDetailsRow> >; Assert.AreEqual(2, result.Content.Count()); Assert.AreEqual(10, result.Content.Single(kw => kw.Name == "Keyword1").AdClicks); Assert.AreEqual(20, result.Content.Single(kw => kw.Name == "Keyword1").AdCost); Assert.AreEqual(null, result.Content.Single(kw => kw.Name == "Keyword1").Impressions); Assert.AreEqual(40, result.Content.Single(kw => kw.Name == "Keyword1").NumVisitors); Assert.AreEqual(1, result.Content.Single(kw => kw.Name == "Keyword1").NumContacts); Assert.AreEqual(11, result.Content.Single(kw => kw.Name == "Keyword2").AdClicks); Assert.AreEqual(21, result.Content.Single(kw => kw.Name == "Keyword2").AdCost); Assert.AreEqual(31, result.Content.Single(kw => kw.Name == "Keyword2").Impressions); Assert.AreEqual(1, result.Content.Single(kw => kw.Name == "Keyword2").NumContacts); }
public IHttpActionResult GetCampaignsDetail(int clientId, DateTime startDate, DateTime endDate) { if (userManager.IsInRole(User.Identity.GetUserId(), "demo")) { var demoCampaigns = new List <CampaignDetails>(); var random = new Random(DateTime.Now.Second); demoCampaigns.Add(new CampaignDetails() { Campaign = "Kampanj", AdClicksMetric = random.Next(0, 1000), AdCost = random.NextDouble() * 10000, SourceMedium = "google/cpc", Impressions = random.Next(0, 10000), Product = "Search", NumContacts = random.Next(0, 200), ContactCollection = new ContactCollection("Sökord 1", 0, 0, new List <Contact>()) { IndexValue = 1 } }); demoCampaigns.Add(new CampaignDetails() { Campaign = "Kampanj", AdClicksMetric = random.Next(0, 500), AdCost = random.NextDouble() * 3000, Impressions = random.Next(0, 10000), SourceMedium = "Bing/cpc", Product = "Search", NumContacts = random.Next(0, 50), ContactCollection = new ContactCollection("Sökord 1", 0, 0, new List <Contact>()) { IndexValue = 0.7m } }); demoCampaigns.Add(new CampaignDetails() { Campaign = "Kampanj Retargeting", AdClicksMetric = random.Next(0, 500), AdCost = random.NextDouble() * 1000, Impressions = random.Next(0, 10000), SourceMedium = "Adroll/cpc", Product = "Retargeting", NumContacts = random.Next(0, 50), ContactCollection = new ContactCollection("Sökord 1", 0, 0, new List <Contact>()) { IndexValue = 0.6m } }); return(Ok(demoCampaigns)); } var client = clienRepository.Where(c => c.Id == clientId).Single(); var tableId = client.AnalyticsTableId; var query = new AnalyticQuery { TabelId = tableId, StartDate = startDate, EndDate = endDate, }; query.Metrics.AddMany("ga:adClicks", "ga:adCost", "ga:impressions", "ga:sessions"); query.Dimenssions.AddMany("ga:sourceMedium", "ga:campaign"); query.MaxResults = 50; query.Filters.AddMany("ga:campaign!=(not set)"); query.Sort = "-ga:adCost"; var campaignFeed = gaService.Get <CampaignDetails>(query); var campaigns = new List <CampaignDetails>(); foreach (var campaignDetails in campaignFeed) { var row = campaignDetails; var contactsForCampaign = client.Leads.Where( c => c.Campaign != null && c.Campaign.Equals(row.Campaign) && c.Date >= startDate && c.Date <= endDate); var cost = row.AdCost.HasValue ? (decimal)row.AdCost : 0m; var clicks = row.AdClicks.HasValue ? (int)row.AdClicks : 0; campaignDetails.ContactCollection = new ContactCollection(campaignDetails.Campaign, cost, clicks, contactsForCampaign.ToList()); campaignDetails.NumContacts = contactsForCampaign.Count(); if (!contactProductService.IsValidProduct(campaignDetails.Campaign, campaignDetails.Medium)) { continue; } campaignDetails.Product = contactProductService.GetProduct(campaignDetails.Campaign, campaignDetails.Medium); if (campaignDetails.AdClicks.HasValue && campaignDetails.AdClicks.Value > 0 && !string.IsNullOrEmpty(campaignDetails.Product)) { campaigns.Add(campaignDetails); } } if (campaigns.Any()) { contactIndexCalculator.SetIndexValues(campaigns.Select(k => k.ContactCollection)); } return(Ok(campaigns.OrderByDescending(c => c.ContactCollection.IndexValue).ToEnumerable())); }
public void CanGetVisitorsYearly() { var clientRepository = RepositoryHelper.RepositoryLocalWithOneClient; var gaService = new Mock <IGoogleAnalyticsApi>(); var userManager = new Mock <IIdentityMembershipProvider>(); var contactProductService = new Mock <IProductService>(); var contactIndexCalculator = new Mock <IContactIndexCalculator>(); var controller = new SourceController(clientRepository, contactProductService.Object, userManager.Object, gaService.Object, contactIndexCalculator.Object); var startDate = new DateTime(2012, 1, 1); var endDate = new DateTime(2014, 1, 1); var mapRowResponse = new List <VisitorsOverTimeGaData>(); var row1 = new VisitorsOverTimeGaData { Date = "2014", Visitors = 100 }; var row2 = new VisitorsOverTimeGaData { Date = "2013", Visitors = 170 }; var row3 = new VisitorsOverTimeGaData { Date = "2012", Visitors = 70 }; mapRowResponse.Add(row1); mapRowResponse.Add(row2); mapRowResponse.Add(row3); var analyticQuery = new AnalyticQuery(); analyticQuery.Dimenssions.AddMany("ga:year"); analyticQuery.TabelId = clientRepository.All().First().AnalyticsTableId; analyticQuery.StartDate = startDate; analyticQuery.EndDate = endDate; analyticQuery.Metrics.Add("ga:visitors"); gaService.Setup( ga => ga.Get <VisitorsOverTimeGaData>(It.Is <AnalyticQuery>( aq => !aq.Dimenssions.Except(analyticQuery.Dimenssions).Any() && !aq.Metrics.Except(analyticQuery.Metrics).Any() && !aq.Filters.Except(analyticQuery.Filters).Any() && aq.StartDate == analyticQuery.StartDate && aq.EndDate == analyticQuery.EndDate && aq.TabelId == analyticQuery.TabelId))).Returns(mapRowResponse); var result = controller.GetVisitorsOverTime(1, startDate, endDate, "Yearly") as OkNegotiatedContentResult <List <VisitorStats> >; Assert.AreEqual(3, result.Content.Count()); Assert.AreEqual(70, result.Content.Single(r => r.date == startDate).visitors); Assert.AreEqual(170, result.Content.Single(r => r.date == startDate.AddYears(1)).visitors); Assert.AreEqual(100, result.Content.Single(r => r.date == endDate).visitors); }
public IHttpActionResult GetVisitorsOverTime(int clientId, DateTime startDate, DateTime endDate, string aggregateType) { var tableId = clienRepository.Where(c => c.Id == clientId).Single().AnalyticsTableId; string dimentions = ""; var aggregateFormat = ""; if (aggregateType == "Daily") { dimentions = "ga:date"; aggregateFormat = "yyyyMMdd"; } else if (aggregateType == "Monthly") { dimentions = "ga:yearmonth"; aggregateFormat = "yyyyMM"; } else if (aggregateType == "Yearly") { dimentions = "ga:year"; aggregateFormat = "yyyy"; } var query = new AnalyticQuery { TabelId = tableId, StartDate = startDate, EndDate = endDate, }; query.Metrics.AddMany("ga:visitors"); query.Dimenssions.AddMany(dimentions); var response = gaService.Get <VisitorsOverTimeGaData>(query); var sourceByDay = response .Select(row => new VisitorStats { date = DateTime.ParseExact(row.AggregationDate, aggregateFormat, CultureInfo.InvariantCulture), visitors = row.Visitors }) .ToList(); if (userManager.IsInRole(User.Identity.GetUserId(), "demo")) { var r = new Random(); sourceByDay = response .Select(dataEntry => new VisitorStats { date = DateTime.ParseExact(dataEntry.AggregationDate, aggregateFormat, CultureInfo.InvariantCulture), visitors = r.Next(0, 100) }) .ToList(); } if (sourceByDay.Any()) { return(Ok(sourceByDay)); } else { return(NotFound()); } }
/// <summary> /// Queries offsets and values in time-series data for a specified flight and analytic. /// </summary> /// <param name="emsSystem"> /// The unique identifier of the EMS system. /// </param> /// <param name="flightId"> /// The integer ID of the flight record for which to query data. /// </param> /// <param name="query"> /// The information used to construct a query for which results are returned. /// </param> public virtual QueryResult QueryResults(int flightId, AnalyticQuery query, int emsSystem = NoEmsServerSpecified) { return(AccessTaskResult(QueryResultsAsync(flightId, query, emsSystem))); }
public ActionResult Report(int clientId, DateTime startDate, DateTime endDate) { var client = clientRepository.First(c => c.Id == clientId); var clientViewModel = new ClientViewModel(client); var model = new CcoReportViewModel(userManager.GetRoles(User.Identity.GetUserId()), clientViewModel); model.Today = serverTime.RequestStarted; model.OnMonth = model.Today.AddMonths(-1); model.OneQuarter = model.Today.AddMonths(-3); model.OneYear = model.Today.AddMonths(-12); model.StartDate = startDate; model.EndDate = endDate; var tableId = client.AnalyticsTableId; var query = new AnalyticQuery { TabelId = tableId, StartDate = startDate, EndDate = endDate, }; query.Metrics.AddMany("ga:adClicks", "ga:adCost"); query.Dimenssions.AddMany("ga:keyword"); query.MaxResults = 500; query.Filters.AddMany("ga:campaign!~Retargeting", "ga:campaign!~Remarketing", "ga:campaign!~Display"); query.Sort = "-ga:adCost"; var keywordRows = gaService.Get<KeyWordReport>(query); var keywordFinder = new Dictionary<string, KeyWordReport>(); keywordRows.ForEach(k => { model.KeyWords.Add(k); keywordFinder.Add(k.Keyword, k); }); var searchPhrasesLeads = SearchPhrasesLeads(clientId, startDate, endDate); foreach (var searchPhraseLead in searchPhrasesLeads) { if (!string.IsNullOrEmpty(searchPhraseLead) && keywordFinder.ContainsKey(searchPhraseLead)) { keywordFinder[searchPhraseLead].NumLead = keywordFinder[searchPhraseLead].NumLead + 1; } } var searchPhrasesNotLeads = SearchPhrasesNotLeads(clientId, startDate, endDate); foreach (var searchPhraseNotLead in searchPhrasesNotLeads) { if (!string.IsNullOrEmpty(searchPhraseNotLead) && keywordFinder.ContainsKey(searchPhraseNotLead)) { keywordFinder[searchPhraseNotLead].NumNotALead = keywordFinder[searchPhraseNotLead].NumNotALead + 1; } } var searchPhrasesContacts = SearchPhrasesContacts(clientId, startDate, endDate); foreach (var searchPhraseContact in searchPhrasesContacts) { if (!string.IsNullOrEmpty(searchPhraseContact) && keywordFinder.ContainsKey(searchPhraseContact)) { keywordFinder[searchPhraseContact].Contacts = keywordFinder[searchPhraseContact].Contacts + 1; } } return View(model); }