Пример #1
0
        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);
        }
Пример #2
0
        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));
        }