示例#1
0
        public override bool SetValues(ProcessingScope scope, IList<object> row)
        {
            if (_fields.Count == 0) return false;

            var index = 0;
            
            //Get metrics from current DimensionData (EaTableMapper) or calculate from context

            var metrics = scope.Current<DimensionData>().TryGet(data => data.MetricsValue)
                          ?? scope.Current<IVisitAggregationContext>().TryGet(XaHelpers.CalculateMetrics);

            if (metrics != null)
            {
                if (FactTypes.HasFlag(FactTypes.Visits)) row[index++] = metrics.Visits;
                if (FactTypes.HasFlag(FactTypes.Value)) row[index++] = metrics.Value;
                if (FactTypes.HasFlag(FactTypes.Bounces)) row[index++] = metrics.Bounces;
                if (FactTypes.HasFlag(FactTypes.Conversions)) row[index++] = metrics.Conversions;
                if (FactTypes.HasFlag(FactTypes.TimeOnSite)) row[index++] = metrics.TimeOnSite;
                if (FactTypes.HasFlag(FactTypes.PageViews)) row[index++] = metrics.Pageviews;
                if (FactTypes.HasFlag(FactTypes.Count)) row[index++] = metrics.Count;                
               
                return true;
            }

            return false;
        }
        public override bool SetValues(ProcessingScope scope, IList <object> row)
        {
            if (_fields.Count == 0)
            {
                return(false);
            }

            var index = 0;

            //Get metrics from current DimensionData (EaTableMapper) or calculate from context

            var metrics = scope.Current <DimensionData>().TryGet(data => data.MetricsValue)
                          ?? scope.Current <IVisitAggregationContext>().TryGet(XaHelpers.CalculateMetrics);

            if (metrics != null)
            {
                if (FactTypes.HasFlag(FactTypes.Visits))
                {
                    row[index++] = metrics.Visits;
                }
                if (FactTypes.HasFlag(FactTypes.Value))
                {
                    row[index++] = metrics.Value;
                }
                if (FactTypes.HasFlag(FactTypes.Bounces))
                {
                    row[index++] = metrics.Bounces;
                }
                if (FactTypes.HasFlag(FactTypes.Conversions))
                {
                    row[index++] = metrics.Conversions;
                }
                if (FactTypes.HasFlag(FactTypes.TimeOnSite))
                {
                    row[index++] = metrics.TimeOnSite;
                }
                if (FactTypes.HasFlag(FactTypes.PageViews))
                {
                    row[index++] = metrics.Pageviews;
                }
                if (FactTypes.HasFlag(FactTypes.Count))
                {
                    row[index++] = metrics.Count;
                }

                return(true);
            }

            return(false);
        }
        public IEnumerable <FunnelStep> GetSteps(ProcessingScope scope)
        {
            var ctx = scope.Current <IVisitAggregationContext>();

            if (ctx == null)
            {
                yield break;
            }

            var currentStep = 0;

            foreach (var ev in ctx.Visit.Pages.SelectMany(p => p.PageEvents))
            {
                if (currentStep >= Steps.Count)
                {
                    break;
                }

                if (Steps[currentStep].Events.Contains(ev.Name) || Steps[currentStep].Events.Contains(ev.PageEventDefinitionId.ToString("D")))
                {
                    yield return(new FunnelStep {
                        Number = currentStep + 1, Name = Steps[currentStep].Name, Continued = 1
                    });

                    ++currentStep;
                }
            }
            if (currentStep < Steps.Count)
            {
                yield return(new FunnelStep {
                    Number = currentStep + 1, Name = Steps[currentStep].Name, Fallout = 1
                });
            }
        }
        public void ReturnCorrectObject()
        {

            var scope = new ProcessingScope();
            var o1 = new Level1();
            var o2 = new Level1();
            var o2_1 = new Level2();

            scope.Set(o1);
            Assert.AreSame(o1, scope.Current<Level1>());

            scope.Set(o2);
            Assert.AreSame(o2, scope.Current<Level1>());

            var childScope = scope.CreateChildScope(new DummyMapper()).Set(o2_1);
            Assert.AreSame(o2_1, childScope.Current<Level2>());
            Assert.AreSame(o2, childScope.Current<Level1>());
        }
 protected virtual DimensionData GetDimensionDataFromContext(ProcessingScope context)
 {
     var ctx = context.Current<IVisitAggregationContext>();
     if (ctx != null)
     {
         return Dimension.GetData(ctx).FirstOrDefault();
     }
     return null;
 }
        public void ReturnCorrectObject()
        {
            var scope = new ProcessingScope();
            var o1    = new Level1();
            var o2    = new Level1();
            var o2_1  = new Level2();

            scope.Set(o1);
            Assert.AreSame(o1, scope.Current <Level1>());

            scope.Set(o2);
            Assert.AreSame(o2, scope.Current <Level1>());

            var childScope = scope.CreateChildScope(new DummyMapper()).Set(o2_1);

            Assert.AreSame(o2_1, childScope.Current <Level2>());
            Assert.AreSame(o2, childScope.Current <Level1>());
        }
