private void TestLambda <TLambda, TParam, TReturn>(CollectionNode source, string parameterName, SingleValueNode body, Expression <Func <TParam, TReturn> > expectedExpression)
            where TLambda : LambdaNode
        {
            ResourceRangeVariable currentRangeVariable = null;

            if (parameterName != null)
            {
                currentRangeVariable = new ResourceRangeVariable(parameterName, new EdmEntityTypeReference(this.customerEdmType, false), this.entitySet);
                this.testSubject.ParameterExpressions[currentRangeVariable] = Expression.Parameter(typeof(TParam), parameterName);
            }

            LambdaNode node;

            if (typeof(TLambda) == typeof(AnyNode))
            {
                node = new AnyNode(new Collection <RangeVariable>(), currentRangeVariable);
            }
            else
            {
                node = new AllNode(new Collection <RangeVariable>(), currentRangeVariable);
            }

            node.Body   = body;
            node.Source = source;

            var result = this.testSubject.TranslateNode(node);

            CompareExpressions(expectedExpression.Body, result);
        }
        public void EntitySetIsSetCorrectly()
        {
            EntitySetNode         entitySetNode       = new EntitySetNode(HardCodedTestModel.GetDogsSet());
            ResourceRangeVariable entityRangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), entitySetNode);

            Assert.Same(HardCodedTestModel.GetDogsSet(), entityRangeVariable.NavigationSource);
        }
        public void TypeReferenceReturnsEdmEntityTypeReference()
        {
            EntitySetNode         entitySetNode       = new EntitySetNode(HardCodedTestModel.GetDogsSet());
            ResourceRangeVariable entityRangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), entitySetNode);

            Assert.IsType <EdmEntityTypeReference>(entityRangeVariable.TypeReference);
        }
Ejemplo n.º 4
0
        public static IEnumerable <FilterTestCase> PropertyAccessTestCases(IEdmModel model)
        {
            // Accessing a primitive property on the entity type
            ResourceRangeVariable         customersEntityRangeVariable = new ResourceRangeVariable("dummy", model.ResolveTypeReference("TestNS.Customer", false).AsEntity(), model.FindEntityContainer("BinderTestMetadata").FindEntitySet("Customers"));
            SingleValuePropertyAccessNode propertyAccessNode           = new SingleValuePropertyAccessNode(new ResourceRangeVariableReferenceNode(customersEntityRangeVariable.Name, customersEntityRangeVariable),
                                                                                                           model.ResolveProperty("TestNS.Customer.Name"));

            yield return(new FilterTestCase()
            {
                Filter = "Name eq 'Vitek'",
                ExpectedFilterCondition = new BinaryOperatorNode(BinaryOperatorKind.Equal, propertyAccessNode, new ConstantNode("Vitek"))
            });

            // Accessing a complex on entity and primitive on complex
            SingleValuePropertyAccessNode propertyAccessNode2 = new SingleValuePropertyAccessNode(
                new SingleComplexNode(
                    new ResourceRangeVariableReferenceNode(customersEntityRangeVariable.Name, customersEntityRangeVariable),
                    model.ResolveProperty("TestNS.Customer.Address")
                    ),
                model.ResolveProperty("TestNS.Address.City")
                );

            yield return(new FilterTestCase()
            {
                Filter = "Address/City ne 'Prague'",
                ExpectedFilterCondition = new BinaryOperatorNode(BinaryOperatorKind.NotEqual, propertyAccessNode2, new ConstantNode("Prague"))
            });
        }
Ejemplo n.º 5
0
        internal static ResourceRangeVariableReferenceNode CreateRangeVariableReferenceNode(IEdmEntitySet entitySet)
        {
            var entityTypeRef = (IEdmEntityTypeReference)((IEdmCollectionType)entitySet.Type).ElementType;
            var range         = new ResourceRangeVariable("", entityTypeRef, entitySet);

            return(new ResourceRangeVariableReferenceNode("", range));
        }
