コード例 #1
0
        /// <summary>
        /// Parse the If expression using <see cref="JsonElement"/>.
        /// </summary>
        /// <param name="element">The input JSON element.</param>
        /// <param name="context">The parser context.</param>
        /// <param name="ifExp">The built if expression.</param>
        /// <returns>true/false</returns>
        private static bool TryParseIfExpression(JsonElement element, JsonParserContext context, out CsdlIfExpression ifExp)
        {
            Debug.Assert(context != null);
            ifExp = null;

            // Conditional expressions are represented as an object with a member $If whose value is an array of two or three annotation expressions.
            JsonElement propertyValue;

            if (element.ValueKind != JsonValueKind.Object ||
                !element.TryGetProperty("$If", out propertyValue) ||
                propertyValue.ValueKind != JsonValueKind.Array)
            {
                return(false);
            }

            // first child is the test
            CsdlExpressionBase testExpression = propertyValue.ProcessItem(0, context, ParseExpression);

            // the second child is ture clause
            CsdlExpressionBase trueExpression = propertyValue.ProcessItem(1, context, ParseExpression);

            // the third child is false clause
            CsdlExpressionBase falseExpression = null;

            if (propertyValue.GetArrayLength() >= 3)
            {
                // if and only if the if-then-else expression is an item of a collection expression,
                // the third child expression MAY be omitted, reducing it to an if-then expression.
                falseExpression = propertyValue.ProcessItem(2, context, ParseExpression);
            }

            ifExp = new CsdlIfExpression(testExpression, trueExpression, falseExpression, context.Location());
            return(true);
        }
コード例 #2
0
        public void ParseIfExpressionWorksAsExpected()
        {
            string json = @" {
  ""$If"": [
    {
       ""$Path"": ""IsFemale""
    },
    ""Female"",
    ""Male""
  ]
}";

            CsdlExpressionBase expressionBase = ParseExpression(json);

            Assert.NotNull(expressionBase);
            CsdlIfExpression ifExp = Assert.IsType <CsdlIfExpression>(expressionBase);

            Assert.NotNull(ifExp.Test);
            CsdlPathExpression pathExp = Assert.IsType <CsdlPathExpression>(ifExp.Test);

            Assert.Equal("IsFemale", pathExp.Path);

            Assert.NotNull(ifExp.IfTrue);
            CsdlConstantExpression trueExp = Assert.IsType <CsdlConstantExpression>(ifExp.IfTrue);

            Assert.Equal(EdmValueKind.String, trueExp.ValueKind);
            Assert.Equal("Female", trueExp.Value);

            Assert.NotNull(ifExp.IfFalse);
            CsdlConstantExpression falseExp = Assert.IsType <CsdlConstantExpression>(ifExp.IfFalse);

            Assert.Equal(EdmValueKind.String, falseExp.ValueKind);
            Assert.Equal("Male", falseExp.Value);
        }
コード例 #3
0
 public CsdlSemanticsIfExpression(CsdlIfExpression expression, IEdmEntityType bindingContext, CsdlSemanticsSchema schema) : base(schema, expression)
 {
     this.testCache      = new Cache <CsdlSemanticsIfExpression, IEdmExpression>();
     this.ifTrueCache    = new Cache <CsdlSemanticsIfExpression, IEdmExpression>();
     this.ifFalseCache   = new Cache <CsdlSemanticsIfExpression, IEdmExpression>();
     this.expression     = expression;
     this.bindingContext = bindingContext;
 }
コード例 #4
0
 public CsdlSemanticsIfExpression(CsdlIfExpression expression, IEdmEntityType bindingContext, CsdlSemanticsSchema schema)
     : base(schema, expression)
 {
     this.expression     = expression;
     this.bindingContext = bindingContext;
 }
