/// <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());
            }
        }
Exemple #2
0
        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));
            }
        }