Aggregates.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. //using InABox.Core;
  2. //using System;
  3. //using System.Collections.Generic;
  4. //using System.Linq;
  5. //using System.Linq.Expressions;
  6. //using System.Reflection;
  7. //using System.Text;
  8. //using System.Threading.Tasks;
  9. //namespace InABox.Database
  10. //{
  11. // public enum AggregateType
  12. // {
  13. // Sum,
  14. // Count
  15. // }
  16. // public enum AggregateAction
  17. // {
  18. // Add,
  19. // Subtract
  20. // }
  21. // public interface IAggregate<TSource, TTarget> where TSource : Entity, new() where TTarget : Entity, new()
  22. // {
  23. // bool Calculate(TSource source, TTarget previous, TTarget current);
  24. // //void Reduce(TTarget target);
  25. // //void Increase(TTarget target, bool TargetChanged);
  26. // String AggregateValue(TTarget target);
  27. // }
  28. // public abstract class Aggregate<TSource, TTarget, TType> : IAggregate<TSource, TTarget> where TSource : Entity, new() where TTarget : Entity, new()
  29. // {
  30. // public Expression<Func<TSource, TType>> Source { get; set; }
  31. // public TType CurrentValue { get; set; }
  32. // public TType OriginalValue { get; set; }
  33. // public Expression<Func<TTarget, TType>> Target { get; set; }
  34. // public AggregateType Type { get; private set; }
  35. // private Aggregate()
  36. // {
  37. // }
  38. // public Aggregate(Expression<Func<TSource, TType>> source, Expression<Func<TTarget, TType>> target, AggregateType type) : base()
  39. // {
  40. // Type = type;
  41. // Source = source; // source != null ? CoreUtils.GetPropertyFromExpression<TSource, TType>(source) : null;
  42. // Target = target; // target != null ? CoreUtils.GetPropertyFromExpression<TTarget, TType>(target) : null;
  43. // }
  44. // protected virtual TType ConvertValue(object value)
  45. // {
  46. // return (TType)Convert.ChangeType(value, typeof(TType));
  47. // }
  48. // public bool CalculateSum(TSource source, TTarget previous, TTarget current)
  49. // {
  50. // var src = CoreUtils.GetPropertyFromExpression<TSource, TType>(Source);
  51. // CurrentValue = (TType)src.GetValue(source);
  52. // //OriginalValue = ((source.OriginalValues != null) && (source.OriginalValues.ContainsKey(Source.Name))) ? ConvertValue(source.OriginalValues[Source.Name]) : CurrentValue;
  53. // OriginalValue = source.HasOriginalValue(Source) ? source.GetOriginalValue(Source) : CurrentValue;
  54. // if ((previous != current) || (!Equals(CurrentValue, OriginalValue)))
  55. // {
  56. // var tgt = CoreUtils.GetPropertyFromExpression<TTarget, TType>(Target);
  57. // if (previous != null)
  58. // {
  59. // TType PreviousAggregrate = (TType)tgt.GetValue(previous);
  60. // tgt.SetValue(previous, Accumulate(AggregateAction.Subtract, PreviousAggregrate, OriginalValue));
  61. // }
  62. // if (current != null)
  63. // {
  64. // TType CurrentAggregate = (TType)tgt.GetValue(current);
  65. // tgt.SetValue(current, Accumulate(AggregateAction.Add, CurrentAggregate, CurrentValue));
  66. // }
  67. // return true;
  68. // }
  69. // return false;
  70. // }
  71. // public bool CalculateCount(TSource source, TTarget previous, TTarget current)
  72. // {
  73. // if (previous != current)
  74. // {
  75. // TType value = (TType)Convert.ChangeType(1, typeof(TType));
  76. // var tgt = CoreUtils.GetPropertyFromExpression<TTarget, TType>(Target);
  77. // if (previous != null)
  78. // {
  79. // TType PreviousAggregrate = (TType)tgt.GetValue(previous);
  80. // tgt.SetValue(previous, Accumulate(AggregateAction.Subtract, PreviousAggregrate, Counter()));
  81. // }
  82. // if (current != null)
  83. // {
  84. // TType CurrentAggregate = (TType)tgt.GetValue(current);
  85. // tgt.SetValue(current, Accumulate(AggregateAction.Add, CurrentAggregate, Counter()));
  86. // }
  87. // return true;
  88. // }
  89. // return false;
  90. // }
  91. // public bool Calculate(TSource source, TTarget previous, TTarget current)
  92. // {
  93. // return Type.Equals(AggregateType.Sum)
  94. // ? CalculateSum(source, previous, current)
  95. // : CalculateCount(source, previous, current);
  96. // }
  97. // protected abstract TType Accumulate(AggregateAction calculation, TType currentValue, TType originalValue);
  98. // public abstract TType Counter();
  99. // public String AggregateValue(TTarget target)
  100. // {
  101. // var tgt = CoreUtils.GetPropertyFromExpression<TTarget, TType>(Target);
  102. // return String.Format("{0}: {1}", tgt.Name, tgt.GetValue(target));
  103. // }
  104. // }
  105. // public class DoubleAggregate<TSource, TTarget> : Aggregate<TSource, TTarget, Double> where TSource : Entity, new() where TTarget : Entity, new()
  106. // {
  107. // public DoubleAggregate(Expression<Func<TSource, Double>> source, Expression<Func<TTarget, Double>> target, AggregateType type) : base(source, target, type) { }
  108. // public override double Counter()
  109. // {
  110. // return 1.00F;
  111. // }
  112. // protected override double Accumulate(AggregateAction calculation, double currentValue, double originalValue)
  113. // {
  114. // return calculation == AggregateAction.Subtract ? currentValue - originalValue : currentValue + originalValue;
  115. // }
  116. // }
  117. // public class TimeSpanAggregate<TSource, TTarget> : Aggregate<TSource, TTarget, TimeSpan> where TSource : Entity, new() where TTarget : Entity, new()
  118. // {
  119. // public TimeSpanAggregate(Expression<Func<TSource, TimeSpan>> source, Expression<Func<TTarget, TimeSpan>> target, AggregateType type) : base(source, target, type) { }
  120. // public override TimeSpan Counter()
  121. // {
  122. // return new TimeSpan(1);
  123. // }
  124. // protected override TimeSpan ConvertValue(object value)
  125. // {
  126. // if (value is String)
  127. // return TimeSpan.Parse((String)value);
  128. // return base.ConvertValue(value);
  129. // }
  130. // protected override TimeSpan Accumulate(AggregateAction calculation, TimeSpan currentValue, TimeSpan originalValue)
  131. // {
  132. // return calculation == AggregateAction.Subtract ? currentValue - originalValue : currentValue + originalValue;
  133. // }
  134. // }
  135. // public class IntegerAggregate<TSource, TTarget> : Aggregate<TSource, TTarget, int> where TSource : Entity, new() where TTarget : Entity, new()
  136. // {
  137. // public IntegerAggregate(Expression<Func<TSource, int>> source, Expression<Func<TTarget, int>> target, AggregateType type) : base(source, target, type) { }
  138. // public override int Counter()
  139. // {
  140. // return 1;
  141. // }
  142. // protected override int Accumulate(AggregateAction calculation, int currentValue, int originalValue)
  143. // {
  144. // return calculation == AggregateAction.Subtract ? currentValue - originalValue : currentValue + originalValue;
  145. // }
  146. // }
  147. //}