示例#7
0
        protected virtual DimensionData GetDimensionDataFromContext(ProcessingScope context)
        {
            var ctx = context.Current <IVisitAggregationContext>();

            if (ctx != null)
            {
                return(Dimension.GetData(ctx).FirstOrDefault());
            }
            return(null);
        }
        protected override IEnumerable SelectRowItems(ProcessingScope context)
        {
            var ctx = context.Current<IVisitAggregationContext>();
            if (ctx != null)
            {
                return Dimension.GetData(ctx).Where(d => d != null);
            }

            return Enumerable.Empty<object>();
        }
        protected override IEnumerable SelectRowItems(ProcessingScope context)
        {
            var ctx = context.Current <IVisitAggregationContext>();

            if (ctx != null)
            {
                return(Dimension.GetData(ctx).Where(d => d != null));
            }

            return(Enumerable.Empty <object>());
        }
示例#10
0
        public override bool SetValues(ProcessingScope scope, IList<object> row)
        {
            var ce = CalculateForEntireVisit ? null : scope.Current<PageEventData>();
            var cp = CalculateForEntireVisit ? null : scope.Current<PageData>();
            var cv = scope.Current<IVisitAggregationContext>().TryGet(v => v.Visit);

            if (cv == null) return false;

            var es = ce != null ? new[] { ce } : cp != null ? cp.PageEvents.OrEmpty() : cv.Pages.OrEmpty().SelectMany(p => p.PageEvents.OrEmpty());
            var ps = cp != null ? new[] { cp } : cv.Pages.OrEmpty();

            es = es.Where(e => e.IsGoal);

            var index = 0;
            if (FactTypes.HasFlag(FactTypes.Visits)) row[index++] = scope.OncePerScope<IVisitAggregationContext>(1);
            if (FactTypes.HasFlag(FactTypes.Value)) row[index++] = es.Sum(e => e.Value);
            if (FactTypes.HasFlag(FactTypes.Bounces)) row[index++] = cv.Pages.TryGet(_ => _.Count == 1 ? 1 : 0);
            if (FactTypes.HasFlag(FactTypes.Conversions)) row[index++] = es.Count();
            if (FactTypes.HasFlag(FactTypes.TimeOnSite))
                row[index++] = ps.Sum(p => DimensionBase.ConvertDuration(p.Duration));
            if (FactTypes.HasFlag(FactTypes.PageViews)) row[index++] = cp != null ? scope.OncePerScope<PageData>(1) : ps.Count();

            if (CalculateForEntireVisit)
            {
                for (var i = 0; i < index; i++)
                {
                    if (!(row[i] is IDeferedValue))
                    {
                        row[i] = scope.OncePerScope<IVisitAggregationContext>(row[i]);
                    }
                }
            }

            if (FactTypes.HasFlag(FactTypes.Count)) row[index++] = 1;


            return true;
        }
