Sebastian Stehle
4 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with
86 additions and
24 deletions
-
backend/src/Squidex.Infrastructure/Json/Objects/JsonValue.cs
-
backend/src/Squidex.Infrastructure/Queries/ClrValue.cs
-
backend/src/Squidex.Infrastructure/Queries/Json/JsonFilterVisitor.cs
-
backend/tests/Squidex.Infrastructure.Tests/Queries/QueryFromJsonTests.cs
|
|
|
@ -70,28 +70,28 @@ namespace Squidex.Infrastructure.Json.Objects |
|
|
|
|
|
|
|
switch (value) |
|
|
|
{ |
|
|
|
case string s: |
|
|
|
return Create(s); |
|
|
|
case bool b: |
|
|
|
return Create(b); |
|
|
|
case float f: |
|
|
|
return Create(f); |
|
|
|
case double d: |
|
|
|
return Create(d); |
|
|
|
case int i: |
|
|
|
return Create(i); |
|
|
|
case long l: |
|
|
|
return Create(l); |
|
|
|
case Guid g: |
|
|
|
return Create(g); |
|
|
|
case DomainId i: |
|
|
|
return Create(i); |
|
|
|
case Instant i: |
|
|
|
return Create(i); |
|
|
|
case object[] array: |
|
|
|
return Array(array); |
|
|
|
case IReadOnlyDictionary<string, object?> obj: |
|
|
|
return Object(obj); |
|
|
|
case string typed: |
|
|
|
return Create(typed); |
|
|
|
case bool typed: |
|
|
|
return Create(typed); |
|
|
|
case float typed: |
|
|
|
return Create(typed); |
|
|
|
case double typed: |
|
|
|
return Create(typed); |
|
|
|
case int typed: |
|
|
|
return Create(typed); |
|
|
|
case long typed: |
|
|
|
return Create(typed); |
|
|
|
case Guid typed: |
|
|
|
return Create(typed); |
|
|
|
case DomainId typed: |
|
|
|
return Create(typed); |
|
|
|
case Instant typed: |
|
|
|
return Create(typed); |
|
|
|
case object[] typed: |
|
|
|
return Array(typed); |
|
|
|
case IReadOnlyDictionary<string, object?> typed: |
|
|
|
return Object(typed); |
|
|
|
} |
|
|
|
|
|
|
|
throw new ArgumentException("Invalid json type", nameof(value)); |
|
|
|
|
|
|
|
@ -64,6 +64,11 @@ namespace Squidex.Infrastructure.Queries |
|
|
|
return value != null ? new ClrValue(value, ClrValueType.String, false) : Null; |
|
|
|
} |
|
|
|
|
|
|
|
public static implicit operator ClrValue(List<FilterSphere> value) |
|
|
|
{ |
|
|
|
return value != null ? new ClrValue(value, ClrValueType.Sphere, true) : Null; |
|
|
|
} |
|
|
|
|
|
|
|
public static implicit operator ClrValue(List<Instant> value) |
|
|
|
{ |
|
|
|
return value != null ? new ClrValue(value, ClrValueType.Instant, true) : Null; |
|
|
|
@ -109,6 +114,45 @@ namespace Squidex.Infrastructure.Queries |
|
|
|
return value != null ? new ClrValue(value, ClrValueType.Dynamic, true) : Null; |
|
|
|
} |
|
|
|
|
|
|
|
public ClrValue ToList() |
|
|
|
{ |
|
|
|
var value = Value; |
|
|
|
|
|
|
|
if (IsList || ValueType == ClrValueType.Null || value == null) |
|
|
|
{ |
|
|
|
return this; |
|
|
|
} |
|
|
|
|
|
|
|
ClrValue BuildList<T>(T value) |
|
|
|
{ |
|
|
|
return new ClrValue(new List<T> { value }, ValueType, true); |
|
|
|
} |
|
|
|
|
|
|
|
switch (value) |
|
|
|
{ |
|
|
|
case FilterSphere typed: |
|
|
|
return BuildList(typed); |
|
|
|
case Instant typed: |
|
|
|
return BuildList(typed); |
|
|
|
case Guid typed: |
|
|
|
return BuildList(typed); |
|
|
|
case bool typed: |
|
|
|
return BuildList(typed); |
|
|
|
case float typed: |
|
|
|
return BuildList(typed); |
|
|
|
case double typed: |
|
|
|
return BuildList(typed); |
|
|
|
case int typed: |
|
|
|
return BuildList(typed); |
|
|
|
case long typed: |
|
|
|
return BuildList(typed); |
|
|
|
case string typed: |
|
|
|
return BuildList(typed); |
|
|
|
} |
|
|
|
|
|
|
|
return this; |
|
|
|
} |
|
|
|
|
|
|
|
public override string ToString() |
|
|
|
{ |
|
|
|
if (Value is IList list) |
|
|
|
|
|
|
|
@ -73,9 +73,19 @@ namespace Squidex.Infrastructure.Queries.Json |
|
|
|
|
|
|
|
if (value != null && isValidOperator) |
|
|
|
{ |
|
|
|
if (value.IsList && nodeIn.Operator != CompareOperator.In) |
|
|
|
if (nodeIn.Operator == CompareOperator.In) |
|
|
|
{ |
|
|
|
args.Errors.Add($"Array value is not allowed for '{nodeIn.Operator}' operator and path '{nodeIn.Path}'."); |
|
|
|
if (!value.IsList) |
|
|
|
{ |
|
|
|
value = value.ToList(); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
if (value.IsList) |
|
|
|
{ |
|
|
|
args.Errors.Add($"Array value is not allowed for '{nodeIn.Operator}' operator and path '{nodeIn.Path}'."); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (nodeIn.Operator == CompareOperator.Matchs && value.Value?.ToString()?.IsValidRegex() != true) |
|
|
|
|
|
|
|
@ -491,6 +491,14 @@ namespace Squidex.Infrastructure.Queries |
|
|
|
|
|
|
|
AssertErrors(json, "Array value is not allowed for 'Equals' operator and path 'string'."); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Should_convert_single_value_to_list_for_in_operator() |
|
|
|
{ |
|
|
|
var json = new { path = "string", op = "in", value = "Hello" }; |
|
|
|
|
|
|
|
AssertFilter(json, "string in ['Hello']"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
|