Browse Source

Null support.

pull/320/head
Sebastian Stehle 7 years ago
parent
commit
426124bb29
  1. 20
      src/Squidex.Infrastructure/Queries/FilterValue.cs
  2. 5
      src/Squidex.Infrastructure/Queries/OData/ConstantWithTypeVisitor.cs
  3. 2
      src/Squidex.Infrastructure/Queries/Query.cs
  4. 4
      tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetQueryServiceTests.cs
  5. 6
      tests/Squidex.Domain.Apps.Entities.Tests/Assets/Queries/FilterTagTransformerTests.cs
  6. 10
      tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/FilterTagTransformerTests.cs
  7. 33
      tests/Squidex.Infrastructure.Tests/Queries/ODataConversionTests.cs

20
src/Squidex.Infrastructure/Queries/FilterValue.cs

@ -123,15 +123,27 @@ namespace Squidex.Infrastructure.Queries
{ {
if (Value is IList list) if (Value is IList list)
{ {
return $"[{string.Join(", ", list.OfType<object>().ToArray())}]"; return $"[{string.Join(", ", list.OfType<object>().Select(ToString).ToArray())}]";
} }
else if (Value == null) else
{
return ToString(Value);
}
}
private string ToString(object value)
{
if (ValueType == FilterValueType.String)
{
return $"'{value.ToString().Replace("'", "\\'")}'";
}
else if (value == null)
{ {
return "<Null>"; return "null";
} }
else else
{ {
return Value.ToString(); return value.ToString();
} }
} }
} }

5
src/Squidex.Infrastructure/Queries/OData/ConstantWithTypeVisitor.cs

@ -60,6 +60,11 @@ namespace Squidex.Infrastructure.Queries.OData
return new FilterValue(ParseInstant(value)); return new FilterValue(ParseInstant(value));
} }
if (ConstantVisitor.Visit(nodeIn.Source) == null)
{
return FilterValue.Null;
}
throw new NotSupportedException(); throw new NotSupportedException();
} }

2
src/Squidex.Infrastructure/Queries/Query.cs

@ -32,7 +32,7 @@ namespace Squidex.Infrastructure.Queries
if (FullText != null) if (FullText != null)
{ {
parts.Add($"FullText: {FullText}"); parts.Add($"FullText: '{FullText.Replace("'", "\'")}'");
} }
if (Skip > 0) if (Skip > 0)

4
tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetQueryServiceTests.cs

@ -109,7 +109,7 @@ namespace Squidex.Domain.Apps.Entities.Assets
{ {
await sut.QueryAsync(context, Q.Empty.WithODataQuery("$top=100&$orderby=fileName asc&$search=Hello World")); await sut.QueryAsync(context, Q.Empty.WithODataQuery("$top=100&$orderby=fileName asc&$search=Hello World"));
A.CallTo(() => assetRepository.QueryAsync(appId, A<Query>.That.Matches(x => x.ToString() == "FullText: Hello World; Take: 100; Sort: fileName Ascending"))) A.CallTo(() => assetRepository.QueryAsync(appId, A<Query>.That.Matches(x => x.ToString() == "FullText: 'Hello World'; Take: 100; Sort: fileName Ascending")))
.MustHaveHappened(); .MustHaveHappened();
} }
@ -118,7 +118,7 @@ namespace Squidex.Domain.Apps.Entities.Assets
{ {
await sut.QueryAsync(context, Q.Empty.WithODataQuery("$filter=fileName eq 'ABC'")); await sut.QueryAsync(context, Q.Empty.WithODataQuery("$filter=fileName eq 'ABC'"));
A.CallTo(() => assetRepository.QueryAsync(appId, A<Query>.That.Matches(x => x.ToString() == "Filter: fileName == ABC; Take: 200; Sort: lastModified Descending"))) A.CallTo(() => assetRepository.QueryAsync(appId, A<Query>.That.Matches(x => x.ToString() == "Filter: fileName == 'ABC'; Take: 200; Sort: lastModified Descending")))
.MustHaveHappened(); .MustHaveHappened();
} }

6
tests/Squidex.Domain.Apps.Entities.Tests/Assets/Queries/FilterTagTransformerTests.cs

@ -28,7 +28,7 @@ namespace Squidex.Domain.Apps.Entities.Assets.Queries
var source = FilterBuilder.Eq("tags", "name1"); var source = FilterBuilder.Eq("tags", "name1");
var result = FilterTagTransformer.Transform(source, appId, tagService); var result = FilterTagTransformer.Transform(source, appId, tagService);
Assert.Equal("tags == id1", result.ToString()); Assert.Equal("tags == 'id1'", result.ToString());
} }
[Fact] [Fact]
@ -40,7 +40,7 @@ namespace Squidex.Domain.Apps.Entities.Assets.Queries
var source = FilterBuilder.Eq("tags", "name1"); var source = FilterBuilder.Eq("tags", "name1");
var result = FilterTagTransformer.Transform(source, appId, tagService); var result = FilterTagTransformer.Transform(source, appId, tagService);
Assert.Equal("tags == name1", result.ToString()); Assert.Equal("tags == 'name1'", result.ToString());
} }
[Fact] [Fact]
@ -49,7 +49,7 @@ namespace Squidex.Domain.Apps.Entities.Assets.Queries
var source = FilterBuilder.Eq("other", "value"); var source = FilterBuilder.Eq("other", "value");
var result = FilterTagTransformer.Transform(source, appId, tagService); var result = FilterTagTransformer.Transform(source, appId, tagService);
Assert.Equal("other == value", result.ToString()); Assert.Equal("other == 'value'", result.ToString());
A.CallTo(() => tagService.GetTagIdsAsync(appId, A<string>.Ignored, A<HashSet<string>>.Ignored)) A.CallTo(() => tagService.GetTagIdsAsync(appId, A<string>.Ignored, A<HashSet<string>>.Ignored))
.MustNotHaveHappened(); .MustNotHaveHappened();

