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); }
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")) }); }
internal static ResourceRangeVariableReferenceNode CreateRangeVariableReferenceNode(IEdmEntitySet entitySet) { var entityTypeRef = (IEdmEntityTypeReference)((IEdmCollectionType)entitySet.Type).ElementType; var range = new ResourceRangeVariable("", entityTypeRef, entitySet); return(new ResourceRangeVariableReferenceNode("", range)); }
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)); }
/// <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)); } }
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()); }
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)); }
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); }
public void EntityCollectionNodeIsSetCorrectly() { EntitySetNode entitySetNode = new EntitySetNode(HardCodedTestModel.GetDogsSet()); ResourceRangeVariable entityRangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), entitySetNode); entityRangeVariable.CollectionResourceNode.ShouldBeEntitySetQueryNode(HardCodedTestModel.GetDogsSet()); }
public void TypeReferenceIsEdmEntityTypeReference() { ResourceRangeVariable rangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), HardCodedTestModel.GetDogsSet()); ResourceRangeVariableReferenceNode referenceNode = new ResourceRangeVariableReferenceNode(rangeVariable.Name, rangeVariable); Assert.IsType <EdmEntityTypeReference>(referenceNode.TypeReference); }
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); }
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); }
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()); }
public void NameCannotBeNull() { ResourceRangeVariable rangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), HardCodedTestModel.GetDogsSet()); Action createWithNullName = () => new ResourceRangeVariableReferenceNode(null, rangeVariable); Assert.Throws <ArgumentNullException>("name", createWithNullName); }
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()); }
/// <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; }
public void KindShouldBeEntityRangeVariable() { EntitySetNode entitySetNode = new EntitySetNode(HardCodedTestModel.GetDogsSet()); ResourceRangeVariable entityRangeVariable = new ResourceRangeVariable("dogs", HardCodedTestModel.GetDogTypeReference(), entitySetNode); entityRangeVariable.Kind.Should().Be(RangeVariableKind.Resource); }
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()); }
/// <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); }
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()); }
/// <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 )); }
/// <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)); }
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); }
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"); }
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); }
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); }