示例#11
0
        protected virtual DimensionData GetDimensionDataFromContext(ProcessingScope context)
        {
            var ctx = context.Current <IVisitAggregationContext>();

            if (ctx != null)
            {
                try
                {
                    return(Dimension.GetData(ctx).FirstOrDefault());
                }
                catch (Exception ex)
                {
                    Log.SingleError("Error getting dimension from context:" + ex, this);
                }
            }
            return(null);
        }
        public override bool SetValues(ProcessingScope scope, IList<object> target)
        {
            var testPage = scope.Current<IVisitAggregationContext>().TryGet(v => v.Visit.Pages.FirstOrDefault(p => p.MvTest != null && p.MvTest.Id == TestSet.Id));
            if (testPage != null)
            {
                var i = 0;
                foreach (var variable in TestSet.Variables)
                {
                    var value = testPage.MvTest.Combination[i];
                    target[i * 2] = value;
                    target[i * 2 + 1] = variable.Values[value].Label;
                    ++i;
                }

                return true;
            }
            return false;
        }
        public override bool SetValues(ProcessingScope scope, IList <object> target)
        {
            var testPage = scope.Current <IVisitAggregationContext>().TryGet(v => v.Visit.Pages.FirstOrDefault(p => p.MvTest != null && p.MvTest.Id == TestSet.Id));

            if (testPage != null)
            {
                var i = 0;
                foreach (var variable in TestSet.Variables)
                {
                    var value = testPage.MvTest.Combination[i];
                    target[i * 2]     = value;
                    target[i * 2 + 1] = variable.Values[value].Label;
                    ++i;
                }

                return(true);
            }
            return(false);
        }
 public void ScopeCanBeNull()
 {
     var scope = new ProcessingScope();
     Assert.IsNull(scope.Current<Level1>());
 }
 public virtual T SelectItem(ProcessingScope scope)
 {
     return(scope.Current <T>());
 }
 public override VisitData SelectItem(ProcessingScope scope)
 {
     return(scope.Current <IVisitAggregationContext>().TryGet(v => v.Visit));
 }
        public void TestNesting()
        {
            var scope1 = new ProcessingScope();
            var scope2 = scope1.CreateChildScope(new DummyMapper());
            var scope3 = scope2.CreateChildScope(new DummyMapper());

            var o1     = new Level1();
            var o1_1   = new Level2();
            var o1_1_1 = new Level3();
            var o1_1_2 = new Level3();
            var o1_2   = new Level2();
            var o2     = new Level1();
            var o2_1   = new Level2();
            var o3     = new Level1();
            var o3_1   = new Level2();
            var o3_2   = new Level2();
            var o3_2_1 = new Level3();
            var o3_3   = new Level2();
            var o3_3_1 = new Level3();
            var o3_3_2 = new Level3();

            scope1.Set(o1);
            Assert.AreEqual(1, scope1.GlobalIndex);
            scope2.Set(o1_1);
            Assert.AreEqual(1, scope2.Index <Level1>());
            Assert.AreEqual(1, scope2.Index <Level2>());

            scope3.Set(o1_1_1);
            Assert.AreEqual(1, scope3.Index <Level1>());
            Assert.AreEqual(1, scope3.Index <Level2>());
            Assert.AreEqual(1, scope3.Index <Level3>());
            scope3.Set(o1_1_2);
            Assert.AreEqual(2, scope3.Index <Level1>());
            Assert.AreEqual(2, scope3.Index <Level2>());
            Assert.AreEqual(2, scope3.Index <Level3>());
            Assert.AreEqual(2, scope3.ChildIndex);
            Assert.AreEqual(2, scope3.GlobalIndex);

            scope2.Set(o1_2);
            Assert.AreEqual(2, scope2.Index <Level1>());
            Assert.AreEqual(2, scope2.Index <Level2>());
            Assert.AreEqual(2, scope2.ChildIndex);
            Assert.AreEqual(2, scope3.GlobalIndex);

            scope1.Set(o2);
            Assert.AreEqual(2, scope1.GlobalIndex);
            scope2 = scope2.Set(o2_1);
            Assert.AreEqual(1, scope2.Index <Level1>());
            Assert.AreEqual(3, scope2.GlobalIndex);

            scope1.Set(o3);
            Assert.AreEqual(3, scope1.GlobalIndex);
            scope2 = scope2.Set(o3_1);
            Assert.AreEqual(1, scope2.Index <Level1>());
            Assert.AreEqual(4, scope2.GlobalIndex);

            scope2.Set(o3_2);
            Assert.AreEqual(2, scope2.Index <Level1>());
            Assert.AreEqual(5, scope2.GlobalIndex);

            scope3.Set(o3_2_1);
            Assert.AreEqual(1, scope3.Index <Level1>());
            Assert.AreEqual(1, scope3.Index <Level2>());
            Assert.AreEqual(3, scope3.GlobalIndex);

            scope2.Set(o3_3);
            Assert.AreEqual(3, scope2.Index <Level1>());
            Assert.AreEqual(6, scope2.GlobalIndex);

            scope3.Set(o3_3_1);
            Assert.AreEqual(2, scope3.Index <Level1>());
            Assert.AreEqual(1, scope3.Index <Level2>());
            Assert.AreEqual(4, scope3.GlobalIndex);

            scope3.Set(o3_3_2);
            Assert.AreEqual(3, scope3.Index <Level1>());
            Assert.AreEqual(2, scope3.Index <Level2>());
            Assert.AreEqual(5, scope3.GlobalIndex);

            //Check that the objects are correctly assigned

            Assert.AreSame(o3, scope3.Current <Level1>());
            Assert.AreSame(o3_3, scope3.Current <Level2>());
            Assert.AreSame(o3_3_2, scope3.Current <Level3>());

            Assert.AreSame(o3, scope2.Current <Level1>());
            Assert.AreSame(o3_3, scope2.Current <Level2>());

            Assert.AreSame(o3, scope1.Current <Level1>());
        }
        public void TestNesting()
        {
            var scope1 = new ProcessingScope();
            var scope2 = scope1.CreateChildScope(new DummyMapper());
            var scope3 = scope2.CreateChildScope(new DummyMapper());

            var o1 = new Level1();
            var o1_1 = new Level2();
            var o1_1_1 = new Level3();
            var o1_1_2 = new Level3();
            var o1_2 = new Level2();
            var o2 = new Level1();
            var o2_1 = new Level2();
            var o3 = new Level1();
            var o3_1 = new Level2();
            var o3_2 = new Level2();
            var o3_2_1 = new Level3();
            var o3_3 = new Level2();
            var o3_3_1 = new Level3();
            var o3_3_2 = new Level3();

            scope1.Set(o1);
            Assert.AreEqual(1, scope1.GlobalIndex);
            scope2.Set(o1_1);
            Assert.AreEqual(1, scope2.Index<Level1>());
            Assert.AreEqual(1, scope2.Index<Level2>());

            scope3.Set(o1_1_1);
            Assert.AreEqual(1, scope3.Index<Level1>());
            Assert.AreEqual(1, scope3.Index<Level2>());
            Assert.AreEqual(1, scope3.Index<Level3>());
            scope3.Set(o1_1_2);
            Assert.AreEqual(2, scope3.Index<Level1>());
            Assert.AreEqual(2, scope3.Index<Level2>());
            Assert.AreEqual(2, scope3.Index<Level3>());
            Assert.AreEqual(2, scope3.ChildIndex);
            Assert.AreEqual(2, scope3.GlobalIndex);

            scope2.Set(o1_2);
            Assert.AreEqual(2, scope2.Index<Level1>());
            Assert.AreEqual(2, scope2.Index<Level2>());
            Assert.AreEqual(2, scope2.ChildIndex);
            Assert.AreEqual(2, scope3.GlobalIndex);

            scope1.Set(o2);
            Assert.AreEqual(2, scope1.GlobalIndex);
            scope2 = scope2.Set(o2_1);
            Assert.AreEqual(1, scope2.Index<Level1>());
            Assert.AreEqual(3, scope2.GlobalIndex);

            scope1.Set(o3);
            Assert.AreEqual(3, scope1.GlobalIndex);
            scope2 = scope2.Set(o3_1);
            Assert.AreEqual(1, scope2.Index<Level1>());
            Assert.AreEqual(4, scope2.GlobalIndex);

            scope2.Set(o3_2);
            Assert.AreEqual(2, scope2.Index<Level1>());
            Assert.AreEqual(5, scope2.GlobalIndex);

            scope3.Set(o3_2_1);
            Assert.AreEqual(1, scope3.Index<Level1>());
            Assert.AreEqual(1, scope3.Index<Level2>());
            Assert.AreEqual(3, scope3.GlobalIndex);

            scope2.Set(o3_3);
            Assert.AreEqual(3, scope2.Index<Level1>());
            Assert.AreEqual(6, scope2.GlobalIndex);

            scope3.Set(o3_3_1);
            Assert.AreEqual(2, scope3.Index<Level1>());
            Assert.AreEqual(1, scope3.Index<Level2>());
            Assert.AreEqual(4, scope3.GlobalIndex);

            scope3.Set(o3_3_2);
            Assert.AreEqual(3, scope3.Index<Level1>());
            Assert.AreEqual(2, scope3.Index<Level2>());
            Assert.AreEqual(5, scope3.GlobalIndex);

            //Check that the objects are correctly assigned

            Assert.AreSame(o3, scope3.Current<Level1>());
            Assert.AreSame(o3_3, scope3.Current<Level2>());
            Assert.AreSame(o3_3_2, scope3.Current<Level3>());

            Assert.AreSame(o3, scope2.Current<Level1>());
            Assert.AreSame(o3_3, scope2.Current<Level2>());

            Assert.AreSame(o3, scope1.Current<Level1>());
        }
        public void ScopeCanBeNull()
        {
            var scope = new ProcessingScope();

            Assert.IsNull(scope.Current <Level1>());
        }
        public IEnumerable <object> GetSplits(ProcessingScope scope)
        {
            var visitContext = scope.Current <IVisitAggregationContext>();
            var vd           = visitContext.Visit;

            var originalVisitPageCount = vd.VisitPageCount;
            var originalValue          = vd.Value;
            var all = vd.Pages.ToList();

            var lists = Enumerable.Range(0, Conditions.Length + 1).Select(c => new List <PageData>()).ToArray();

            var targetIndex = 0;

            foreach (var page in all)
            {
                if (IncludeMatchBefore)
                {
                    lists[targetIndex].Add(page);
                }
                if (targetIndex < Conditions.Length && Conditions[targetIndex](scope, page))
                {
                    ++targetIndex;
                }
                if (!IncludeMatchBefore)
                {
                    lists[targetIndex].Add(page);
                }
            }

            if (targetIndex < lists.Length - 1 && EmptyIfConditionNotMet)
            {
                //All conditions were not met. Clear all lists
                foreach (var list in lists)
                {
                    list.Clear();
                }
            }

            var vals = new int[lists.Length];

            var ix = 0;

            foreach (var list in lists)
            {
                vd.Pages          = list;
                vd.VisitPageCount = list.Count;
                vd.Value          = visitContext.Visit.Pages.Sum(p => p.PageEvents.Sum(pe => pe.Value));
                vals[ix++]        = vd.Value;
                yield return(visitContext);
            }

            vd.Pages          = all;
            vd.VisitPageCount = originalVisitPageCount;
            vd.Value          = originalValue;


            if (IncludeTotal)
            {
                yield return(visitContext);
            }
        }
