Browse Source

Closes #70

pull/65/merge
Sebastian Stehle 9 years ago
parent
commit
15c9a0c866
  1. 72
      src/Squidex.Domain.Apps.Read.MongoDb/Contents/Visitors/FilterVisitor.cs
  2. 3
      src/Squidex.Infrastructure/Dispatching/Helper.cs
  3. 3
      src/Squidex/Config/Swagger/XmlResponseTypesProcessor.cs
  4. 8
      src/Squidex/Pipeline/Swagger/SwaggerHelper.cs
  5. 27
      tests/Squidex.Domain.Apps.Read.Tests/Schemas/ODataQueryTests.cs
  6. 3
      tests/Squidex.Domain.Apps.Read.Tests/Squidex.Domain.Apps.Read.Tests.csproj

72
src/Squidex.Domain.Apps.Read.MongoDb/Contents/Visitors/FilterVisitor.cs

@ -36,6 +36,11 @@ namespace Squidex.Domain.Apps.Read.MongoDb.Contents.Visitors
return node.Accept(visitor);
}
public override FilterDefinition<MongoContentEntity> Visit(ConvertNode nodeIn)
{
return nodeIn.Source.Accept(this);
}
public override FilterDefinition<MongoContentEntity> Visit(UnaryOperatorNode nodeIn)
{
if (nodeIn.OperatorKind == UnaryOperatorKind.Not)
@ -51,19 +56,19 @@ namespace Squidex.Domain.Apps.Read.MongoDb.Contents.Visitors
var fieldNode = nodeIn.Parameters.ElementAt(0);
var valueNode = nodeIn.Parameters.ElementAt(1);
if (nodeIn.Name == "endswith")
if (string.Equals(nodeIn.Name, "endswith", StringComparison.OrdinalIgnoreCase))
{
var value = BuildRegex(valueNode, v => v + "$");
return Filter.Regex(BuildFieldDefinition(fieldNode), value);
}
if (nodeIn.Name == "startswith")
if (string.Equals(nodeIn.Name, "startswith", StringComparison.OrdinalIgnoreCase))
{
var value = BuildRegex(valueNode, v => "^" + v);
return Filter.Regex(BuildFieldDefinition(fieldNode), value);
}
if (nodeIn.Name == "contains")
if (string.Equals(nodeIn.Name, "contains", StringComparison.OrdinalIgnoreCase))
{
var value = BuildRegex(valueNode, v => v);
@ -83,29 +88,50 @@ namespace Squidex.Domain.Apps.Read.MongoDb.Contents.Visitors
{
return Filter.Or(nodeIn.Left.Accept(this), nodeIn.Right.Accept(this));
}
if (nodeIn.OperatorKind == BinaryOperatorKind.NotEqual)
{
return Filter.Ne(BuildFieldDefinition(nodeIn.Left), BuildValue(nodeIn.Right));
}
if (nodeIn.OperatorKind == BinaryOperatorKind.Equal)
{
return Filter.Eq(BuildFieldDefinition(nodeIn.Left), BuildValue(nodeIn.Right));
}
if (nodeIn.OperatorKind == BinaryOperatorKind.LessThan)
{
return Filter.Lt(BuildFieldDefinition(nodeIn.Left), BuildValue(nodeIn.Right));
}
if (nodeIn.OperatorKind == BinaryOperatorKind.LessThanOrEqual)
{
return Filter.Lte(BuildFieldDefinition(nodeIn.Left), BuildValue(nodeIn.Right));
}
if (nodeIn.OperatorKind == BinaryOperatorKind.GreaterThan)
if (nodeIn.Left is SingleValueFunctionCallNode functionNode)
{
return Filter.Gt(BuildFieldDefinition(nodeIn.Left), BuildValue(nodeIn.Right));
var regexFilter = Visit(functionNode);
var value = BuildValue(nodeIn.Right);
if (value is bool booleanRight)
{
if ((nodeIn.OperatorKind == BinaryOperatorKind.Equal && !booleanRight) ||
(nodeIn.OperatorKind == BinaryOperatorKind.NotEqual && booleanRight))
{
regexFilter = Filter.Not(regexFilter);
}
return regexFilter;
}
}
if (nodeIn.OperatorKind == BinaryOperatorKind.GreaterThanOrEqual)
else
{
return Filter.Gte(BuildFieldDefinition(nodeIn.Left), BuildValue(nodeIn.Right));
if (nodeIn.OperatorKind == BinaryOperatorKind.NotEqual)
{
return Filter.Ne(BuildFieldDefinition(nodeIn.Left), BuildValue(nodeIn.Right));
}
if (nodeIn.OperatorKind == BinaryOperatorKind.Equal)
{
return Filter.Eq(BuildFieldDefinition(nodeIn.Left), BuildValue(nodeIn.Right));
}
if (nodeIn.OperatorKind == BinaryOperatorKind.LessThan)
{
return Filter.Lt(BuildFieldDefinition(nodeIn.Left), BuildValue(nodeIn.Right));
}
if (nodeIn.OperatorKind == BinaryOperatorKind.LessThanOrEqual)
{
return Filter.Lte(BuildFieldDefinition(nodeIn.Left), BuildValue(nodeIn.Right));
}
if (nodeIn.OperatorKind == BinaryOperatorKind.GreaterThan)
{
return Filter.Gt(BuildFieldDefinition(nodeIn.Left), BuildValue(nodeIn.Right));
}
if (nodeIn.OperatorKind == BinaryOperatorKind.GreaterThanOrEqual)
{
return Filter.Gte(BuildFieldDefinition(nodeIn.Left), BuildValue(nodeIn.Right));
}
}
throw new NotSupportedException();

3
src/Squidex.Infrastructure/Dispatching/Helper.cs

@ -6,6 +6,7 @@
// All rights reserved.
// ==========================================================================
using System;
using System.Reflection;
namespace Squidex.Infrastructure.Dispatching
@ -14,7 +15,7 @@ namespace Squidex.Infrastructure.Dispatching
{
public static bool HasRightName(MethodInfo method)
{
return method.Name == "On";
return string.Equals(method.Name, "On", StringComparison.OrdinalIgnoreCase);
}
public static bool HasRightReturnType<TOut>(MethodInfo method)

3
src/Squidex/Config/Swagger/XmlResponseTypesProcessor.cs

@ -6,6 +6,7 @@
// All rights reserved.
// ==========================================================================
using System;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using NJsonSchema.Infrastructure;
@ -43,7 +44,7 @@ namespace Squidex.Config.Swagger
response.Description = match.Groups["Description"].Value;
if (statusCode == "200")
if (string.Equals(statusCode, "200", StringComparison.OrdinalIgnoreCase))
{
hasOkResponse = true;
}

8
src/Squidex/Pipeline/Swagger/SwaggerHelper.cs

@ -6,6 +6,7 @@
// All rights reserved.
// ==========================================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
@ -36,12 +37,17 @@ namespace Squidex.Pipeline.Swagger
public static SwaggerDocument CreateApiDocument(HttpContext context, MyUrlsOptions urlOptions, string appName)
{
var scheme =
string.Equals(context.Request.Scheme, "http", StringComparison.OrdinalIgnoreCase) ?
SwaggerSchema.Http :
SwaggerSchema.Https;
var document = new SwaggerDocument
{
Tags = new List<SwaggerTag>(),
Schemes = new List<SwaggerSchema>
{
context.Request.Scheme == "http" ? SwaggerSchema.Http : SwaggerSchema.Https
scheme
},
Consumes = new List<string>
{

27
tests/Squidex.Domain.Apps.Read.Tests/MongoDb/Contents/ODataQueryTests.cs → tests/Squidex.Domain.Apps.Read.Tests/Schemas/ODataQueryTests.cs

@ -114,6 +114,33 @@ namespace Squidex.Domain.Apps.Read.MongoDb.Contents
Assert.Equal(o, i);
}
[Fact]
public void Should_create_contains_query_with_equals()
{
var i = F("$filter=contains(data/firstName/de, 'Sebastian') eq true");
var o = C("{ 'do.1.de' : /Sebastian/i }");
Assert.Equal(o, i);
}
[Fact]
public void Should_create_negated_contains_query_with_equals()
{
var i = F("$filter=contains(data/firstName/de, 'Sebastian') eq false");
var o = C("{ 'do.1.de' : { '$not' : /Sebastian/i } }");
Assert.Equal(o, i);
}
[Fact]
public void Should_create_negated_contains_query_and_other()
{
var i = F("$filter=contains(data/firstName/de, 'Sebastian') eq false and data/isAdmin/iv eq true");
var o = C("{ 'do.1.de' : { '$not' : /Sebastian/i }, 'do.3.iv' : true }");
Assert.Equal(o, i);
}
[Fact]
public void Should_create_string_equals_query()
{

3
tests/Squidex.Domain.Apps.Read.Tests/Squidex.Domain.Apps.Read.Tests.csproj

@ -26,4 +26,7 @@
<ItemGroup>
<Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" />
</ItemGroup>
<ItemGroup>
<Folder Include="MongoDb\Contents\" />
</ItemGroup>
</Project>
Loading…
Cancel
Save