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 Microsoft.OData.UriParser;
using MongoDB.Bson.Serialization.Attributes; using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver; using MongoDB.Driver;
using NodaTime;
using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Core.GenerateEdmSchema; using Squidex.Domain.Apps.Core.GenerateEdmSchema;
using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Core.Schemas;
@ -27,6 +28,18 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Visitors
typeof(MongoContentEntity).GetProperties() typeof(MongoContentEntity).GetProperties()
.ToDictionary(x => x.Name, x => x.GetCustomAttribute<BsonElementAttribute>()?.ElementName ?? x.Name, StringComparer.OrdinalIgnoreCase); .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) public static ConvertProperty CreatePropertyCalculator(Schema schema, bool useDraft)
{ {
return propertyNames => return propertyNames =>
@ -98,7 +111,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Visitors
filters.Add(Filter.In(x => x.Status, status)); 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) if (filter.Filter != null)
{ {

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

@ -6,6 +6,7 @@
// ========================================================================== // ==========================================================================
using System; using System;
using Microsoft.OData;
using Microsoft.OData.Edm; using Microsoft.OData.Edm;
using Microsoft.OData.UriParser; using Microsoft.OData.UriParser;
using NodaTime; using NodaTime;
@ -51,7 +52,24 @@ namespace Squidex.Infrastructure.MongoDb.OData
return Instant.FromDateTimeOffset(dateTimeOffset); 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); 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); 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] [Fact]
public void Should_make_query_with_createdBy() 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() public void Should_make_query_with_datetime_equals()
{ {
var i = F("$filter=data/birthday/iv eq 1988-01-19T12:00:00Z"); 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); Assert.Equal(o, i);
} }
@ -430,7 +439,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.OData
var parser = edmModel.ParseQuery(value); var parser = edmModel.ParseQuery(value);
var query = var query =
parser.BuildFilter<MongoContentEntity>(FindExtensions.CreatePropertyCalculator(schemaDef, false)) parser.BuildFilter<MongoContentEntity>(FindExtensions.CreatePropertyCalculator(schemaDef, false), FindExtensions.ValueConverter)
.Filter.Render(Serializer, Registry).ToString(); .Filter.Render(Serializer, Registry).ToString();
return query; return query;

Loading…
Cancel
Save