コード例 #5
0
        private static void AddLabeledExpressions(CsdlExpressionBase expression, Dictionary <string, object> result)
        {
            if (expression == null)
            {
                return;
            }

            switch (expression.ExpressionKind)
            {
            case Expressions.EdmExpressionKind.Labeled:
            {
                CsdlLabeledExpression labeledElement = (CsdlLabeledExpression)expression;
                string label = labeledElement.Label;
                object duplicateLabeledElement;
                if (result.TryGetValue(label, out duplicateLabeledElement))
                {
                    // If the label has multiple definitions, store the duplicates as a list of labeled elements.
                    List <CsdlLabeledExpression> duplicates = duplicateLabeledElement as List <CsdlLabeledExpression>;
                    if (duplicates == null)
                    {
                        duplicates = new List <CsdlLabeledExpression>();
                        duplicates.Add((CsdlLabeledExpression)duplicateLabeledElement);
                        result[label] = duplicates;
                    }

                    duplicates.Add(labeledElement);
                }
                else
                {
                    result[label] = labeledElement;
                }

                AddLabeledExpressions(labeledElement.Element, result);
                break;
            }

            case Expressions.EdmExpressionKind.Collection:
                foreach (CsdlExpressionBase element in ((CsdlCollectionExpression)expression).ElementValues)
                {
                    AddLabeledExpressions(element, result);
                }

                break;

            case Expressions.EdmExpressionKind.OperationApplication:
                foreach (CsdlExpressionBase argument in ((CsdlApplyExpression)expression).Arguments)
                {
                    AddLabeledExpressions(argument, result);
                }

                break;

            case Expressions.EdmExpressionKind.Record:
                foreach (CsdlPropertyValue property in ((CsdlRecordExpression)expression).PropertyValues)
                {
                    AddLabeledExpressions(property.Expression, result);
                }

                break;

            case Expressions.EdmExpressionKind.If:
            {
                CsdlIfExpression ifExpression = (CsdlIfExpression)expression;
                AddLabeledExpressions(ifExpression.Test, result);
                AddLabeledExpressions(ifExpression.IfTrue, result);
                AddLabeledExpressions(ifExpression.IfFalse, result);

                break;
            }

            case Expressions.EdmExpressionKind.IsType:
                AddLabeledExpressions(((CsdlIsTypeExpression)expression).Operand, result);
                break;

            case Expressions.EdmExpressionKind.Cast:
                AddLabeledExpressions(((CsdlCastExpression)expression).Operand, result);
                break;

            default:
                break;
            }
        }
コード例 #6
0
        private static void AddLabeledExpressions(CsdlExpressionBase expression, Dictionary <string, object> result)
        {
            if (expression != null)
            {
                switch (expression.ExpressionKind)
                {
                case EdmExpressionKind.Record:
                    foreach (CsdlPropertyValue value2 in ((CsdlRecordExpression)expression).PropertyValues)
                    {
                        AddLabeledExpressions(value2.Expression, result);
                    }
                    return;

                case EdmExpressionKind.Collection:
                    foreach (CsdlExpressionBase base2 in ((CsdlCollectionExpression)expression).ElementValues)
                    {
                        AddLabeledExpressions(base2, result);
                    }
                    return;

                case EdmExpressionKind.If:
                {
                    CsdlIfExpression expression3 = (CsdlIfExpression)expression;
                    AddLabeledExpressions(expression3.Test, result);
                    AddLabeledExpressions(expression3.IfTrue, result);
                    AddLabeledExpressions(expression3.IfFalse, result);
                    return;
                }

                case EdmExpressionKind.AssertType:
                    AddLabeledExpressions(((CsdlAssertTypeExpression)expression).Operand, result);
                    return;

                case EdmExpressionKind.IsType:
                    AddLabeledExpressions(((CsdlIsTypeExpression)expression).Operand, result);
                    return;

                case EdmExpressionKind.FunctionApplication:
                    foreach (CsdlExpressionBase base3 in ((CsdlApplyExpression)expression).Arguments)
                    {
                        AddLabeledExpressions(base3, result);
                    }
                    return;

                case EdmExpressionKind.LabeledExpressionReference:
                    return;

                case EdmExpressionKind.Labeled:
                {
                    object obj2;
                    CsdlLabeledExpression item = (CsdlLabeledExpression)expression;
                    string label = item.Label;
                    if (!result.TryGetValue(label, out obj2))
                    {
                        result[label] = item;
                    }
                    else
                    {
                        List <CsdlLabeledExpression> list = obj2 as List <CsdlLabeledExpression>;
                        if (list == null)
                        {
                            list = new List <CsdlLabeledExpression> {
                                (CsdlLabeledExpression)obj2
                            };
                            result[label] = list;
                        }
                        list.Add(item);
                    }
                    AddLabeledExpressions(item.Element, result);
                    return;
                }
                }
            }
        }