Ejemplo n.º 6
0
        private static FilterClause CreateFilterClause(IEdmEntitySet entitySet, IEnumerable <KeyValuePair <String, Object> > keys)
        {
            var entityTypeRef = (IEdmEntityTypeReference)((IEdmCollectionType)entitySet.Type).ElementType;
            var range         = new ResourceRangeVariable("", entityTypeRef, entitySet);
            var refNode       = new ResourceRangeVariableReferenceNode("$it", range);

            BinaryOperatorNode compositeNode = null;
            var entityType = (IEdmEntityType)entityTypeRef.Definition;

            foreach (KeyValuePair <String, Object> keyValue in keys)
            {
                IEdmProperty property = entityType.FindProperty(keyValue.Key);
                var          left     = new SingleValuePropertyAccessNode(refNode, property);
                var          right    = new ConstantNode(keyValue.Value, ODataUriUtils.ConvertToUriLiteral(keyValue.Value, ODataVersion.V4));
                var          node     = new BinaryOperatorNode(BinaryOperatorKind.Equal, left, right);

                if (compositeNode == null)
                {
                    compositeNode = node;
                }
                else
                {
                    compositeNode = new BinaryOperatorNode(BinaryOperatorKind.And, compositeNode, node);
                }
            }
            return(new FilterClause(compositeNode, range));
        }
        private SingleResourceNode EntityParameter <T>(string name)
        {
            var entityRangeVariable = new ResourceRangeVariable(name, new EdmEntityTypeReference(this.entitySet.EntityType(), false), this.entitySet);

            this.testSubject.ParameterExpressions[entityRangeVariable] = Expression.Parameter(typeof(T), name);
            return(new ResourceRangeVariableReferenceNode(name, entityRangeVariable));
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Bind $it to the <see cref="QueryNode"/> translated string.
        /// </summary>
        /// <param name="node">node to bind.</param>
        /// <param name="filterClauseRangeVariable">The <see cref="FilterClause"/> range variable.</param>
        /// <returns>The translated string with $it binding.</returns>
        private string BindNode(QueryNode node, ResourceRangeVariable filterClauseRangeVariable)
        {
            BinaryOperatorNode                binaryNode = node as BinaryOperatorNode;
            InNode                            inNode     = node as InNode;
            AnyNode                           anyNode    = node as AnyNode;
            SingleValueFunctionCallNode       singleValueFunctionCallNode       = node as SingleValueFunctionCallNode;
            SingleValueOpenPropertyAccessNode singleValueOpenPropertyAccessNode = node as SingleValueOpenPropertyAccessNode;

            if (binaryNode != null)
            {
                return(BindBinaryOperatorNode(binaryNode, filterClauseRangeVariable));
            }
            else if (inNode != null)
            {
                return(BindInNode(inNode, filterClauseRangeVariable));
            }
            else if (anyNode != null)
            {
                return(BindAnyNode(anyNode, filterClauseRangeVariable));
            }
            else if (singleValueFunctionCallNode != null)
            {
                return(BindSingleValueFunctionCallNode(singleValueFunctionCallNode, filterClauseRangeVariable));
            }
            else if (singleValueOpenPropertyAccessNode != null)
            {
                return(BindSingleValueOpenPropertyAccess(singleValueOpenPropertyAccessNode, filterClauseRangeVariable));
            }
            else
            {
                return(this.TranslateNode(node));
            }
        }
Ejemplo n.º 9
0
        public void TypeReferenceIsSetCorrectly()
        {
            EntitySetNode         entitySetNode       = new EntitySetNode(HardCodedTestModel.GetDogsSet());
            ResourceRangeVariable entityRangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), entitySetNode);

            entityRangeVariable.TypeReference.FullName().Should().Be(HardCodedTestModel.GetDogTypeReference().FullName());
        }
Ejemplo n.º 10
0
        public static ResourceRangeVariableReferenceNode CreateRangeVariableReferenceNode(IEdmEntitySetBase entitySet, String name = null)
        {
            var entityTypeRef = (IEdmEntityTypeReference)((IEdmCollectionType)entitySet.Type).ElementType;
            var rangeVariable = new ResourceRangeVariable(name ?? "$it", entityTypeRef, entitySet);

            return(new ResourceRangeVariableReferenceNode(name ?? "$it", rangeVariable));
        }
