| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 | 
							- //using InABox.Core;
 
- //using System;
 
- //using System.Collections.Generic;
 
- //using System.Linq;
 
- //using System.Linq.Expressions;
 
- //using System.Reflection;
 
- //using System.Text;
 
- //using System.Threading.Tasks;
 
- //namespace InABox.Database
 
- //{
 
- //    public enum AggregateType
 
- //    {
 
- //        Sum,
 
- //        Count
 
- //    }
 
- //    public enum AggregateAction
 
- //    {
 
- //        Add,
 
- //        Subtract
 
- //    }
 
- //    public interface IAggregate<TSource, TTarget> where TSource : Entity, new() where TTarget : Entity, new()
 
- //    {
 
- //        bool Calculate(TSource source, TTarget previous, TTarget current);
 
- //        //void Reduce(TTarget target);
 
- //        //void Increase(TTarget target, bool TargetChanged);
 
- //        String AggregateValue(TTarget target);
 
- //    }
 
- //    public abstract class Aggregate<TSource, TTarget, TType> : IAggregate<TSource, TTarget> where TSource : Entity, new() where TTarget : Entity, new()
 
- //    {
 
- //        public Expression<Func<TSource, TType>> Source { get; set; }
 
- //        public TType CurrentValue { get; set; }
 
- //        public TType OriginalValue { get; set; }
 
- //        public Expression<Func<TTarget, TType>> Target { get; set; }
 
- //        public AggregateType Type { get; private set; }
 
- //        private Aggregate()
 
- //        {
 
- //        } 
 
- //        public Aggregate(Expression<Func<TSource, TType>> source, Expression<Func<TTarget, TType>> target, AggregateType type) : base()
 
- //        {
 
- //            Type = type;
 
- //            Source = source; // source != null ? CoreUtils.GetPropertyFromExpression<TSource, TType>(source) : null;
 
- //            Target = target; // target != null ? CoreUtils.GetPropertyFromExpression<TTarget, TType>(target) : null;
 
- //        }
 
- //        protected virtual TType ConvertValue(object value)
 
- //        {
 
- //            return (TType)Convert.ChangeType(value, typeof(TType));
 
- //        }
 
- //        public bool CalculateSum(TSource source, TTarget previous, TTarget current)
 
- //        {
 
- //            var src = CoreUtils.GetPropertyFromExpression<TSource, TType>(Source);
 
- //            CurrentValue = (TType)src.GetValue(source);
 
- //            //OriginalValue = ((source.OriginalValues != null) && (source.OriginalValues.ContainsKey(Source.Name))) ? ConvertValue(source.OriginalValues[Source.Name]) : CurrentValue;
 
- //            OriginalValue = source.HasOriginalValue(Source) ? source.GetOriginalValue(Source) : CurrentValue;
 
- //            if ((previous != current) || (!Equals(CurrentValue, OriginalValue)))
 
- //            {
 
- //                var tgt = CoreUtils.GetPropertyFromExpression<TTarget, TType>(Target);
 
- //                if (previous != null)
 
- //                {
 
- //                    TType PreviousAggregrate = (TType)tgt.GetValue(previous);
 
- //                    tgt.SetValue(previous, Accumulate(AggregateAction.Subtract, PreviousAggregrate, OriginalValue));
 
- //                }
 
- //                if (current != null)
 
- //                {
 
- //                    TType CurrentAggregate = (TType)tgt.GetValue(current);
 
- //                    tgt.SetValue(current, Accumulate(AggregateAction.Add, CurrentAggregate, CurrentValue));
 
- //                }
 
- //                return true;
 
- //            }
 
- //            return false;
 
- //        }
 
- //        public bool CalculateCount(TSource source, TTarget previous, TTarget current)
 
- //        {
 
- //            if (previous != current)
 
- //            {
 
- //                TType value = (TType)Convert.ChangeType(1, typeof(TType));
 
- //                var tgt = CoreUtils.GetPropertyFromExpression<TTarget, TType>(Target);
 