示例#21
0
        public override bool SetValues(ProcessingScope scope, IList <object> row)
        {
            var ce = CalculateForEntireVisit ? null : scope.Current <PageEventData>();
            var cp = CalculateForEntireVisit ? null : scope.Current <PageData>();
            var cv = scope.Current <IVisitAggregationContext>().TryGet(v => v.Visit);

            if (cv == null)
            {
                return(false);
            }

            var es = ce != null ? new[] { ce } : cp != null?cp.PageEvents.OrEmpty() : cv.Pages.OrEmpty().SelectMany(p => p.PageEvents.OrEmpty());

            var ps = cp != null ? new[] { cp } : cv.Pages.OrEmpty();

            es = es.Where(e => e.IsGoal);

            var index = 0;

            if (FactTypes.HasFlag(FactTypes.Visits))
            {
                row[index++] = scope.OncePerScope <IVisitAggregationContext>(1);
            }
            if (FactTypes.HasFlag(FactTypes.Value))
            {
                row[index++] = es.Sum(e => e.Value);
            }
            if (FactTypes.HasFlag(FactTypes.Bounces))
            {
                row[index++] = cv.Pages.TryGet(_ => _.Count == 1 ? 1 : 0);
            }
            if (FactTypes.HasFlag(FactTypes.Conversions))
            {
                row[index++] = es.Count();
            }
            if (FactTypes.HasFlag(FactTypes.TimeOnSite))
            {
                row[index++] = ps.Sum(p => DimensionBase.ConvertDuration(p.Duration));
            }
            if (FactTypes.HasFlag(FactTypes.PageViews))
            {
                row[index++] = cp != null?scope.OncePerScope <PageData>(1) : ps.Count();
            }

            if (CalculateForEntireVisit)
            {
                for (var i = 0; i < index; i++)
                {
                    if (!(row[i] is IDeferedValue))
                    {
                        row[i] = scope.OncePerScope <IVisitAggregationContext>(row[i]);
                    }
                }
            }

            if (FactTypes.HasFlag(FactTypes.Count))
            {
                row[index++] = 1;
            }


            return(true);
        }
 protected override DimensionData GetDimensionDataFromContext(ProcessingScope context)
 {
     return context.Current<DimensionData>();                
 }            
 protected override DimensionData GetDimensionDataFromContext(ProcessingScope context)
 {
     return(context.Current <DimensionData>());
 }