/// <summary>Constructs the auto import service. </summary>
        /// <param name="configSnapshot">config info</param>
        /// <returns>service</returns>
        internal static EngineImportService MakeEngineImportService(
            ConfigurationInformation configSnapshot,
            AggregationFactoryFactory aggregationFactoryFactory)
        {
            var expression          = configSnapshot.EngineDefaults.ExpressionConfig;
            var engineImportService = new EngineImportServiceImpl(
                expression.IsExtendedAggregation,
                expression.IsUdfCache,
                expression.IsDuckTyping,
                configSnapshot.EngineDefaults.LanguageConfig.IsSortUsingCollator,
                expression.MathContext,
                expression.TimeZone,
                configSnapshot.EngineDefaults.ExecutionConfig.ThreadingProfile,
                aggregationFactoryFactory);

            engineImportService.AddMethodRefs(configSnapshot.MethodInvocationReferences);

            // Add auto-imports
            try
            {
                foreach (var importName in configSnapshot.Imports)
                {
                    engineImportService.AddImport(importName);
                }

                foreach (var importName in configSnapshot.AnnotationImports)
                {
                    engineImportService.AddAnnotationImport(importName);
                }

                foreach (ConfigurationPlugInAggregationFunction config in configSnapshot.PlugInAggregationFunctions)
                {
                    engineImportService.AddAggregation(config.Name, config);
                }

                foreach (ConfigurationPlugInAggregationMultiFunction config in configSnapshot.PlugInAggregationMultiFunctions)
                {
                    engineImportService.AddAggregationMultiFunction(config);
                }

                foreach (ConfigurationPlugInSingleRowFunction config in configSnapshot.PlugInSingleRowFunctions)
                {
                    engineImportService.AddSingleRow(config.Name, config.FunctionClassName, config.FunctionMethodName, config.ValueCache, config.FilterOptimizable, config.RethrowExceptions);
                }
            }
            catch (EngineImportException ex)
            {
                throw new ConfigurationException("Error configuring engine: " + ex.Message, ex);
            }

            return(engineImportService);
        }
        /// <summary>
        /// Constructs the auto import service.
        /// </summary>
        /// <param name="classLoaderProvider">The class loader provider.</param>
        /// <param name="configSnapshot">config INFO</param>
        /// <param name="aggregationFactoryFactory">factory of aggregation service provider</param>
        /// <param name="engineURI">The engine URI.</param>
        /// <returns>
        /// service
        /// </returns>
        /// <exception cref="ConfigurationException">Invalid time-source time unit of " + timeUnit + ", expected millis or micros
        /// or
        /// Error configuring engine: " + ex.Message</exception>
        internal static EngineImportService MakeEngineImportService(
            ClassLoaderProvider classLoaderProvider,
            ConfigurationInformation configSnapshot,
            AggregationFactoryFactory aggregationFactoryFactory,
            String engineURI)
        {
            TimeUnit   timeUnit = configSnapshot.EngineDefaults.TimeSource.TimeUnit;
            TimeAbacus timeAbacus;

            if (timeUnit == TimeUnit.MILLISECONDS)
            {
                timeAbacus = TimeAbacusMilliseconds.INSTANCE;
            }
            else if (timeUnit == TimeUnit.MICROSECONDS)
            {
                timeAbacus = TimeAbacusMicroseconds.INSTANCE;
            }
            else
            {
                throw new ConfigurationException(
                          "Invalid time-source time unit of " + timeUnit + ", expected millis or micros");
            }

            var codegenGetters = configSnapshot.EngineDefaults.Execution.CodeGeneration.IsEnablePropertyGetter;

            if (codegenGetters)
            {
                if (CheckPackageName("uri_" + engineURI) == PackageName.INVALID)
                {
                    throw new ConfigurationException("Invalid engine URI '" + engineURI + "', code generation requires an engine URI that is a valid Java-language identifier and may not contain Java language keywords");
                }
            }

            var expression          = configSnapshot.EngineDefaults.Expression;
            var engineImportService = new EngineImportServiceImpl(
                expression.IsExtendedAggregation,
                expression.IsUdfCache, expression.IsDuckTyping,
                configSnapshot.EngineDefaults.Language.IsSortUsingCollator,
                configSnapshot.EngineDefaults.Expression.MathContext,
                configSnapshot.EngineDefaults.Expression.TimeZone, timeAbacus,
                configSnapshot.EngineDefaults.Execution.ThreadingProfile,
                configSnapshot.TransientConfiguration,
                aggregationFactoryFactory,
                codegenGetters,
                engineURI,
                null,
                classLoaderProvider);

            engineImportService.AddMethodRefs(configSnapshot.MethodInvocationReferences);

            // Add auto-imports
            try
            {
                foreach (var importName in configSnapshot.Imports)
                {
                    engineImportService.AddImport(importName);
                }

                foreach (var importName in configSnapshot.AnnotationImports)
                {
                    engineImportService.AddAnnotationImport(importName);
                }

                foreach (var config in configSnapshot.PlugInAggregationFunctions)
                {
                    engineImportService.AddAggregation(config.Name, config);
                }

                foreach (var config in configSnapshot.PlugInAggregationMultiFunctions)
                {
                    engineImportService.AddAggregationMultiFunction(config);
                }

                foreach (var config in configSnapshot.PlugInSingleRowFunctions)
                {
                    engineImportService.AddSingleRow(
                        config.Name, config.FunctionClassName, config.FunctionMethodName, config.ValueCache,
                        config.FilterOptimizable, config.IsRethrowExceptions, config.EventTypeName);
                }
            }
            catch (EngineImportException ex)
            {
                throw new ConfigurationException("Error configuring engine: " + ex.Message, ex);
            }

            return(engineImportService);
        }
        /// <summary>
        /// Constructs the auto import service.
        /// </summary>
        /// <param name="configSnapshot">config INFO</param>
        /// <param name="aggregationFactoryFactory">factory of aggregation service provider</param>
        /// <returns>service</returns>
        internal static EngineImportService MakeEngineImportService(
            ConfigurationInformation configSnapshot,
            AggregationFactoryFactory aggregationFactoryFactory)
        {
            TimeUnit   timeUnit = configSnapshot.EngineDefaults.TimeSource.TimeUnit;
            TimeAbacus timeAbacus;

            if (timeUnit == TimeUnit.MILLISECONDS)
            {
                timeAbacus = TimeAbacusMilliseconds.INSTANCE;
            }
            else if (timeUnit == TimeUnit.MICROSECONDS)
            {
                timeAbacus = TimeAbacusMicroseconds.INSTANCE;
            }
            else
            {
                throw new ConfigurationException(
                          "Invalid time-source time unit of " + timeUnit + ", expected millis or micros");
            }

            var expression          = configSnapshot.EngineDefaults.Expression;
            var engineImportService = new EngineImportServiceImpl(
                expression.IsExtendedAggregation,
                expression.IsUdfCache, expression.IsDuckTyping,
                configSnapshot.EngineDefaults.Language.IsSortUsingCollator,
                configSnapshot.EngineDefaults.Expression.MathContext,
                configSnapshot.EngineDefaults.Expression.TimeZone, timeAbacus,
                configSnapshot.EngineDefaults.Execution.ThreadingProfile,
                configSnapshot.TransientConfiguration,
                aggregationFactoryFactory);

            engineImportService.AddMethodRefs(configSnapshot.MethodInvocationReferences);

            // Add auto-imports
            try
            {
                foreach (var importName in configSnapshot.Imports)
                {
                    engineImportService.AddImport(importName);
                }

                foreach (var importName in configSnapshot.AnnotationImports)
                {
                    engineImportService.AddAnnotationImport(importName);
                }

                foreach (var config in configSnapshot.PlugInAggregationFunctions)
                {
                    engineImportService.AddAggregation(config.Name, config);
                }

                foreach (var config in configSnapshot.PlugInAggregationMultiFunctions)
                {
                    engineImportService.AddAggregationMultiFunction(config);
                }

                foreach (var config in configSnapshot.PlugInSingleRowFunctions)
                {
                    engineImportService.AddSingleRow(
                        config.Name, config.FunctionClassName, config.FunctionMethodName, config.ValueCache,
                        config.FilterOptimizable, config.IsRethrowExceptions, config.EventTypeName);
                }
            }
            catch (EngineImportException ex)
            {
                throw new ConfigurationException("Error configuring engine: " + ex.Message, ex);
            }

            return(engineImportService);
        }