| 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;//        }//    }//}
 |