private void AddDelta(MoneyColumnMetadataJsModel col, TableViewModel table, int daysDiff, string name) { var sequence = table.Values.SkipWhile(v => { var s = v.CalculatedCells.GetValueOrDefault(col)?.Value; return(s == null || double.IsNaN(s.Value)); }).OrderByDescending(v => v.When); var today = sequence.FirstOrDefault(); var baseSet = sequence.FirstOrDefault(v => v.When.Date.AddDays(daysDiff) <= DateTime.Now.Date); var todayValue = today?.CalculatedCells.GetValueOrDefault(col); var baseSetValue = baseSet?.CalculatedCells.GetValueOrDefault(col); if (todayValue != null && baseSetValue != null) { Ccy = Ccy ?? todayValue.Ccy; IncompleteData |= todayValue.FailedToResolve.Concat(baseSetValue.FailedToResolve).Any(); var dT = todayValue.AdjustedValue - baseSetValue.AdjustedValue; if (dT != null && !double.IsNaN(dT.Value) && !double.IsInfinity(dT.Value)) { Deltas.Add(new Pair { Name = name, Value = dT.Value }); } else { IncompleteData = true; } } }
public static CalculatedResult FromMoney(MoneyColumnMetadataJsModel h, MoneyStateModel money, double adjustment) => new CalculatedResult(h) { Money = money, _ccy = money.Ccy, _adjustment = adjustment, _value = money.Amount, _tooltip = money.Description != null ? $"{money.Description} + {adjustment.ToString(CultureInfo.CurrentCulture)}" : $"{(money.Amount).ToString(CultureInfo.CurrentCulture)}({money.Amount.ToString(CultureInfo.CurrentCulture)} + {adjustment.ToString(CultureInfo.CurrentCulture)})" };
public static CalculatedResult FromComputed(MoneyColumnMetadataJsModel item, double?value, string ccy, IEnumerable <string> failedToResolve, double adjustment, string tooltip) => new CalculatedResult(item) { _value = value, _ccy = ccy, _failedToResolve = failedToResolve, _adjustment = adjustment, _tooltip = tooltip };
public ReferenceExpression(MoneyColumnMetadataJsModel column) { _column = column; }
public ConstantExpression(MoneyColumnMetadataJsModel model, string source) { _model = model; _source = source; }
public EmptyExpression(MoneyColumnMetadataJsModel model) { Value = CalculatedResult.Empty(model); }
protected CalculatedResult(MoneyColumnMetadataJsModel item) { Column = item; _failedToResolve = Enumerable.Empty <string>(); }
public static CalculatedResult ResolutionFail(MoneyColumnMetadataJsModel item, params string[] failedToResolve) => new CalculatedResult(item) { _ccy = null, _value = double.NaN, _failedToResolve = failedToResolve };
public static CalculatedResult Empty(MoneyColumnMetadataJsModel item) => new CalculatedResult(item) { _ccy = null, _value = double.NaN };
public static CalculatedResult Missing(MoneyColumnMetadataJsModel item) => new CalculatedResult(item) { _ccy = null, _value = null };
public static CalculatedResult FromComputed(Dictionary <string, MoneyColumnMetadataJsModel> columns, MoneyColumnMetadataJsModel h, Dictionary <MoneyColumnMetadataJsModel, CalculatedResult> deps) { return(new ExpressionCalculatedResult(columns, h, deps)); }
public FailedToParseExpression(MoneyColumnMetadataJsModel model, string function) { _function = function; Value = CalculatedResult.ResolutionFail(model, function); }
public BinaryExpression(MoneyColumnMetadataJsModel model, string symbol) { _model = model; _symbol = symbol; }
private static CalculateExpression Parse(Dictionary <string, MoneyColumnMetadataJsModel> columns, MoneyColumnMetadataJsModel column, string function) { CalculateExpression currentExpression = new EmptyExpression(column); try { while (function.Length > 0) { function = function.Trim(); if (function[0] == '[') { var referenceName = function.Substring(1, function.IndexOf(']') - 1); function = function.Remove(0, function.IndexOf(']') + 1); var matchingColumn = columns[referenceName]; currentExpression = currentExpression.TryApply(new ReferenceExpression(matchingColumn)); } else if (function[0] == '(') { var counter = 1; int i; for (i = 1; i < function.Length && counter > 0; i++) { if (function[i] == '(') { counter++; } if (function[i] == ')') { counter--; } } var sub = function.Substring(0, i); var subExp = Parse(columns, column, sub.TrimStart('(').TrimEnd(')')); currentExpression = currentExpression.TryApply(new ParenthesisExpression(subExp)); function = function.Substring(i); } else if (function[0] == '{') { var constant = function.Substring(1, function.IndexOf('}') - 1); function = function.Remove(0, function.IndexOf('}') + 1); currentExpression = currentExpression.TryApply(new ConstantExpression(column, constant)); } else { var symbol = BinaryExpression.Symbols.FirstOrDefault(function.StartsWith); if (symbol != null) { currentExpression = new BinaryExpression(column, symbol).TryApply(currentExpression); function = function.Substring(symbol.Length); } else { return(new FailedToParseExpression(column, function)); } } } } catch { return(new FailedToParseExpression(column, function)); } return(currentExpression); }
public ExpressionCalculatedResult(Dictionary <string, MoneyColumnMetadataJsModel> columns, MoneyColumnMetadataJsModel h, Dictionary <MoneyColumnMetadataJsModel, CalculatedResult> deps) : base(h) { _deps = deps; var expression = Parse(columns, h, h.Function); _expression = expression; }