private void ProcessAggregator(NameOrScriptBlock name, EnumOrScriptBlock <FactorySummaryMode> aggregator, ScriptBlock finalizer) { if (summarySensors.Count == 0) { return; } var blocks = GetScriptBlockFromSummaryMode(aggregator, finalizer); foreach (var sensor in summarySensors) { ProcessAggregatorInternal(sensor, blocks.Item1); } ProcessAggregatorEnd(name, summarySensors.LastOrDefault(), blocks.Item2); }
private Tuple <ScriptBlock, ScriptBlock> GetScriptBlockFromSummaryMode(EnumOrScriptBlock <FactorySummaryMode> summary, ScriptBlock finalizer) { ScriptBlock agg = null; ScriptBlock fin = finalizer; if (!summary.IsScriptBlock) { switch (summary.Value) { case FactorySummaryMode.Max: agg = ScriptBlock.Create("\"max($acc, $expr)\""); break; case FactorySummaryMode.Min: agg = ScriptBlock.Create("\"min($acc, $expr)\""); break; case FactorySummaryMode.Sum: agg = ScriptBlock.Create("\"$acc + $expr\""); break; case FactorySummaryMode.Average: agg = ScriptBlock.Create("\"$acc + $expr\""); fin = ScriptBlock.Create($"\"($acc) / {summarySensors.Count}\""); break; default: throw new NotImplementedException($"Don't know how to handle summary mode '{summary.Value}'."); } } else { agg = summary.ScriptBlock; } return(Tuple.Create(agg, fin)); }