- //                if (previous != null)
 
- //                {
 
- //                    TType PreviousAggregrate = (TType)tgt.GetValue(previous);
 
- //                    tgt.SetValue(previous, Accumulate(AggregateAction.Subtract, PreviousAggregrate, Counter()));
 
- //                }
 
- //                if (current != null)
 
- //                {
 
- //                    TType CurrentAggregate = (TType)tgt.GetValue(current);
 
- //                    tgt.SetValue(current, Accumulate(AggregateAction.Add, CurrentAggregate, Counter()));
 
- //                }
 
- //                return true;
 
- //            }
 
- //            return false;
 
- //        }
 
- //        public bool Calculate(TSource source, TTarget previous, TTarget current)
 
- //        {
 
- //            return Type.Equals(AggregateType.Sum)
 
- //                ? CalculateSum(source, previous, current)
 
- //                : CalculateCount(source, previous, current);
 
- //        }
 
- //        protected abstract TType Accumulate(AggregateAction calculation, TType currentValue, TType originalValue);
 
- //        public abstract TType Counter();
 
- //        public String AggregateValue(TTarget target)
 
- //        {
 
- //            var tgt = CoreUtils.GetPropertyFromExpression<TTarget, TType>(Target);
 
- //            return String.Format("{0}: {1}", tgt.Name, tgt.GetValue(target));
 
- //        }
 
- //    }
 
- //    public class DoubleAggregate<TSource, TTarget> : Aggregate<TSource, TTarget, Double> where TSource : Entity, new() where TTarget : Entity, new()
 
- //    {
 
- //        public DoubleAggregate(Expression<Func<TSource, Double>> source, Expression<Func<TTarget, Double>> target, AggregateType type) : base(source, target, type) { }
 
- //        public override double Counter()
 
- //        {
 
- //            return 1.00F;
 
- //        }
 
- //        protected override double Accumulate(AggregateAction calculation, double currentValue, double originalValue)
 
- //        {
 
- //            return calculation == AggregateAction.Subtract ? currentValue - originalValue : currentValue + originalValue;
 
- //        }
 
- //    }
 
- //    public class TimeSpanAggregate<TSource, TTarget> : Aggregate<TSource, TTarget, TimeSpan> where TSource : Entity, new() where TTarget : Entity, new()
 
- //    {
 
- //        public TimeSpanAggregate(Expression<Func<TSource, TimeSpan>> source, Expression<Func<TTarget, TimeSpan>> target, AggregateType type) : base(source, target, type) { }
 
- //        public override TimeSpan Counter()
 
- //        {
 
- //            return new TimeSpan(1);
 
- //        }
 
- //        protected override TimeSpan ConvertValue(object value)
 
- //        {
 
- //            if (value is String)
 
- //                return TimeSpan.Parse((String)value);
 
- //            return base.ConvertValue(value);
 
- //        }
 
- //        protected override TimeSpan Accumulate(AggregateAction calculation, TimeSpan currentValue, TimeSpan originalValue)
 
- //        {
 
- //            return calculation == AggregateAction.Subtract ? currentValue - originalValue : currentValue + originalValue;
 
- //        }
 
- //    }
 
- //    public class IntegerAggregate<TSource, TTarget> : Aggregate<TSource, TTarget, int> where TSource : Entity, new() where TTarget : Entity, new()
 
- //    {
 
- //        public IntegerAggregate(Expression<Func<TSource, int>> source, Expression<Func<TTarget, int>> target, AggregateType type) : base(source, target, type) { }
 
- //        public override int Counter()
 
- //        {
 
- //            return 1;
 
- //        }
 
- //        protected override int Accumulate(AggregateAction calculation, int currentValue, int originalValue)
 
- //        {
 
- //            return calculation == AggregateAction.Subtract ? currentValue - originalValue : currentValue + originalValue;
 
- //        }
 
- //    }
 
- //}
 
 
  |