protected override IEnumerable <Field> CreateFields() { if (FactTypes.HasFlag(FactTypes.Visits)) { yield return new Field { Name = NameFormatter("Visits"), ValueKind = "Visits", ValueType = typeof(int), FieldType = FieldType.Fact, FriendlyName = "Visits" } } ; if (FactTypes.HasFlag(FactTypes.Value)) { yield return new Field { Name = NameFormatter("Value"), ValueType = typeof(int), FieldType = FieldType.Fact, FriendlyName = "Value" } } ; if (FactTypes.HasFlag(FactTypes.Bounces)) { yield return new Field { Name = NameFormatter("Bounces"), ValueType = typeof(int), FieldType = FieldType.Fact, FriendlyName = "Bounces" } } ; if (FactTypes.HasFlag(FactTypes.Conversions)) { yield return new Field { Name = NameFormatter("Conversions"), ValueType = typeof(int), FieldType = FieldType.Fact, FriendlyName = "Conversions" } } ; if (FactTypes.HasFlag(FactTypes.TimeOnSite)) { yield return new Field { Name = NameFormatter("TimeOnSite"), ValueType = typeof(int), FieldType = FieldType.Fact, FriendlyName = "Time on site" } } ; if (FactTypes.HasFlag(FactTypes.PageViews)) { yield return new Field { Name = NameFormatter("PageViews"), ValueType = typeof(int), FieldType = FieldType.Fact, FriendlyName = "Page views" } } ; if (FactTypes.HasFlag(FactTypes.Count)) { yield return new Field { Name = NameFormatter("Count"), ValueType = typeof(int), FieldType = FieldType.Fact, FriendlyName = "Count" } } ; }
public static IEnumerable <CalculatedField> GetCalculatedFields(Func <string, string> nameFormatter, FactTypes factTypes) { if (factTypes.HasFlag(FactTypes.Visits) && factTypes.HasFlag(FactTypes.Value)) { yield return (new CalculatedField { Name = "Value per visit", DaxPattern = string.Format("SUM([{0}]) / SUM([{1}])", nameFormatter("Value"), nameFormatter("Visits")), FormatString = CalculatedFieldFormat.Decimal }); } if (factTypes.HasFlag(FactTypes.Visits) && factTypes.HasFlag(FactTypes.Bounces)) { yield return (new CalculatedField { Name = "Bounce rate", DaxPattern = string.Format("SUM([{0}]) / SUM([{1}])", nameFormatter("Bounces"), nameFormatter("Visits")), FormatString = CalculatedFieldFormat.Percentage }); } if (factTypes.HasFlag(FactTypes.Visits)) { yield return (new CalculatedField { Name = "Conversion rate", DaxPattern = string.Format("SUM([{0}]) / SUM(@Parent[Visits])", nameFormatter("Visits")), FormatString = CalculatedFieldFormat.Percentage }); } }
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 XaFacts(Func <string, string> nameFormatter = null, FactTypes factTypes = FactTypes.All) { FactTypes = factTypes; nameFormatter = nameFormatter ?? (name => name); NameFormatter = nameFormatter; _fields = new List <Field>(); if (factTypes.HasFlag(FactTypes.Visits)) { _fields.Add(new Field { Name = nameFormatter("Visits"), ValueKind = "Visits", ValueType = typeof(int), FieldType = FieldType.Fact }); } if (factTypes.HasFlag(FactTypes.Value)) { _fields.Add(new Field { Name = nameFormatter("Value"), ValueType = typeof(int), FieldType = FieldType.Fact }); } if (factTypes.HasFlag(FactTypes.Bounces)) { _fields.Add(new Field { Name = nameFormatter("Bounces"), ValueType = typeof(int), FieldType = FieldType.Fact }); } if (factTypes.HasFlag(FactTypes.Conversions)) { _fields.Add(new Field { Name = nameFormatter("Conversions"), ValueType = typeof(int), FieldType = FieldType.Fact }); } if (factTypes.HasFlag(FactTypes.TimeOnSite)) { _fields.Add(new Field { Name = nameFormatter("TimeOnSite"), ValueType = typeof(int), FieldType = FieldType.Fact }); } if (factTypes.HasFlag(FactTypes.PageViews)) { _fields.Add(new Field { Name = nameFormatter("PageViews"), ValueType = typeof(int), FieldType = FieldType.Fact }); } if (factTypes.HasFlag(FactTypes.Count)) { _fields.Add(new Field { Name = nameFormatter("Count"), ValueType = typeof(int), FieldType = FieldType.Fact }); } }
public XaFacts(Func<string, string> nameFormatter = null, FactTypes factTypes = FactTypes.All) { FactTypes = factTypes; nameFormatter = nameFormatter ?? (name => name); NameFormatter = nameFormatter; _fields = new List<Field>(); if( factTypes.HasFlag(FactTypes.Visits)) _fields.Add(new Field {Name = nameFormatter("Visits"), ValueKind = "Visits", ValueType = typeof (int), FieldType = FieldType.Fact}); if (factTypes.HasFlag(FactTypes.Value)) _fields.Add(new Field { Name = nameFormatter("Value"), ValueType = typeof(int), FieldType = FieldType.Fact }); if (factTypes.HasFlag(FactTypes.Bounces)) _fields.Add(new Field { Name = nameFormatter("Bounces"), ValueType = typeof(int), FieldType = FieldType.Fact }); if (factTypes.HasFlag(FactTypes.Conversions)) _fields.Add(new Field { Name = nameFormatter("Conversions"), ValueType = typeof(int), FieldType = FieldType.Fact }); if (factTypes.HasFlag(FactTypes.TimeOnSite)) _fields.Add(new Field { Name = nameFormatter("TimeOnSite"), ValueType = typeof(int), FieldType = FieldType.Fact }); if (factTypes.HasFlag(FactTypes.PageViews)) _fields.Add(new Field { Name = nameFormatter("PageViews"), ValueType = typeof(int), FieldType = FieldType.Fact }); if (factTypes.HasFlag(FactTypes.Count)) _fields.Add(new Field { Name = nameFormatter("Count"), ValueType = typeof(int), FieldType = FieldType.Fact }); }
public static IEnumerable<CalculatedField> GetCalculatedFields(Func<string, string> nameFormatter, FactTypes factTypes) { if (factTypes.HasFlag(FactTypes.Visits) && factTypes.HasFlag(FactTypes.Value)) { yield return new CalculatedField { Name = "Value per visit", DaxPattern = string.Format("SUM([{0}]) / SUM([{1}])", nameFormatter("Value"), nameFormatter("Visits")), FormatString = CalculatedFieldFormat.Decimal }; } if (factTypes.HasFlag(FactTypes.Visits) && factTypes.HasFlag(FactTypes.Bounces)) { yield return new CalculatedField { Name = "Bounce rate", DaxPattern = string.Format("SUM([{0}]) / SUM([{1}])", nameFormatter("Bounces"), nameFormatter("Visits")), FormatString = CalculatedFieldFormat.Percentage }; } if (factTypes.HasFlag(FactTypes.Visits)) { yield return new CalculatedField { Name = "Conversion rate", DaxPattern = string.Format("SUM([{0}]) / SUM(@Parent[Visits])", nameFormatter("Visits")), FormatString = CalculatedFieldFormat.Percentage }; } }
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); }