Ejemplo n.º 11
0
        public void KindIsResourceRangeVariableReferenceNode()
        {
            ResourceRangeVariable rangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), HardCodedTestModel.GetDogsSet());
            ResourceRangeVariableReferenceNode referenceNode = new ResourceRangeVariableReferenceNode(rangeVariable.Name, rangeVariable);

            Assert.Equal(InternalQueryNodeKind.ResourceRangeVariableReference, referenceNode.InternalKind);
        }
Ejemplo n.º 12
0
        public void EntityCollectionNodeIsSetCorrectly()
        {
            EntitySetNode         entitySetNode       = new EntitySetNode(HardCodedTestModel.GetDogsSet());
            ResourceRangeVariable entityRangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), entitySetNode);

            entityRangeVariable.CollectionResourceNode.ShouldBeEntitySetQueryNode(HardCodedTestModel.GetDogsSet());
        }
Ejemplo n.º 13
0
        public void TypeReferenceIsEdmEntityTypeReference()
        {
            ResourceRangeVariable rangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), HardCodedTestModel.GetDogsSet());
            ResourceRangeVariableReferenceNode referenceNode = new ResourceRangeVariableReferenceNode(rangeVariable.Name, rangeVariable);

            Assert.IsType <EdmEntityTypeReference>(referenceNode.TypeReference);
        }
Ejemplo n.º 14
0
        public void EntityTypeReferenceIsSameAsTypeReference()
        {
            ResourceRangeVariable rangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), HardCodedTestModel.GetDogsSet());
            ResourceRangeVariableReferenceNode referenceNode = new ResourceRangeVariableReferenceNode(rangeVariable.Name, rangeVariable);

            Assert.Same(referenceNode.TypeReference, referenceNode.StructuredTypeReference);
        }
Ejemplo n.º 15
0
        public void EntitySetComesFromRangeVariable()
        {
            ResourceRangeVariable rangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), HardCodedTestModel.GetDogsSet());
            ResourceRangeVariableReferenceNode referenceNode = new ResourceRangeVariableReferenceNode(rangeVariable.Name, rangeVariable);

            Assert.Same(HardCodedTestModel.GetDogsSet(), referenceNode.NavigationSource);
        }
Ejemplo n.º 16
0
        public void TypeReferenceComesFromRangeVariable()
        {
            ResourceRangeVariable rangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), HardCodedTestModel.GetDogsSet());
            ResourceRangeVariableReferenceNode referenceNode = new ResourceRangeVariableReferenceNode(rangeVariable.Name, rangeVariable);

            Assert.Equal(HardCodedTestModel.GetDogTypeReference().FullName(), referenceNode.TypeReference.FullName());
        }
Ejemplo n.º 17
0
        public void NameCannotBeNull()
        {
            ResourceRangeVariable rangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), HardCodedTestModel.GetDogsSet());
            Action createWithNullName           = () => new ResourceRangeVariableReferenceNode(null, rangeVariable);

            Assert.Throws <ArgumentNullException>("name", createWithNullName);
        }
Ejemplo n.º 18
0
        public void RangeVariableIsSetCorrectly()
        {
            ResourceRangeVariable rangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), HardCodedTestModel.GetDogsSet());
            ResourceRangeVariableReferenceNode referenceNode = new ResourceRangeVariableReferenceNode(rangeVariable.Name, rangeVariable);

            Assert.Same(referenceNode.RangeVariable.ShouldBeResourceRangeVariable(HardCodedTestModel.GetDogTypeReference()).NavigationSource, HardCodedTestModel.GetDogsSet());
        }
