public XaTableMapper(IDimension dimension, string tableName = null,
            string dimensionTableName = null, bool hashKey = false,
            string keyName = null, string labelName = null, ILabelProvider labelProvider = null,            
            IEnumerable<IFieldMapper> additionalFields = null, FactTypes factTypes = FactTypes.All)
        {
            var defintion = new TableDefinition(tableName);

            Dimension = dimension;

            labelName = labelName ?? dimension.GetType().Name + "Label";            
            
            defintion.FieldMappers.Add(new FieldMapperSet(dimensionTableName, dimensionTableName == null,
                new[]
                {
                    new LabeledFieldMapper(new XaDimensionDataMapper(dimension, !hashKey, keyName), labelName, labelProvider, friendlyName: XaFieldMapper.SuggestFriendlyLabelName(labelName))
                }));

            defintion.FieldMappers.Add(new XaFacts(factTypes: factTypes));

            if (additionalFields != null)
            {
                foreach (var f in additionalFields)
                {
                    defintion.FieldMappers.Add(f);
                }
            }
            
            TableDefinitions.Add(defintion);
        }
        public XaTableMapper(IDimension dimension, string tableName = null,
                             string dimensionTableName = null, bool hashKey     = false,
                             string keyName            = null, string labelName = null, ILabelProvider labelProvider = null,
                             IEnumerable <IFieldMapper> additionalFields = null, FactTypes factTypes = FactTypes.All)
        {
            var defintion = new TableDefinition(tableName);

            Dimension = dimension;

            labelName = labelName ?? dimension.GetType().Name + "Label";

            defintion.FieldMappers.Add(new FieldMapperSet(dimensionTableName, dimensionTableName == null,
                                                          new[]
            {
                new LabeledFieldMapper(new XaDimensionDataMapper(dimension, !hashKey, keyName), labelName, labelProvider, friendlyName: XaFieldMapper.SuggestFriendlyLabelName(labelName))
            }));

            defintion.FieldMappers.Add(new XaFacts(factTypes: factTypes));

            if (additionalFields != null)
            {
                foreach (var f in additionalFields)
                {
                    defintion.FieldMappers.Add(f);
                }
            }

            TableDefinitions.Add(defintion);
        }
Beispiel #3
0
 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 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 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 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 FactsMapper(FactTypes factTypes, Func<string, string> nameFormatter, bool calculateForEntireVisit = false)
 {
     NameFormatter = nameFormatter;
     CalculateForEntireVisit = calculateForEntireVisit;
     FactTypes = factTypes;
 }
Beispiel #9
0
 public FactsMapper(FactTypes factTypes, Func <string, string> nameFormatter, bool calculateForEntireVisit = false)
 {
     NameFormatter           = nameFormatter;
     CalculateForEntireVisit = calculateForEntireVisit;
     FactTypes = factTypes;
 }
Beispiel #10
0
        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
                });
            }
        }
Beispiel #11
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);
        }
Beispiel #12
0
 public Fact(FactTypes type, DecompositionTypes decomposition)
 {
     Type          = type;
     Decomposition = decomposition;
 }