/// <summary>Ctor. </summary>
        /// <param name="engineURI">engine URI</param>
        /// <param name="specification">specifies statement groups</param>
        public StatementMetricRepository(String engineURI,
                                         MetricsReportingConfig specification)
        {
            _specification = specification;
            int numGroups = specification.StatementGroups.Count + 1; // +1 for default group (remaining stmts)

            _groupMetrics = new StatementMetricArray[numGroups];

            // default group
            _groupMetrics[0] = new StatementMetricArray(engineURI, "group-default", 100, false);

            // initialize all other groups
            int countGroups = 1;

            foreach (var entry in specification.StatementGroups)
            {
                MetricsReportingConfig.StmtGroupMetrics config = entry.Value;

                int initialNumStmts = config.NumStatements;
                if (initialNumStmts < 10)
                {
                    initialNumStmts = 10;
                }
                _groupMetrics[countGroups] = new StatementMetricArray(engineURI, "group-" + countGroups, initialNumStmts,
                                                                      config.IsReportInactive);
                countGroups++;
            }

            _statementGroups = new Dictionary <String, int?>();
        }
        /// <summary>Ctor. </summary>
        /// <param name="specification">configuration</param>
        /// <param name="engineUri">engine URI</param>
        public MetricReportingServiceImpl(MetricsReportingConfig specification, String engineUri)
        {
            _specification = specification;
            _engineUri     = engineUri;
            _schedule      = new MetricScheduleService();

            _stmtMetricRepository     = new StatementMetricRepository(engineUri, specification);
            _statementGroupExecutions = new LinkedHashMap <String, MetricExecStatement>();
            _statementMetricHandles   = new Dictionary <String, StatementMetricHandle>();
            StatementOutputHooks      = new CopyOnWriteArraySet <StatementResultListener>();

            if (specification.IsThreading)
            {
                _metricsExecutor = new MetricsExecutorThreaded(engineUri);
            }
            else
            {
                _metricsExecutor = new MetricsExecutorUnthreaded();
            }
        }