From da4f38e9f3991e3153dd11e955679d63cc7f92fa Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Mon, 31 Jul 2017 22:09:36 +0200 Subject: [PATCH] Closes #87 --- .../Schemas/AssetsField.cs | 2 +- .../Schemas/ReferencesField.cs | 2 +- .../Schemas/StringField.cs | 10 +++---- .../Contents/Visitors/FilterVisitor.cs | 6 +++- .../{Schemas => Contents}/ODataQueryTests.cs | 29 +++++++++++++++++-- 5 files changed, 38 insertions(+), 11 deletions(-) rename tests/Squidex.Domain.Apps.Read.Tests/{Schemas => Contents}/ODataQueryTests.cs (91%) diff --git a/src/Squidex.Domain.Apps.Core/Schemas/AssetsField.cs b/src/Squidex.Domain.Apps.Core/Schemas/AssetsField.cs index a71c25f2a..963b5065f 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/AssetsField.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/AssetsField.cs @@ -78,7 +78,7 @@ namespace Squidex.Domain.Apps.Core.Schemas protected override IEdmTypeReference CreateEdmType() { - return null; + return EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.String, !Properties.IsRequired); } } } diff --git a/src/Squidex.Domain.Apps.Core/Schemas/ReferencesField.cs b/src/Squidex.Domain.Apps.Core/Schemas/ReferencesField.cs index aff409490..606da1bc6 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/ReferencesField.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/ReferencesField.cs @@ -86,7 +86,7 @@ namespace Squidex.Domain.Apps.Core.Schemas protected override IEdmTypeReference CreateEdmType() { - return null; + return EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.String, !Properties.IsRequired); } } } diff --git a/src/Squidex.Domain.Apps.Core/Schemas/StringField.cs b/src/Squidex.Domain.Apps.Core/Schemas/StringField.cs index 7fda9d84e..a6ad02818 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/StringField.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/StringField.cs @@ -52,6 +52,11 @@ namespace Squidex.Domain.Apps.Core.Schemas } } + public override object ConvertValue(JToken value) + { + return value.ToString(); + } + protected override void PrepareJsonSchema(JsonProperty jsonProperty, Func schemaResolver) { jsonProperty.Type = JsonObjectType.String; @@ -69,10 +74,5 @@ namespace Squidex.Domain.Apps.Core.Schemas { return EdmCoreModel.Instance.GetPrimitive(EdmPrimitiveTypeKind.String, !Properties.IsRequired); } - - public override object ConvertValue(JToken value) - { - return value.ToString(); - } } } diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Contents/Visitors/FilterVisitor.cs b/src/Squidex.Domain.Apps.Read.MongoDb/Contents/Visitors/FilterVisitor.cs index bcfde393a..df961e010 100644 --- a/src/Squidex.Domain.Apps.Read.MongoDb/Contents/Visitors/FilterVisitor.cs +++ b/src/Squidex.Domain.Apps.Read.MongoDb/Contents/Visitors/FilterVisitor.cs @@ -110,7 +110,11 @@ namespace Squidex.Domain.Apps.Read.MongoDb.Contents.Visitors { if (nodeIn.OperatorKind == BinaryOperatorKind.NotEqual) { - return Filter.Ne(BuildFieldDefinition(nodeIn.Left), BuildValue(nodeIn.Right)); + var field = BuildFieldDefinition(nodeIn.Left); + + return Filter.Or( + Filter.Not(Filter.Exists(field)), + Filter.Ne(field, BuildValue(nodeIn.Right))); } if (nodeIn.OperatorKind == BinaryOperatorKind.Equal) { diff --git a/tests/Squidex.Domain.Apps.Read.Tests/Schemas/ODataQueryTests.cs b/tests/Squidex.Domain.Apps.Read.Tests/Contents/ODataQueryTests.cs similarity index 91% rename from tests/Squidex.Domain.Apps.Read.Tests/Schemas/ODataQueryTests.cs rename to tests/Squidex.Domain.Apps.Read.Tests/Contents/ODataQueryTests.cs index 065717ae8..d4d0033ae 100644 --- a/tests/Squidex.Domain.Apps.Read.Tests/Schemas/ODataQueryTests.cs +++ b/tests/Squidex.Domain.Apps.Read.Tests/Contents/ODataQueryTests.cs @@ -20,13 +20,14 @@ using Squidex.Domain.Apps.Read.Apps; using Squidex.Domain.Apps.Read.Contents.Edm; using Squidex.Domain.Apps.Read.MongoDb.Contents; using Squidex.Domain.Apps.Read.MongoDb.Contents.Visitors; +using Squidex.Domain.Apps.Read.Schemas; using Squidex.Infrastructure; using Squidex.Infrastructure.MongoDb; using Xunit; // ReSharper disable SpecifyACultureInStringConversionExplicitly -namespace Squidex.Domain.Apps.Read.Schemas +namespace Squidex.Domain.Apps.Read.Contents { public class ODataQueryTests { @@ -41,7 +42,11 @@ namespace Squidex.Domain.Apps.Read.Schemas .AddOrUpdateField(new NumberField(4, "age", Partitioning.Invariant, new NumberFieldProperties { MinValue = 1, MaxValue = 10 })) .AddOrUpdateField(new DateTimeField(5, "birthday", Partitioning.Invariant, - new DateTimeFieldProperties())); + new DateTimeFieldProperties())) + .AddOrUpdateField(new AssetsField(6, "pictures", Partitioning.Invariant, + new AssetsFieldProperties())) + .AddOrUpdateField(new ReferencesField(7, "friends", Partitioning.Invariant, + new ReferencesFieldProperties())); private readonly IBsonSerializerRegistry registry = BsonSerializer.SerializerRegistry; private readonly IBsonSerializer serializer = BsonSerializer.SerializerRegistry.GetSerializer(); @@ -172,7 +177,7 @@ namespace Squidex.Domain.Apps.Read.Schemas public void Should_create_string_not_equals_query() { var i = F("$filter=data/firstName/de ne 'Sebastian'"); - var o = C("{ 'do.1.de' : { '$ne' : 'Sebastian' } }"); + var o = C("{ '$or' : [{ 'do.1.de' : { '$exists' : false } }, { 'do.1.de' : { '$ne' : 'Sebastian' } }] }"); Assert.Equal(o, i); } @@ -213,6 +218,24 @@ namespace Squidex.Domain.Apps.Read.Schemas Assert.Equal(o, i); } + [Fact] + public void Should_create_equals_query_for_assets() + { + var i = F("$filter=data/pictures/iv eq 'guid'"); + var o = C("{ 'do.6.iv' : 'guid' }"); + + Assert.Equal(o, i); + } + + [Fact] + public void Should_create_equals_query_for_references() + { + var i = F("$filter=data/friends/iv eq 'guid'"); + var o = C("{ 'do.7.iv' : 'guid' }"); + + Assert.Equal(o, i); + } + [Fact] public void Should_create_and_query() {