/// <summary> /// Add a feature assignment to the aggregate pipeline /// </summary> /// <param name="feature"></param> public override void Add(AssignmentExpression feature) { IExpression fExpression = feature.Value; string fName = GetFeatureName(feature);//feature.Member.ToString(); var featureFType = fExpression.GetType(); string featureContent = null; if (featureFType == typeof(NameExpression)) { var aggTree = AddAggregateTreeFromField(fExpression as NameExpression); aggTree.Name = fName; _aggregateJobTrees.Add(aggTree); // var member = (fExpression as NameExpression).Member?.ToString(); // //In some cases we might just use the field // if (string.IsNullOrEmpty(member)) member = fExpression.ToString(); // featureContent = $"groupFields[\"{fName}\"] = " + "new BsonDocument { { \"$first\", \"$" + member + "\" } };"; } else if (fExpression.IsDonutAggregateFunction()) { //We're dealing with an aggregate call var aggregateTree = AddAggregateTreeFromCall(fExpression as CallExpression); aggregateTree.Name = fName; _aggregateJobTrees.Add(aggregateTree); var functionType = _donutFnResolver.GetFunctionType(fExpression as CallExpression); switch (functionType) { case DonutFunctionType.GroupField: HasGroupingFields = true; break; case DonutFunctionType.Project: HasProjection = true; break; case DonutFunctionType.GroupKey: HasGroupingKeys = true; break; case DonutFunctionType.Filter: HasFilters = true; break; } } else { //This is not a donut aggregate throw new NotImplementedException(fExpression.ToString()); } }
public static bool IsDonutNativeFeature(this AssignmentExpression fExpr) { var fExpression = fExpr.Value; if (fExpression is CallExpression callExpr) { var df = new DonutFunctions(); if (df.IsAggregate(callExpr)) { return(false); } var fnType = df.GetFunctionType(callExpr); return(fnType == DonutFunctionType.Donut); } return(false); }
/// <summary> /// /// </summary> /// <param name="callExpression"></param> /// <param name="feature"></param> /// <returns></returns> public FeatureFunctionsCodeResult GenerateFeatureFunctionCall(CallExpression callExpression, AssignmentExpression feature = null) { var fnDict = new DonutFunctions(); var isAggregate = fnDict.IsAggregate(callExpression); var functionType = fnDict.GetFunctionType(callExpression); Clean(); _expVisitor.Clear(); var strValues = VisitCall(callExpression, null, _expVisitor); if (string.IsNullOrEmpty(strValues)) { return(null); } if (isAggregate) { var aggregateField = new BsonDocument(); if (feature == null) { try { aggregateField = BsonDocument.Parse(strValues); } catch (Exception ex) { Trace.WriteLine($"Failed to parse expression: {callExpression}\nError: {ex.Message}"); return(null); } } else { aggregateField[feature.Member.ToString()] = BsonDocument.Parse(strValues); } var result = new FeatureFunctionsCodeResult(functionType, aggregateField.ToString()); return(result); } else { return(new FeatureFunctionsCodeResult(strValues)); } }