10
tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/FilterTagTransformerTests.cs

@ -45,7 +45,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries
var source = FilterBuilder.Eq("data.tags2.iv", "name1"); var source = FilterBuilder.Eq("data.tags2.iv", "name1");
var result = FilterTagTransformer.Transform(source, appId, schema, tagService); var result = FilterTagTransformer.Transform(source, appId, schema, tagService);
Assert.Equal("data.tags2.iv == id1", result.ToString()); Assert.Equal("data.tags2.iv == 'id1'", result.ToString());
} }
[Fact] [Fact]
@ -57,7 +57,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries
var source = FilterBuilder.Eq("data.tags2.iv", "name1"); var source = FilterBuilder.Eq("data.tags2.iv", "name1");
var result = FilterTagTransformer.Transform(source, appId, schema, tagService); var result = FilterTagTransformer.Transform(source, appId, schema, tagService);
Assert.Equal("data.tags2.iv == name1", result.ToString()); Assert.Equal("data.tags2.iv == 'name1'", result.ToString());
} }
[Fact] [Fact]
@ -66,7 +66,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries
var source = FilterBuilder.Eq("data.tags1.iv", "value"); var source = FilterBuilder.Eq("data.tags1.iv", "value");
var result = FilterTagTransformer.Transform(source, appId, schema, tagService); var result = FilterTagTransformer.Transform(source, appId, schema, tagService);
Assert.Equal("data.tags1.iv == value", result.ToString()); Assert.Equal("data.tags1.iv == 'value'", result.ToString());
A.CallTo(() => tagService.GetTagIdsAsync(appId, A<string>.Ignored, A<HashSet<string>>.Ignored)) A.CallTo(() => tagService.GetTagIdsAsync(appId, A<string>.Ignored, A<HashSet<string>>.Ignored))
.MustNotHaveHappened(); .MustNotHaveHappened();
@ -78,7 +78,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries
var source = FilterBuilder.Eq("data.string.iv", "value"); var source = FilterBuilder.Eq("data.string.iv", "value");
var result = FilterTagTransformer.Transform(source, appId, schema, tagService); var result = FilterTagTransformer.Transform(source, appId, schema, tagService);
Assert.Equal("data.string.iv == value", result.ToString()); Assert.Equal("data.string.iv == 'value'", result.ToString());
A.CallTo(() => tagService.GetTagIdsAsync(appId, A<string>.Ignored, A<HashSet<string>>.Ignored)) A.CallTo(() => tagService.GetTagIdsAsync(appId, A<string>.Ignored, A<HashSet<string>>.Ignored))
.MustNotHaveHappened(); .MustNotHaveHappened();
@ -90,7 +90,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries
var source = FilterBuilder.Eq("no.data", "value"); var source = FilterBuilder.Eq("no.data", "value");
var result = FilterTagTransformer.Transform(source, appId, schema, tagService); var result = FilterTagTransformer.Transform(source, appId, schema, tagService);
Assert.Equal("no.data == value", result.ToString()); Assert.Equal("no.data == 'value'", result.ToString());
A.CallTo(() => tagService.GetTagIdsAsync(appId, A<string>.Ignored, A<HashSet<string>>.Ignored)) A.CallTo(() => tagService.GetTagIdsAsync(appId, A<string>.Ignored, A<HashSet<string>>.Ignored))
.MustNotHaveHappened(); .MustNotHaveHappened();

33
tests/Squidex.Infrastructure.Tests/Queries/ODataConversionTests.cs