Ejemplo n.º 19
0
            /// <summary>
            /// Constructs a BindInfo with the given <paramref name="bindMethod"/>.
            /// </summary>
            /// <param name="bindingStateQueryOptions">The query options to be passed for the binding state. Null by default.</param>
            /// <param name="bindMethodDelegate">The bind method algorithm. By default, uses MetadataBinder method
            /// if this parameter isn't populated.</param>
            public BindInfo(List <CustomQueryOptionToken> bindingStateQueryOptions = null, MetadataBinder.QueryTokenVisitor bindMethod = null)
            {
                ResourceRangeVariable implicitRangeVariable = new ResourceRangeVariable(
                    ExpressionConstants.It,
                    HardCodedTestModel.GetPersonTypeReference(),
                    HardCodedTestModel.GetPeopleSet());

                this.bindingState = new BindingState(configuration)
                {
                    ImplicitRangeVariable = implicitRangeVariable
                };
                this.bindingState.RangeVariables.Push(
                    new BindingState(configuration)
                {
                    ImplicitRangeVariable = implicitRangeVariable
                }.ImplicitRangeVariable);

                if (bindingStateQueryOptions != null)
                {
                    this.bindingState.QueryOptions = bindingStateQueryOptions;
                }

                this.binder     = new MetadataBinder(bindingState);
                this.bindMethod = bindMethod ?? binder.Bind;
            }
Ejemplo n.º 20
0
        public void KindShouldBeEntityRangeVariable()
        {
            EntitySetNode         entitySetNode       = new EntitySetNode(HardCodedTestModel.GetDogsSet());
            ResourceRangeVariable entityRangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), entitySetNode);

            entityRangeVariable.Kind.Should().Be(RangeVariableKind.Resource);
        }
Ejemplo n.º 21
0
        public void EntityTypeReferenceReturnsEdmEntityTypeReference()
        {
            EntitySetNode         entitySetNode       = new EntitySetNode(HardCodedTestModel.GetDogsSet());
            ResourceRangeVariable entityRangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), entitySetNode);

            entityRangeVariable.StructuredTypeReference.Should().BeOfType <EdmEntityTypeReference>();
        }
        public void NameCannotBeNull()
        {
            ResourceRangeVariable rangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), HardCodedTestModel.GetDogsSet());
            Action createWithNullName           = () => new ResourceRangeVariableReferenceNode(null, rangeVariable);

            createWithNullName.ShouldThrow <Exception>(Error.ArgumentNull("name").ToString());
        }
Ejemplo n.º 23
0
        /// <summary>
        /// Bind $it to the <see cref="BinaryOperatorNode"/> translated string.
        /// </summary>
        /// <param name="node">node to bind.</param>
        /// <param name="filterClauseRangeVariable">The <see cref="FilterClause"/> range variable.</param>
        /// <returns>The translated string with $it binding.</returns>
        private string BindBinaryOperatorNode(BinaryOperatorNode node, ResourceRangeVariable filterClauseRangeVariable)
        {
            string translatedNode = this.TranslateNode(node);
            ResourceRangeVariableReferenceNode leftRangeVariableNode  = GetResourceRangeVariableReferenceNode(node.Left);
            ResourceRangeVariableReferenceNode rightRangeVariableNode = GetResourceRangeVariableReferenceNode(node.Right);

            BinaryOperatorKind binaryNodeKind = node.OperatorKind;

            string binaryOperator = this.BinaryOperatorNodeToString(binaryNodeKind);

            string[] binarySeparator = { binaryOperator };
            string[] substrings      = translatedNode.Trim().Split(binarySeparator, StringSplitOptions.RemoveEmptyEntries);
            string   leftBinary      = substrings[0].Trim();
            string   rightBinary     = substrings[1].Trim();

            if (leftRangeVariableNode != null && IsDifferentSource(filterClauseRangeVariable, leftRangeVariableNode))
            {
                leftBinary = ExpressionConstants.It + ExpressionConstants.SymbolForwardSlash + leftBinary;
            }

            if (rightRangeVariableNode != null && IsDifferentSource(filterClauseRangeVariable, rightRangeVariableNode))
            {
                rightBinary = ExpressionConstants.It + ExpressionConstants.SymbolForwardSlash + rightBinary;
            }

            return(leftBinary + ' ' + binaryOperator + ' ' + rightBinary);
        }
