Ejemplo n.º 1
0
 public SpecialFunctionExpression(SPAGSConverter convert, SPAGS.Function spagsFunc, string pattern, MutateExpression mutate)
 {
     Match returnType = Regex.Match(pattern, @"^(.*?)(\s*\-\>\s*(\S+)\s*)$");
     if (returnType.Success)
     {
         pattern = returnType.Groups[1].Value;
         ReturnValueTypes = (PossibleValueTypes)Enum.Parse(typeof(PossibleValueTypes), returnType.Groups[3].Value);
     }
     else
     {
         ReturnValueTypes = convert.GetValueTypes(spagsFunc.Signature.ReturnType);
     }
     Pattern = pattern;
     SPAGSFunction = spagsFunc;
     this.convert = convert;
     Mutate = mutate;
 }
Ejemplo n.º 2
0
        protected override ScalarExpression OnBuildQuery(QueryBuilderContext context)
        {
            ScalarExpression arg = Argument.BuildQuery(context);

            if (ResultType.Type == DataType.Entity)
            {
                return(arg);
            }

            // Special case for AggregateExpression, because if we aggregate a choicefield, then it presents
            // as an Entity type, therefore requesting this cast - but the query builder wants to receive the aggregate expression directly.
            if (arg is EDC.ReadiNow.Metadata.Query.Structured.AggregateExpression)
            {
                var result = new MutateExpression {
                    Expression = arg
                };

                switch (ResultType.Type)
                {
                case DataType.String:
                    result.MutateType = MutateType.DisplaySql;
                    break;

                case DataType.Bool:
                    result.MutateType = MutateType.BoolSql;
                    break;

                default:
                    throw new InvalidOperationException(ResultType.Type.ToString( ));
                }
                return(result);
            }

            // Just refer to the node
            var queryNode = context.GetNode(Argument);

            switch (ResultType.Type)
            {
            case DataType.String:
                var nameResult = new ResourceDataColumn
                {
                    FieldId = "core:name",
                    NodeId  = queryNode.NodeId
                };
                return(nameResult);

            case DataType.Bool:
                var boolResult = new CalculationExpression
                {
                    Operator    = CalculationOperator.IsNull,
                    Expressions = new List <ScalarExpression>
                    {
                        new IdExpression {
                            NodeId = queryNode.NodeId
                        }
                    }
                };
                return(boolResult);

            default:
                throw new InvalidOperationException(ResultType.Type.ToString());
            }
        }