public static ExprNode TryResolveAsAggregation( EngineImportService engineImportService, bool distinct, String functionName, LazyAllocatedMap <ConfigurationPlugInAggregationMultiFunction, PlugInAggregationMultiFunctionFactory> plugInAggregations, String engineURI) { try { AggregationFunctionFactory aggregationFactory = engineImportService.ResolveAggregationFactory(functionName); return(new ExprPlugInAggNode(distinct, aggregationFactory, functionName)); } catch (EngineImportUndefinedException) { // Not an aggregation function } catch (EngineImportException e) { throw new IllegalStateException("Error resolving aggregation: " + e.Message, e); } // try plug-in aggregation multi-function ConfigurationPlugInAggregationMultiFunction config = engineImportService.ResolveAggregationMultiFunction(functionName); if (config != null) { PlugInAggregationMultiFunctionFactory factory = plugInAggregations.Map.Get(config); if (factory == null) { factory = TypeHelper.Instantiate <PlugInAggregationMultiFunctionFactory>( config.MultiFunctionFactoryClassName); plugInAggregations.Map.Put(config, factory); } factory.AddAggregationFunction( new PlugInAggregationMultiFunctionDeclarationContext( functionName.ToLower(), distinct, engineURI, config)); return(new ExprPlugInAggMultiFunctionNode(distinct, config, factory, functionName)); } // try built-in expanded set of aggregation functions return(engineImportService.ResolveAggExtendedBuiltin(functionName, distinct)); }