Ejemplo n.º 24
0
        public void GenerateQueryNodeShouldWorkIfPropertyIsPrimitiveCollection()
        {
            var property = HardCodedTestModel.GetDogNicknamesProperty();
            ResourceRangeVariable rangeVariable = new ResourceRangeVariable("Color", HardCodedTestModel.GetDogTypeReference(), HardCodedTestModel.GetDogsSet());
            QueryNode             result        = EndPathBinder.GeneratePropertyAccessQueryNode(new ResourceRangeVariableReferenceNode(rangeVariable.Name, rangeVariable), property, new BindingState(configuration));

            result.ShouldBeCollectionPropertyAccessQueryNode(HardCodedTestModel.GetDogNicknamesProperty());
        }
Ejemplo n.º 25
0
 /// <summary>
 /// Writes entity range variable to string.
 /// </summary>
 /// <param name="node">Node to write to string</param>
 /// <returns>String representation of node.</returns>
 private static string ToString(ResourceRangeVariable node)
 {
     return(tabHelper.Prefix + "ResourceRangeVariable" +
            tabHelper.Indent(() =>
                             tabHelper.Prefix + "Name = " + node.Name +
                             tabHelper.Prefix + "NavigationSource = " + node.NavigationSource.Name +
                             tabHelper.Prefix + "TypeReference = " + node.TypeReference
                             ));
 }
Ejemplo n.º 26
0
        /// <summary>
        /// Helper bind method that returns null. Parameter is unused.
        /// </summary>
        private QueryNode BindMethodReturnsNode(QueryToken token)
        {
            ResourceRangeVariable implicitRangeVariable = new ResourceRangeVariable(
                ExpressionConstants.It,
                HardCodedTestModel.GetPersonTypeReference(),
                HardCodedTestModel.GetPeopleSet());

            return(NodeFactory.CreateRangeVariableReferenceNode(implicitRangeVariable));
        }
Ejemplo n.º 27
0
        public void KindShouldBeAnyNode()
        {
            ResourceRangeVariable      rangeVariable  = (ResourceRangeVariable)NodeFactory.CreateImplicitRangeVariable(HardCodedTestModel.GetDogTypeReference(), HardCodedTestModel.GetDogsSet());
            Collection <RangeVariable> rangeVariables = new Collection <RangeVariable>
            {
                rangeVariable
            };
            AnyNode anyNode = new AnyNode(rangeVariables, rangeVariable);

            Assert.Equal(InternalQueryNodeKind.Any, anyNode.InternalKind);
        }
Ejemplo n.º 28
0
        public void TypeReferenceShouldBeBoolean()
        {
            ResourceRangeVariable      rangeVariable  = (ResourceRangeVariable)NodeFactory.CreateImplicitRangeVariable(HardCodedTestModel.GetDogTypeReference(), HardCodedTestModel.GetDogsSet());
            Collection <RangeVariable> rangeVariables = new Collection <RangeVariable>
            {
                rangeVariable
            };
            AllNode allNode = new AllNode(rangeVariables, rangeVariable);

            allNode.TypeReference.FullName().Should().Be("Edm.Boolean");
        }
Ejemplo n.º 29
0
        public void GenerateQueryNodeShouldReturnQueryNode()
        {
            var property = HardCodedTestModel.GetDogColorProp();
            CollectionResourceNode entityCollectionNode = new EntitySetNode(HardCodedTestModel.GetDogsSet());
            ResourceRangeVariable  rangeVariable        = new ResourceRangeVariable("Color", HardCodedTestModel.GetDogTypeReference(), entityCollectionNode);
            var result = EndPathBinder.GeneratePropertyAccessQueryNode(
                new ResourceRangeVariableReferenceNode(rangeVariable.Name, rangeVariable),
                property, new BindingState(configuration));

            result.ShouldBeSingleValuePropertyAccessQueryNode(property);
        }
Ejemplo n.º 30
0
        public void KindShouldBeAllNode()
        {
            ResourceRangeVariable      rangeVariable  = (ResourceRangeVariable)NodeFactory.CreateImplicitRangeVariable(HardCodedTestModel.GetDogTypeReference(), HardCodedTestModel.GetDogsSet());
            Collection <RangeVariable> rangeVariables = new Collection <RangeVariable>
            {
                rangeVariable
            };
            AllNode allNode = new AllNode(rangeVariables, rangeVariable);

            allNode.InternalKind.Should().Be(InternalQueryNodeKind.All);
        }