@ -103,11 +103,20 @@ namespace Squidex.Infrastructure.Queries
Assert.Equal(o, i); Assert.Equal(o, i);
} }
[Fact]
public void Should_parse_filter_when_type_is_null()
{
var i = Q("$filter=firstName eq null");
var o = C("Filter: firstName == null");
Assert.Equal(o, i);
}
[Fact] [Fact]
public void Should_parse_filter_when_type_is_string() public void Should_parse_filter_when_type_is_string()
{ {
var i = Q("$filter=firstName eq 'Dagobert'"); var i = Q("$filter=firstName eq 'Dagobert'");
var o = C("Filter: firstName == Dagobert"); var o = C("Filter: firstName == 'Dagobert'");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -116,7 +125,7 @@ namespace Squidex.Infrastructure.Queries
public void Should_parse_filter_when_type_is_string_list() public void Should_parse_filter_when_type_is_string_list()
{ {
var i = Q("$filter=firstName in ('Dagobert')"); var i = Q("$filter=firstName in ('Dagobert')");
var o = C("Filter: firstName in [Dagobert]"); var o = C("Filter: firstName in ['Dagobert']");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -197,7 +206,7 @@ namespace Squidex.Infrastructure.Queries
public void Should_parse_filter_with_negation() public void Should_parse_filter_with_negation()
{ {
var i = Q("$filter=not endswith(lastName, 'Duck')"); var i = Q("$filter=not endswith(lastName, 'Duck')");
var o = C("Filter: !(endsWith(lastName, Duck))"); var o = C("Filter: !(endsWith(lastName, 'Duck'))");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -206,7 +215,7 @@ namespace Squidex.Infrastructure.Queries
public void Should_parse_filter_with_startswith() public void Should_parse_filter_with_startswith()
{ {
var i = Q("$filter=startswith(lastName, 'Duck')"); var i = Q("$filter=startswith(lastName, 'Duck')");
var o = C("Filter: startsWith(lastName, Duck)"); var o = C("Filter: startsWith(lastName, 'Duck')");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -215,7 +224,7 @@ namespace Squidex.Infrastructure.Queries
public void Should_parse_filter_with_endswith() public void Should_parse_filter_with_endswith()
{ {
var i = Q("$filter=endswith(lastName, 'Duck')"); var i = Q("$filter=endswith(lastName, 'Duck')");
var o = C("Filter: endsWith(lastName, Duck)"); var o = C("Filter: endsWith(lastName, 'Duck')");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -224,7 +233,7 @@ namespace Squidex.Infrastructure.Queries
public void Should_parse_filter_with_contains() public void Should_parse_filter_with_contains()
{ {
var i = Q("$filter=contains(lastName, 'Duck')"); var i = Q("$filter=contains(lastName, 'Duck')");
var o = C("Filter: contains(lastName, Duck)"); var o = C("Filter: contains(lastName, 'Duck')");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -233,7 +242,7 @@ namespace Squidex.Infrastructure.Queries
public void Should_parse_filter_with_contains_to_true() public void Should_parse_filter_with_contains_to_true()
{ {
var i = Q("$filter=contains(lastName, 'Duck') eq true"); var i = Q("$filter=contains(lastName, 'Duck') eq true");
var o = C("Filter: contains(lastName, Duck)"); var o = C("Filter: contains(lastName, 'Duck')");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -242,7 +251,7 @@ namespace Squidex.Infrastructure.Queries
public void Should_parse_filter_with_contains_to_false() public void Should_parse_filter_with_contains_to_false()
{ {
var i = Q("$filter=contains(lastName, 'Duck') eq false"); var i = Q("$filter=contains(lastName, 'Duck') eq false");
var o = C("Filter: !(contains(lastName, Duck))"); var o = C("Filter: !(contains(lastName, 'Duck'))");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -305,7 +314,7 @@ namespace Squidex.Infrastructure.Queries
public void Should_parse_filter_with_conjunction_and_contains() public void Should_parse_filter_with_conjunction_and_contains()
{ {
var i = Q("$filter=contains(firstName, 'Sebastian') eq false and isComicFigure eq true"); var i = Q("$filter=contains(firstName, 'Sebastian') eq false and isComicFigure eq true");
var o = C("Filter: (!(contains(firstName, Sebastian)) && isComicFigure == True)"); var o = C("Filter: (!(contains(firstName, 'Sebastian')) && isComicFigure == True)");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -332,7 +341,7 @@ namespace Squidex.Infrastructure.Queries
public void Should_parse_filter_with_full_text() public void Should_parse_filter_with_full_text()
{ {
var i = Q("$search=Duck"); var i = Q("$search=Duck");
var o = C("FullText: Duck"); var o = C("FullText: 'Duck'");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -341,7 +350,7 @@ namespace Squidex.Infrastructure.Queries
public void Should_parse_filter_with_full_text_and_multiple_terms() public void Should_parse_filter_with_full_text_and_multiple_terms()
{ {
var i = Q("$search=Dagobert or Donald"); var i = Q("$search=Dagobert or Donald");
var o = C("FullText: Dagobert or Donald"); var o = C("FullText: 'Dagobert or Donald'");
Assert.Equal(o, i); Assert.Equal(o, i);
} }
@ -375,7 +384,7 @@ namespace Squidex.Infrastructure.Queries
private static string C(string value) private static string C(string value)
{ {
return value.Replace('\'', '"'); return value;
} }
private static string Q(string value) private static string Q(string value)

Loading…
Cancel
Save