public void Test_when_visit_query_condition_push_new_criteria_collection() { // Arrange CmsqlQueryCondition condition = new CmsqlQueryCondition { Identifier = "PageName", Operator = EqualityOperator.GreaterThan, Value = "5" }; CmsqlExpressionVisitorContext context = new CmsqlExpressionVisitorContext(new ContentType()); CmsqlExpressionVisitor cmsqlExpressionVisitor = new CmsqlBinaryOrExpressionVisitor( new QueryConditionToPropertyCriteriaMapper( new PropertyDataTypeResolver(new ContentType())), context); // Act cmsqlExpressionVisitor.VisitQueryCondition(condition); IEnumerable <PropertyCriteriaCollection> propertyCriteriaCollection = context.GetCriteria(); // Assert propertyCriteriaCollection.Should().HaveCount(1); }
public void Test_can_parse_multiple_queries() { CmsqlQueryParser parser = new CmsqlQueryParser(); CmsqlQueryParseResult parseResult = parser.Parse( "select test from start;select test from root where foo = 'bar';select barf from 123 where (foo = 'bar' and bar = 'foo') or (bla = 'bli' and bli = 'bla')"); parseResult.Queries.Should().HaveCount(3); parseResult.Errors.Should().BeNullOrEmpty(); CmsqlQuery firstQuery = parseResult.Queries.First(); firstQuery.ContentType.ShouldBeEquivalentTo("test"); firstQuery.StartNode.StartNodeId.Should().BeNullOrEmpty(); firstQuery.StartNode.StartNodeType.ShouldBeEquivalentTo(CmsqlQueryStartNodeType.Start); firstQuery.Criteria.Should().BeNull(); CmsqlQuery secondQuery = parseResult.Queries.ElementAt(1); secondQuery.ContentType.ShouldBeEquivalentTo("test"); secondQuery.StartNode.StartNodeId.Should().BeNullOrEmpty(); secondQuery.StartNode.StartNodeType.ShouldBeEquivalentTo(CmsqlQueryStartNodeType.Root); secondQuery.Criteria.Should().BeOfType <CmsqlQueryCondition>(); CmsqlQueryCondition condition = secondQuery.Criteria as CmsqlQueryCondition; condition.Identifier.ShouldBeEquivalentTo("foo"); condition.Operator.ShouldBeEquivalentTo(EqualityOperator.Equals); condition.Value.ShouldBeEquivalentTo("bar"); CmsqlQuery thirdQuery = parseResult.Queries.ElementAt(2); thirdQuery.ContentType.ShouldBeEquivalentTo("barf"); thirdQuery.StartNode.StartNodeId.ShouldBeEquivalentTo("123"); thirdQuery.StartNode.StartNodeType.ShouldBeEquivalentTo(CmsqlQueryStartNodeType.Id); thirdQuery.Criteria.Should().BeOfType <CmsqlQueryBinaryExpression>(); }
public void Test_when_property_cannot_be_resolved_context_should_contain_error() { // Arrange CmsqlQueryCondition condition = new CmsqlQueryCondition { Identifier = "ThisPropertyCannotBeFound", Operator = EqualityOperator.GreaterThan, Value = "5" }; CmsqlExpressionVisitorContext context = new CmsqlExpressionVisitorContext(new ContentType()); CmsqlExpressionVisitor cmsqlExpressionVisitor = new CmsqlExpressionVisitor( new QueryConditionToPropertyCriteriaMapper( new PropertyDataTypeResolver(new ContentType())), context); // Act cmsqlExpressionVisitor.VisitQueryCondition(condition); // Assert CmsqlQueryExecutionError error = context.Errors.Single(); error.Message.ShouldBeEquivalentTo("Could not find property 'ThisPropertyCannotBeFound'"); }
public void Test_can_map_query_condition_to_property_criteria() { // Arrange CmsqlQueryCondition condition = new CmsqlQueryCondition { Identifier = "PageName", Operator = EqualityOperator.GreaterThan, Value = "5" }; CmsqlExpressionVisitorContext context = new CmsqlExpressionVisitorContext(new ContentType()); CmsqlExpressionVisitor cmsqlExpressionVisitor = new CmsqlExpressionVisitor( new QueryConditionToPropertyCriteriaMapper( new PropertyDataTypeResolver(new ContentType())), context); // Act cmsqlExpressionVisitor.VisitQueryCondition(condition); PropertyCriteriaCollection propertyCriteriaCollection = context.GetCriteria().Single(); PropertyCriteria propertyCriteria = propertyCriteriaCollection.Last(); // Assert propertyCriteria.Value.ShouldBeEquivalentTo(condition.Value); propertyCriteria.Condition.ShouldBeEquivalentTo(CompareCondition.GreaterThan); propertyCriteria.Name.ShouldBeEquivalentTo(condition.Identifier); }
public void Test_when_condition_cannot_be_mapped_criteria_should_be_empty() { // Arrange CmsqlQueryCondition condition = new CmsqlQueryCondition { Identifier = "ThisPropertyCannotBeFound", Operator = EqualityOperator.GreaterThan, Value = "5" }; CmsqlExpressionVisitorContext context = new CmsqlExpressionVisitorContext(new ContentType()); CmsqlExpressionVisitor cmsqlExpressionVisitor = new CmsqlExpressionVisitor( new QueryConditionToPropertyCriteriaMapper( new PropertyDataTypeResolver(new ContentType())), context); // Act cmsqlExpressionVisitor.VisitQueryCondition(condition); IEnumerable <PropertyCriteriaCollection> propertyCriteriaCollection = context.GetCriteria(); // Assert propertyCriteriaCollection.Should().BeEmpty(); }
internal bool TryMap(CmsqlQueryCondition condition, out PropertyCriteria criteria) { criteria = null; if (condition == null) { return(false); } if (!_propertyDataTypeResolver.TryResolve(condition.Identifier, out PropertyDataType propertyDataType)) { return(false); } CompareCondition compareCondition = MapEqualityOperatorToCompareCondition(condition.Operator); criteria = new PropertyCriteria { Condition = compareCondition, Value = condition.Value, Name = condition.Identifier, Type = propertyDataType, Required = true }; return(true); }
public void Test_can_parse_less_than_or_equals_condition() { CmsqlParser cmsqlParser = CmsqlParserFactory.CreateParserForQuery("foo <= 'bar'"); CmsqlParser.ConditionContext parseTree = cmsqlParser.condition(); ConditionVisitor visitor = new ConditionVisitor(); CmsqlQueryCondition condition = visitor.VisitCondition(parseTree); condition.Identifier.ShouldBeEquivalentTo("foo"); condition.Operator.ShouldBeEquivalentTo(EqualityOperator.LessThanOrEquals); condition.Value.ShouldBeEquivalentTo("bar"); }
public virtual void VisitQueryCondition(CmsqlQueryCondition condition) { if (condition == null) { Context.Errors.Add(new CmsqlQueryExecutionError("Could not process malformed query condition.")); return; } if (_conditionToCriteriaMapper.TryMap(condition, out PropertyCriteria criteria)) { Context.AddPropertyCriteria(criteria); } else { Context.Errors.Add(new CmsqlQueryExecutionError($"Could not find property '{condition.Identifier}'")); } }
public void Test_when_property_is_unkown_mapping_should_return_false() { // Arrange CmsqlQueryCondition condition = new CmsqlQueryCondition { Identifier = "This is some unknown property", Operator = EqualityOperator.GreaterThan, Value = "5" }; QueryConditionToPropertyCriteriaMapper mapper = new QueryConditionToPropertyCriteriaMapper( new PropertyDataTypeResolver(new ContentType())); // Act bool isMapSuccessfull = mapper.TryMap(condition, out PropertyCriteria criteria); // Assert isMapSuccessfull.Should().BeFalse(); criteria.Should().BeNull(); }
public void Test_can_map_query_condition_to_property_criteria() { // Arrange ContentType contentType = new ContentType { PropertyDefinitions = { new PropertyDefinition { Name = "FooBar", Type = new PropertyDefinitionType { DataType = PropertyDataType.Number } } } }; CmsqlQueryCondition condition = new CmsqlQueryCondition { Identifier = "FooBar", Operator = EqualityOperator.GreaterThan, Value = "5" }; QueryConditionToPropertyCriteriaMapper mapper = new QueryConditionToPropertyCriteriaMapper( new PropertyDataTypeResolver(contentType)); // Act bool isMapSuccessfull = mapper.TryMap(condition, out PropertyCriteria criteria); // Assert isMapSuccessfull.Should().BeTrue(); criteria.Name.ShouldBeEquivalentTo(condition.Identifier); criteria.Condition.ShouldBeEquivalentTo(CompareCondition.GreaterThan); criteria.Value.ShouldBeEquivalentTo(condition.Value); criteria.Type.ShouldBeEquivalentTo(PropertyDataType.Number); }
public void Test_can_map_query_condition_with_meta_data_property_to_property_criteria() { // Arrange CmsqlQueryCondition condition = new CmsqlQueryCondition { Identifier = MetaDataProperties.PageName, Operator = EqualityOperator.GreaterThan, Value = "5" }; QueryConditionToPropertyCriteriaMapper mapper = new QueryConditionToPropertyCriteriaMapper( new PropertyDataTypeResolver(new ContentType())); // Act bool isMapSuccessfull = mapper.TryMap(condition, out PropertyCriteria criteria); // Assert isMapSuccessfull.Should().BeTrue(); criteria.Name.ShouldBeEquivalentTo(condition.Identifier); criteria.Condition.ShouldBeEquivalentTo(CompareCondition.GreaterThan); criteria.Value.ShouldBeEquivalentTo(condition.Value); criteria.Type.ShouldBeEquivalentTo(PropertyDataType.String); }
public override void VisitQueryCondition(CmsqlQueryCondition condition) { Context.PushNewPropertyCriteriaCollection(); base.VisitQueryCondition(condition); }