Browse Source

Null fixes for odata.

pull/662/head
Sebastian 5 years ago
parent
commit
1eaf238049
  1. 77
      backend/src/Squidex.Infrastructure/Queries/OData/ConstantWithTypeVisitor.cs
  2. 41
      backend/tests/Squidex.Infrastructure.Tests/Queries/QueryFromODataTests.cs

77
backend/src/Squidex.Infrastructure/Queries/OData/ConstantWithTypeVisitor.cs

@ -40,24 +40,25 @@ namespace Squidex.Infrastructure.Queries.OData
public override ClrValue Visit(ConvertNode nodeIn) 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()!); return bool.Parse(value.ToString()!);
} }
if (nodeIn.TypeReference.Definition == GuidType) if (nodeIn.TypeReference.Definition == GuidType)
{ {
var value = ConstantVisitor.Visit(nodeIn.Source);
return Guid.Parse(value.ToString()!); return Guid.Parse(value.ToString()!);
} }
if (nodeIn.TypeReference.Definition == DateTimeType || nodeIn.TypeReference.Definition == DateType) if (nodeIn.TypeReference.Definition == DateTimeType || nodeIn.TypeReference.Definition == DateType)
{ {
var value = ConstantVisitor.Visit(nodeIn.Source);
return ParseInstant(value); return ParseInstant(value);
} }
@ -116,44 +117,52 @@ namespace Squidex.Infrastructure.Queries.OData
public override ClrValue Visit(ConstantNode nodeIn) 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) if (nodeIn.TypeReference.Definition == GuidType)
{ {
return (bool)nodeIn.Value; return (Guid)nodeIn.Value;
} }
if (nodeIn.TypeReference.Definition == SingleType) if (nodeIn.TypeReference.Definition == BooleanType)
{ {
return (float)nodeIn.Value; return (bool)nodeIn.Value;
} }
if (nodeIn.TypeReference.Definition == DoubleType) if (nodeIn.TypeReference.Definition == SingleType)
{ {
return (double)nodeIn.Value; return (float)nodeIn.Value;
} }
if (nodeIn.TypeReference.Definition == Int32Type) if (nodeIn.TypeReference.Definition == DoubleType)
{ {
return (int)nodeIn.Value; return (double)nodeIn.Value;
} }
if (nodeIn.TypeReference.Definition == Int64Type) if (nodeIn.TypeReference.Definition == Int32Type)
{ {
return (long)nodeIn.Value; return (int)nodeIn.Value;
} }
if (nodeIn.TypeReference.Definition == StringType) if (nodeIn.TypeReference.Definition == Int64Type)
{ {
return (string)nodeIn.Value; return (long)nodeIn.Value;
}
if (nodeIn.TypeReference.Definition == StringType)
{
return (string)nodeIn.Value;
}
} }
throw new NotSupportedException(); throw new NotSupportedException();

41
backend/tests/Squidex.Infrastructure.Tests/Queries/QueryFromODataTests.cs

@ -67,7 +67,7 @@ namespace Squidex.Infrastructure.Queries
[InlineData("created")] [InlineData("created")]
[InlineData("createdNullable")] [InlineData("createdNullable")]
[InlineData("properties/datetime")] [InlineData("properties/datetime")]
[InlineData("properties/nested/dateime")] [InlineData("properties/nested/datetime")]
public void Should_parse_filter_when_type_is_datetime(string field) public void Should_parse_filter_when_type_is_datetime(string field)
{ {
var i = _Q($"$filter={field} eq 1988-01-19T12:00:00Z"); var i = _Q($"$filter={field} eq 1988-01-19T12:00:00Z");
@ -76,6 +76,19 @@ namespace Squidex.Infrastructure.Queries
Assert.Equal(o, i); 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] [Fact]
public void Should_parse_filter_when_type_is_datetime_list() public void Should_parse_filter_when_type_is_datetime_list()
{ {
@ -129,6 +142,19 @@ namespace Squidex.Infrastructure.Queries
Assert.Equal(o, i); 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] [Fact]
public void Should_parse_filter_when_type_is_guid_list() public void Should_parse_filter_when_type_is_guid_list()
{ {
@ -182,6 +208,19 @@ namespace Squidex.Infrastructure.Queries
Assert.Equal(o, i); 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] [Fact]
public void Should_parse_filter_when_type_is_boolean_list() public void Should_parse_filter_when_type_is_boolean_list()
{ {

Loading…
Cancel
Save