Exemple #1
0
 public static bool IsDonutAggregateFunction(this IExpression expr)
 {
     if (expr is CallExpression callExpr)
     {
         var df = new DonutFunctions();
         return(df.IsAggregate(callExpr));
     }
     return(false);
 }
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);
        }
        private string GetFeatureYieldsContent(DonutScript script)
        {
            var fBuilder        = new StringBuilder();
            var donutFnResolver = new DonutFunctions();

            foreach (var feature in script.Features)
            {
                IExpression accessor       = feature.Value;
                string      fName          = feature.Member.ToString();
                string      featureContent = "";
                var         featureFType   = accessor.GetType();
                if (featureFType == typeof(NameExpression))
                {
                    var member = (accessor as NameExpression).Member?.ToString();
                    //In some cases we might just use the field
                    if (string.IsNullOrEmpty(member))
                    {
                        member = accessor.ToString();
                    }
                    featureContent = $"yield return pair(\"{fName}\", doc[\"{member}\"]);";
                }
                else if (featureFType == typeof(CallExpression))
                {
                    if (donutFnResolver.IsAggregate(accessor as CallExpression))
                    {
                        //We're dealing with an aggregate call
                        //var aggregateContent = GenerateFeatureFunctionCall(accessor as CallExpression, feature);
                    }
                    else
                    {
                        //We're dealing with a function call
                        //featureContent = GenerateFeatureFunctionCall(accessor as CallExpression, feature).Content;
                    }
                }
                else
                {
                    throw new NotImplementedException();
                }
                if (!string.IsNullOrEmpty(featureContent))
                {
                    fBuilder.AppendLine(featureContent);
                }
            }
            return(fBuilder.ToString());
        }
        /// <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));
            }
        }