public Characteristic(FormulaInfo formulaInfo, ReportDataProvider reportDataProvider)
        {
            if (formulaInfo == null)
            {
                throw new ArgumentNullException("formulaInfo");
            }
            if (reportDataProvider == null)
            {
                throw new ArgumentNullException("reportDataProvider");
            }

            _reportDataProvider = reportDataProvider;

            var formulaCore = formulaInfo.Coefficients
                                         .Aggregate(formulaInfo.Expression,
                                             (current, coeff) =>
                                                 current.Replace(coeff.Key,
                                                     coeff.Value.ToString(CultureInfo.InvariantCulture)));

            _arguments = formulaInfo.Arguments;

            var preparedExpression = ToolsHelper.Parser.Parse(formulaCore);
            _compiledExpression = ToolsHelper.Compiler.Compile(preparedExpression);
            _compiledExpression = ToolsHelper.Optimizer.Optimize(_compiledExpression);
        }
        public Report(string name,
                      IReportTableProvider tableProvider,
                      IFormulaProvider formulaProvider,
                      ReportDataProvider reportDataProvider)
        {
            if (tableProvider == null)
            {
                throw new ArgumentNullException("tableProvider");
            }
            if (formulaProvider == null)
            {
                throw new ArgumentNullException("formulaProvider");
            }
            if (reportDataProvider == null)
            {
                throw new ArgumentNullException("reportDataProvider");
            }

            Names = new List<string> {name};
            ReportTables = new List<ReportTable>();

            foreach (var xmlTable in tableProvider.GetTables())
            {
                var reportTable = new ReportTable(xmlTable, formulaProvider, reportDataProvider);
                ReportTables.Add(reportTable);
            }
        }
        public ReportTable(XReportTable xmlTable,
                           IFormulaProvider formulaProvider,
                           ReportDataProvider reportDataProvider)
        {
            if (xmlTable == null)
            {
                throw new ArgumentNullException("xmlTable");
            }
            if (formulaProvider == null)
            {
                throw new ArgumentNullException("formulaProvider");
            }
            if (reportDataProvider == null)
            {
                throw new ArgumentNullException("reportDataProvider");
            }

            Name = xmlTable.Name;
            ReportGroups = new List<ReportGroup>();

            foreach (var xmlGroup in xmlTable.Groups)
            {
                var reportGroup = new ReportGroup(xmlGroup, formulaProvider, reportDataProvider);
                ReportGroups.Add(reportGroup);
            }
        }
 public ReportGenerator(Func<Type, IReportTableProvider> reportTableResolver,
     IFormulaProvider formulaProvider,
     ReportDataProvider reportDataProvider)
 {
     _reportTableResolver = reportTableResolver;
     _formulaProvider = formulaProvider;
     _reportDataProvider = reportDataProvider;
 }
        public ReportGroup(XReportTableGroup xmlGroup,
            IFormulaProvider formulaProvider,
            ReportDataProvider reportDataProvider)
        {
            if (xmlGroup == null)
            {
                throw new ArgumentNullException("xmlGroup");
            }
            if (formulaProvider == null)
            {
                throw new ArgumentNullException("formulaProvider");
            }
            if (reportDataProvider == null)
            {
                throw new ArgumentNullException("reportDataProvider");
            }

            Name = xmlGroup.Name;
            ReportRows = new List<ReportRow>();

            foreach (var formulaId in xmlGroup.Formulas)
            {
                var formulaInfo = formulaProvider.GetFormula(formulaId);
                var characteristic = new Characteristic(formulaInfo, reportDataProvider);
                var value = NormalizeValue(characteristic.Evaluate());

                if (double.IsNaN(value))
                {
                    value = 0;
                }

                //TODO: Round or Integral part?
                var reportFormula = new ReportRow(formulaInfo.Name,
                    Convert.ToInt32(value),
                    Convert.ToInt32(formulaInfo.MaxValue));
                ReportRows.Add(reportFormula);
            }
        }