Esempio n. 1
0
        public IEdmLabeledExpression WrapLabeledElement(CsdlLabeledExpression labeledElement, IEdmEntityType bindingContext)
        {
            IEdmLabeledExpression expression;

            if (!this.semanticsLabeledElements.TryGetValue(labeledElement, out expression))
            {
                expression = new CsdlSemanticsLabeledExpression(labeledElement.Label, labeledElement.Element, bindingContext, this);
                this.semanticsLabeledElements[labeledElement] = expression;
            }
            return(expression);
        }
Esempio n. 2
0
        public IEdmLabeledExpression WrapLabeledElement(CsdlLabeledExpression labeledElement, IEdmEntityType bindingContext)
        {
            IEdmLabeledExpression result;

            // Guarantee that multiple requests to wrap a given labeled element all return the same object.
            if (!this.semanticsLabeledElements.TryGetValue(labeledElement, out result))
            {
                result = new CsdlSemanticsLabeledExpression(labeledElement.Label, labeledElement.Element, bindingContext, this);
                this.semanticsLabeledElements[labeledElement] = result;
            }

            return(result);
        }
Esempio n. 3
0
        public IEdmLabeledExpression FindLabeledElement(string label, IEdmEntityType bindingContext)
        {
            object obj2;

            if (!this.LabeledExpressions.TryGetValue(label, out obj2))
            {
                return(null);
            }
            CsdlLabeledExpression labeledElement = obj2 as CsdlLabeledExpression;

            if (labeledElement != null)
            {
                return(this.WrapLabeledElement(labeledElement, bindingContext));
            }
            return(this.WrapLabeledElementList((List <CsdlLabeledExpression>)obj2, bindingContext));
        }
Esempio n. 4
0
        public IEdmLabeledExpression FindLabeledElement(string label, IEdmEntityType bindingContext)
        {
            object labeledElement;

            if (this.LabeledExpressions.TryGetValue(label, out labeledElement))
            {
                CsdlLabeledExpression labeledElementExpression = labeledElement as CsdlLabeledExpression;
                if (labeledElementExpression != null)
                {
                    return(this.WrapLabeledElement(labeledElementExpression, bindingContext));
                }

                return(this.WrapLabeledElementList((List <CsdlLabeledExpression>)labeledElement, bindingContext));
            }

            return(null);
        }
Esempio n. 5
0
        public void ParseLabeledElementExpressionWorksAsExpected()
        {
            string json = @" { ""$LabeledElement"": {
     ""$Path"": ""FirstName""
  },
   ""$Name"": ""CustomerFirstName""
}";

            CsdlExpressionBase expressionBase = ParseExpression(json);

            Assert.NotNull(expressionBase);
            CsdlLabeledExpression labeledExp = Assert.IsType <CsdlLabeledExpression>(expressionBase);

            Assert.Equal("CustomerFirstName", labeledExp.Label);
            Assert.NotNull(labeledExp.Element);
            Assert.IsType <CsdlPathExpression>(labeledExp.Element);
        }
Esempio n. 6
0
        /// <summary>
        /// Parse the Labeled Element expression using <see cref="JsonElement"/>.
        /// </summary>
        /// <param name="element">The input JSON element.</param>
        /// <param name="context">The parser context.</param>
        /// <param name="labeledExp">The built labeled element expression.</param>
        /// <returns>true/false</returns>
        private static bool TryParseLabeledElementExpression(JsonElement element, JsonParserContext context, out CsdlLabeledExpression labeledExp)
        {
            Debug.Assert(context != null);
            labeledExp = null;

            // Labeled element expressions are represented as an object with a member $LabeledElement whose value is an annotation expression
            JsonElement propertyValue;

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

            CsdlExpressionBase expression = propertyValue.ProcessProperty("$LabeledElement", context, ParseExpression);

            // a member $Name whose value is a string containing the labeled element’s name.
            string label = element.ProcessRequiredProperty("$Name", context, (v, p) => v.ParseAsString(p));

            labeledExp = new CsdlLabeledExpression(label, expression, context.Location());
            return(true);
        }
Esempio n. 7
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;
            }
        }
Esempio n. 8
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;
                }
                }
            }
        }