Browse Source

Fix OData conversion.

pull/447/head
Sebastian 6 years ago
parent
commit
87816a8d90
  1. 15
      backend/src/Squidex.Infrastructure/Queries/OData/ConstantWithTypeVisitor.cs
  2. 113
      backend/tests/Squidex.Infrastructure.Tests/Queries/QueryODataConversionTests.cs

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

@ -18,6 +18,7 @@ namespace Squidex.Infrastructure.Queries.OData
public sealed class ConstantWithTypeVisitor : QueryNodeVisitor<ClrValue> public sealed class ConstantWithTypeVisitor : QueryNodeVisitor<ClrValue>
{ {
private static readonly IEdmPrimitiveType BooleanType = EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.Boolean); private static readonly IEdmPrimitiveType BooleanType = EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.Boolean);
private static readonly IEdmPrimitiveType DateType = EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.Date);
private static readonly IEdmPrimitiveType DateTimeType = EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.DateTimeOffset); private static readonly IEdmPrimitiveType DateTimeType = EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.DateTimeOffset);
private static readonly IEdmPrimitiveType DoubleType = EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.Double); private static readonly IEdmPrimitiveType DoubleType = EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.Double);
private static readonly IEdmPrimitiveType GuidType = EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.Guid); private static readonly IEdmPrimitiveType GuidType = EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.Guid);
@ -53,7 +54,7 @@ namespace Squidex.Infrastructure.Queries.OData
return Guid.Parse(value.ToString()!); return Guid.Parse(value.ToString()!);
} }
if (nodeIn.TypeReference.Definition == DateTimeType) if (nodeIn.TypeReference.Definition == DateTimeType || nodeIn.TypeReference.Definition == DateType)
{ {
var value = ConstantVisitor.Visit(nodeIn.Source); var value = ConstantVisitor.Visit(nodeIn.Source);
@ -70,7 +71,7 @@ namespace Squidex.Infrastructure.Queries.OData
public override ClrValue Visit(CollectionConstantNode nodeIn) public override ClrValue Visit(CollectionConstantNode nodeIn)
{ {
if (nodeIn.ItemType.Definition == DateTimeType) if (nodeIn.ItemType.Definition == DateTimeType || nodeIn.ItemType.Definition == DateType)
{ {
return nodeIn.Collection.Select(x => ParseInstant(x.Value)).ToList(); return nodeIn.Collection.Select(x => ParseInstant(x.Value)).ToList();
} }
@ -115,6 +116,16 @@ 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)
{
return ParseInstant(nodeIn.Value);
}
if (nodeIn.TypeReference.Definition == GuidType)
{
return (Guid)nodeIn.Value;
}
if (nodeIn.TypeReference.Definition == BooleanType) if (nodeIn.TypeReference.Definition == BooleanType)
{ {
return (bool)nodeIn.Value; return (bool)nodeIn.Value;

113
backend/tests/Squidex.Infrastructure.Tests/Queries/QueryODataConversionTests.cs

@ -19,15 +19,23 @@ namespace Squidex.Infrastructure.Queries
{ {
var entityType = new EdmEntityType("Squidex", "Users"); var entityType = new EdmEntityType("Squidex", "Users");
entityType.AddStructuralProperty("id", EdmPrimitiveTypeKind.Guid); entityType.AddStructuralProperty("id", EdmPrimitiveTypeKind.Guid, false);
entityType.AddStructuralProperty("created", EdmPrimitiveTypeKind.DateTimeOffset); entityType.AddStructuralProperty("idNullable", EdmPrimitiveTypeKind.Guid, true);
entityType.AddStructuralProperty("isComicFigure", EdmPrimitiveTypeKind.Boolean); entityType.AddStructuralProperty("created", EdmPrimitiveTypeKind.DateTimeOffset, false);
entityType.AddStructuralProperty("firstName", EdmPrimitiveTypeKind.String); entityType.AddStructuralProperty("createdNullable", EdmPrimitiveTypeKind.DateTimeOffset, true);
entityType.AddStructuralProperty("lastName", EdmPrimitiveTypeKind.String); entityType.AddStructuralProperty("isComicFigure", EdmPrimitiveTypeKind.Boolean, false);
entityType.AddStructuralProperty("birthday", EdmPrimitiveTypeKind.Date); entityType.AddStructuralProperty("isComicFigureNullable", EdmPrimitiveTypeKind.Boolean, true);
entityType.AddStructuralProperty("incomeCents", EdmPrimitiveTypeKind.Int64); entityType.AddStructuralProperty("firstName", EdmPrimitiveTypeKind.String, true);
entityType.AddStructuralProperty("incomeMio", EdmPrimitiveTypeKind.Double); entityType.AddStructuralProperty("firstNameNullable", EdmPrimitiveTypeKind.String, false);
entityType.AddStructuralProperty("age", EdmPrimitiveTypeKind.Int32); entityType.AddStructuralProperty("lastName", EdmPrimitiveTypeKind.String, true);
entityType.AddStructuralProperty("birthday", EdmPrimitiveTypeKind.Date, false);
entityType.AddStructuralProperty("birthdayNullable", EdmPrimitiveTypeKind.Date, true);
entityType.AddStructuralProperty("incomeCents", EdmPrimitiveTypeKind.Int64, false);
entityType.AddStructuralProperty("incomeCentsNullable", EdmPrimitiveTypeKind.Int64, true);
entityType.AddStructuralProperty("incomeMio", EdmPrimitiveTypeKind.Double, false);
entityType.AddStructuralProperty("incomeMioNullable", EdmPrimitiveTypeKind.Double, true);
entityType.AddStructuralProperty("age", EdmPrimitiveTypeKind.Int32, false);
entityType.AddStructuralProperty("ageNullable", EdmPrimitiveTypeKind.Int32, true);
var container = new EdmEntityContainer("Squidex", "Container"); var container = new EdmEntityContainer("Squidex", "Container");
@ -49,11 +57,13 @@ namespace Squidex.Infrastructure.Queries
Assert.NotNull(parser); Assert.NotNull(parser);
} }
[Fact] [Theory]
public void Should_parse_filter_when_type_is_datetime() [InlineData("created")]
[InlineData("createdNullable")]
public void Should_parse_filter_when_type_is_datetime(string field)
{ {
var i = Q("$filter=created eq 1988-01-19T12:00:00Z"); var i = Q($"$filter={field} eq 1988-01-19T12:00:00Z");
var o = C("Filter: created == 1988-01-19T12:00:00Z"); var o = C($"Filter: {field} == 1988-01-19T12:00:00Z");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -68,7 +78,7 @@ namespace Squidex.Infrastructure.Queries
} }
[Fact] [Fact]
public void Should_parse_filter_when_type_is_date() public void Should_parse_filter_when_type_is_datetime_and_and_value_is_date()
{ {
var i = Q("$filter=created eq 1988-01-19"); var i = Q("$filter=created eq 1988-01-19");
var o = C("Filter: created == 1988-01-19T00:00:00Z"); var o = C("Filter: created == 1988-01-19T00:00:00Z");
@ -76,20 +86,33 @@ namespace Squidex.Infrastructure.Queries
Assert.Equal(o, i); Assert.Equal(o, i);
} }
[Theory]
[InlineData("birthday")]
[InlineData("birthdayNullable")]
public void Should_parse_filter_when_type_is_date(string field)
{
var i = Q($"$filter={field} eq 1988-01-19");
var o = C($"Filter: {field} == 1988-01-19T00:00:00Z");
Assert.Equal(o, i);
}
[Fact] [Fact]
public void Should_parse_filter_when_type_is_date_list() public void Should_parse_filter_when_type_is_date_list()
{ {
var i = Q("$filter=created in ('1988-01-19')"); var i = Q("$filter=birthday in ('1988-01-19')");
var o = C("Filter: created in [1988-01-19T00:00:00Z]"); var o = C("Filter: birthday in [1988-01-19T00:00:00Z]");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
[Fact] [Theory]
public void Should_parse_filter_when_type_is_guid() [InlineData("id")]
[InlineData("idNullable")]
public void Should_parse_filter_when_type_is_guid(string field)
{ {
var i = Q("$filter=id eq B5FE25E3-B262-4B17-91EF-B3772A6B62BB"); var i = Q($"$filter={field} eq B5FE25E3-B262-4B17-91EF-B3772A6B62BB");
var o = C("Filter: id == b5fe25e3-b262-4b17-91ef-b3772a6b62bb"); var o = C($"Filter: {field} == b5fe25e3-b262-4b17-91ef-b3772a6b62bb");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -112,11 +135,13 @@ namespace Squidex.Infrastructure.Queries
Assert.Equal(o, i); Assert.Equal(o, i);
} }
[Fact] [Theory]
public void Should_parse_filter_when_type_is_string() [InlineData("firstName")]
[InlineData("firstNameNullable")]
public void Should_parse_filter_when_type_is_string(string field)
{ {
var i = Q("$filter=firstName eq 'Dagobert'"); var i = Q($"$filter={field} eq 'Dagobert'");
var o = C("Filter: firstName == 'Dagobert'"); var o = C($"Filter: {field} == 'Dagobert'");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -130,11 +155,13 @@ namespace Squidex.Infrastructure.Queries
Assert.Equal(o, i); Assert.Equal(o, i);
} }
[Fact] [Theory]
public void Should_parse_filter_when_type_is_boolean() [InlineData("isComicFigure")]
[InlineData("isComicFigureNullable")]
public void Should_parse_filter_when_type_is_boolean(string field)
{ {
var i = Q("$filter=isComicFigure eq true"); var i = Q($"$filter={field} eq true");
var o = C("Filter: isComicFigure == True"); var o = C($"Filter: {field} == True");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -148,11 +175,13 @@ namespace Squidex.Infrastructure.Queries
Assert.Equal(o, i); Assert.Equal(o, i);
} }
[Fact] [Theory]
public void Should_parse_filter_when_type_is_int32() [InlineData("age")]
[InlineData("ageNullable")]
public void Should_parse_filter_when_type_is_int32(string field)
{ {
var i = Q("$filter=age eq 60"); var i = Q($"$filter={field} eq 60");
var o = C("Filter: age == 60"); var o = C($"Filter: {field} == 60");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -166,11 +195,13 @@ namespace Squidex.Infrastructure.Queries
Assert.Equal(o, i); Assert.Equal(o, i);
} }
[Fact] [Theory]
public void Should_parse_filter_when_type_is_int64() [InlineData("incomeCents")]
[InlineData("incomeCentsNullable")]
public void Should_parse_filter_when_type_is_int64(string field)
{ {
var i = Q("$filter=incomeCents eq 31543143513456789"); var i = Q($"$filter={field} eq 31543143513456789");
var o = C("Filter: incomeCents == 31543143513456789"); var o = C($"Filter: {field} == 31543143513456789");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -184,11 +215,13 @@ namespace Squidex.Infrastructure.Queries
Assert.Equal(o, i); Assert.Equal(o, i);
} }
[Fact] [Theory]
public void Should_parse_filter_when_type_is_double() [InlineData("incomeMio")]
[InlineData("incomeMioNullable")]
public void Should_parse_filter_when_type_is_double(string field)
{ {
var i = Q("$filter=incomeMio eq 5634474356.1233"); var i = Q($"$filter={field} eq 5634474356.1233");
var o = C("Filter: incomeMio == 5634474356.1233"); var o = C($"Filter: {field} == 5634474356.1233");
Assert.Equal(o, i); Assert.Equal(o, i);
} }

Loading…
Cancel
Save