Browse Source

Fix for datetime queries.

pull/312/head
Sebastian Stehle 7 years ago
parent
commit
176f408049
  1. 15
      src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Visitors/FindExtensions.cs
  2. 20
      src/Squidex.Infrastructure.MongoDb/MongoDb/OData/ConstantVisitor.cs
  3. 13
      tests/Squidex.Domain.Apps.Entities.Tests/Contents/OData/ODataQueryTests.cs

15
src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Visitors/FindExtensions.cs

@ -12,6 +12,7 @@ using System.Reflection;
using Microsoft.OData.UriParser;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;
using NodaTime;
using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Core.GenerateEdmSchema;
using Squidex.Domain.Apps.Core.Schemas;
@ -27,6 +28,18 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Visitors
typeof(MongoContentEntity).GetProperties()
.ToDictionary(x => x.Name, x => x.GetCustomAttribute<BsonElementAttribute>()?.ElementName ?? x.Name, StringComparer.OrdinalIgnoreCase);
public static readonly ConvertValue ValueConverter = (field, value) =>
{
if (value is Instant instant &&
!string.Equals(field, "mt", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(field, "ct", StringComparison.OrdinalIgnoreCase))
{
return instant.ToString();
}
return value;
};
public static ConvertProperty CreatePropertyCalculator(Schema schema, bool useDraft)
{
return propertyNames =>
@ -98,7 +111,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Visitors
filters.Add(Filter.In(x => x.Status, status));
}
var filter = query.BuildFilter<MongoContentEntity>(propertyCalculator);
var filter = query.BuildFilter<MongoContentEntity>(propertyCalculator, ValueConverter);
if (filter.Filter != null)
{

20
src/Squidex.Infrastructure.MongoDb/MongoDb/OData/ConstantVisitor.cs

@ -6,6 +6,7 @@
// ==========================================================================
using System;
using Microsoft.OData;
using Microsoft.OData.Edm;
using Microsoft.OData.UriParser;
using NodaTime;
@ -51,7 +52,24 @@ namespace Squidex.Infrastructure.MongoDb.OData
return Instant.FromDateTimeOffset(dateTimeOffset);
}
return InstantPattern.General.Parse(Visit(nodeIn.Source).ToString()).Value;
if (value is DateTime dateTime)
{
return Instant.FromDateTimeUtc(DateTime.SpecifyKind(dateTime, DateTimeKind.Utc));
}
if (value is Date date)
{
return Instant.FromUtc(date.Year, date.Month, date.Day, 0, 0);
}
var parseResult = InstantPattern.General.Parse(Visit(nodeIn.Source).ToString());
if (!parseResult.Success)
{
throw new ODataException("Datetime is not in a valid format. Use ISO 8601");
}
return parseResult.Value;
}
return base.Visit(nodeIn);

13
tests/Squidex.Domain.Apps.Entities.Tests/Contents/OData/ODataQueryTests.cs

@ -95,6 +95,15 @@ namespace Squidex.Domain.Apps.Entities.Contents.OData
Assert.Equal(o, i);
}
[Fact]
public void Should_make_query_with_created_and_date()
{
var i = F("$filter=created eq 1988-01-19");
var o = C("{ 'ct' : ISODate('1988-01-19T00:00:00Z') }");
Assert.Equal(o, i);
}
[Fact]
public void Should_make_query_with_createdBy()
{
@ -216,7 +225,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.OData
public void Should_make_query_with_datetime_equals()
{
var i = F("$filter=data/birthday/iv eq 1988-01-19T12:00:00Z");
var o = C("{ 'do.5.iv' : ISODate('1988-01-19T12:00:00Z') }");
var o = C("{ 'do.5.iv' : '1988-01-19T12:00:00Z' }");
Assert.Equal(o, i);
}
@ -430,7 +439,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.OData
var parser = edmModel.ParseQuery(value);
var query =
parser.BuildFilter<MongoContentEntity>(FindExtensions.CreatePropertyCalculator(schemaDef, false))
parser.BuildFilter<MongoContentEntity>(FindExtensions.CreatePropertyCalculator(schemaDef, false), FindExtensions.ValueConverter)
.Filter.Render(Serializer, Registry).ToString();
return query;

Loading…
Cancel
Save