From 1eaf2380493862d21bb93d5c41a148987e996d43 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 16 Feb 2021 00:14:58 +0100 Subject: [PATCH] Null fixes for odata. --- .../Queries/OData/ConstantWithTypeVisitor.cs | 77 +++++++++++-------- .../Queries/QueryFromODataTests.cs | 41 +++++++++- 2 files changed, 83 insertions(+), 35 deletions(-) diff --git a/backend/src/Squidex.Infrastructure/Queries/OData/ConstantWithTypeVisitor.cs b/backend/src/Squidex.Infrastructure/Queries/OData/ConstantWithTypeVisitor.cs index 5d9d60993..8625691ea 100644 --- a/backend/src/Squidex.Infrastructure/Queries/OData/ConstantWithTypeVisitor.cs +++ b/backend/src/Squidex.Infrastructure/Queries/OData/ConstantWithTypeVisitor.cs @@ -40,24 +40,25 @@ namespace Squidex.Infrastructure.Queries.OData public override ClrValue Visit(ConvertNode nodeIn) { - if (nodeIn.TypeReference.Definition == BooleanType) + var value = ConstantVisitor.Visit(nodeIn.Source); + + if (value == null) { - var value = ConstantVisitor.Visit(nodeIn.Source); + return ClrValue.Null; + } + if (nodeIn.TypeReference.Definition == BooleanType) + { return bool.Parse(value.ToString()!); } if (nodeIn.TypeReference.Definition == GuidType) { - var value = ConstantVisitor.Visit(nodeIn.Source); - return Guid.Parse(value.ToString()!); } if (nodeIn.TypeReference.Definition == DateTimeType || nodeIn.TypeReference.Definition == DateType) { - var value = ConstantVisitor.Visit(nodeIn.Source); - return ParseInstant(value); } @@ -116,44 +117,52 @@ namespace Squidex.Infrastructure.Queries.OData public override ClrValue Visit(ConstantNode nodeIn) { - if (nodeIn.TypeReference.Definition == DateTimeType || nodeIn.TypeReference.Definition == DateType) + if (nodeIn.Value == null) { - return ParseInstant(nodeIn.Value); + return ClrValue.Null; } - if (nodeIn.TypeReference.Definition == GuidType) + if (nodeIn.TypeReference != null) { - return (Guid)nodeIn.Value; - } + if (nodeIn.TypeReference.Definition == DateTimeType || nodeIn.TypeReference.Definition == DateType) + { + return ParseInstant(nodeIn.Value); + } - if (nodeIn.TypeReference.Definition == BooleanType) - { - return (bool)nodeIn.Value; - } + if (nodeIn.TypeReference.Definition == GuidType) + { + return (Guid)nodeIn.Value; + } - if (nodeIn.TypeReference.Definition == SingleType) - { - return (float)nodeIn.Value; - } + if (nodeIn.TypeReference.Definition == BooleanType) + { + return (bool)nodeIn.Value; + } - if (nodeIn.TypeReference.Definition == DoubleType) - { - return (double)nodeIn.Value; - } + if (nodeIn.TypeReference.Definition == SingleType) + { + return (float)nodeIn.Value; + } - if (nodeIn.TypeReference.Definition == Int32Type) - { - return (int)nodeIn.Value; - } + if (nodeIn.TypeReference.Definition == DoubleType) + { + return (double)nodeIn.Value; + } - if (nodeIn.TypeReference.Definition == Int64Type) - { - return (long)nodeIn.Value; - } + if (nodeIn.TypeReference.Definition == Int32Type) + { + return (int)nodeIn.Value; + } - if (nodeIn.TypeReference.Definition == StringType) - { - return (string)nodeIn.Value; + if (nodeIn.TypeReference.Definition == Int64Type) + { + return (long)nodeIn.Value; + } + + if (nodeIn.TypeReference.Definition == StringType) + { + return (string)nodeIn.Value; + } } throw new NotSupportedException(); diff --git a/backend/tests/Squidex.Infrastructure.Tests/Queries/QueryFromODataTests.cs b/backend/tests/Squidex.Infrastructure.Tests/Queries/QueryFromODataTests.cs index 1fd6c1911..3f3885465 100644 --- a/backend/tests/Squidex.Infrastructure.Tests/Queries/QueryFromODataTests.cs +++ b/backend/tests/Squidex.Infrastructure.Tests/Queries/QueryFromODataTests.cs @@ -67,7 +67,7 @@ namespace Squidex.Infrastructure.Queries [InlineData("created")] [InlineData("createdNullable")] [InlineData("properties/datetime")] - [InlineData("properties/nested/dateime")] + [InlineData("properties/nested/datetime")] public void Should_parse_filter_when_type_is_datetime(string field) { var i = _Q($"$filter={field} eq 1988-01-19T12:00:00Z"); @@ -76,6 +76,19 @@ namespace Squidex.Infrastructure.Queries Assert.Equal(o, i); } + [Theory] + [InlineData("created")] + [InlineData("createdNullable")] + [InlineData("properties/datetime")] + [InlineData("properties/nested/datetime")] + public void Should_parse_filter_when_type_is_datetime_and_value_is_null(string field) + { + var i = _Q($"$filter={field} eq null"); + var o = _C($"Filter: {field} == null"); + + Assert.Equal(o, i); + } + [Fact] public void Should_parse_filter_when_type_is_datetime_list() { @@ -129,6 +142,19 @@ namespace Squidex.Infrastructure.Queries Assert.Equal(o, i); } + [Theory] + [InlineData("id")] + [InlineData("idNullable")] + [InlineData("properties/uid")] + [InlineData("properties/nested/guid")] + public void Should_parse_filter_when_type_is_guid_and_value_is_null(string field) + { + var i = _Q($"$filter={field} eq null"); + var o = _C($"Filter: {field} == null"); + + Assert.Equal(o, i); + } + [Fact] public void Should_parse_filter_when_type_is_guid_list() { @@ -182,6 +208,19 @@ namespace Squidex.Infrastructure.Queries Assert.Equal(o, i); } + [Theory] + [InlineData("isComicFigure")] + [InlineData("isComicFigureNullable")] + [InlineData("properties/boolean")] + [InlineData("properties/nested/boolean")] + public void Should_parse_filter_when_type_is_boolean_and_value_is_null(string field) + { + var i = _Q($"$filter={field} eq null"); + var o = _C($"Filter: {field} == null"); + + Assert.Equal(o, i); + } + [Fact] public void Should_parse_filter_when_type_is_boolean_list() {