/// <summary> /// /// </summary> /// <param name="lstParameters"></param> /// <param name="template"></param> /// <returns></returns> public string DonutFunctionToMongoAggregateElement(List <ParameterExpression> lstParameters, string template) { for (int i = 0; i < lstParameters.Count; i++) { var parameter = lstParameters[i]; object paramOutputObj; var pValue = parameter.Value; var argExpVisitor = new AggregateFeatureGeneratingExpressionVisitor(_script); //If we visit functions here, note that in the pipeline var paramStr = argExpVisitor.Visit(parameter as IExpression, out paramOutputObj); var subAggregateTree = argExpVisitor.AggregateTree; if (pValue is NameExpression varValue && varValue.Member != null) { var isRootIntegrationVar = varValue.Name == _script.GetRootIntegration().Name; //Strip the root integration name in cases of [IntegrationName].[Function]. if (isRootIntegrationVar) { pValue = varValue.Member; } } if (pValue is MemberExpression memberValue) { pValue = memberValue.Parent; } ChildStages.AddRange(subAggregateTree.Stages); if (pValue is CallExpression || paramOutputObj is IDonutTemplateFunction <string> ) { if (Function.Type == DonutFunctionType.GroupField) { if (paramOutputObj is IDonutTemplateFunction <string> iDonutFn && iDonutFn.Type == DonutFunctionType.Project) { throw new System.Exception( $"Function {Function} is a grouping and cannot have projection arguments."); } } } template = FormatDonutFnAggregateParameter(template, pValue, paramOutputObj, i, paramStr); } return(template); }
public AggregateFeatureCodeGenerator(DonutScript script, AggregateFeatureGeneratingExpressionVisitor expVisitor) : base(script) { _donutFnResolver = new DonutFunctions(); _rootIntegration = script.Integrations.FirstOrDefault(); if (_rootIntegration == null) { throw new InvalidIntegrationException("Script has no integrations"); } if (_rootIntegration.Fields == null || _rootIntegration.Fields.Count == 0) { throw new InvalidIntegrationException("Integration has no fields"); } _rootDataMember = script.GetDatasetMember(_rootIntegration.Name); _outputCollection = _rootIntegration.FeaturesCollection; if (string.IsNullOrEmpty(_outputCollection)) { throw new InvalidOperationException("Root integration must have a features collection set."); } _expVisitor = expVisitor ?? throw new ArgumentNullException(nameof(expVisitor)); _aggregateJobTrees = new List <AggregateJobTree>(); }
//private DataIntegration _integration; public DonutScriptCodeGenerator(DonutScript script) { _expVisitor = new AggregateFeatureGeneratingExpressionVisitor(script); //_integration = integration; }